Kubernetes Health Check (probe)

신동수·2024년 5월 6일
0

K8S

목록 보기
7/14

개요

  • 오랜 시간 동안 실행되는 많은 애플리케이션은 종종 오류가 날 수있다. 오류가 발생하였을 때에는 재 기동이 필요하거나, 트래픽 유입을 막을 필요가 있다.
  • 분산 시스템 및 마이크로서비스 아키텍처 환경의 수십 에서 수백 개가 되는 애플리케이션들을 관리하는 것은 매우 어려운 일이지만 이를 해결 해준 것이 Kubernetes 이며, Kubernetes는 컨테이너와 관련된 여러 기능을 제공한다.
  • 여러 기능 중 서비스의 가용성, 신뢰성을 보장해 주는 헬스체크 (Probe) 의 개념, 유형에 대하여 알아보고자 한다.

Kubernetes Probe

Liveness Probe


Liveness Probe를 사용하여 Container 가 활성화되어 올바르게 작동하는지 확인한다.
Kubernetes 는 주기적으로 Container 에 Health Check 요청을 Container 로 보내고 지정된 Timeout 시간 내에 응답을 받지 못하면 Container를 재기동 시킨다. 이를 통해 Pod의 상태를 실시간으로 모니터링하고, 문제가 발생한 경우 적시에 대응할 수 있다. 이는 Container 가 제대로 작동하지 않는 상황을 방지하여 신뢰성 확보에 기여한다.

예시

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      livenessProbe:
        httpGet:
          path: /health
          port: 8080
        initialDelaySeconds: 10
        periodSeconds: 5

해석 : /health 엔드포인트로 HTTP GET 요청을 주기적으로 보내고, 컨테이너가 시작된 후 10초 뒤부터 Probe가 시작된다. Probe는 5초마다 주기적으로 수행되며, 응답이 오는지 확인한다.

Readiness Probe


Readiness Probe 는 Container 가 트래픽을 수신할 준비가 되었는지 확인하는 데 사용된다. Kubernetes 는 주기적으로 Health Check 요청을 Container 로 보내고, 준비가 되었다는 응답 코드를 수신하면 트래픽을 수신할 준비가 된 컨테이너로 간주한다. 그 외에 다른 코드를 받으면 Kubernetes 는 트래픽을 수신할 준비가 될 때까지 로드밸런서 풀에서 해당 Container 를 제거한다. 이를 통해, Container 가 사용 가능한 상태인지를 실시간으로 확인하고, 사용 가능하지 않은 Pod에 대한 요청을 차단하여 가용성 확보에 기여한다.

예시

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      readinessProbe:
        tcpSocket:
          port: 8080
        initialDelaySeconds: 5
        periodSeconds: 10

해석 : 5초 후부터 컨테이너의 8080 포트로 TCP 소켓 연결을 확인하고, 10초마다 주기적으로 Probe를 수행한다.

Startup Probe

Startup Probe는 Container 가 올바르게 시작되었는지 확인하는 데 사용된다. Kubernetes는 시작 단계 동안 주기적으로 Health Check 요청을 Container 로 보낸다. 준비가 되었다는 응답 코드를 수신하면 Kubernetes는 해당 Container 가 정상적으로 기동되었다고 판단한다. 지정된 시간 초과 내에 응답을 수신하지 못하면 Kubernetes가 컨테이너를 다시 시작한다. 이를 통해 Liveness Probe 와 마찬가지로, 신뢰성 확보에 기여한다. 해당 Probe는 컨테이너 생성 시 동작하며, 헬스체크에 성공하면 더 이상 동작하지 않는다.

예시

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      startupProbe:
        tcpSocket:
          port: 8080
        failureThreshold: 30
        periodSeconds: 10

해석 : 8080 포트로 TCP 소켓 연결을 기다리며, 10초마다 주기적으로 Probe를 수행한다. 만약 30번의 연속 실패가 발생하면 컨테이너의 시작이 실패로 간주한다.

Startup Probe가 필요한 이유

1. Startup 및 Liveness Probe를 이용

2. Liveness Probe만 이용

위 그림을 비교하였을 때에 Startup Probe를 함께 사용하였을 때에 2가지 이점이 있는 것을 확인할 수 있다.
1. 애플리케이션 기동이 먼저 되면, 설정된 최대 시간보다 빨리 서비스를 할 수 있다. (Readiness Probe가 설정되어 있을 시, 유입이 되기 시작)
2. Liveness Probe의 설정을 조금 더 유연하게 할 수 있다. (Probe 주기, 최대 실패 횟수 등을 다르게 설정 가능)

Probe types

컨테이너가 정상적인지 아닌지를 체크하는 방법으로 다음과 같이 3가지 방식을 제공한다.

  • Command probe
  • HTTP probe
  • TCP probe

Command probe

  • 컨테이너의 상태 체크를 쉘 명령으로 수행한 결과에 따라 정상여부를 체크한다.
    • 결과값이 0이면 성공, 0이 아니면 실패로 간주한다.
  • "exec"으로 정의하고 "command : " 아래에 실행하고자 하는 쉘 명령을 기입한다.

예시

apiVersion: v1
kind: Pod
metadata:
  name: liveness-pod
spec:
  containers:
  - name: liveness-pod
    image: my-image
    ports:
    - containerPort: 8080
    livenessProbe: 
      exec:
        command:
        - cat
        - /healthy

해석 : liveness-pod라는 이름의 Pod를 생성하며, 이 Pod는 my-image 이미지를 사용하고 8080 포트를 사용한다. 또한, 컨테이너의 라이브니스를 확인하기 위해 /healthy 파일을 읽는 명령을 주기적으로 실행한다.

HTTP probe

  • 가장 많이 사용하는 Probe 방식으로 Http GET을 이용하여 컨테이너 상태를 체크한다.
  • 지정된 URL로 HTTP GET 요청을 보내, 리턴되는 HTTP 응답코드가 200~3xx이라면 정상으로 판단한다.

예시

apiVersion: v1
kind: Pod
metadata:
  name: readiness-pod
spec:
  replicas: 2
  selector:
    app: readiness-pod
  template:
    metadata:
      name: readiness-pod
      labels:
        app: readiness-pod
    spec:
      containers:
      - name: readiness-pod
        image: my-image
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /health
            port: 8080

해석 : readiness-pod라는 이름의 Pod를 생성하며, 2개의 복제본을 가진다. 이 Pod는 my-image 이미지를 사용하고 8080 포트를 사용하며, /health 경로로 HTTP GET 요청을 수행하여 준비 상태를 확인한다.

TCP probe

  • 지정된 포트에 TCP 연결을 시도하여, 연결이 성공되면 컨테이너가 정상인것으로 판단한다.

예시

apiVersion: v1
kind: Pod
metadata:
  name: liveness-pod-tcp
spec:
  containers:
  - name: liveness-pod-tcp
    image: my-image
    imagePullPolicy: Always
    ports:
    - containerPort: 8080
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5

해석 : liveness-pod-tcp라는 이름의 Pod를 생성한다. 이 Pod는 my-image 이미지를 사용하고 8080 포트를 사용한다. 또한, TCP 소켓을 사용하여 5초마다 한 번씩 8080 포트의 라이브니스를 확인한다.

Probe 옵션

Kubernetes Probe 유형 별 비교 설명 및 설정 시 조절 가능한 옵션

Liveness ProbeReadiness ProbeStartup Probe
On failure- 컨테이너 다시 시작- 컨테이너로의 트래픽 전송 중지- 컨테이너 다시 시작
Check types- Http
- Exec
- tcpSocket
- Http
- Exec
- tcpSocket
- Http
- Exec
- tcpSocket
Execute Timing- 컨테이너 실행 상태
- PosStart 후크 완료 후
- 시작 프로브가 완료된 후

- 컨테이너 실행 상태
- PosStart 후크 완료 후
- 시작 프로브가 완료된 후

- 컨테이너 실행 상태
- PosStart 후크 완료 후

Kubernetes Probe 적용 시 설정 가능한 옵션

VALUEDEFAULTDESCRIPTION
failureThreshold3Probe 시도가 해당 옵션에 설정된 수 만큼 연속으로 실패하면, Probe가 실패하였다고 판단한다.
Kubelet 은 Pod의 Ready 조건을 false 로 설정하고, Probe 유형 별 실패 시 동작을 수행합니다. 기본 값은 3 이다.
initialDelaySeconds0sContainer 가 시작된 후 부터 Startup, Liveness, Readiness Probe가 실행되기 전의 Delay 시간(초) 이다. 기본 값은 0초이며, 최소 값은 0초 이다.
periodSeconds10sProbe를 수행하는 빈도(초) 이다. 기본 값은 10초 이다.
successThreshold1Probe 시도가 실패 후부터 Probe가 성공했다고 판단하는 최소 연속 성공 횟수이다.
기본 값 및 최소 값은 1이다. Startup 및 Liveness Probe는 반드시 1 이어야 한다.
terminationGracePeriodSeconds

(Probe-level)
30sKubelet 이 Probe에 실패한 Container 의 종료를 트리거한 다음, Container Runtime 이 해당 Container 를 강제로 중지하는 사이에 대기하도록 설정한 유예 기간(초) 이다.기본 값은 30 초 이며, 최소 값은 1초 이다.
timeutSeconds1sProbe 시도 후 실패라고 간주하는 Timeout 시간입니다. 기본 값은 1초 이다.

참고 :
Kubernetes Probe

profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글

관련 채용 정보