Lined Notebook

[Kubernetes] 05. 파드, 마스터, 워커 노드 문제 발생 시

by ymkim

01. 쿠버네티스 파드에 문제가 생긴 경우

이번 시간에는 쿠버네티스 파드에 문제가 생긴 경우 어떻게 문제를 해결하는지 알아보자.

01-1. 만약 파드를 실수로 지웠다면

파드를 지우는 경우는 아래와 같이 두 가지 유형으로 구분이 된다.

  • 파드만 배포된 경우 삭제 해버렸다
    • 파드가 삭제가 되면 복구가 힘들다
    • 새로운 파드를 직접 생성 해줘야 한다
  • 디플로이먼트 형태로 배포된 파드를 삭제 해버렸다
    • 디플로이먼트의 경우 파드가 삭제되어도 새로운 파드를 생성한다
    • Replica Set의 갯수에 따라서 Pod를 재생성하기 때문이다

01-2. 삭제 실습

kubectl apply -f ~/_Lecture_k8s_starter.kit/ch4/4.1/del-deploy.yaml
kubectl apply -f ~/_Lecture_k8s_starter.kit/ch4/4.1/del-pod.yaml
  • 단순 파드 삭제, 디플로이먼트 파드 삭제를 진행 해보자
  • 우선 삭제를 위해서 두개의 pod를 생성 한다
kubectl delete pod del-pod
[root@m-k8s ~]# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
del-deploy-57f68b56f7-8rhcp   1/1     Running   0          105s
del-deploy-57f68b56f7-hrn2m   1/1     Running   0          105s
del-deploy-57f68b56f7-t9kbh   1/1     Running   0          105s
  • del-pod 삭제
  • 디플로이먼트로 배포하지 않았기에, 삭제 후에 해당 Pod 는 복구가 불가능하다
kubectl delete pod del-deploy-57f68b56f7-hrn2m
  • Deployment로 배포된 파드를 삭제 한다
  • 해당 Pod를 삭제하여도 Replicaset 유지를 위해 복구가 된다
kubectl delete deployment del-deploy
[root@m-k8s ~]# kubectl get po
NAME                          READY   STATUS        RESTARTS   AGE
del-deploy-57f68b56f7-6vzns   0/1     Terminating   0          65s
del-deploy-57f68b56f7-8rhcp   0/1     Terminating   0          4m10s
del-deploy-57f68b56f7-t9kbh   0/1     Terminating   0          4m10s
  • deployment는 위와 같이 deployment 명령어를 통해 삭제한다
  • 핵심은 Replicaset을 유지하기 위해 deployment는 복구를 진행한다는 것
  • 웬만하면 Pod 자체를 배포하지말고, deployment 형태로 배포를 진행 하자
  • 다음 시간에는 쿠버네티스의 구성 요소에 문제가 발생한 경우에 대해 알아보자

02. 쿠버네티스 워커 노드 문제 발생

02-1. kubelet 중단 실습

systemctl stop kubelet
  • Pod가 배포되는 워커 노드의 kubelet을 종료한다
  • 또한 kubelet을 종료하는 경우에는 바로 복구가 되지는 않는다
[root@w1-k8s ~] systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: inactive (dead) since Mon 2022-08-08 23:37:33 KST; 31s ago
     Docs: <https://kubernetes.io/docs/>
  Process: 939 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 939 (code=exited, status=0/SUCCESS)

Aug 08 23:34:26 w1-k8s kubelet[939]: W0808 23:34:26.736821     939 docker_sandbox.go:402] f...st.
Aug 08 23:34:26 w1-k8s kubelet[939]: with error: exit status 1
Aug 08 23:34:26 w1-k8s kubelet[939]: I0808 23:34:26.748490     939 scope.go:95] [topologyma...db3
Aug 08 23:34:27 w1-k8s kubelet[939]: I0808 23:34:27.960845     939 reconciler.go:196] operatio...
Aug 08 23:34:27 w1-k8s kubelet[939]: I0808 23:34:27.967973     939 operation_generator.go:797]...
Aug 08 23:34:28 w1-k8s kubelet[939]: I0808 23:34:28.063289     939 reconciler.go:319] Volum... ""
Aug 08 23:36:59 w1-k8s kubelet[939]: E0808 23:36:59.214814     939 remote_runtime.go:392] E...ded
Aug 08 23:37:33 w1-k8s systemd[1]: Stopping kubelet: The Kubernetes Node Agent...
Aug 08 23:37:33 w1-k8s kubelet[939]: I0808 23:37:33.189928     939 dynamic_cafile_content.g...crt
Aug 08 23:37:33 w1-k8s systemd[1]: Stopped kubelet: The Kubernetes Node Agent.
Hint: Some lines were ellipsized, use -l to show in full.
  • 위 명령어 입력 시 kubelet이 종료된 것을 확인할 수 있다
  • 이제 워커 노드의 kubelet을 종료한 채로 Pod 배포를 해보자
[root@m-k8s ~] kubectl apply -f ~/_Lecture_k8s_starter.kit/ch4/4.1/del-deploy.yaml
deployment.apps/del-deploy created
  • 이전에 사용한 deployment를 통해 3개의 pod 배포
[root@m-k8s ~]# kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
del-deploy-57f68b56f7-gxhnx   1/1     Running   0          25s
del-deploy-57f68b56f7-qkx8h   1/1     Running   0          25s
del-deploy-57f68b56f7-rqnbm   1/1     Running   0          25s
  • 3개의 Pod가 배포된 것을 확인할 수 있다
  • 하지만 워커 노드의 kubelet에 문제가 발생하면 배포가 정상적으로 이루어지지 않는다
    • 즉, 문제가 생긴 워커 노드에는 배포가 진행되지 않는다
    • 문제가 없는 워커 노드에만 배포가 진행됨

다음에는 워커 노드의 Container Runtime에 문제가 발생한 경우를 살펴보자.

02-2. Container Runtime 문제 발생

systemctl stop docker
  • 워커 노드의 Docker 서비스를 중단한다
  • 아래 명령어를 통해 워커 노드의 Container Runtime 확인이 가능하다
[root@w1-k8s ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Mon 2022-08-08 23:41:49 KST; 24s ago
     Docs: <https://docs.docker.com>
  Process: 963 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/SUCCESS)
 Main PID: 963 (code=exited, status=0/SUCCESS)

Aug 08 23:34:26 w1-k8s dockerd[963]: time="2022-08-08T23:34:26.095743506+09:00" level=info ...te"
Aug 08 23:34:27 w1-k8s dockerd[963]: time="2022-08-08T23:34:27.272278644+09:00" level=info ...te"
Aug 08 23:41:47 w1-k8s systemd[1]: Stopping Docker Application Container Engine...
Aug 08 23:41:47 w1-k8s dockerd[963]: time="2022-08-08T23:41:47.865059458+09:00" level=info ...d'"
Aug 08 23:41:49 w1-k8s dockerd[963]: time="2022-08-08T23:41:49.044411976+09:00" level=info ...te"
Aug 08 23:41:49 w1-k8s dockerd[963]: time="2022-08-08T23:41:49.428976728+09:00" level=info ...te"
Aug 08 23:41:49 w1-k8s dockerd[963]: time="2022-08-08T23:41:49.636290997+09:00" level=info ...te"
Aug 08 23:41:49 w1-k8s dockerd[963]: time="2022-08-08T23:41:49.798211217+09:00" level=info ...te"
Aug 08 23:41:49 w1-k8s dockerd[963]: time="2022-08-08T23:41:49.839780629+09:00" level=info ...te"
Aug 08 23:41:49 w1-k8s systemd[1]: Stopped Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
  • 정상적으로 Docker가 중지된 것을 확인할 수 있다
  • 다음으로는 마스터 노드 내에서 추가적인 Pod 배포를 진행 해보자
kubectl scale deployment del-deploy --replicas=6
  • 기존에 배포가 되어있는 파드의 Replica를 scale out 한다
[root@m-k8s ~] kubectl get po -o wide
NAME                          READY   STATUS    RESTARTS   AGE    IP               NODE     NOMINATED NODE   READINESS GATES
del-deploy-57f68b56f7-gxhnx   1/1     Running   0          5m3s   172.16.103.132   w2-k8s   <none>           <none>
del-deploy-57f68b56f7-jj9c8   1/1     Running   0          26s    172.16.103.134   w2-k8s   <none>           <none>
del-deploy-57f68b56f7-k7lsr   1/1     Running   0          26s    172.16.132.8     w3-k8s   <none>           <none>
del-deploy-57f68b56f7-mpr7q   1/1     Running   0          26s    172.16.132.7     w3-k8s   <none>           <none>
del-deploy-57f68b56f7-qkx8h   1/1     Running   0          5m3s   172.16.103.133   w2-k8s   <none>           <none>
del-deploy-57f68b56f7-rqnbm   1/1     Running   0          5m3s   172.16.132.6     w3-k8s   <none>           <none>
  • 현재 문제가 발생한 노드는 w1-k8s 서버다
  • 컨테이너 런타임에 문제가 생긴 경우 kubelet이 이를 감지하여 해당 서버에는 배포를 하지 않는다
  • Docker 서비스를 다시 키고 9 개로 scale을 하면 다시 복구가 되는 것을 확인 가능하다

03. 마스터 노드 문제 발생

마스터 노드에 문제가 생기면 정말 힘들어진다.. 해당 부분 알아보자

03-1. 스케쥴러 삭제 된다면?

[root@m-k8s ~]# kubectl get pod -n kube-system -o wide
NAME                                       READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
calico-kube-controllers-744cfdf676-kq77l   1/1     Running   2          9d    172.16.171.73   m-k8s    <none>           <none>
calico-node-46z26                          1/1     Running   2          9d    192.168.1.103   w3-k8s   <none>           <none>
calico-node-72rt8                          1/1     Running   3          9d    192.168.1.102   w2-k8s   <none>           <none>
calico-node-ttbpb                          1/1     Running   2          9d    192.168.1.10    m-k8s    <none>           <none>
calico-node-w7rmn                          1/1     Running   3          9d    192.168.1.101   w1-k8s   <none>           <none>
coredns-74ff55c5b-pbxzx                    1/1     Running   2          9d    172.16.171.71   m-k8s    <none>           <none>
coredns-74ff55c5b-w6npr                    1/1     Running   2          9d    172.16.171.72   m-k8s    <none>           <none>
etcd-m-k8s                                 1/1     Running   2          9d    192.168.1.10    m-k8s    <none>           <none>
kube-apiserver-m-k8s                       1/1     Running   2          9d    192.168.1.10    m-k8s    <none>           <none>
kube-controller-manager-m-k8s              1/1     Running   2          9d    192.168.1.10    m-k8s    <none>           <none>
kube-proxy-bhtlg                           1/1     Running   2          9d    192.168.1.10    m-k8s    <none>           <none>
kube-proxy-cvxnj                           1/1     Running   2          9d    192.168.1.102   w2-k8s   <none>           <none>
kube-proxy-j49fm                           1/1     Running   2          9d    192.168.1.103   w3-k8s   <none>           <none>
kube-proxy-vf5zl                           1/1     Running   3          9d    192.168.1.101   w1-k8s   <none>           <none>
kube-scheduler-m-k8s                       1/1     Running   2          9d    192.168.1.10    m-k8s    <none>           <none>
  • 이번에는 마스터 노드의 스케쥴러를 삭제 해보자
  • 여기서 우리가 죽일 시스템은 kube-scheduler-m-k8s다
[root@m-k8s ~]# kubectl delete pod kube-scheduler-m-k8s -n kube-system
pod "kube-scheduler-m-k8s" deleted
  • 마스터 노드에 존재하는 스케쥴러 Pod를 삭제 하였다
  • 그러면 어떻게 되는지 다음 내용을 살펴보자
[root@m-k8s ~]# kubectl get po -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-744cfdf676-kq77l   1/1     Running   2          9d
calico-node-46z26                          1/1     Running   2          9d
calico-node-72rt8                          1/1     Running   3          9d
calico-node-ttbpb                          1/1     Running   2          9d
calico-node-w7rmn                          1/1     Running   3          9d
coredns-74ff55c5b-pbxzx                    1/1     Running   2          9d
coredns-74ff55c5b-w6npr                    1/1     Running   2          9d
etcd-m-k8s                                 1/1     Running   2          9d
kube-apiserver-m-k8s                       1/1     Running   2          9d
kube-controller-manager-m-k8s              1/1     Running   2          9d
kube-proxy-bhtlg                           1/1     Running   2          9d
kube-proxy-cvxnj                           1/1     Running   2          9d
kube-proxy-j49fm                           1/1     Running   2          9d
kube-proxy-vf5zl                           1/1     Running   3          9d
kube-scheduler-m-k8s                       1/1     Running   2          56s
  • 마스터 노드에 존재하는 녀석들은 삭제를 하여도 바로 재 생성한다
  • 다른 녀석들도 삭제를 진행 하여도 마찬가지로 복구가 된다

03-2. 마스터 노드의 kubelet 중단된다면?

systemctl stop kubelet
  • 마스터 노드의 kubelet 중단되는 경우를 실습 해보자
  • 후에 다시 한번 스케쥴러를 삭제 해보자
[root@m-k8s ~]# kubectl delete pod kube-scheduler-m-k8s -n kube-system
pod "kube-scheduler-m-k8s" deleted
  • 해당 명령어를 통해 kube-system에 존재하는 스케쥴러 삭제
  • 하지만 실제로 삭제가 되지 않고, 커멘드창이 멈추게 된다
  • Ctrl + C를 통해 빠져 나온다
[root@m-k8s ~]# kubectl get po -n kube-system
NAME                                       READY   STATUS        RESTARTS   AGE
calico-kube-controllers-744cfdf676-kq77l   1/1     Running       2          9d
calico-node-46z26                          1/1     Running       2          9d
calico-node-72rt8                          1/1     Running       3          9d
calico-node-ttbpb                          1/1     Running       2          9d
calico-node-w7rmn                          1/1     Running       3          9d
coredns-74ff55c5b-pbxzx                    1/1     Running       2          9d
coredns-74ff55c5b-w6npr                    1/1     Running       2          9d
etcd-m-k8s                                 1/1     Running       2          9d
kube-apiserver-m-k8s                       1/1     Running       2          9d
kube-controller-manager-m-k8s              1/1     Running       2          9d
kube-proxy-bhtlg                           1/1     Running       2          9d
kube-proxy-cvxnj                           1/1     Running       2          9d
kube-proxy-j49fm                           1/1     Running       2          9d
kube-proxy-vf5zl                           1/1     Running       3          9d
kube-scheduler-m-k8s                       1/1     Terminating   2          3m1s
  • 현재 Pod의 상태를 보면 Terminating 상태인 것을 확인 가능
    • 삭제를 시도하고 있는 것으로 보여짐
  • kubelet에 명령어가 가야 하는데, 현재 kubelet이 중단된 상황이여서 삭제가 안됨
  • 그러면 여기서 워커 노드에 배포가 가능할까? 한번 배포를 해보자
[root@m-k8s ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
  • Pod 생성이 가능한지 한번 더 확인
[root@m-k8s ~]# kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
del-deploy-57f68b56f7-bndkj   1/1     Running   0          9m46s
del-deploy-57f68b56f7-gxhnx   1/1     Running   0          17m
del-deploy-57f68b56f7-jj9c8   1/1     Running   0          12m
del-deploy-57f68b56f7-k7lsr   1/1     Running   0          12m
del-deploy-57f68b56f7-lqcs9   1/1     Running   0          9m46s
del-deploy-57f68b56f7-mpr7q   1/1     Running   0          12m
del-deploy-57f68b56f7-nhrk6   1/1     Running   0          9m46s
del-deploy-57f68b56f7-qkx8h   1/1     Running   0          17m
del-deploy-57f68b56f7-rqnbm   1/1     Running   0          17m
nginx-6799fc88d8-fbzzc        1/1     Running   0          22s
  • kubelet이 정지 되었음에도 불구하고 nginx pod는 정상적으로 배포가 되었다
  • 그렇다면 스케쥴링 역시 동작이 잘 될까?
kubectl scale deployment nginx --replicas=3
  • 기존 배포한 nginx의 replica를 3개로 증설한다
  • kubelet이 멈춘 상황인데 배포가 제대로 될까?…
[root@m-k8s ~]# kubectl get po
NAME                          READY   STATUS              RESTARTS   AGE
del-deploy-57f68b56f7-4j9r5   1/1     Running             0          28m
del-deploy-57f68b56f7-bmpqr   1/1     Running             0          28m
del-deploy-57f68b56f7-j2hjr   1/1     Running             0          30m
del-deploy-57f68b56f7-sqbhz   1/1     Running             0          30m
del-deploy-57f68b56f7-w6tf2   1/1     Running             0          28m
del-deploy-57f68b56f7-wl8mj   1/1     Running             0          30m
nginx-6799fc88d8-97c57        0/1     ContainerCreating   0          6s
nginx-6799fc88d8-bsqxm        1/1     Running             0          53s
nginx-6799fc88d8-qhr7t        0/1     ContainerCreating   0          6s
  • 우려와는 다르게 배포가 정상적으로 되는 것을 확인할 수 있다
[root@m-k8s ~]# curl 172.16.132.20

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

  • curl도 정상적으로 실행이 된다

03-3. 마스터 노드의 컨테이너 런타임 중단

systemctl stop docker
  • 마스터 노드의 도커를 중단한다
[root@m-k8s ~]# kubectl get po
The connection to the server 192.168.1.10:6443 was refused - did you specify the right host or port?
  • 마스터 노드 내에서 파드 내역을 확인하지만 통신이 되지를 않는다
  • 마스터 노드의 컨테이너 런타임에 문제가 생길 시 크리티컬한 이슈가 발생한다
  • 즉, 마스터 노드의 컨테이너 런타임에는 문제가 발생하지 않도록 유의하여야 한다

참고 자료

블로그의 정보

기록하고, 복기하고

ymkim

활동하기