코알못

[CKA] Kubernetes Self-healing LivenessProbe 본문

ETC

[CKA] Kubernetes Self-healing LivenessProbe

코린이s 2023. 8. 15. 18:08
728x90

쿠버네티스는 self-healing 기능이 있으며 Liveness Probe를 이용하면 해당 기능을 사용할 수 있다.

아래와 같이 spec.containers 부분에 정의하며 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: my-nginx
    image: nginx
    licenessProbe:
      httpGet:
        path: /
        port: 80

위에 httpGet 방식 포함하여 세가지가 있어 서비스에 맞게 사용하면 된다.

매커니즘 형식 어떻게 확인
httpGet httpGet:
  path: /
  port: 80
지정된 port, path를 주기적으로 호출하여 200이 아닌 값이 나오면 컨테이너 다시 시작
tcpSocket tcpSocket:
  port: 22
지정된 포트로 TCP 연결 시도하여 연결 되지 않으면 컨테이너 다시 시작
exec exec:
  command:
  - ls
  - /data/file
명령 전달하고 종료코드가 0이 아니면 컨테이너 다시 시작

우선 nginx yaml 파일을 생성한다.

[node1 ~]$ kubectl run my-nginx --image=nginx --dry-run=client -o yaml > nginx.yaml

그 다음 아래에 livenessProbe를 추가 해보자!

# nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: my-nginx
  name: my-nginx
spec:
  containers:
  - image: nginx
    name: my-nginx
    ports:
    - containerPort: 80
      protocol: TCP
    livenessProbe:
      httpGet:
        path: /
        port: 80

그리고 해당 yaml 파일로 컨테이너를 생성한다.

[node1 ~]$kubectl create -f nginx.yaml 
pod/my-nginx created
[node1 ~]$ kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          8s

해당 컨테이너에 대한 상세 정보를 보면 Liveness 부분에 default 값이 정의 되어 있다.

[node1 ~]$ kubectl describe pod my-nginx
..
    Liveness:       http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=3

각 의미하는 바와 만약 default 말고 설정 값을 변경하고 싶다면 yaml명을 보고 정의해주면 된다.

기능 내용 yaml 명
delay 체크 로직 언제 부터 시작할 것 인가 initalDelaySeconds
timeout 몇초 뒤에 응답 없으면 실패로 판단 할 것 인가 timeoutSeconds
period 간격을 어느정도 두고 체크 할 것 인가 periodSeconds
success 연속 몇번 성공해야 성공으로 판단 successThreshold
failure 연속 몇번으로 실패해야 실패로 판단 failureThreshold

현재 러닝중인 파드의 liveness 설정을 yaml 형태로 보고 싶다면 아래와 같이 -o 를 이용하여 확인 할 수 있다.

[node1 ~]$ kubectl get pod my-nginx -o yaml
...
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    livenessProbe:
      failureThreshold: 3
      httpGet:
        path: /
        port: 80
        scheme: HTTP
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1

정말 이슈가 있을때 liveness가 리스타트를 해주는지 확인을 위해 연습용 이미지인 smlinux/unhealthy 를 이용해보자!

해당 이미지는 5번째 호출까지 200을 리턴하며 그 이후에는 500을 리턴한다.

아래와 같이 yaml 파일을 생성한뒤

# liveness.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: my-nginx
  name: my-nginx
spec:
  containers:
  - image: smlinux/unhealthy
    name: liveness
    ports:
    - containerPort: 8080
      protocol: TCP
    livenessProbe:
      httpGet:
        path: /
        port: 8080

해당 파일을 이용하여 파드를 생성한다.

[node1 ~]$ kubectl create -f liveness.yaml 
pod/my-nginx created

최초에 러닝 상태이며 기본 liveness 설정이 있으니 10s 간격으로 8080을 호출 할 것이다.

NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          35s

80s 뒤에 다시 파드 상태를 보면 컨테이너가 재기동 되어 RESTARTS 부분에 1로 카운팅 된것을 볼 수 있다.

[node1 ~]$ kubectl get pods        
NAME       READY   STATUS    RESTARTS      AGE
my-nginx   1/1     Running   1 (10s ago)   2m11s

파드가 어떻게 되어  재기동 되었는지 보기 위해 describe를 통해 보면 75s 에 3번 fail 발생하여 컨테이너를 재기동 한것을 볼 수 있다.

[node1 ~]$ kubectl describe pod my-nginx
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  2m26s                default-scheduler  Successfully assigned default/my-nginx to node2
  Normal   Pulled     2m9s                 kubelet            Successfully pulled image "smlinux/unhealthy" in 16.619266941s (16.619284142s including waiting)
  Warning  Unhealthy  55s (x3 over 75s)    kubelet            Liveness probe failed: HTTP probe failed with statuscode: 500
  Normal   Killing    55s                  kubelet            Container liveness failed liveness probe, will be restarted
  Normal   Pulling    25s (x2 over 2m25s)  kubelet            Pulling image "smlinux/unhealthy"
  Normal   Created    25s (x2 over 2m9s)   kubelet            Created container liveness
  Normal   Pulled     25s                  kubelet            Successfully pulled image "smlinux/unhealthy" in 682.784937ms (682.820938ms including waiting)
  Normal   Started    24s (x2 over 2m8s)   kubelet            Started container liveness

이제 다른 예제로 busybox 이미지(리눅스에서 필요한 명령어들만 모아 놓은 이미지)를 이용하여 /tmp/healthy 파일을 생성한뒤 30s 뒤에 해당 디렉토리를 삭제 하도록 하고 

liveness 체크를 /tmp/healthy 파일 존재 여부로 잡아보자!

체크는 pod 실행뒤 10s뒤, 5s 마다 체크, 연속 1번 성공시 성공, 연속 2회 실패시 실패로 판단하도록 한다.

우선 아래 명령어를 통해 yaml 파일을 만들고

[node1 ~]$ kubectl run liveness --image=busybox --dry-run=client -o yaml > liveness-exec.yaml

yaml 파일에 liveness 부분과 디렉토리 삭제하는 명령어를 넣는다.

# liveness-exec.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: liveness
  name: liveness
spec:
  containers:
  - image: busybox
    name: liveness
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - ls /tmp/healthy
      initialDelaySeconds: 10
      periodSeconds: 5
      successThreshold: 1
      failureThreshold: 2

이제 해당 yaml 파일로 파드를 생성하면

$ kubectl create -f liveness-exec.yaml

파드가 정상적으로 생성 된 것을 볼 수 있다. 

[node1 ~]$ kubectl get pod liveness
NAME       READY   STATUS    RESTARTS   AGE
liveness   1/1     Running   0          10s

파드 정보를 보면 아래와 같이 원하는바대로 설정 되었으며 Events 부분을 보면 /tmp/healthy 파일을 찾지 못하여 리스타트 된것을 볼 수 있다.

[node1 ~]$ kubectl describe pod liveness
Liveness:       exec [ls /tmp/healthy] delay=10s timeout=1s period=5s #success=1 #failure=2

Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  2m48s                default-scheduler  Successfully assigned default/liveness to node2
  Normal   Pulled     2m47s                kubelet            Successfully pulled image "busybox" in 679.302748ms (679.342749ms including waiting)
  Normal   Pulled     97s                  kubelet            Successfully pulled image "busybox" in 695.942777ms (695.971378ms including waiting)
  Warning  Unhealthy  58s (x4 over 2m13s)  kubelet            Liveness probe failed: ls: /tmp/healthy: No such file or directory
  Normal   Killing    58s (x2 over 2m8s)   kubelet            Container liveness failed liveness probe, will be restarted
  Normal   Pulling    28s (x3 over 2m48s)  kubelet            Pulling image "busybox"
  Normal   Created    27s (x3 over 2m47s)  kubelet            Created container liveness
  Normal   Started    27s (x3 over 2m47s)  kubelet            Started container liveness
  Normal   Pulled     27s

다시 파드 RESTART 부분을 보면 카운트가 증가한것을 볼 수 있다.

[node1 ~]$ kubectl get pod liveness
NAME       READY   STATUS    RESTARTS      AGE
liveness   1/1     Running   5 (21s ago)   6m12s

끝!

728x90

'ETC' 카테고리의 다른 글

[CKA] kubernetes 리소스 조정(CPU,MEM)  (0) 2023.08.29
[CKA] Kubernetes init & infra & static container  (0) 2023.08.24
[CKA] yaml 및 APIVersion  (0) 2023.08.12
[CKA] Kubernetes 동작 원리 및 namespace  (0) 2023.08.12
[CKA] Pod 생성 하기  (0) 2023.08.11
Comments