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에서 수행)
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 올리는 법
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
'컴퓨터 > 클라우드 (Cloud)' 카테고리의 다른 글
Ubuntu, kubernetes, nvidia gpu monitoring 정리 (0) | 2023.02.01 |
---|---|
Ubuntu, Kubernetes dashboard 정리 (0) | 2023.01.22 |
Ubuntu, Kubernetes Metallb 설치 정리 (0) | 2022.12.31 |
Docker 명령어 정리 (2) | 2022.12.27 |
Ubuntu, docker 설치 및 제거 정리 (0) | 2022.12.07 |