[k8s] Probes
카테고리: k8s
태그: k8s
🎯Probes
Liveness: kubelet은 liveness probe를 사용하여 언제 포드를 다시 시작해야 하는지 파악합니다. 포드가 정상 상태로 간주되지 않는 경우 다시 시작됩니다.Readiness: kubelet은 readiness probe를 사용하여 포드가 트래픽을 수신할 수 있는지 파악합니다. 포드가 준비되지 않은 경우 서비스 로드밸런서에서 제거됩니다Startup Probes: kubelet은 startup probe를 사용하여 포드에서 기동중인 어플리케이션이 언제 시작할 준비가 완료되는지 파악합니다. startup probe가 성공하기 전까지 liveness probe와 readiness probe는 비활성화됩니다.
Handler
Probe에서 포드의 HealthCheck를 수행하는 데 사용 가능한 방법입니다.
- exec Command
- HTTP Request
- TCP Socket
- gRPC
Liveness Probe & exec Command
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
- 컨테이너는 시작되면
touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600명령을 수행합니다. - kubelet은 첫 번째 probe를 수행하기 전에 5초를 기다립니다. (initialDelaySeconds)
- kubelet은 5초마다 liveness probe를 수행합니다. (periodSeconds)
- kubelet은 probe를 수행하기 위해 cat 명령을 실행합니다.
- 컨테이너는 처음 30초 동안에는 /tmp/healthy 파일이 있으므로 cat /tmp/healthy 명령은 성공 코드를 반환합니다.
- 30초 후 cat /tmp/healthy 명령은 실패 코드를 반환합니다.
- liveness probe가 실패했으며 실패한 컨테이너가 종료되고 다시 시작됩니다.
- kubectl get pod 명령의 출력에는 RESTARTS 필드가 증가했음을 확인할 수 있습니다. (RESTARTS 카운터는 실패한 컨테이너가 실행 상태로 돌아오면 증가합니다.)
Liveness Probe & HTTP Request
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: registry.k8s.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
- kubelet은 첫 번째 probe를 수행하기 전에 3초를 기다립니다. (initialDelaySeconds)
- kubelet은 3초마다 liveness probe를 수행합니다. (periodSeconds)
- kubelet은 probe를 수행하기 위해 포트 8080에서 수신 대기 중인 HTTP 서버에 GET 요청을 보냅니다.
- HTTP 서버의 /healthz 경로에 대한 핸들러가 HTTP Request 핸들러가 성공 코드를 반환하면 kubelet은 컨테이너가 살아 있고 healty한 것으로 간주합니다. 핸들러가 실패 코드를 반환하면 kubelet은 컨테이너를 종료하고 다시 시작합니다.
Note:
- HTTP Request Handler의 경우 200보다 크거나 같고 400보다 작은 코드는 성공으로 간주하며 다른 코드는 실패로 간주합니다.
- 위 예제에서 사용된 컨테이너 애플리케이션은 처음 10초 동안 상태 200을 반환하고 그 후에는 상태 500을 반환하도록 코딩되었습니다.
Liveness Probe & Readiness Probe & TCP Socket
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: registry.k8s.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
- kubelet은 컨테이너가 시작된 후 5초 후에 첫 번째 readiness probe를 보냅니다. (readinessProbe.initialDelaySeconds)
- 포트 8080 으로 goproxy 컨테이너에 연결을 시도합니다.
- tcpSocker Handler가 성공하면 Pod가 준비됨으로 표시되고 트래픽을 수신할 수 있습니다.
- readinessProbe는 이후 10초마다 이 검사를 계속 실행합니다. (readinessProbe.periodSeconds)
- kubelet은 컨테이너가 시작된 후 10초 후에 첫 번째 liveness probe를 실행합니다.
- readiness probe와 유사하게 liveness probe는 포트 8080 으로 goproxy 컨테이너에 연결을 시도합니다.
- liveness probe가 실패하면 컨테이너가 다시 시작됩니다.
Note:
TCP 소켓 핸들러를 사용하면 kubelet은 지정된 포트에서 컨테이너에 대한 소켓을 열려고 시도합니다. 연결이 맺어지면 컨테이너가 healty한 것으로 간주되고 그렇지 않으면 실패로 간주됩니다.
startup Probe
ports:
- name: liveness-port
containerPort: 8080
hostPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 1
periodSeconds: 10
startupProbe:
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 30
periodSeconds: 10
- kubelet은 최대 5분(30 * 10 = 300초) 동안 애플리케이션 시작을 완료하는 데 사용할 수 있습니다.
- startup probe가 한 번 성공하면 liveness probe가 활성됩니다.
- startup probe가 성공하지 못하면 300초 후에 종료되고 포드의 restartPolicy가 적용됩니다.
명명된 포트 사용
HTTP 및 TCP 핸들러에 명명된 포트를 사용할 수 있습니다. (gRPC 핸들러는 명명된 포트를 지원하지 않습니다.)
ports:
- name: liveness-port
containerPort: 8080
hostPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: liveness-port
Configure Probes
liveness, readiness, statup Probe에서 HealthCheck 동작을 보다 정확하게 제어하는 데 사용할 수 있는 여러 필드가 있습니다.
| 필드 | 설명 |
|---|---|
initialDelaySeconds |
liveness, readiness, startup probe가 시작되기 전에 Delay 되는 시간(초)입니다. 기본 값은 0초입니다. |
periodSeconds |
Probe를 수행할 빈도(초)를 설정합니다. 기본 값은 10초입니다. (Minimum value is 1s) |
timeoutSeconds |
Probe가 tiemout(healthCheck 후 응답을 기다리는 시간)된 후 시간(초)입니다. 기본 값은 1초입니다. (Minimum value is 1s) |
sucessThreshold |
Probe가 실패한 후 성공한 것으로 간주되는 최소 연속 성공 횟수입니다. 기본 값은 1입니다. liveness 및 startup probe의 경우 1이어야 합니다. (Minimum value is 1) |
failureThreshold |
Probe가 실패한 후 failureThreshold 시간이 지나면 kubernetes는 전체 검사가 실패한 것으로 간주합니다. liveness probe의 경우 failureThreshold 시간 동안 성공으로 전환되지 않는 이상 kubernetes는 컨테이너를 비정상으로 취급하고 컨테이너에 대한 재시작을 트리거합니다. startup probe는 terminationGracePeriodSeconds 설정을 고려하여 실패한 컨테이너를 계속 실행하면서 다른 프로브도 가능한 계속 실행합니다. 다만 확인에 실패했기 때문에 kubelet은 Pod의 Ready condition을 false로 설정합니다. |
terminationGracePeriodSeconds |
kubelet이 실패한 컨테이너의 종료를 트리거한 다음 컨테이너 런타임이 해당 컨테이너를 강제로 중지하는 사이에 대기하도록 유예 기간을 설정합니다. 기본적으로 포드 설정 값을 상속하며 지정되지 않은 경우 30초입니다. (Minimum value is 1s) |
Note:
kubernetes 1.21 릴리즈 이전에는 liveness 또는 startup probe에 실패한 컨테이너를 종료하는 데 포드 수준의 terminationGracePeriodSeconds가 사용되었습니다. 이는 의도한 것이 아니었으며 Pod 수준의 terminationGracePeriodSeconds가 설정되었을 때 다시 시작하는 데 비정상적으로 오랜 시간이 걸리는 잠재적인 문제를 초래했습니다. kubernetes 1.25 릴리즈 이상에서는 사용자가 probe spec의 일부로 probe 수준의 terminationGracePeriodSeconds를 지정할 수 있습니다. Pod 및 Probe 수준의 terminationGracePeriodSeconds가 모두 설정된 경우 kubelet은 Probe 수준의 값을 우선합니다.
HTTP Handler
HTTP 핸들러에는 httpGet에서 설정할 수 있는 추가 필드가 있습니다.
host: 연결할 호스트 이름, 기본 값은 포드의 IP입니다.scheme: 호스트에 연결하는 데 사용할 프로토콜입니다. (HTTP 또는 HTTPS) 기본 값은 HTTP입니다.path: HTTP 서버에 액세스하기 위한 경로입니다. 기본 값은 ‘/’입니다.httpHeaders: 요청에 설정할 사용자 지정 헤더입니다.port: 컨테이너에 액세스할 포트의 이름 또는 번호입니다.
📌출처
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기