반응형

 

 

 

 

컨테이너 프로브(probe)

프로브 는 컨테이너에서 kubelet에 의해 주기적으로 수행되는 진단(diagnostic)이다. 진단을 수행하기 위해서, kubelet은 컨테이너 안에서 코드를 실행하거나, 또는 네트워크 요청을 전송한다.

 

 

Check 순서 

프로브를 사용하여 컨테이너를 체크하는 방법에는 4가지가 있다. 각 프로브는 다음의 4가지 메커니즘 중 단 하나만을 정의해야 한다.

  • exec - 컨테이너 내에서 지정된 명령어를 실행한다. 명령어가 상태 코드 0으로 종료되면 진단이 성공한 것으로 간주한다.
  • grpc - gRPC를 사용하여 원격 프로시저 호출을 수행한다. 체크 대상이 gRPC 헬스 체크를 구현해야 한다. 응답의 status 가 SERVING 이면 진단이 성공했다고 간주한다. gRPC 프로브는 알파 기능이며 GRPCContainerProbe 기능 게이트를 활성화해야 사용할 수 있다.
  • httpGet - 지정한 포트 및 경로에서 컨테이너의 IP주소에 대한 HTTP GET 요청을 수행한다. 응답의 상태 코드가 200 이상 400 미만이면 진단이 성공한 것으로 간주한다.
  • tcpSocket - 지정된 포트에서 컨테이너의 IP주소에 대해 TCP 검사를 수행한다. 포트가 활성화되어 있다면 진단이 성공한 것으로 간주한다. 원격 시스템(컨테이너)가 연결을 연 이후 즉시 닫는다면, 이 또한 진단이 성공한 것으로 간주한다.

 

프로브 결과

각 probe는 다음 세 가지 결과 중 하나를 가진다.

  • Success - 컨테이너가 진단을 통과함.
  • Failure - 컨테이너가 진단에 실패함.
  • Unknown - 진단 자체가 실패함(아무런 조치를 수행해서는 안 되며, kubelet이 추가 체크를 수행할 것이다)

 

 

프로브 종류

kubelet은 실행 중인 컨테이너들에 대해서 선택적으로 세 가지 종류의 프로브를 수행하고 그에 반응할 수 있다.

  • livenessProbe - 컨테이너가 동작 중인지 여부를 나타낸다. 만약 활성 프로브(liveness probe)에 실패한다면, kubelet은 컨테이너를 죽이고, 해당 컨테이너는 재시작 정책의 대상이 된다. 만약 컨테이너가 활성 프로브를 제공하지 않는 경우, 기본 상태는 Success 이다.
  • readinessProbe - 컨테이너가 요청을 처리할 준비가 되었는지 여부를 나타낸다. 만약 준비성 프로브(readiness probe)가 실패한다면, 엔드포인트 컨트롤러는 파드에 연관된 모든 서비스들의 엔드포인트에서 파드의 IP주소를 제거한다. 준비성 프로브의 초기 지연 이전의 기본 상태는 Failure 이다. 만약 컨테이너가 준비성 프로브를 지원하지 않는다면, 기본 상태는 Success 이다.
  • startupProbe - 컨테이너 내의 애플리케이션이 시작되었는지를 나타낸다. 스타트업 프로브(startup probe)가 주어진 경우, 성공할 때까지 다른 나머지 프로브는 활성화되지 않는다. 만약 스타트업 프로브가 실패하면, kubelet이 컨테이너를 죽이고, 컨테이너는 재시작 정책에 따라 처리된다. 컨테이너에 스타트업 프로브가 없는 경우, 기본 상태는 Success 이다.

 

 

 

 

 

Health Check 기능

livenessProve

# livenessProbe 커맨드를 추가하여 해당 Pod가 정상인지 health check
jinsu@jinsu:~$ cat liveness.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: liveness
spec:
  containers: 
  - name: mynginx
    image: nginx
    livenessProbe:
      httpGet:
        path: /
        port: 80

# READY 부분이 1/1로 정상임을 확인
jinsu@jinsu:~$ kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
liveness   1/1     Running   0          2m19s
jinsu@jinsu:~$

readnessProve

# readinessProve 커맨드를 추가하여 80포트를 Health check
jinsu@jinsu:~$ cat readiness.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: readiness
spec:
  containers: 
  - name: mynginx
    image: nginx
    readinessProbe:
      httpGet:
        path: /
        port: 80
jinsu@jinsu:~$ 

# READY 상태를 체크하여 1/1 정상임을 확인
jinsu@jinsu:~$ kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
liveness    1/1     Running   0          3m50s
readiness   1/1     Running   0          14s
jinsu@jinsu:~$

exec를 이용하여 health check

# readinessProbe와 exec를 추가하여 pod안에 moby파일이 여부에 따라 상태 체크
jinsu@jinsu:~$ cat readiness-command.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: readiness-command
spec:
  containers: 
  - name: mynginx
    image: nginx
    readinessProbe:
      exec:
        command: [ "ls", "/work-dir/moby" ]
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  initContainers:
  - name: git
    image: alpine/git
    command: ["sh"]
    args:
    - "-c"
    - "git clone https://github.com/moby/moby.git \
          /work-dir/moby"
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  volumes:
  - name: workdir
    emptyDir: {}
jinsu@jinsu:~$ 


jinsu@jinsu:~$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
readiness-command   0/1     Running   0          47s
jinsu@jinsu:~$

# moby 디렉토리를 삭제해봅니다.
jinsu@jinsu:~$ kubectl exec readiness-command -- rm -rf /work-dir/moby

jinsu@jinsu:~$ kubectl get pod                                        
NAME                READY   STATUS    RESTARTS   AGE
readiness-command   1/1     Running   0          2m17s
jinsu@jinsu:~$
# READY항복이 0으로 변경된것을 확인할 수 있습니다.
jinsu@jinsu:~$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
readiness-command   0/1     Running   0          2m36s
jinsu@jinsu:~$

 

 

 

 

참고자료

https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/

반응형

+ Recent posts