이번 글은 kafka의 resilient를 위해 k8s 클러스터를 구축한 경험을 정리한 글입니다.
가장 먼저 memory swap을 꺼줍니다.
swapoff -a
이유는 k8s는 컨테이너들의 리소스 사용량을 관리하는데 메모리가 부족할때 억지로 디스크를 끌어다 쓰는 memory swap특성상 k8s입장에선 예외이기 때문입니다.
찾아보면 아래 명령어를 사용해 swap부분을 주석처리(#) 해주라하는데, 저는 들어가보니 swap관련된 줄이 없더군요.
sudo vi /etc/fstab
다음은 설치 가능한 패키지 리스트를 한번 새로고침 해줍니다.
sudo apt update & sudo apt-get update
이후 필요한 패키지들을 다운 받아줍니다.
sudo apt-get install \
apt-transport-https \
ca-certificates \
lsb-release \
curl -y
다음으로 도커의 gpg키를 다운 받아줍니다.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
gpg키는 내가 다운 받으려는 패키지가 변조 되지 않았는지 증명해주는 rsa키 입니다.
다음으론 apt repositiory에 다운받으려는 패키지인 도커를 등록합니다.
echo \
"deb [arch=$(dpkg --print-architecture) 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 curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
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
apt repository에 등록했으니 한번더 새로고침 해줍니다.
sudo apt-get update
다음으론 kubernetes 클러스터 구축을 위한 kubeadm, 노드에 실제로 파드를 실행시키기 위한 kubelet, cli환경에서 kubernetes에게 명령을 내리기 위한 Kubectl을 다운 받고 자동 업데이트를 비활성화 해줍니다.
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
k8s에서 자체적으로 띄우는 컨테이너들이 사용하는 포트가 있어서 해당 포트들을 ec2 보안그룹에서 열어줘야하는데 해당 포트들은 아래 링크를 참고바랍니다.
https://kubernetes.io/docs/reference/networking/ports-and-protocols/
도커도 다운받아줍니다.
sudo apt-get install \
containerd.io \
docker-ce \
docker-ce-cli \
-y
그리고 containerd 설정을 기본값으로 해줍니다.
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
이러면 컨테이너 런타임인 containerd의 cgroup driver는 cgroupfs이고 kubelet의 driver는 systemd입니다.
그럼 init할때 서로 충돌이 날겁니다. 그럼 이제 하나로 맞춰줘야 하는데 k8s에서는 cgroup driver로 systemd를 선호하므로 containerd의 driver를 systemd로 바꿔줄겁니다.
/etc/containerd/config.toml 에서 SystemdCgroup값을 true로 바꿔주면 됩니다. vi로 할 수도있고 아래와 같이 sed를 사용해도 됩니다.
sudo sed -e 's/SystemdCgroup = false/SystemdCgroup = true/g' -i /etc/containerd/config.toml
그럼 이제 진짜 구축해봅시다.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=마스터노드ip
pod-network-cidr은 사용하는 CNI에 따라 다른데 제가 사용한 Flannel은 10.244.0.0/16 대역을 사용합니다.
위 명령어를 치면 출력에도 뜰텐데 아래와 같은 명령을 수행해줍니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
또 다른 워커노드에서 클러스터에 join명령어도 맨아래 뜰텐데, token을 다시 재확인 하지 못하는건 아니지만 조금 귀찮으니 복사해서 저장해두시길 추천드립니다.
마지막으로 CNI를 다운로드 해줍니다.
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
워커노드에서도 init대신 join하는 거랑 admin.conf 파일 이동하는 거 빼고 똑같이하면 됩니다.
그리고 아마 워커노드에서 kubectl을 사용하려 하면 에러가 뜰텐데 마스터노드의 $HOME/.kube/config 파일을 워커노드의 똑같은경로에 복사해주고 sudo chown $(id -u):$(id -g) $HOME/.kube/config를 수행하면 작동할 겁니다.
docker 명령어를 사용하려는데 permission denied에러가 뜨는 경우
sudo chmod 666 /var/run/docker.sock
위 명령을 수행하시면 됩니다.