나그네소

kubernetes livenessProbe 본문

Cloud/Kubernetes

kubernetes livenessProbe

나그네소티 2022. 11. 9. 20:17

kubernetes 에서 자랑 하는 기능으로 문제가 있는 컨테이는 libenessprobe을 사용하여

재기동 해주는 기능을 제공 한다.

 

1. LivenessProbe

컨테이너가 재대로 동작 되지 않고 있을 때 자동으로 재기동 시켜준다. livenessProbe를 이용해
self-healing pod(kubelet으로 컨테이너 진단)
:컨테이너가 문제없으면 계속 진행 문제있으면 진단해서 재 기동.
 

2.  Liveness Probe(1)

  • pod가 계속 실행 할 수 있음을 보장
  • pod의 spec에 정의
Pod-definition(일반 POD)
livenessProbe definition(live 적용 pod)
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-container
     image: nginx:1.14
 
: web server container
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14
    livenessProbe:
      httpGet:
        path: /
        port: 80

 

2-1) LivenessProbe 단계 (건강검진)

  • httpGet : Web으로 check 하겠다.
  • path :  root에서
  • port : 80 port을 이용하여

 

3. Liveness Probe(2)

건강 검진을 하는데 문제의 이슈가 여러개 있을 수 있다. 배가 아픈지 허리가 아픈지 아픈 부위에 따라검진을 하는 방식이 달라야 하는데 livenessprobe는 3가지 형태의 검진 방법이 있다.

 

3-1) livenessProbe 매커리즘

livenessProbe 3가지에 대하여 알아 본다.

httpGet probe(web probe 지원) : 지정한 IP 주소, port, path에 http get 요청을 보내, 해당 컨테이너가   응답하는지를 확인한다. 반환코드가 200이 아닌 값이 나오면 오류, 컨테이너를 다시 시작한다.

: web 관련 port로 요청하여 문제가 없는지 판단.
(연속해서 세번 실패하면 문제가 있다 판단해서 컨테이너를 다시 죽이고 다시 hub에서 다신 컨테이너를 받아서
기동 시킨다)
livenessProbe:
  httpGet:
    path:/
    port: 80

 

◆ tcpSocket probe : 지정된 포트에 TCP연결을 시도 연결되지 않으면 컨테이너를 다시 시작한다.

livenessProbe:
  tcpSocket:
    port: 22

: 해당 되는 열려 있는 port로 접속해서 접속되면 건강 하다 판단.
 

exec probe: exec 명령을 전달하고 명령의 종료 코드가 0이 아니면 컨테이너를 다시 시작한다.

livenessProbe:
  exec:
    command:
    - ls
    - /data/file

주기적으로 db에서 data를 가져오는 컨테이너가 있을 시  그데이터가 pod 안에서 있는지 주기적으로 체크 한다.

 

중요 : pod를 restart 시키는게 아니라 컨테이를 restart를 시켜주는 것이다. 컨테이너를 restart 시켜주는 것이기 때문에POD의 IP 정보는 바뀌지 않는다.( 쿠버네티스에서 진짜 자랑 하고 있는 것중에 하나이다.)

 

3. Liveness Probe(3)

  • liveness Probe 매게 변수
    • periodSeconds : health check 반복 실행 시간(초)
    • initialDelaySeconds: Pod 실행 후 delay할 시간(초)
    • timeoutSeconds: health check후 응답을 기다리는 시간(초)
Pod-definition(일반 POD)
livenessProbe definition(live 적용 pod)
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-container
     image: nginx:1.14
 
: web server container
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14
    livenessProbe:
      httpGet:
        path: /
        port: 80
======= 아래의 부분은 안쓰면 Default ========
      initialDelaySeconds: 15
      periodSeconds: 20
      timeoutSeconds: 1
      successThreshold: 1
      failureThreshold: 3

 

livenessProbe sample

kuber-master:/home/son_kube/tmp] cat pod-nginx-liveness.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-liveness
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14
    ports:
    - containerPort: 80
      protocol: TCP
    livenessProbe:
      httpGet:
        path: /
        port: 80

* livenessProbe describe

kuber-master:/home/son_kube/tmp] k describe pods nginx-pod-liveness
...
  nginx-container:
    Container ID:   containerd://6abcc22e84547275979b97c5129a0300be64233a29924ed510152f45dc6f48ae
    Image:          nginx:1.14
    Image ID:       docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Tue, 08 Nov 2022 09:08:17 +0900
    Ready:          True
    Restart Count:  0
    Liveness:       http-get http://:80/ delay=0s timeout=1s(몇초동안 응답이 없으면 오류인지) period=10s(얼마만에 점검 할건지) #success=1 #failure=3
......

 

* livenessProbe 옵션을 보고 싶을 때

kuber-master:/home/son_kube/tmp] k describe pods nginx-pod-liveness
....
livenessProbe:
      failureThreshold: 3
      httpGet:
        path: /
        port: 80
        scheme: HTTP
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1
    name: nginx-container
...

: livenessProbe default로 적용되는 옵션들의 이름을 알 수 있다.

 

livenessProbe example

liveness probe는 spec에 정의 한다. 아래 example의 smlinux/unhealthy container는 http connection있을 때 5번까지는
성공 그 이후에는 내부 서버 오류로 HTTP 500 Error을 발생 한다.

 

- pod-liveness.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-pod
spec:
  containers:
  - image: smlinux/unhealthy
    name: unhealthy-container
    ports:
    - containerPort: 8080
      protocol: TCP
    livenessProbe:
      httpGet:
        path: /
        port: 8080
 

step1. k apply -f pod-liveness.yaml

step2. describe 확인
k describe pods liveness-pod

Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  3m15s                default-scheduler  Successfully assigned default/liveness-pod to kuber-node2
  Normal   Pulled     2m43s                kubelet            Successfully pulled image "smlinux/unhealthy" in 31.04569481s
  Warning  Unhealthy  84s (x3 over 104s)   kubelet            Liveness probe failed: HTTP probe failed with statuscode: 500
  Normal   Killing    84s                  kubelet            Container unhealthy-container failed liveness probe, will be restarted
  Normal   Pulling    54s (x2 over 3m14s)  kubelet            Pulling image "smlinux/unhealthy"
  Normal   Created    52s (x2 over 2m43s)  kubelet            Created container unhealthy-container
  Normal   Started    52s (x2 over 2m42s)  kubelet            Started container unhealthy-container
  Normal   Pulled     52s                  kubelet            Successfully pulled image "smlinux/unhealthy" in 1.897735137s

kuber-master:/home/son_kube/tmp] k get pods -o wide
NAME                               READY   STATUS    RESTARTS      AGE     IP             NODE          NOMINATED NODE   READINESS GATES
goldilocks-g1n1-5876468c7f-4k9zh   1/1     Running   0             25m     10.244.1.228   kuber-node1   <none>           <none>
liveness-pod                       1/1     Running   3 (80s ago)   7m21s   10.244.2.44    kuber-node2   <none>           <none>

: 3번 재 수행 되었다는 것을 알 수 있다.

 

 

 

 

 

'Cloud > Kubernetes' 카테고리의 다른 글

kubernetes Pod - static Pod  (0) 2022.11.17
kubernetes init container pod  (0) 2022.11.09
kubernetes POD 동작 Flow  (0) 2022.11.09
kubernetes pod container 정리  (0) 2022.11.09
kubernetes yaml 템플릿 과 API  (0) 2022.11.09