Post

[K8s] 쿠버네티스 클러스터 구성

[K8s] 쿠버네티스 클러스터 구성

1. Control Plane 구성(마스터 노드에서만 진행)

1-1) 클러스터 초기화

image

 Kubernetes의 마스터 노드가 설정되고, 지정된 네트워크 범위와 API 서버 주소를 사용하여 클러스터가 구성됨, 이후에는 클러스터에 노드를 추가하고 필요한 Kubernetes 구성 요소와 애플리케이션을 배포할 수 있음

1
kubeadm init --pod-network-cidr=10.11.0.0/16 --apiserver-advertise-address=192.168.108.100
  • kubeadm init
    • Kubernetes 클러스터를 새로 초기화
    • kubeadm은 Kubernetes 클러스터를 쉽게 부트스트랩할 수 있도록 도와주는 도구
    • init 명령은 마스터 노드를 설정하고 필요한 모든 구성 요소를 실행
  • –pod-network-cidr=10.11.0.0/16
    • 클러스터 내의 pod 네트워크에 사용될 ip 범위(cidr 표기법)를 지정
    • 각 Pod에 고유한 ip 주소가 할당되며, 이 옵션을 통해 해당 ip 주소의 범위를 정의
  • –apiserver-advertise-address=192.168.108.100
    • Kubernetes API 서버가 광고(advertise) IP 주소를 설정
    • 이 주소는 클러스터 내부 또는 외부의 다른 컴퓨터가 API 서버와 통신하는데 사용(클러스터를 구성하는데 사용하는 네트워크 인터페이스에 할당된 IP 주소여야 함)

1-2) 토큰 생성

image

Kubernetes 클러스터에 새 노드를 추가하기 위한 명령어를 생성하고 출력

1
kubeadm token create --print-join-command > ~/token
  • kubeadm token create
    • 새로운 접근 토큰을 생성, 이 토큰은 새로운 노드가 클러스터에 합류(join)할 때 사용됨
  • –print-join-command
    • 실제로 새 노드를 클러스터에 추가하는데 사용할 수 있는 완전한 kubeadm join 명령어를 출력
    • 이 토큰을 포함하여 클러스터에 합류하기 위해 필요한 전체 명령어를 출력
    • ‘kubeadm join [API 서버 주소] –token [토큰] –discovery-token-ca-cert-hash [해시]‘의 형태를 갖게됨
    • 이 명령을 다른 노드에서 실행하면 해당 노드는 제공된 토큰을 사용하여 클러스터의 마스터 노드에 인증하고 클러스터에 합류함
    • -> 해당 명령은 큰 클러스터를 운영하거나 여러 노드를 자동으로 추가할 때 유용함, 이 명령어를 사용해 쉽고 빠르게 새 노드를 클러스터에 추가할 수 있음

1-3) scp를 이용하여 worker node로 파일 보내기

image

scp 명령어가 원격 시스템으로 연결 시 패스워드 입력을 요구하는데, 이를 ssh 공개키 인증으로 대체함

1
a="yes"; for num in {1..2..3}; do echo $a | scp token node$num:/root/; done;
  • a=”yes”
    • a라는 변수에 문자열 “yes”를 할당
  • for num in {1..3..1}
    • 1부터 3까지 1씩 증가시키며 반복
  • echo $a | scp token node$num:/root/
    • 반복문의 각 반복마다 실행
    • 변수 a의 값을 출력하고, 출력된 값은 파이프를 통해 scp 명령으로 전달됨
    • scp 명령을 이용해 원격지로 파일을 복사(로컬 시스템의 token 파일을 node1:/root/token, node2:/root/token, node3:/root/token으로 각각 복사

2. kube 환경 설정하기

image image

3. kubectl 자동완성 기능 설치

image image

4. CNI 설치(이 실습에서는 Calico를 설치)

  1. Tigera Calico 연산자 및 사용자 지정 리소스 정의 image

  2. 클러스터 초기화에서 지정한 Pod-Network image image

# [참고] weave를 설치할 때

1
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

5. 충분히 기다린 후(약 3분 이상) 아래 명령으로 확인

image

# 쿠버네티스 초기화 명령 실행

만약 containerd를 패키지(RPM, .deb 등)를 통해 설치하였다면, CRI integration 플러그인은 기본적으로 비활성화 되어 있음

쿠버네티스에서 containerd를 사용하기 위해서는 CRI support가 활성화되어 있어야 함

cri가 /etc/containerd/config.toml 파일 안에 있는 disabled_plugin 목록에 포함되지 않도록 주의해야 함

만약 해당 파일을 변경하였으면, containerd를 다시 시작함

6. 마스터에 조인(워커노드(node1.labs.local, node2.labs.local, node3.labs.local)에서 작업)

image 아까 복사해놓은 token 파일을 이용해 master.labs.local의 클러스터에 합류(join) 시킴

7. 조인 확인하기(관리노드(master.labs.local)에서 작업)

image 대략 1분 정도 기다린 후 정상적으로 Ready 올라오는 것 확인

* 오래 기다려도 Ready가 안 올라올 경우 master 노드에서 아래와 같이 taint를 제거

1
2
3
4
5
6
7
8
kubectl taint nodes node1.labs.local
node-role.kubernetes.io/control-plane:NoSchedule-

kubectl taint nodes node2.labs.local
node-role.kubernetes.io/control-plane:NoSchedule-

kubectl taint nodes node3.labs.local
node-role.kubernetes.io/control-plane:NoSchedule-

8. kubectl describe nodes master.labs.local

image

이렇게 올라오지 않는 경우 image

1
2
# 확인
sudo -i; kubectl get nodes
  1. 도커 서비스가 마스터 노드에서 활성화되지 않은 경우
    [해결]
    1
    
    sudo systemctl enable --now docker   sudo systemctl restart --now containerd
    
  2. 아래와 같이 NotReady인 경우
    image [원인]
    1
    2
    
    kubectl describe node master.labs.local \| egrep 'error'
    error: cni plugin not initialized
    

    [해결]

    1
    
    kubectl get pods -o wide -n kube-system \| awk '$1 ~ /calico-node/ {print $1}'
    

    image 위에 나타나는 모든 노드 이름을 지움

    1
    
    kubectl delete pod \[NODENAME\] -n kube-system
    

[참고사이트] https://platform9.com/kb/kubernetes/cni-plugin-not-initialized-on-master-node

Due to an bug in the Platform9 Managed Kubernetes Stack the CNI config is not reloaded when a partial restart of the stack takes place
(Platform9 Managed Kubernetes 스택의 버그로 인해 스택을 부분적으로 다시 시작할 때 CNI 구성이 다시 로드되지 않음)

9. 지우고 다시 설치할 때

모두 삭제 후 Control Plane 구성을 다시 진행

1
2
3
4
5
6
# All Node
sudo systemctl stop kubelet
sudo kubeadm reset -f
sudo rm -rf ~/.kube
sudo rm -rf /root/.kube
sudo rm -rf /var/lib/etcd
This post is licensed under CC BY 4.0 by the author.