728x90
파드 자체에 문제가 생기거나, 파드 내부에서 동작 중인 컨테이너에 문제가 생길 수 있는데, 두 가지 상황에 대해 자동 복구가 가능하다.
컨테이너 자동 복구
- 파드에서 동작 중인 컨테이너에 문제 발생 시, 파드가 컨테이너를 자동으로 재시작하거나 교체하여 항상 정상 작동을 유지할 수 있도록 노력한다.
- self-healing이라고도 한다.
[root@m-k8s ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
echo-hname-7894b67f-8mb7s 1/1 Running 0 101m 172.16.132.1 w3-k8s <none> <none>
echo-hname-7894b67f-kflct 1/1 Running 0 101m 172.16.103.129 w2-k8s <none> <none>
echo-hname-7894b67f-srpb2 1/1 Running 0 101m 172.16.221.129 w1-k8s <none> <none>
nginx-pod 1/1 Running 0 101m 172.16.132.2 w3-k8s <none> <none>
[root@m-k8s ~]# kubectl exec -it nginx-pod -- /bin/bash
root@nginx-pod:/# cat /run/nginx.pid
1
root@nginx-pod:/# ls -l /run/nginx.pid
-rw-r--r--. 1 root root 2 Jun 26 02:32 /run/nginx.pid
[root@m-k8s ~]# i=1; while true; do sleep 1; echo $((i++)) `curl --silent 172.16.132.2 | grep title`; done
1 <title>Welcome to nginx!</title>
2 <title>Welcome to nginx!</title>
3 <title>Welcome to nginx!</title>
4 <title>Welcome to nginx!</title>
5 <title>Welcome to nginx!</title>
6 <title>Welcome to nginx!</title>
7 <title>Welcome to nginx!</title>
8
9
10
...
50
51
52 <title>Welcome to nginx!</title>
53 <title>Welcome to nginx!</title>
54 <title>Welcome to nginx!</title>
55 <title>Welcome to nginx!</title>
- nginx-pod에 접속하여 실행중인 프로세스의 pid를 확인한다.
- nginx 컨테이너는 6/26/02:32에 시작되었다.
- nginx-pod에 대해 1초마다 title을 요청한다.
[root@m-k8s ~]# kubectl exec -it nginx-pod -- /bin/bash
root@nginx-pod:/# kill 1
root@nginx-pod:/# command terminated with exit code 137
- nginx-pod에 접속해서 pid=1을 가진 프로그램을 종료시키면 command가 종료된다.
[root@m-k8s ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
echo-hname-7894b67f-8mb7s 1/1 Running 0 117m
echo-hname-7894b67f-kflct 1/1 Running 0 117m
echo-hname-7894b67f-srpb2 1/1 Running 0 117m
nginx-pod 0/1 CrashLoopBackOff 2 116m
[root@m-k8s ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
echo-hname-7894b67f-8mb7s 1/1 Running 0 117m
echo-hname-7894b67f-kflct 1/1 Running 0 117m
echo-hname-7894b67f-srpb2 1/1 Running 0 117m
nginx-pod 1/1 Running 3 117m
[root@m-k8s ~]# kubectl exec -it nginx-pod -- /bin/bash
root@nginx-pod:/# ls -l /run/nginx.pid
-rw-r--r--. 1 root root 2 Jun 26 04:27 /run/nginx.pid
- pod는
CrashLoopBackOff
상태를 보인다. 내부에서 문제가 발생한 것이다. 여기서 문제는 nginx 프로세스가 강제 종료된 것이다. - 몇 초 뒤 다시 pod를 보면 pod가 컨테이너를 자동 재시작하여 다시
Running
상태로 변경된 것을 확인할 수 있고,RESTARTS
의 수가 1 증가한 것도 확인할 수 있다. pod 자체가 재시작한 것이 아니므로AGE
는 변경되지 않는다. - nginx-pod에 접속하여 프로세스를 확인하면 6/26/04:27에 시작된 것임을 확인할 수 있다.
파드 자체 자동 복구
- 레플리카셋으로 원하는 파드의 갯수를 설정해두면 파드에 문제가 생겼을 때 자동으로 파드가 재시작하거나 새로 생성된다.
[root@m-k8s ~]# kubectl delete pods nginx-pod
pod "nginx-pod" deleted
[root@m-k8s ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
echo-hname-7894b67f-8mb7s 1/1 Running 0 124m
echo-hname-7894b67f-kflct 1/1 Running 0 124m
echo-hname-7894b67f-srpb2 1/1 Running 0 124m
[root@m-k8s ~]# kubectl delete pods echo-hname-7894b67f-8mb7s
pod "echo-hname-7894b67f-8mb7s" deleted
[root@m-k8s ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
echo-hname-7894b67f-kflct 1/1 Running 0 126m
echo-hname-7894b67f-srpb2 1/1 Running 0 126m
echo-hname-7894b67f-vj657 1/1 Running 0 36s
[root@m-k8s ~]# kubectl delete deployment echo-hname
deployment.apps "echo-hname" deleted
[root@m-k8s ~]# kubectl get pod
No resources found in default namespace.
- nginx-pod는 run으로 실행하여 단일 실행한 pod이므로 삭제시 그대로 삭제된다.
- deployment에 의해 관리되는 echo-hname-* pod의 경우 삭제해도 pod의 갯수가 그대로 유지되어 있다. 이것은 replica에 원하는 pod의 갯수를 설정해두었기 때문에 pod가 삭제되어도 다시 생성되는 것이다.
- 파드가 삭제된 후 재생성되는 것이기 때문에
RESTARTS
의 숫자가 증가하지 않는다. 새로 생성되었기 때문에AGE
는 변경되었다. - deployment에 의해 관리되는 pod를 삭제하기 위해서는 deployment를 삭제해야 한다.
728x90