Pod

Pod๋ž€?

Pod๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ์ปดํ“จํŒ… ๋‹จ์œ„์ด๋‹ค

  • Pod๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ทธ๋ฃน์ด๋‹ค

    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๊ฐœ๋ฐœ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค

    • ๋Œ€์‹  ํ•จ๊ป˜ ๋ฐฐ์น˜๋œ ๋‹ค์ˆ˜์˜ ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๊ณ , ์ด ์ปจํ…Œ์ด๋„ˆ์˜ ๊ทธ๋ฃน์„ Pod ๋ผ๊ณ  ํ•œ๋‹ค

  • Pod๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ทธ๋ฃน์œผ๋กœ, ๊ฐ™์€ ์›Œ์ปค ๋…ธ๋“œ์—์„œ ๊ฐ™์€ linux namespace๋กœ ํ•จ๊ป˜ ์‹คํ–‰๋œ๋‹ค

    • ๊ฐ Pod๋Š” ์ž์ฒด IP, ํ˜ธ์ŠคํŠธ ์ด๋ฆ„, ํ”„๋กœ์„ธ์Šค๋“ฑ์ด ์žˆ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„์‚ฐ๋œ ๋จธ์‹  ์ด๋‹ค

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰๋˜๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค์ผ ์ˆ˜ ์žˆ๊ณ , ๊ฐœ๋ฐœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฃผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค์™€ ๋ถ€๊ฐ€์ ์œผ๋กœ ๋„์™€์ฃผ๋Š” ํ”„๋กœ์„ธ์Šค๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค

  • Pod๊ฐ€ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—, ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•ญ์ƒ ํ•˜๋‚˜์˜ ์›Œ์ปค ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์—ฌ๋Ÿฌ ์›Œ์ปค ๋…ธ๋“œ์— ๊ฑธ์ณ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค

Pod์—์„œ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

์ปจํ…Œ์ด๋„ˆ๋ฅผ Pod๋กœ ๋ฌถ์–ด ๊ทธ๋ฃน์œผ๋กœ ๋งŒ๋“ค ๋•Œ (๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹จ์ผ ํŒŒ๋“œ๋กœ ๋„ฃ์„์ง€ or ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ํŒŒ๋“œ์— ๋„ฃ์„์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด) ์•„๋ž˜์™€ ๊ฐ™์€ ์งˆ๋ฌธ์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค

  1. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š”๊ฐ€ or ์„œ๋กœ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

  2. ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ชจ์—ฌ ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๊ฐ€ or ๊ฐœ๋ณ„์ ์ธ ๊ตฌ์„ฑ์š”์†Œ์ธ๊ฐ€?

  3. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•จ๊ป˜ or ๊ฐœ๋ณ„์ ์œผ๋กœ ์Šค์ผ€์ผ๋ง๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€?

๊ธฐ๋ณธ์ ์œผ๋กœ ํŠน์ • ์ด์œ  ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹จ์ผ Pod๋กœ ๊ตฌ์„ฑํ•ด์•ผํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ถ„๋ฆฌ๋œ Pod์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

๐Ÿ’ก ์ปจํ…Œ์ด๋„ˆ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ง์•„์•ผํ•œ๋‹ค Pod๋ฅผ `๋™์ผํ•œ machine`์—์„œ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด, ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํฌํ•จํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค

Pod ์ •์˜ํ•˜๊ธฐ

Pod๋ฅผ ์ •์˜ํ•˜๋Š” ์ฃผ์š” ๋ถ€๋ถ„

  • Metadata

    • ์ด๋ฆ„, namespace, label ๋ฐ Pod์— ๊ด€ํ•œ ๊ธฐํƒ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค

  • Spec

    • Pod container, volume, ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ๋“ฑ Pod ์ž์ฒด์— ๊ด€ํ•œ ์‹ค์ œ ๋ช…์„ธ๋ฅผ ๊ฐ€์ง„๋‹ค

  • Status

    • Pod ์ƒํƒœ, ๊ฐ container ์„ค๋ช…๊ณผ ์ƒ์„ธ, Pod ๋‚ด๋ถ€ IP, ๊ธฐํƒ€ ๊ธฐ๋ณธ ์ •๋ณด ๋“ฑ Pod์— ๊ด€ํ•œ ํ˜„์žฌ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค

ex)

apiVersion: v1
kind: Pod
metadata:
 name:kubia-mannual
spec:
 containers:
 - image: luksa/kubia
  name: kubia
  ports:
  - containerPort: 8080
   protocol: TCP

์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ์ง€์ •

  • Pod ์ •์˜ ์•ˆ์—์„œ port๋ฅผ ์ง€์ •ํ•ด๋‘” ๊ฒƒ์€ ๋‹จ์ง€ ์ •๋ณด์— ๋ถˆ๊ณผํ•˜๋‹ค

    • ์ƒ๋žตํ•ด๋„ ๋‹ค๋ฅธ client์—์„œ port๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค

  • ํ•˜์ง€๋งŒ ํฌํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•œ๋‹ค๋ฉด, Cluster๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•ด๋‹น pod์—์„œ ๋…ธ์ถœํ•œ port๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค

    • ๋˜ํ•œ port๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๋ฉด port์— ์ด๋ฆ„์„ ์ง€์ •ํ•ด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

Label์„ ์ด์šฉํ•œ Pod ๊ตฌ์„ฑ

Label์„ ํ†ตํ•ด Pod์™€ ๊ธฐํƒ€ ๋‹ค๋ฅธ Kubernetes object ๊ฐ„์˜ ์กฐ์งํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค

  • Label์€ Pod์™€ ๋ชจ๋“  ๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ์งํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค

  • Label์€ ๋ฆฌ์†Œ์Šค์— ๋“ฑ๋กํ•˜๋Š” key-value ์Œ์œผ๋กœ, ์ด ์Œ์€ label selector๋ฅผ ์‚ฌ์šฉํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•  ๋•Œ ํ™œ์šฉ๋œ๋‹ค

    • ๋ฆฌ์†Œ์Šค๋Š” selector์— ์ง€์ •๋œ label์„ ํฌํ•จํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•„ํ„ฐ๋ง ๋„๋‹ˆ๋‹ค

  • Label์˜ key๊ฐ€ unique ํ•˜๋‹ค๋ฉด, ํ•˜๋‚˜ ์ด์ƒ์˜ ์›ํ•˜๋Š” ๋งŒํผ์˜ label์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์‹œ label์„ ๋ถ™์ด์ง€๋งŒ, ๋‚˜์ค‘์— label์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค

Label๊ณผ Selector๋ฅผ ์ด์šฉํ•ด Pod ์Šค์ผ€์ค„๋ง ์ œํ•œํ•˜๊ธฐ

  • Kubernetes์˜ ์ „์ฒด์ ์ธ ์•„์ด๋””์–ด๋Š” ๊ทธ ์œ„์— ์‹คํ–‰๋˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ๋ถ€ํ„ฐ ์‹ค์ œ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์— ์žˆ๊ธฐ์—, Pod๊ฐ€ ์–ด๋–ค node์— ์Šค์ผ€์ค„๋ง๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค

    • ๊ทธ๋กœ ์ธํ•ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜์— ๊ฒฐํ•ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

  • ๊ทธ๋ž˜์„œ Kubernetes๋Š” ์ •ํ™•ํ•œ node๋ฅผ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹  ํ•„์š”ํ•œ node ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ธฐ์ˆ ํ•˜๊ณ , Kubernetes๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š” node๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•œ๋‹ค

    • ์ด๋Š” node label ๊ณผ label selector ๋ฅผ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜๋‹ค

1. ์›Œ์ปค ๋…ธ๋“œ ๋ถ„๋ฅ˜์— Label ์‚ฌ์šฉ

Node๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  kubernetes object์— label์„ ๋ถ€์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒˆ node๋ฅผ cluster์— ์ถ”๊ฐ€ํ•  ๋•Œ node๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ•˜๋“œ์›จ์–ด๋‚˜ pod ์Šค์ผ€์ค„๋ง ์‹œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌํ•ญ์„ label๋กœ ์ง€์ •ํ•ด node๋ฅผ ๋ถ„๋ฅ˜ํ•œ๋‹ค

ex)

kubectl label node [node] gpu=true

2. ํŠน์ • Node์— Pod ์Šค์ผ€์ค„๋ง

GPU๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด Pod๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•  ๋•Œ, ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ GPU๋ฅผ ์ œ๊ณตํ•˜๋Š” node๋ฅผ ์„ ํƒํ•˜๋„๋ก ์š”์ฒญํ•˜๋ ค๋ฉด, ํ•ด๋‹น Pod์˜ YAML ํŒŒ์ผ์— node selector ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค

ex)

apiVersion: v1
kind: Pod
metadata:
 name: kube-gpu
spec:
 nodeSelector:
  gpu: "true"
 containers:
 - image: luksa/kubia
  name: kubia
  ports:
  - containerPort: 8080
   protocol: TCP

์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•จ์œผ๋กœ์จ ์Šค์ผ€์ค„๋Ÿฌ๋Š” gpu=true label์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” node ์ค‘์—์„œ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค

Pod๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ

Liveness Probe

  • Kubernetes๋Š” liveness probe ๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ด์•„ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

  • Pod์˜ spec์— ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ liveness probe๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

  • Kubernetes๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ probe๋ฅผ ์‹คํ–‰ํ•˜๊ณ , probe์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ ํ•œ๋‹ค

Probe ์‹คํ–‰ ๋งค์ปค๋‹ˆ์ฆ˜

Kubernetes๋Š” ์„ธ ๊ฐ€์ง€ ๋งค์ปค๋‹ˆ์ฆ˜ ์„ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ์— Probe๋ฅผ ์‹คํ–‰ํ•œ๋‹ค

  1. HTTP GET Probe

    • ์ง€์ •ํ•œ IP ์ฃผ์†Œ, port, ๊ฒฝ๋กœ์— HTTP GET ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค

    • Probe๊ฐ€ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๊ณ  ์‘๋‹ต ์ฝ”๋“œ๊ฐ€ 2xx or 3xx์ธ ๊ฒฝ์šฐ, probe๊ฐ€ ์„ฑ๊ณตํ–ˆ๋‹ค๊ณ  ๊ฐ„์ฃผ๋œ๋‹ค

    • ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์‘๋‹ต ์ž์ฒด๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด, probe๊ฐ€ ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค

  2. TCP Socket Probe

    • ์ปจํ…Œ์ด๋„ˆ์˜ ์ง€์ •๋œ port์— TCP ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•œ๋‹ค

    • ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ•˜๋ฉด probe๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค

  3. Exec Probe

    • ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ , ๋ช…๋ น์˜ ์ข…๋ฃŒ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค

    • ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 0 ์ด๋ฉด probe๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค

    • 0 ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์‹คํŒจ๋กœ ๊ฐ„์ฃผ ๋œ๋‹ค

ex)

apiVersion: v1
kind: Pod
metadata:
 name: kube-liveness
spec:
 containers:
 - image: luksa/kubia-unhealthy
  name: kubia
  livenessProbe:
   httpGet:
    path: /
    port: 8080

์œ„์˜ ์„ค์ •์—์„œ pod descriptor๋Š” kubernetes๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ "/" ๊ฒฝ๋กœ์™€ 8080 port์— HTTP GET ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋„๋ก httpGet liveness probe๋ฅผ ์ •์˜ํ•œ๋‹ค

Last updated