Kubernetes

Kubernetes 기초 - Pod(3)

사실 나도 모름 2023. 12. 7. 03:32
  1. Pod 개념(복습) 및 사용
  2. livenessProbe를 사용한 self-healing Pod     ←   오늘 볼 내용
  3. init container
  4. infra container(pause) 이해
  5. static pod 만들기
  6. Pod에 resource 할당
  7. 환경변수를 이용해 컨테이너에 데이터 전달
  8. pod 구성 패턴의 종류

2. livenessProbe를 사용한 self-healing Pod

컨테이너가 제대로 동작하지 않을 때 컨테이너를 restart시킴으로 건강한 컨테이너들로만 애플리케이션 서비스를 보장해주겠다는 기능이다.

Pod - definition livenessProbe - definition
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: nginx:1.25
    name: webserver
    ports:
    - containerPort: 80




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

 

위 표는 webserver가 동작함에 있어서 HTTP GET 요청을 80번 포트로 보냄으로 컨테이너의 생사를 확인하도록 livenessProbe 라인을 추가한 것이다.

livenessProbe는 Pod의 spec부분에 입력한다.

 

livenessProbe 메커니즘

 

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

livenessProbe:
  httpGet:
    path: /
    port: 80

 

 

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

livenessProbe:
  tcpSocket:
    port: 22

 

 

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

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

 

 

쿠버네티스는 서비스 실행 보장을 위해 3연속 실패를 하면  컨테이너가 건강하지 않다고 판단하고 해당 파드를 죽이고 컨테이너 이미지를 가져와서 다시 실행한다.

중요한 것은 파드를 restart시키는 것이 아니라 container를 restart시키기 때문에 파드에 적용된 IP는 변경되지 않는다.

 

 

livenessProbe 매개변수

 

매개변수는 쓰지 않으면 기본값으로 적용이 되어 실행되지만 직접 커스터마이징할 수도 있다.

Pod - definition livenessProbe - definition
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: nginx:1.25
    name: webserver
    ports:
    - containerPort: 80










apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: nginx:1.25
    name: webserver
    ports:
    - containerPort: 80
      protocol: TCP
    livenessProbe:
      httpGet:
        path: /
        port: 80
    initialDelaySeconds: 15
    periodSeconds: 20
    timeoutSeconds: 1
    successThreshold: 1
    failureTreshold: 1

 

매개변수

  • initialDelaySeconds : Pod 실행 후 delay할 시간(초)
  • periodSeconds : healthy check 반복 실행 시간(초)
  • timeoutSeconds : healthy check 후 응답을 기다리는 시간(초)
  • successThreshold : 응답이 일정 횟수 성공해야 정상으로 간주(횟수)
  • failureThreshold : 응답이 일정 횟수 실패하면 컨테이너 재시작(횟수)

 

 

예제

 

실제로 livenessProbe가 컨테이너를 restart하는지 확인하기 위한 실험이다.

이미지는 smlinux/unhealthy를 사용했으며 해당 이미지는 http get 요청을 5번까지는 200을 반환하지만 6번째 부터는 500을 반환하여 오류를 발생시킨다.

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

 

livenessProbe는 기본값으로 10초에 한번씩 상태 검사를 하므로 컨테이너가 실행된 순간부터 60초가 지나면 실패가 나온다.

그렇게 3번의 실패를 거듭하면 쿠버네티스는 컨테이너가 불능 상태로 간주하고 없앤 후 다시 만든다.

반환 코드 500번으로 Liveness prove failed 오류 발생
Unhealthy ×3이 되어 컨테이너를 Killing 후 다시 이미지를 Pulling하여 컨테이너restart
RESTARTS 횟수 1 증가

 

약간의 오차가 있지만 livenessProbe가 정상적으로 잘 작동하고 있다.

 

 

실습

 

아래의 liveness-exam.yaml 파일에 self-healing 기능을 추가하시오.

  • 동작되는 Pod내의 컨테이너에 /tmp/healthy 파일이 있는지 5초마다 확인한다.
  • Pod 실행 후 10초 후부터 검사한다.
  • 성공횟수는 1번 실패횟수는 연속 2회로 구성한다.
# 문제
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exam
spec:
  containers:
  - name: busybox-container
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600

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

 

 

 

 


 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - Pod(5)  (0) 2023.12.07
Kubernetes 기초 - Pod(4)  (0) 2023.12.07
Kubernetes 기초 - Pod(2)  (0) 2023.12.06
Kubernetes 기초 - Pod(1)  (0) 2023.12.06
Kubernetes 기초 - 동작 원리  (0) 2023.12.06