1. LivenessProbe로 Self-healing Pod 만들기

Self-healing : 문제 없는 컨테이너로만 어플리케이션 서비스 할 수 있도록 보장해주는 기능

https://kubernetes.io/

 

Kubernetes

Run K8s Anywhere Kubernetes is open source giving you the freedom to take advantage of on-premises, hybrid, or public cloud infrastructure, letting you effortlessly move workloads to where it matters to you.

kubernetes.io


Liveness Probe

  • Pod가 지속 실행할 수 있음을 보장(건강검진)
  • Pod의 spec에 정의
#Pod-definition(일반적인 파드)
apiVersion: v1
kind: Pod
metadata:
 name: nginx-pod
spec:
 containers:
 - name: nginx-container
   image: nginx:1.14
   
   
#livenessProbe definition
apiVersion: v1
kind: Pod
metadata:
 name: nginx-pod
spec:
 containers:
 - name: nginx-container
   image: nginx:1.14
   livenessProbe:		#livenessProbe pod 설정 : http 프로토콜을 통해 80포트로 /의 페이지로 주기적으로 접속
    httpGet:		#응답이 없을 경우 컨테이너에 문제가 생긴 것으로 판단
     path: /
     port: 80

livenessProbe 매커니즘

httpGet probe
  • 지정한 IP주소, port, path에 HTTP GET 요청을 보내 해당 컨테이너가 응답하는 지 확인
  • 반환코드가 200이 아닌 값이 나오면 오류라고 판단하고 컨테이너를 다시 시작한다.
  • 어떤 형식으로든 Web service를 제공하고 있다면 테스트 가능
livenessProbe:
 httpGet
  path: /
  port: 80
  1. Running 중인 파드의 컨테이너(ex. nginx)에게 80포트를 통해 루트(/) 페이지에서 주기적으로 HTTP GET 테스트
  2. 200이 아닌 다른 값(ex. 500)이 연속 세 번 반복되면 문제가 생긴 것으로 판단
  3. 해당 컨테이너를 kill
  4. 도커 허브에서 새로운 컨테이너를 가져와 실행(restart)

 

tcpSocket probe
  • 지정한 포트에 TCP 연결을 시도
  • 연결되지 않으면 컨테이너를 다시 시작한다.
livenessProbe:
 tcpSocket:
  port: 22
  1. Running 중인 파드의 컨테이너(ex. sshd)에게 22포트(TCP)를 통해 주기적으로 연결 테스트
  2. 연결 불가가 연속 세 번 반복되면 문제가 생긴 것으로 판단
  3. 해당 컨테이너를 kill 
  4. 도커 허브에서 새로운 컨테이너를 가져와 실행(restart)

 

exec probe
  • exec 명령을 전달하고 명령의 종료코드가 0이 아니면 컨테이너를 다시 시작
livenessProbe:
 exec:
  command:
  - ls
  - /data/file
  1. Running 중인 파드의 컨테이너가 백엔드의 특정 DB에서 데이터를 가져와 서비스할 때 데이터가 유효한지 테스트
  2. 내용 확인 불가가 연속 세 번 반복되면 문제가 생긴 것으로 판단
  3. 해당 컨테이너를 kill 
  4. 도커 허브에서 새로운 컨테이너를 가져와 실행(restart)

* 파드가 아닌 컨테이너를 kill & restart 하는 것이므로 Pod IP는 바뀌지 않음!


livenessProbe 매개 변수

  • periodSeconds : health check 반복 실행 시간(초)
  • initialDelaySeconds : Pod 실행 후 delay할 시간(초)
  • timeoutSeconds : health check 후 응답을 기다리는 시간(초)
#Pod-definition
apiVersion: v1
kind: Pod
metadata:
 name: nginx-pod
spec:
 containers:
 - name: nginx-container
   image: nginx:1.14
   
   
#livenessProbe definition
apiVersion: v1
kind: Pod
metadata:
 name: nginx-pod
spec:
 containers:
 - name: nginx-container
   image: nginx:1.14
   livenessProbe:
    httpGet:
     path: /
     port: 80
     
    initialDelaySeconds: 15		#값 입력하지 않을 경우 default값
    periodSeconds: 20
    timeoutSeconds: 1
    successThreshold: 1
    failureThreshold: 3

livenessProbe default 설정 값을 보면 다음과 같음을 알 수 있다.


livenessProbe example

 

liveness Probe는 Pod의 spec에 정의한다.

아래 example에서 사용한 smlinux/unhealthy 컨테이너는 HTTP connection이 있을 때마다 내부 서버오류로 HTTP 500 ERROR가 발생한다.

cat 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
```

kubectl create -f pod-nginx-liveness.yaml
kubectl describe pod nginx-pod-liveness

Error가 발생하여 컨테이너 restart 하는 모습


Exercise

[문제]

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

  • 동작되는 Pod 내의 컨테이너에 /tmp/healthy 파일이 있는지 5초마다 확인한다.
  • Pod 실행 후 10초 후부터 검사한다.
  • 성공횟수는 1번, 실패횟수는 연속 2회로 구성한다.

 

[정답]