지난 시간에는 로컬 환경에 실습과 테스트를 위한 경량 쿠버네티스를 설치해보았다. 이번에는 본격적으로 쿠버네티스를 설치하고 구성하기까지의 과정을 정리해보겠다.

우선 쿠버네티스 노드를 구성하기 앞서 이전에 활용해봤던 multipass를 가지고 VM을 올려줄 것이다.
쿠버네티스 공식 문서에서는 쿠버네티스를 사용하기 위해서 최소한의 사양을 지정해주는데 그에 맞춰 VM을 생성해주어야한다.
- 2 GB or more of RAM per machine (any less will leave little room for your apps).
- 2 CPUs or more.
kubernetes.io
$ multipass launch --name k8s-master --cpus 2 --memory 4G --disk 5G jammy
$ multipass launch --name k8s-node1 --cpus 2 --memory 2G --disk 5G jammy
$ multipass launch --name k8s-node2 --cpus 2 --memory 2G --disk 5G jammy
$ multipass list
Name State IPv4 Image
k8s-master Running 192.168.64.9 Ubuntu 22.04 LTS
k8s-node1 Running 192.168.64.7 Ubuntu 22.04 LTS
k8s-node2 Running 192.168.64.8 Ubuntu 22.04 LTS
# Swap disable & Disabling Swaps on Reboot
$ swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
# Letting iptables see bridged traffic & Apply kernel parameters
$ cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system
# Disable firewall
$ systemctl stop ufw
# systemctl disable ufw
방화벽의 경우 편리함을 위해 비활성화 시켜놨지만 쿠버네티스 공식문서에서 친절하게 필요한 port를 명시해준다.
링크를 참고하시오. >> Ports and Protocols
기본적인 환경 설정이 끝났다면 각 노드들에 도커를 설치해주자. 참고로 나는 공식문서에서 제공되는 순서를 그대로 따라 했다.
# Add Docker's official GPG key:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
# Install docker package
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 설치 확인
$ docker version
$ sudo apt-get update
# Download the public signing key
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# Add Kubernetes apt repository
$ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# Update the apt package index, install kubelet, kubeadm and kubectl, and pin their version
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl
# Enable the kubelet service before running kubeadm
$ systemctl start kubelet && systemctl enable kubelet
클러스터를 생성하면 마지막에 나오는 kubeadm 명령어를 잘 복사해서 보관하고 있어야한다. 해당 명령어는 나중에 워커 노드들이 마스터에 join하기 위해 필요하다!
# Kubernetes control-plane initialize
$ kubeadm init
.
.
.
kubeadm join 192.168.64.9:6443 --token <token> \
--discovery-token-ca-cert-hash <cert-hash>
# Settings for writing kubectl commands
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
만일 root가 아닌 다른 일반 계정에서도 kubectl 명령어를 사용하고 싶다면 동일하게 위의 과정을 진행하면 된다. 사실 나는 sudo를 매번 붙이는게 귀찮아서 root 계정에서 설정하고 있다.
쿠버네티스 pod 네트워크 구성을 하기위해 CNI 설치가 필요하다. CNI에는 여러 종류가 있으며 그 중에서 Weave Net을 설치했다.
# Installing a Pod network add-on
$ kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
네트워크 구성이 완료되면 NotReady -> Ready로 변경되는 것을 확인할 수 있다.
$ kubectl get nodes // 네트워크 구성 전
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 2m36s v1.30.2
$ kubectl get nodes // 네트워크 구성 후
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 4m21s v1.30.2
kubeadm init이 끝나고 메모해두었던 join 명령어를 실행해준다.
kubeadm join 192.168.64.9:6443 --token <token> \
--discovery-token-ca-cert-hash <cert-hash>
마스터 노드에서 kubectl 명령어로 구성이 잘 됐는지 확인해준다.
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready control-plane 15m v1.30.2 192.168.64.9 <none> Ubuntu 22.04.4 LTS 5.15.0-113-generic containerd://1.7.18
k8s-node1 Ready <none> 9m53s v1.30.2 192.168.64.7 <none> Ubuntu 22.04.4 LTS 5.15.0-113-generic containerd://1.7.18
k8s-node2 Ready <none> 9m27s v1.30.2 192.168.64.8 <none> Ubuntu 22.04.4 LTS 5.15.0-113-generic containerd://1.7.18
kubeadm 혹은 kubectl get nodes 할 경우 종종 발생하는 에러가 있다.
[ERROR CRI]: container runtime is not running: output: time="2024-07-10T12:03:04+09:00" level=fatal msg="validate service connection: validate CRI v1 runtime API for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
대충 요론 에러인데 containerd를 재시작 해주는 것으로 금방 해결할 수 있다.
rm /etc/containerd/config.toml
systemctl restart containerd
kubectl 명령어를 사용하다보면 처음부터 끝까지 다 수동으로 적어야할때 정말 귀찮을 수 있다. 시스템 상에 등록해주고 편리하게 쿠버네티스를 사용할 수 있다.
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc