본문 바로가기

개발

[k8s] 쿠버네티스 노드 Not Ready 분석 및 해결하기

쿠버네티스 클러스터링 이후 런타임까지 변경했지만 마스터 포함 각 노드들은 Not Ready 상태로 되어있는모습...

 


일단은 이유를 알아보기 위해 마스터노드를 살펴보자 

 

1. 노드 상태 살펴보기

 

다음 명령어로 노드 상태가 왜 Not Ready 인지 확인해보자

 

kubectl describe node 노드Name

 

명령어를 실행하면 여러가지 정보가 나오는데 그 중 Conditions 항목을 살펴보면 다음과 같이 나온다

 

 

맨 아래 노드들이 NotReady 상태인 이유가 나온다. cni 플러그인이 제대로 동작하지 않아 네트워크 에러가 발생했다고 한다.

cni 플러그인만 제대로 동작하게끔 수정하면 문제가 해결될것 같다. 

 

cni 플러그인이 뭔지, 에러가 왜 났는지는 다음 게시글에서!

 

현 상태에서 아래 명령어를 실행하면

 

kubectl get pods -n kube-system -o wide

 

아래와 같이 coredns 파드들이 pending 상태에 빠져있는 모습을 확인할 수 있다.

 

 

아래 첨부한 공식문서에 따르면 coredns는 쿠버네티스의DNS 서버인데 현재 pending 상태에 빠져있는것도 쿠버네티스의 네트워크가 제대로 설정되어 있지 않기 때문이라고 한다.

 

 

https://kubernetes.io/ko/docs/tasks/administer-cluster/coredns/

 

서비스 디스커버리를 위해 CoreDNS 사용하기

이 페이지는 CoreDNS 업그레이드 프로세스와 kube-dns 대신 CoreDNS를 설치하는 방법을 보여준다. 시작하기 전에 쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도

kubernetes.io

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#coredns-is-stuck-in-the-pending-state

 

Troubleshooting kubeadm

As with any program, you might run into an error installing or running kubeadm. This page lists some common failure scenarios and have provided steps that can help you understand and fix the problem. If your problem is not listed below, please follow the f

kubernetes.io

 

이제 문제는 확인했으니 해결법을 확인해보자

 

 

2. 쿠버네티스 CNI 플러그인 설치하기

 

아래 문서를 확인해보면 여러가지 종류의 플러그인이 나열되어 있는데 그 중 calico를 선택했다.

 

https://kubernetes.io/ko/docs/concepts/cluster-administration/networking/

 

클러스터 네트워킹

네트워킹은 쿠버네티스의 중심적인 부분이지만, 어떻게 작동하는지 정확하게 이해하기가 어려울 수 있다. 쿠버네티스에는 4가지 대응해야 할 네트워킹 문제가 있다. 고도로 결합된 컨테이너 간

kubernetes.io

 

굳이 calico를 선택한 이유는 공식문서에 나와있는 플러그인 이기도하고 문서에는 그냥 넣은걸수도...?
(https://kubernetes.io/ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/)

 

예제가 많이 나와있었기 때문!

 

설치를 위해 공식 문서를 확인해보자

 

https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises

 

Install Calico networking and network policy for on-premises deployments

Install Calico networking and network policy for on-premises deployments.

projectcalico.docs.tigera.io

 

문서에 나와있는대로 진행만 하면 정말 간단하게 설치가 가능하다.

 

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

 

배포될 calico 리소스에 대한 설정파일을 받아오고 

 

kubectl apply -f calico.yaml

 

쿠버네티스에 적용하면 끝

 

지난 게시글에서 쿠버네티스 클러스터링 구성시 kubeadm init 옵션으로 파드 네트워크 대역에 대한 설정을 했었는데
이런 경우 별도로 네트워크 대역을 설정하지 않아도 자동감지해 대역을 설정한다고 한다.

이 부분은 잠시 후 실제로 적용이 잘 되었는지 확인해볼예정

 

 

3. 설치확인하기

 

설치를 했으니 잘 설치가 되었는지, 동작은 잘 되는지 확인해보자

 

아래 명령어를 실행해보면

 

kubectl get nodes

 

 

쿠버네티스 노드들이 Ready 상태로 바뀐걸 확인할 수 있다.

coredns 상태를 확인해보면

 

kubectl get pods -n kube-system -o wide

 

 

이번에 배포한 calico 관련 파드들과 coredns 관련 파드도 정상적으로 Running 상태로 바뀌었다!

 

예제용 파드를 이용해 실제로 배포가 되고 동작이 되는지까지 확인해보자

 

kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml

 

예제 파드 배포 후 상태를 확인해보면

 

kubectl describe pod nginx

 

 

정상적으로 실행되고 IP 대역도 쿠버네티스 클러스터링시 기입했던 네트워크 대역 옵션에 맞게 잘 설정된 모습

아래 명령어로 실제 파드에 접근도 가능하다.

 

kubectl exec --stdin --tty nginx -- /bin/bash

 

이제 마지막으로 calico 네트워크 대역이 제대로 설정되었는지 눈으로 확인해보자

확인시 calico 에서 지원하는 cli를 사용해야 한다. 공식문서를 참조하면 금방 설치할 수 있다.

 

https://projectcalico.docs.tigera.io/maintenance/clis/calicoctl/install

 

Install calicoctl

Install the CLI for Calico.

projectcalico.docs.tigera.io

 

curl -L https://github.com/projectcalico/calico/releases/download/v3.22.1/calicoctl-linux-amd64 -o calicoctl
chmod +x ./calicoctl

 

위 명령어만 실행하면 설치는 완료!

어디서든 calicoctl을 사용하기 위해 echo $PATH 로 나오는 경로에 설치된 calicoctl 을 옮겨주면된다

끝났다면 직접 확인해보자 아래명령어 입력시

 

calicoctl get ippools

 

 

잘 설정되어있는 모습을 볼 수 있다!