[Kubernetes] 파드, 마스터, 워커 노드 문제 발생 시
by ymkim01. 쿠버네티스 파드에 문제가 생긴 경우
이번 시간에는 쿠버네티스 파드에 문제가 생긴 경우 어떻게 문제를 해결하는지 알아보자.
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?
- 마스터 노드 내에서 파드 내역을 확인하지만 통신이 되지를 않는다
- 마스터 노드의 컨테이너 런타임에 문제가 생길 시 크리티컬한 이슈가 발생한다
- 즉, 마스터 노드의 컨테이너 런타임에는 문제가 발생하지 않도록 유의하여야 한다
참고 자료
'Containerize > Kubernetes - 쉽게 시작하는 k8s' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 구성 요소 확인(+EKS, AKS, GKE)과 파드 배포 흐름 (0) | 2023.04.25 |
---|---|
[Kubernetes] 파드, 서비스, 로드밸런서를 통한 서비스 배포 (0) | 2023.04.25 |
[Kubernetes] 코드로 쉽게 구성하는 쿠버네티스 랩 환경 (0) | 2023.04.25 |
[Kubernetes] 쿠버네티스란? (0) | 2023.04.25 |
블로그의 정보
기록하고 정리하는 공간
ymkim