본문 바로가기

컴퓨터/클라우드 (Cloud)

Ubuntu, Kubernetes Cluster 구성 정리

Ubuntu system 두 대를 활용해서 Kubernetes Cluster 구성

Kubernetes, containerd, calico 로 구성

 

1. 호스트 등록 (master node에서만 수행)

/etc/hosts 에 내부 ip주소와 username 입력

 

# sudo nano /etc/hosts
192.168.1.173   master
192.168.1.174   worker1

 

2. swap off (모든 node에서 수행)

 

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

 

3. kernel modul load 저장 (모든 node에서 수행)

 

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

 

4. kubernetes kernel prameter 저장 (모든 node에서 수행)

 

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

 

5. System Reload (모든 node에서 수행)

 

sudo sysctl --system

 

6. containerd depency (모든 node에서 수행)

 

sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

 

7. enable docker repository (모든 node에서 수행)

 

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

8. containerd 설치 (모든 node에서 수행)

 

sudo apt update
sudo apt install -y containerd.io

 

9. cgroup에 containerd 사용 (모든 node에서 수행)

 

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

 

10. containerd restart (모든 node에서 수행)

 

sudo systemctl restart containerd
sudo systemctl enable containerd

 

11. kubernetes apt repository 등록 (모든 node에서 수행)

 

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

 

12. kubernetes 구동 요소 (kubelet, kubeadm, kubectl) 설치 (모든 node에서 수행)

 

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

 

13. kubernetes 시작 (master node에서 수행)

 

# template
sudo kubeadm init --control-plane-endpoint=마스터 노드 ip --apiserver-advertise-address=마스터 노드 ip --pod-network-cidr=pod들이 사용할 서브넷

# 예제
sudo kubeadm init --control-plane-endpoint=192.168.0.41 --apiserver-advertise-address=192.168.0.41 --pod-network-cidr=192.168.1.0/16

 

output:

 

 

13-1. runtime 제거 (cri-dockerd)

runtime이 두 개 이상일 경우, runtime을 command로 명시하거나

하나를 제거해야 한다.

 

sudo systemctl disable cri-docker.service
sudo systemctl stop cri-docker.service
sudo rm -f /etc/systemd/system/cri-docker.service

 

14. master 노드 권한 등록 (master node에서 수행)

 

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#export KUBECONFIG=/etc/kubernetes/admin.conf

 

15. worker node 추가 (worker node에서 수행)

https://stackoverflow.com/questions/63936268/how-to-generate-kubeadm-token-for-secondary-control-plane-nodes

13번 output 사진의 kubeadm join ~ 부분을 worker node 터미널에 입력

12번까지 수행된 상태여야 한다.

 

#kubeadm token create --print-join-command


sudo kubeadm join 192.168.0.41:6443 --token kvng0s.cw7l5u7v6awfp7tg \
	--discovery-token-ca-cert-hash sha256:650c7d630ee26165a8ceaf561e2e0edf8ef4cc9c897b354c7b2e55cee2e66336

#kubeadm init phase upload-certs --upload-certs #for master node
sudo kubeadm join 192.168.0.46:6443 --token 57pj6q.c5snfkjhojt887pd --discovery-token-ca-cert-hash sha256:17f58c3a33754b7119ceeffb55a27599622690fc09a2b4e92d1480873d834fa3 --control-plane --certificate-key 8a4edcd9cfed82d92a27335d14836ef9a3027f400ace3215c91d2f7a0243a04c --apiserver-advertise-address=192.168.0.41

 

16. 상태확인 (master node에서 수행)

 

kubectl get nodes

kubectl get pods -n kube-system

 

output:

 

 

17. Calico default yaml 파일 다운로드 (master node에서 수행)

 

curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O

 

18. 방화벽 해제 (없으면 패스) (master node에서 수행)

 

sudo ufw allow 179
sudo ufw restart

 

19. calico.yaml 파일 수정 (master node에서 수행)

19-1. 네트워크 인터페이스 정보 입력

 

sudo nano calico.yaml

# 아래의 enp6s0을 ifconfig로 확인되는 lan 네트워크 인터페이스 이름으로 변경!
- name: IP_AUTODETECTION_METHOD
  value: "interface=enp6s0"

 

그림:

 

 

19-2. CIDR (subnet) 정보 입력

12번, cluster 시작 command에서

calico의 default CIDR 주소인 192.168.0.0/16 가 아닌 다른 주소를 사용했을 경우

해당 주소를 입력

 

- name: CALICO_IPV4POOL_CIDR
  value: "192.168.1.0/16"

 

그림:

 

 

20. calico.yaml 적용 (master node에서 수행)

 

kubectl apply -f calico.yaml

# 적용 취소
kubectl delete -f calico.yaml

 

21. 상태 확인

 

kubectl get pods -n kube-system

 

output:

 

 

master node에 pod 올리는 법

(https://stackoverflow.com/questions/56634139/how-to-use-the-master-node-as-worker-node-in-kubernetes-cluster)

 

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

 

에러 정리

 

1.calico-node 상태가 running은 하지만 READY 가 0인 경우

--> kubectl describe pod calico-node-노드이름 -n kube-system 입력해서 상태 확인

--> unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl 에러 일 경우

--> 18, 19번 과정 다시 해보기

 

2. kubectl get nodes 에서 worker node의 status가 NotReady

--> "kubectl describe node worker node 이름" 을 입력해서 상태 확인

--> InvalidDiskCapacity ~ invalid capacity 0 on image filesystem 일 경우,

--> sudo systemctl restart containerd, sudo systemctl restart kubelet 입력

 

kubernetes 제거

 

kubeadm reset
sudo rm -rf /etc/cni/net.d
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/etcd
sudo rm -rf $HOME/.kube/config /var/lib/kubelet
# 여기까지는 리셋

sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*   
sudo apt-get autoremove  
sudo rm -rf ~/.kube
sudo rm -f /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt