본문 바로가기
K8S

포드 모니터링

by Rainbound-IT 2021. 7. 28.
반응형

쿠버네티스에는 컨테이너 애플리케이션이 제대로 작동하는지 항상 감시하여 문제가 있으면 포드를 자동으로 재시작하는 장치가 있다.

 

 

컨테이너 애플리케이션의 감시

쿠버네티스에서는 포드가 가동되고 있는지를 포드안의 컨테이너 프로세스가 가동 중인지 아닌지로 판단한다.

하지만 프로세스는 가동중이지만 서비스로서는 제대로 움직이지 않을때가 있다.(ex. 프로세스 데드락걸려 리퀘스트 x)

이를 해결하기위해 Liveness Probe를 이용하여 응답을 확인한다. 

매니페스트에서 체크조건을 추가하면 활성화가 된다.

 

가동방식

  • HTTP 리퀘스트의 반환값을 체크한다.
  • TCP Socket으로 연결할 수 있는지를 체크한다.
  • 명령의 실행 결과를 체크한다.

 

Liveness Probe  적용해보기

웹 애플리케이션의 경우 특정 URL에 HTTP 리퀘스트를 보내, 그 반환값을 체크함으로써 애플리케이션이 정상적으로 움직이는지 확인한다.

# (1) 기본항목
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http

# (2) Pod 스펙
spec:

  # (3) 컨테이너
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:  # http 리퀘스트의 반환값에 따른 체크를 한다.
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 10
      periodSeconds: 5

이 매니페스트의 경우 Liveness Probe를 실행하기 위해

kubelet은 HTTP GET 리퀘스트를 컨테이너 안에서 실행되고 있는 /healthz:8080에 대해 송신합니다.

이 리퀘스트의 HTTP 스테이터스 코드가 200이상 400미만인 경우는 성공으로 간주. 그외는 오류로 간주하고 kubelet이 재시작한다.

 

또 매니페스트의 [initialDelaySeconds]필드는

포드가 시작된 이후 처음으로 감시를 실행 할때 까지의 시간을 나타내는것으로 10초로 설정되어있다.

[periodSeconds]는 Liveness Probe의 실행 간격이다.

 

initialDelaySecond가 10초므로 시작되기 10초전까지 /healthz 핸들러가 스테이터스 200을 반환한다.

그후 스테이터스는 400을 반환한다.(컨테이너 image가 그런식이라는 뜻인듯하다.)

 

10초후 에러를 일으키지만 5초 실행간격이라 다시실행된다.(메시지가 반복된다.)

 

 

TCP Socket으로 연결할 수 있는지 체크하기

http와 비슷하게 TCP socket에 연결을 할수 있는지 없는지로 체크가 가능하다.

livenessporbe에 tcpSocket을 설정한다.

# (1) 기본사항
apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp

# (2) Pod그펙
spec:

  # (3) 컨테이너 사양
  containers:
  - name: goproxy
    image: k8s.gcr.io/goproxy:0.1
    livenessProbe:
      tcpSocket:  # TCP 소켓 통신에 의한 체크를 한다.
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

이것은 주로 http 이외의 서비스를 체크할때 사용한다.

 

 

명령의 실행결과 체크하기

리퀘스트의 결과가 아닌 컨테이너 안에서 임의의 명령을 실행하여 그결과로 포드의 가동여부를 판단할 수 있다.

 

# (1) 기본사항
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec

# (2) Pod 스펙
spec:

  # (3) 컨테이너
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:   # 명령의 실행 결과에 의한 체크를 한다.
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10
      periodSeconds: 5

컨테이너 가동여부를 확인하기 위해 컨테이너 내부에서 cat명령을 실행하고

성공하면 0, 아니면 다른값을 반환하여 kubelet이 컨테이너 재시작을 한다.

컨테이너 안에서는 처음에 /tmp/healthy를 작성하고 그 후 30초 Sleep한 후 healthy 파일을 삭제하고 있다.

 처음 30초 후에는 파일이 존재해서 Liveness Probe는 감시에 성공하지만 30초후 삭제되어 오류가 발생할 것이다.

 

probe를 실행하기 위해 kubelet은 컨테이너 안에서 cat 명령을 실행한다. 

명령이 성공시 0반환하면서 성공으로 간주하고 이외라면 재시작을 한다.

처음 30초간은 실행이 잘된다.
30초가 지나면 파일이 삭제되서 오류가 발생되어 컨테이너가 재시작된다.(이게 반복이된다.)

 

 

kubectl delete -f [폴더명] 으로 하면 하위 파일이 한번에 삭제가 되는것같다.

 

 

반응형

'K8S' 카테고리의 다른 글

컨트롤 플레인  (0) 2021.09.30
리플리카셋으로 포드 관리  (0) 2021.08.02
노드의 리소스 관리  (0) 2021.07.28
관리 ID  (0) 2021.07.28
포드의 스케줄링 구조  (0) 2021.07.22

댓글