๐Ÿ”ŽKubernetes์˜ Container Probe๋ž€?

Kubernetes์—์„œ Pod๋ฅผ ๋ฐฐํฌํ•˜๋ฉด Pod์—์„œ ์ •์˜ํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ์š”. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•  ๋•Œ ๋น„๋กœ์†Œ Pod๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Pod๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๋‹ค๋ณด๋ฉด ๋™์ž‘ ์ค‘์ด๋˜ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๊ฐ€ ์ •์ƒ์ธ์ง€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธ์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜น์€ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•  ๋•Œ๋„ ์žˆ์ฃ .

์ด๋ ‡๊ฒŒ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ง„๋‹จํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ, Container Probe์ž…๋‹ˆ๋‹ค.

๐ŸฉบContainer Probe์˜ ์ง„๋‹จ ์œ ํ˜•๊ณผ Probe์˜ ์ข…๋ฅ˜

Kubernetes์˜ Container Probe๋Š” Manifest์˜ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ๋ฒจ์—์„œ ์ •์˜๋˜๋Š”๋ฐ์š”. ์ •์˜๋œ ์ง„๋‹จ ์„ค์ •์— ๋”ฐ๋ผ kubelet์ด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ง„๋‹จ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Probe๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด 4๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • exec
    • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด ์ง€์ •
    • ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 0์ด๋ฉด ์„ฑ๊ณต์œผ๋กœ ์ง„๋‹จ
    • exec๋Š” ์ˆ˜ํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— Node์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”
  • grpc
    • gRPC ์š”์ฒญ์œผ๋กœ ์ง„๋‹จํ•˜๋ฉฐ, gRPC Health Check์ด ๋ฏธ๋ฆฌ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์•ผ ํ•จ
    • ์‘๋‹ต status๊ฐ€ SERVING์ด๋ฉด ์„ฑ๊ณต์œผ๋กœ ์ง„๋‹จ
  • httpGet
    • ํŠน์ • port ๋ฐ path๋กœ Pod์˜ IP์— ๋Œ€ํ•ด HTTP GET ์š”์ฒญ์œผ๋กœ ์ง„๋‹จ
    • ์‘๋‹ต status code๊ฐ€ 200 ์ด์ƒ 400 ๋ฏธ๋งŒ์ด๋ฉด ์„ฑ๊ณต์œผ๋กœ ์ง„๋‹จ
  • tcpSocket
    • ํŠน์ • port๋กœ Pod์˜ IP์— ๋Œ€ํ•ด TCP ์š”์ฒญ์œผ๋กœ ์ง„๋‹จ
    • ํ•ด๋‹น port๊ฐ€ ์—ด๋ ค ์žˆ์œผ๋ฉด ์„ฑ๊ณต์œผ๋กœ ์ง„๋‹จ

์ด๋ ‡๊ฒŒ ์ˆ˜ํ–‰ํ•œ ์ง„๋‹จ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜ 3๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค.

  • Success: ์ง„๋‹จ ์„ฑ๊ณต
  • Failure: ์ง„๋‹จ ์‹คํŒจ
  • Unknown: ์ง„๋‹จ ์‹คํŒจ, Faliure์™€ ๋‹ฌ๋ฆฌ kubelet์ด ์ถ”๊ฐ€ ์ง„๋‹จ ์‹คํ–‰

kubelet์ด ์ˆ˜ํ–‰ํ•˜๋Š” Probe๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ์š”.

  • Readiness Probe
  • Liveness Probe
  • Startup Probe

๊ฐ Probe์— ๋Œ€ํ•ด ์•„๋ž˜์—์„œ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

โœจReadiness, Liveness, Startup Probe

Readiness Probe

Readiness Probe๋Š” ํŠธ๋ž˜ํ”ฝ๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”๋ฐ์š”. Readiness Probe๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋กœ ํŠธ๋ž˜ํ”ฝ์ด ๋“ค์–ด์˜ค๋Š” ์‹œ์ ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ ์ง„๋‹จ ๊ฒฐ๊ณผ๊ฐ€ ์„ฑ๊ณต์ธ ์‹œ์ ๋ถ€ํ„ฐ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ํŠธ๋ž˜ํ”ฝ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ Readiness Probe๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ฃ .

๊ฐ Probe๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ ˆ๋ฒจ์—์„œ ์ •์˜ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ์š”. ์•„๋ž˜ Pod Manifest ์˜ˆ์ œ๋กœ Probe๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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:  # Readiness Probe๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
      httpGet:
	    path: /healthz
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 10

์œ„ ์˜ˆ์ œ์—์„œ Readiness Probe๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์‚ดํŽด๋ณด๋ฉด ํ•ด๋‹น Probe์˜ ์ž‘๋™ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์œ„ Readiness Probe๋Š” HTTP GET ์š”์ฒญ์œผ๋กœ ์ง„๋‹จ ์ˆ˜ํ–‰ (httpGet)
  • HTTP GET ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” Port์™€ ๊ฒฝ๋กœ๋Š” 8080 ๋ฐ /healthz
  • kubelet์ด ์ฒซ Probe ์ง„๋‹จ์„ ์ˆ˜ํ–‰๋˜๋Š” ์‹œ์ ์€ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ›„ 15์ดˆ ๋’ค (initialDelaySeconds)
  • kubelet์€ 10์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ Probe ์ง„๋‹จ ์ˆ˜ํ–‰ (periodSeconds)

์œ„ ์˜ˆ์ œ์—์„  ์ปจํ…Œ์ด๋„ˆ์— readinessProbe ํ•˜๋‚˜๋งŒ ์ •์˜๋˜์—ˆ์ง€๋งŒ, ํ•„์š”์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด Probe๋ฅผ ์ข…๋ฅ˜๋ณ„๋กœ ๋ชจ๋‘ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Liveness Probe

Liveness Probe๋Š” ๋™์ž‘ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ง„๋‹จํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Kubernetes์— ๋ฐฐํฌ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค์— ์ด์Šˆ๊ฐ€ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๊ฐ€ Unhealthy์ธ ๊ฒฝ์šฐ, kubelet์ด ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ Pod์˜ restartPolicy(์žฌ์‹œ์ž‘ ์ •์ฑ…)์— ๋”ฐ๋ผ ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ๋•Œ๋ฌธ์— Liveness Probe๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Probe์˜ ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ์ง„๋‹จ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ข…๋ฃŒ ๋˜๋Š” ์žฌ์‹œ์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด Liveness Probe๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ๋ดค๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ๋ชจ๋“  Probe๋Š” spec.containers ๋ ˆ๋ฒจ์—์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ์œ„ ์ฝ”๋“œ์— exec๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” Liveness Probe๋ฅผ ์ถ”๊ฐ€๋กœ ์ •์˜ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™๊ฒ ์Šต๋‹ˆ๋‹ค.

spec:
  containers:
  - name: goproxy
    image: registry.k8s.io/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:  # Readiness Probe๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
      httpGet:
	    path: /healthz
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 10
    livenessProbe:  # ๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด Liveness Probe๋ฅผ ์ถ”๊ฐ€๋กœ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
      exec:
        command:
		- cat
		- /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ Liveness Probe์™€ Readiness Probe๋ฅผ ๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ Probe์˜ ์—ญํ•  ์ˆ˜ํ–‰์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Readiness Probe๋กœ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ ์ œ์–ด
  • Liveness Probe๋กœ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ๋™์ž‘ ์ค‘์— ์ง„๋‹จ ์‹คํŒจ ์‹œ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘

Startup Probe

๋งˆ์ง€๋ง‰์œผ๋กœ Startup Probe๋Š”, ๊ทธ ์ด๋ฆ„์ฒ˜๋Ÿผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹œ์ž‘ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋™ํ•˜๋Š” ๋ฐ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ์ง„๋‹จํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, Liveness Probe์˜ periodSeconds ๊ฐ’์„ ๊ธธ๊ฒŒ ์„ค์ •ํ•ด์„œ ์ง„๋‹จ ์ฃผ๊ธฐ๋ฅผ ๋„“ํžˆ๊ธฐ๋ณด๋‹ค๋Š” Startup Probe๋ฅผ ์ •์˜ํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€๋ฐ์š”.

๊ทธ๋ž˜์•ผ Liveness Probe๋กœ๋Š” ๋™์ž‘ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ์ ์ ˆํ•œ ์ฃผ๊ธฐ๋กœ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Startup Probe๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

startupProbe:
  httpGet:
    path: /healthz
    port: 8080
  failureThreshold: 30
  periodSeconds: 10

์œ„ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด failureThreshold(์ตœ๋Œ€ ์‹คํŒจ ํ—ˆ์šฉ ํšŸ์ˆ˜) ๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ์š”.

ํ•ด๋‹น Startup Probe๋Š” ์ตœ๋Œ€ 300์ดˆ(30 * 10) ๋™์•ˆ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ํ–ˆ๋Š”์ง€๋ฅผ ์ง„๋‹จํ•˜๊ณ , 300์ดˆ๊ฐ€ ์ง€๋‚˜๋„๋ก ์ง„๋‹จ์— ์‹คํŒจํ•˜๋ฉด Pod์˜ restartPolicy(์žฌ์‹œ์ž‘ ์ •์ฑ…)์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์ฐธ๊ณ ํ•  ์ ์€, Startup Probe์˜ ์ง„๋‹จ์ด ์„ฑ๊ณตํ•˜๊ธฐ ์ „๊นŒ์ง„ Readiness Probe์™€ Liveness Probe๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐ Probe๋Š” ์ˆ˜ํ–‰ ์‹œ์ ๊ณผ ์—ญํ• ์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ์ปจํ…Œ์ด๋„ˆ์˜ ์„ฑ๊ฒฉ์ด๋‚˜ ์šด์˜ ์ •์ฑ…์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์กฐํ•ฉ์œผ๋กœ Probe๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋”์šฑ ํšจ๊ณผ์ ์œผ๋กœ Pod๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

References