JUST WRITE

Kubernets Cluster에 Worker Node 추가 본문

MLOps/Kubernetes

Kubernets Cluster에 Worker Node 추가

천재보단범재 2023. 2. 18. 21:02

Kubernetes Cluster에 Worker Node 추가

Kubernetes Cluster에 Worker Node 추가

현재 Private Cloud 환경에서 Kubernetes Cluster를 구성하는 프로젝트를 진행하고 있다.

높은 사양으로 제공받다 보니 고려할 부분이 많았다.

한 Server에 Disk가 40개 정도 되니 관리 편하기 위해 RAID 구성을 요청하였는데,

여기서 문제가 생겨서 해당 Server를 Kubernetes Worker Node로 넣었다가 잠시 제거하였다.

(어떤 문제였는지는 아래 포스팅에서 확인 가능!)

 

RAID Disk 구성 - Spare Disk

RAID Disk 구성 현재 Private Cloud 환경에서 Kubernete Cluster를 구성하는 프로젝트를 진행하고 있다. 제공받은 Server(AWS EC2와 같은)의 구성이 너무 좋아서 오히려 관리가 힘들 거 같았다. 자세한 Spec은 밝

developnote-blog.tistory.com

문제를 해결하고 나서 다시 Worker Node에 추가해야 돼서 해당 과정을 정리해 보았다.

Token 생성

Kubernetes Cluster에 Worker Node를 추가하기 위해서는 Master Node에서 Toke 생성이 필요하다.

kubeadm으로 token 생성이 가능하다.

생성된 token을 기반으로 추가를 원하는 Worker Node에서 Join 명령어를 수행하면 된다.

token 생성 시 option(--print-join-command)을 주면 token을 생성하면서 Join 명령어를 바로 보여준다.

해당 명령어를 복사해서 Worker Node에서 실행해 주면 된다.

$ kubeadm token create --print-join-command
kubeadm join 10.***.***.***:*** --token ********* --discovery-token-ca-cert-hash sha256:******

$ kubeadm token list
TOKEN                TTL         EXPIRES                USAGES                   DESCRIPTION   EXTRA GROUPS
******************   23h         2023-02-11T00:44:37Z   authentication,signing   <none>        system:bootstrappers:kubeadm:default-node-token

위에서 token 정보를 보면 기한이 하루인 token이 생성된 것을 알 수 있다.

Join 명령어 실행

Master Node에서 생성한 Token기반 Join 명령어를 추가하려는 Worker Node에서 실행한다.

(sudo권한 필요)

$ kubeadm join 10.***.***.***:*** --token ********* --discovery-token-ca-cert-hash sha256:******

설정값 관련 에러

하지만 아래와 같은 error가 발생하였다.

이미 Kubernetes 관련 config가 설정되어 있다는 에러였다.

Worker Node였다가 제거했던 Server라 설정값이 남아있었다.

error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
        [ERROR Port-10250]: Port 10250 is in use
        [ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists

이럴때는 kubeadm reset으로 설정값들을 제거해 준다.

$ kubeadm reset
[reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
[preflight] Running pre-flight checks
W0210 09:46:55.734906 2905242 removeetcdmember.go:80] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] No etcd config found. Assuming external etcd
[reset] Please, manually reset etcd to prevent further issues
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet" 
[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller /etc/kubernetes/scheduler.conf]
[reset] Deleting contents of stateful directories: [/var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni]

The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d

The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually by using the "iptables" command.

If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.

The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.

Network 관련 에러 발생

이제 Worker Node에 Join 명령어를 수행하니 정상적으로 추가가 되었다.

Master Node에서 아래 명령어로 확인 가능하다.

$ kubectl get no

하지만 또 다른 문제가 발생하였다.

추가한 Worker Node에서 Pod이 생성되지 않고 아래와 같은 에러가 발생하였다.

cni0 Network 관련 IP address를 이미 가지고 있다는 에러였다.

위 설정값 에러처럼 이미 Worker Node였다 삭제한 Server라 Network 설정이 남아있기 때문이었다.

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "c630e66c3967b10c2d0069117b719d6241c9a0a68b6f21b89f7f90f55c425bc4" 
network for pod "continuous-image-puller-6bkgh": networkPlugin cni failed to set up pod "continuous-image-puller-6bkgh_jupyterhub" 
network: failed to set bridge addr: "cni0" already has an IP address different from 10.***.***.***/24

Worker Node에서 제외하고 kubeadm reset을 진행하였다.

아직 다시 Worker Node Join을 수행하지 않았다.

그리고 추가하려는 Worker Node에서 Network 리스트를 확인하였다.

확인해 보니 flannel1.1과 cni0이라는 Network Interface가 존재하였다.

# interface 확인
$ ip a

...
...
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:28:6a:64:c0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
10: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether 1e:3c:dc:97:4d:71 brd ff:ff:ff:ff:ff:ff
    inet 10.***.***.***/32 brd 10.244.9.0 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::1c3c:dcff:fe97:4d71/64 scope link
       valid_lft forever preferred_lft forever
11: cni0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 26:88:39:8c:71:3d brd ff:ff:ff:ff:ff:ff
    inet 10.***.***.***/24 brd 10.***.***.*** scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::2488:39ff:fe8c:713d/64 scope link
       valid_lft forever preferred_lft forever

해당 Network Interface를 정리하였다.

아래와 같은 과정으로 정리하였다.

$ systemctl stop kubelet
$ systemctl stop docker

$ rm -rf /var/lib/cni
$ rm -rf /etc/cni
$ rm -rf /var/lib/kubelet/*

$ ifconfig flannel.1 down
$ ifconfig cni0 down
$ ifconfig docker0 down

$ ip link delete flannel.1
$ ip link delete cni0

이렇게 Network까지 정리하고 kubeamd join 명령어를 수행하니 정상적으로 Pod이 생성되었다.

이번 Worker Node를 추가하면서 Node에 어떤 설정이 들어가는지 자세히 알 수 있었다.

[참고사이트]

 

728x90
반응형
Comments