<aside> 🏆

2-1. 메모리 swap 기능 비활성화

Kubernetes의 안정적인 작동을 위해서 메모리 swap 기능을 비활성화합니다.

# swapoff -a
# sed -i '/swap/s/^/#/' /etc/fstab

명령어를 입력하여 비활성화를 확인합니다. 아무것도 출력되지 않으면 비활성화가 완료된 것입니다.

# swapon -s

2-2. 네트워크 옵션 설정

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

2-3. 방화벽 설정

방화벽이 활성화된 환경에서 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

2-4. 컨테이너 런타임 설치

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

3. 쿠버네티스 설치 하기

쿠버네티스 설치 및 클러스터 구성을 위해 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

4. 쿠버네티스 설치 – 클러스터 설정하기

설치가 완료된 이후, 클러스터 구성을 위해서 master node와 worker node의 개별적인 설정이 필요합니다.

4-1. 쿠버네티스 설치 – master 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>

4-2. 쿠버네티스 설치 – worker node 설정

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를 확인합니다.

image.png

</aside>