이것저것
kubeadm을 이용한 k8s 클러스터 구축 본문
kubeadm을 사용해 controller node 하나와 worker node 하나로 구성된 클러스터를 자체 클라우드에 구성하였다.
다만 중간에 시행착오가 많았어서 공식문서를 보면서 나름의 구축방법을 적어보았다.
(링크: kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)
<모든 머신에서 실행>
swap 영역 비활성화
sudo swapoff -a
br_netfilter 커널 모듈 로드
sudo modprobe br_netfilter
sysctl에서 net.bridge.bridge-nf-call-iptables = 1 인지 확인
sudo sysctl -a | grep -i net.bridge.bridge-nf-call-iptables
(1이 아니면) sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
다음 url 참고하여 contrainer 설치
kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
참고로 여기서 docker를 설치하고 나서 cgroupdriver를 systemd로 설정해줘야 한다.
나는 위 링크의 방법대로 하지 않고
sudo vim /usr/lib/systemd/system/docker.service에서 ExecStart 마지막에 --exec-opt native.cgroupdriver=systemd 추가 후
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep -i cgroup
실행하여 systemd로 설정변경하였다.
kubelet kubeadm kubectl 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
<controller node에서 실행>
kubeadm init 실행
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<controller-node-ip>
실행하면 마지막에 kubeadm join로 시작하는 명령어가 나오는데 나중에 worker node를 join 시킬때 필요하므로 따로 적어놓자
kubectl 권한 설정
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Pod network 설정
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
다른 종류의 CNI 사용하는 방법도 있지만 flannel이 가장 설치하고 사용하기 간편한 듯하여 flannel로 설치하였다.
Pod network 설정 뒤 kubectl get pods --all-namespaces 를 통해 coredns를 봤을때 ready 상태이면 설정이 잘 된것이다. 참고로 flannel이 controller-node-ip의 대역에서 2번째 주소부터를 coredns container의 ip 주소로 사용한다. (e.g., controller-node-ip의 대역이 192.168.0.0/24이면 192.168.0.2부터 coredns container ip주소로 사용) 따라서, 네트워크에서 각 머신의 ip주소와 coredns의 ip주소가 겹치지 않도록 조심해야한다.
<workder node에서 실행>
해당 노드를 클러스터에 추가
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
(좀 전에 kubeadm init 실행 후 나온 명령어를 입력하면 된다.)
kubectl get nodes를 통해 node가 추가된 것을 확인할 수 있다.
kubectl get pods --all-namespaces를 실행해보면 각 node에서 flannel pod가 정상적으로 실행되어야 한다.
내 경우엔 여기서 pod들이 CrashLoopBackOff를 띄우면서 재시작을 반복했는데 worker node에 default network route가 설정되어있지 않아 pod가 이용할 network interface를 찾지 못해 생긴 문제였다.
(참고: github.com/flannel-io/flannel/issues/1353)
노드에 default network route 추가 (flannel pod CrashLoopBackOff 시에만 실행)
sudo route add default gw <current-node-ip>
(route 확인: route -n)
이제 적당한 테스트 image로 클러스터를 테스트해보자.