이것저것

kubeadm을 이용한 k8s 클러스터 구축 본문

스터디/Kubernetes

kubeadm을 이용한 k8s 클러스터 구축

호준 2021. 3. 28. 23:28

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로 클러스터를 테스트해보자.