<aside> 🏆
Kubernetes의 안정적인 작동을 위해서 메모리 swap 기능을 비활성화합니다.
# swapoff -a
# sed -i '/swap/s/^/#/' /etc/fstab
명령어를 입력하여 비활성화를 확인합니다. 아무것도 출력되지 않으면 비활성화가 완료된 것입니다.
# swapon -s
Kubernetes 클러스터 구성을 위해 모듈을 로드하고, 네트워크를 설정하는 파일을 생성합니다.
# cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
# cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
명령어를 통해 변경한 설정을 적용합니다.
# sysctl --system
방화벽이 활성화된 환경에서 Kubernetes 환경을 구축할 경우, 특정 포트의 개방이 필요합니다.
master node(Control plane)
| 프로토콜 | 방향 | 포트 범위 | 용도 | 사용 주체 |
|---|---|---|---|---|
| TCP | Inbound | 6443 | 쿠버네티스API 서버 | 전부 |
| TCP | Inbound | 2379-2380 | etcd 서버클라이언트 API | kube-apiserver, etcd |
| TCP | Inbound | 10250 | Kubelet API | Self,Control plane |
| TCP | Inbound | 10259 | kube-scheduler | Self |
| TCP | Inbound | 10257 | kube-controller-manager | Self |
worker node
| 프로토콜 | 방향 | 포트 범위 | 용도 | 사용 주체 |
|---|---|---|---|---|
| TCP | Inbound | 10250 | Kubelet API | Self,Control plane |
| TCP | Inbound | 30000-32767 | NodePort Services† | 전부 |
명령어를 통해 포트들을 개방합니다.
# firewall-cmd --permanent --add-port=6443/tcp
...
포트 개방을 완료한 후 방화벽 설정을 적용합니다.
# firewall-cmd --reload
Kubernetes는 컨테이너들을 통합 관리하는 오케스트레이션 플랫폼이기 때문에 컨테이너의 실행, 관리 등의 역할을 수행하는 컨테이너 런타임의 설치를 필요로 합니다. 이 포스트에서는 Docker를 설치 후 Containerd 패키지를 사용하는 방법을 사용합니다.
Docker 설치를 위해 apt 업데이트 및 필수 패키지 설치를 진행합니다.
# apt-get update
# apt-get install -y apt-transport-https ca-certificates curl gnupg
Docker의 공개 키를 다운로드하고, 저장소를 등록합니다.
# curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] <https://download.docker.com/linux/ubuntu> $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
저장소를 업데이트하고, Docker 설치를 진행합니다,
# apt update
# apt install -y docker.io
Docker 데몬의 구성 파일을 설정합니다.
# cat <<EOF | 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 구성 파일을 생성합니다.
# mkdir -p /etc/containerd
# containerd config default | tee /etc/containerd/config.toml
생성한 파일을 수정합니다.
vi /etc/containerd/config.toml
# 파일의 해당 옵션을 true로 수정
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
수정 사항을 적용합니다.
# systemctl restart containerd
쿠버네티스 설치 및 클러스터 구성을 위해 kubelet, kubeadm, kubectl을 설치합니다.
클러스터를 구성할 master node와 worker node 전부 설치를 진행합니다.
저장소를 업데이트하고, 필수 패키지를 설치합니다.
# apt-get update
# apt-get install -y apt-transport-https ca-certificates curl gnupg
공개 키를 다운로드하고, 저장소를 추가합니다.
# curl -fsSL <https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key> | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] <https://pkgs.k8s.io/core:/stable:/v1.28/deb/> /" | tee /etc/apt/sources.list.d/kubernetes.list
해당 내용에 변화가 있을 수 있으므로 공식 문서를 참고하세요.
저장소를 업데이트하고 kubelet, kubeadm, kubectl 설치를 진행합니다.
master node는 모든 패키지를 필수적으로 설치해야 하지만, worker node의 경우 kubelet과 kubeadm 2개의 패키지만 필수적으로 요구합니다.
# apt-get update
# apt-get install -y kubelet kubeadm kubectl
설치한 패키지의 버전을 고정합니다.
# apt-mark hold kubelet kubeadm kubectl
설치가 완료된 이후, 클러스터 구성을 위해서 master node와 worker node의 개별적인 설정이 필요합니다.
명령어를 통해 Kubernetes 클러스터를 초기화하고, master node를 설정합니다.
# kubeadm init --pod-network-cidr=10.244.0.0/16
설정이 끝나고 worker node를 클러스터에 등록하기 위한 join 명령어가 출력됩니다.
kubeadm join 192.168.***.***:6443 --token ******.5vfxtbd99w84usur \\
--discovery-token-ca-cert-hash sha256:338d571521069b7ecd6358cae93c6c6658******************************
--------------------------------------------------------------
나의 ca
kubeadm join 172.31.9.92:6443 --token x2dgtp.5iyvgw3c1w16i1tk \\
--discovery-token-ca-cert-hash sha256:607ecf777b4f331c1a2b4f963b0de188953fc32377********************
root가 아닌 사용자가 kubectl 명령어를 사용할 수 있도록 설정하기 위해
kubectl 명령어를 사용할 사용자 계정에서 다음 명령어를 실행합니다.
$ mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
컨테이너 간의 네트워크를 제어하기 위한 CNI(Container Network Interface)를 설정합니다.
이 포스트에서는 Flannel을 사용했습니다.
# kubectl apply -f <https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml>
master node에서 kudeadm init 명령어를 통해 생성한 join 명령어를 통해 클러스터에 worker node를 등록합니다.
# kubeadm join 192.168.***.***:6443 --token ******.5vfxtbd99w84usur \\
--discovery-token-ca-cert-hash sha256:338d571521069b7ecd6358cae93c6c6658******************************
master node에서 등록된 worker node를 확인합니다.

</aside>