1. OS 정보 확인
nproc
free -h
ifconfig -a
sudo cat /sys/class/dmi/product_uuid
sudo cat /sys/class/dmi/id/product_uuid
2. 메모리 swap 기능 비활성화
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
sudo free -m
sudo swapon -s
systemctl list-unit-files --type swap
systemctl mask [swap unit명]
ex) systemctl mask dev-sda3.swap
sudo systemctl list-unit-files --type swap
3. 방화벽 설정(쿠버네티스 포트만 방화벽 포트 개방)
sudo apt-get install -y firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250-10252/tcp
sudo firewall-cmd --permanent --add-port=8285/udp
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --reload
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
sudo firewall-cmd --permanent --add-port=8285/udp
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --permanent --add-port=26443/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
sudo netstat -tlnp
telnet [ip] [port]
ex) telnet 192.168.100.128 6443
>>
Trying 192.168.111.128...
telnet: Unable to connect to remote host: Connection refused
curl -v telnet://[ip]:[port]
4. 네트워크 옵션 설정
sudo cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
br_netfilter는 Linux 커널 모듈로, 브리지 네트워크 인터페이스를 사용하여 IP 필터링과 네트워크 주소 변환(NAT)을 가능하게 하는 기능을 제공합니다. 이 모듈은 특히 Kubernetes와 같은 컨테이너 오케스트레이션 시스템에서 필수적입니다. Kubernetes에서 Pod 간 통신 및 네트워킹을 올바르게 처리하기 위해 br_netfilter가 필요할 수 있습니다.
5. 컨테이너 런타임 설치
- Docker 설치 후 Containerd 패키지 사용
apt 업데이트 및 필수 패키지 설치
# apt 업데이트
sudo apt-get update
# 필수 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
공개키 다운로드 및 저장소 등록
curl -fsSL https:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
도커 설치
sudo apt update
sudo apt install -y docker.io 또는 sudo apt install -y docker-ce
docker --version
* docker.io 데비안(우분투)에서 제공하는 도커 패키지로 데비안 저장소에서 도커 패키지를 가져오게 된다.
* docker.io 는 docker의 외부 종속성 패키지는 마이크로 패키징으로 독립적으로 패키징되어 있다.
* docker-ce 설치 시 → 외부 종속성 패키지로 containerd.io 설치됨.
* docker.io 설치 시 → 외부 종속성 패키지로 containerd 설치됨.
도커 데몬 설정
# /etc/docker 디렉토리 없을 경우 생성
sudo mkdir /etc/docker
# daemon.json 파일 추가
sudo cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 필요 시 cgroup(runc) 옵션 설정
# containerd 구성 파일 생성
sudo mkdir -p /etc/containerd
# containerd 기본 설정값으로 config.toml 생성
sudo containerd config default | sudo tee /etc/containerd/config.toml
# config.toml 파일 수정
vi /etc/containerd/config.toml
# cgroup driver(runc) 사용하기 설정
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
# 수정사항 적용 및 재실행
sudo systemctl restart containerd
도커 재실행
sudo service docker restart
sudo service docker status
- Containerd 설치 후 사용
apt 업데이트 및 필수 패키지 설치
#apt 업데이트
sudo apt-get update
#필수 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
공개키 다운로드 및 저장소 목록
curl -fsSL https:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
containerd 패키지 설치
#저장소 적용을 위한 apt 업데이트
sudo apt-get update
#containerd 패키지 설치
sudo apt-get install containerd
#설치 확인
sudo systemctl status containerd
containerd config 옵션 설정
#containerd 구성 파일 생성
sudo mkdir -p /etc/containerd
#containerd 기본 설정값으로 config.toml 생성
sudo containerd config default | sudo tee /etc/containerd/config.toml
#config.toml 파일 수정
vi /etc/containerd/config.toml
# cgroup driver(runc) 사용하기 설정
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
#수정사항 적용 및 재실행
sudo systemctl restart containerd
- Docker Engine + cri-dockerd 적용
- Docker 엔진 관련 명령을 기반으로 스크립트를 실행
- 권한이 있는 Pod에서 Docker 명령 실행
- Docker 특정 로깅 및 모니터링 활용
apt 패키지 업데이트 및 필수 패키지 설치
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg
dpkg -l | grep [패키지명]
docker gpg 키 다운로드 및 저장소 추가
curl -fsSL https:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
docker 패키지 설치
sudo apt update
sudo apt install -y docker-ce
설치 확인
docker --version
docker run -it --name [컨테이너명] hello-world
docker ps -a
docker rm [컨테이너ID 또는 컨테이너명]
docker images
docker rmi [이미지명]
- cri-dockerd를 이용하여 도커 엔진과 쿠버네티스 연결
git clone https://github.com/Mirantis/cri-dockerd.git
wget https://storage.googleapis.com/golang/getgo/installer_linux
chmod +x ./installer_linux
./installer_linux
source ~/.bash_profile
#cri-dockerd 빌드
cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket
sudo systemctl restart docker && sudo systemctl restart cri-docker
sudo systemctl status cri-docker.socket --no-pager
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
6. Kubernetes Cluster 설치
a. apt 패키지 업데이트 및 필수 패키지
- apt-transport-https
- ca-certificates
- curl
- gnupg
# apt 업데이트
sudo apt-get update
# 필수 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
b. 구글 클라우드의 공캐 키 다운로드 및 쿠버네티스 레포지토리 추가
- Ubuntu 20.04
#keyrings 디렉토리 생성
sudo mkdir -p /etc/apt/keyrings
#개인키 다운로드
curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https:
#쿠버네티스 레포지토리 추가
sudo apt-add-repository "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] http://apt.kubernetes.io/ kubernetes-xenial main"
- Ubuntu 22.04 이후
curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://dl.k8s.io/apt/doc/apt-key.gpg
sudo echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
*만약 문제가 발생하면 vi 편집기로 kubenetes.list 파일에 해당 문자열 추가
sudo vi /etc/apt/sources.list.d/kubernetes.list
deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] http://apt.kubernetes.io/ kubernetes-xenial main
c. 쿠버네티스 패키지 설치
# 저장소 추가되었기 때문에 apt 업데이트
sudo apt-get update
# 쿠버네티스 패키지 설치
sudo apt-get install -y kubelet kubeadm kubectl
# 쿠버네티스 패키지 버전 고정
sudo apt-mark hold kubelet kubeadm kubectl
# 쿠버네티스 설치 버전 조회
kubelet --version
kubeadm version
kubectl version
# kubelet service 확인
sudo systemctl status kubelet.service
*쿠버네티스 패키지 설치할 때 Unable to locate package ~ 에러가 발생할 수 있습니다.
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
# 쿠버네티스 apt 리포지터리를 추가한다.
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.
sudo apt-get update
7. Master Node 구성
a. Control-Plan 구성
kubeadm을 통해 Control-Plane 설정을 완료하면 Worker Node의 join키가 발급되고 해당 키로 Worker Node를 등록 시 사용하니 기록 필요
# 쿠버네티스 클러스터를 초기화하여 새로운 마스터 노드를 생성하는 명령어
# 별도의 옵션을 설정하지 않으면 기본 디폴트 값으로 적용
kubeadm init [옵션]
# 기본 설정 명령어
sudo kubeadm init
# Calico
sudo kubeadm init
# Flannel
sudo kubeadm init
# 옵션 목록
# 결과
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.19.95:6443
b. kubectl 설정
root 계정이 아닌 다른 계정에서도 kubectl 명령어를 사용하기 위해 config 설정
*config 설정을 진행하지 않을 경우 kubectl 명령어를 사용 시
The connection to the server localhost:8080 was refused - did you specify the right host or port?
sudo mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
c. CNI(Container Network Interface) 설정
컨테이너 간의 네트워크를 제어할 수 있는 플러그인으로 컨테이너 런타임에서 컨테이너의 네트워크를 사용하게 해주는 인터페이스입니다.
쿠버네티스에서 사용되는 Pod들은 기본적으로 오버레이 네트워크 방식을 적용하여 엔드포인트 간의 네트워크 구조를 추상화하여 네트워크 통신 경로를 단순화합니다. 이때 사용되는 플러그인 마다 설정 방법이 다릅니다.
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml -o calico.yaml
kubectl apply -f calico.yaml
kubectl get pods -A -o wide
8. Worker Node구성
a. Worker Node Master 클러스터에 연결
마스터 노드에서 kubeadm init을 통해 생성한 join 명령어를 이용하여worker node 등록
sudo kubeadm join [ip]:6443 --token [토큰명] --discovery-token-ca-cert-hash [hashkey]
9. 최종 확인
a. Master Node에서 node 상태 확인
kubectl get node
or
kubectl get nodes -o wide