๋ ˆํผ๋Ÿฐ์Šค

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฌธ์„œ์˜ ๋ณธ ์„น์…˜์—์„œ๋Š” ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

API ๋ ˆํผ๋Ÿฐ์Šค

๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ, ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

CLI

  • kubectl - ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ CLI ๋„๊ตฌ.
  • kubeadm - ์•ˆ์ •์ ์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ํ”„๋กœ๋น„์ „ํ•˜๊ธฐ ์œ„ํ•œ CLI ๋„๊ตฌ.

์ปดํฌ๋„ŒํŠธ

  • kubelet - ๊ฐ ๋…ธ๋“œ์—์„œ ๊ตฌ๋™๋˜๋Š” ์ฃผ์š”ํ•œ ์—์ด์ „ํŠธ. kubelet์€ PodSpecs ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๋ฉฐ ๊ธฐ์ˆ ๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ตฌ๋™๋˜๊ณ  ์žˆ๋Š”์ง€, ์ •์ƒ ์ž‘๋™ํ•˜๋Š”์ง€๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

  • kube-apiserver - ํŒŒ๋“œ, ์„œ๋น„์Šค, ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์€ API ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๊ฒ€์ฆ๊ณผ ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” REST API.

  • kube-controller-manager - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ํƒ‘์žฌ๋œ ํ•ต์‹ฌ ์ œ์–ด ๋ฃจํ”„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ๋ชฌ.

  • kube-proxy - ๊ฐ„๋‹จํ•œ TCP/UDP ์ŠคํŠธ๋ฆผ ํฌ์›Œ๋”ฉ์ด๋‚˜ ๋ฐฑ-์—”๋“œ ์ง‘ํ•ฉ์— ๊ฑธ์ณ์„œ ๋ผ์šด๋“œ-๋กœ๋นˆ TCP/UDP ํฌ์›Œ๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • kube-scheduler - ๊ฐ€์šฉ์„ฑ, ์„ฑ๋Šฅ ๋ฐ ์šฉ๋Ÿ‰์„ ๊ด€๋ฆฌํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ.

  • ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ๊ณผ ์›Œ์ปค ๋…ธ๋“œ์—์„œ ๊ผญ ์—ด์–ด์•ผ ํ•˜๋Š” ํฌํŠธ์™€ ํ”„๋กœํ† ์ฝœ ๋ฆฌ์ŠคํŠธ

API ์„ค์ •

์ด ์„น์…˜์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ตฌ์„ฑ์š”์†Œ ๋˜๋Š” ๋„๊ตฌ๋ฅผ ํ™˜๊ฒฝ์„ค์ •ํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋˜๋Š” "๋ฏธ๋ฐœํ‘œ๋œ" API๋ฅผ ๋‹ค๋ฃฌ๋‹ค. ์ด API๋“ค์€ ์‚ฌ์šฉ์ž๋‚˜ ๊ด€๋ฆฌ์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉ/๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์— ์ค‘์š”ํ•˜์ง€๋งŒ, ์ด๋“ค API์˜ ๋Œ€๋ถ€๋ถ„์€ ์•„์ง API ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

kubeadm์„ ์œ„ํ•œ API ์„ค์ •

์„ค๊ณ„ ๋ฌธ์„œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ค๊ณ„ ๋ฌธ์„œ์˜ ์•„์นด์ด๋ธŒ. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์•„ํ‚คํ…์ฒ˜์™€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋””์ž์ธ ๊ฐœ์š”๋ถ€ํ„ฐ ์ฝ์–ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

1 - ์šฉ์–ด์ง‘

2 - API ๊ฐœ์š”

์ด ์„น์…˜์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

REST API๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๊ทผ๋ณธ์ ์ธ ๊ตฌ์กฐ์ด๋‹ค. ๋ชจ๋“  ์กฐ์ž‘, ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ํ†ต์‹ ๊ณผ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž์˜ ๋ช…๋ น์€ API ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” REST API ํ˜ธ์ถœ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋žซํผ ์•ˆ์˜ ๋ชจ๋“  ๊ฒƒ์€ API ์˜ค๋ธŒ์ ํŠธ๋กœ ์ทจ๊ธ‰๋˜๊ณ , API์— ์ƒ์‘ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์ฐธ์กฐ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „ v1.34์— ๋Œ€ํ•œ API๊ฐ€ ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ฐฐ๊ฒฝ ์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œ์–ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์— ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์š”์ฒญ์ด ์Šน์ธ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

API ๋ฒ„์ „ ๊ทœ์น™

JSON๊ณผ Protobuf ์ง๋ ฌํ™” ์Šคํ‚ค๋งˆ ๋ชจ๋‘ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด์„œ ๋™์ผํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฅธ๋‹ค. ์ดํ›„ ์„ค๋ช…์—์„œ๋Š” ์ด ํ˜•์‹ ๋ชจ๋‘๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

API ๋ฒ„์ „ ๊ทœ์น™๊ณผ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „ ๊ทœ์น™์€ ๊ฐ„์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋œ๋‹ค. API์™€ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „ ๋ถ€์—ฌ์— ๊ด€ํ•œ ์ œ์•ˆ์—๋Š” API ๋ฒ„์ „ ๊ทœ์น™๊ณผ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „ ๊ทœ์น™ ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๊ธฐ์ˆ ๋˜์–ด ์žˆ๋‹ค.

API ๋ฒ„์ „์˜ ์ฐจ์ด๋Š” ์ˆ˜์ค€์˜ ์•ˆ์ •์„ฑ๊ณผ ์ง€์›์˜ ์ฐจ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. API ๋ณ€๊ฒฝ ๋ฌธ์„œ์—์„œ ๊ฐ ์ˆ˜์ค€์˜ ๊ธฐ์ค€์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜๋Š” ๊ฐ ์ˆ˜์ค€์˜ ๊ธฐ์ค€์— ๋Œ€ํ•œ ์š”์•ฝ์ด๋‹ค.

  • ์•ŒํŒŒ(Alpha):

    • ๋ฒ„์ „ ์ด๋ฆ„์— alpha๊ฐ€ ํฌํ•จ๋œ๋‹ค(์˜ˆ: v1alpha1).
    • ๋นŒํŠธ์ธ ์•ŒํŒŒ API ๋ฒ„์ „์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์œผ๋ฉฐ, ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” kube-apiserver ์„ค์ •์— ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ฒ„๊ทธ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์•ŒํŒŒ API์— ๋Œ€ํ•œ ๊ธฐ์ˆ  ์ง€์›์ด ์–ธ์ œ๋“  ๊ณต์ง€ ์—†์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹ค์Œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ฆด๋ฆฌ์Šคํ•  ๋•Œ ๊ณต์ง€ ์—†์ด API์˜ ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์œ„ํ—˜์ด ๋†’๊ณ  ์žฅ๊ธฐ๊ฐ„ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹จ๊ธฐ๊ฐ„ ํ…Œ์ŠคํŠธ ์šฉ๋„์˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.
  • ๋ฒ ํƒ€(Beta):

    • ๋ฒ„์ „ ์ด๋ฆ„์— beta๊ฐ€ ํฌํ•จ๋œ๋‹ค(์˜ˆ: v2beta3).

    • ๋นŒํŠธ์ธ ๋ฒ ํƒ€ API ๋ฒ„์ „์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์œผ๋ฉฐ, ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” kube-apiserver ์„ค์ •์— ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. (์˜ˆ์™ธ์‚ฌํ•ญ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.22 ๋ฒ„์ „ ์ด์ „์˜ ๋ฒ ํƒ€ API๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค.)

    • ๋นŒํŠธ์ธ ๋ฒ ํƒ€ API ๋ฒ„์ „์ด ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š๊ธฐ๊นŒ์ง€๋Š” 9๋‹ฌ ๋˜๋Š” 3๋ฒˆ์˜ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค(๋‘˜ ์ค‘ ๋” ๊ธด ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ํ•จ)๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€์›๋˜์ง€ ์•Š์€ ์‹œ์ ์—์„œ ์ œ๊ฑฐ๋˜๊ธฐ๊นŒ์ง€๋Š” ๋‹ค์‹œ 9๋‹ฌ ๋˜๋Š” 3๋ฒˆ์˜ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค(๋‘˜ ์ค‘ ๋” ๊ธด ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ํ•จ)๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

    • ์ฝ”๋“œ๊ฐ€ ์ž˜ ํ…Œ์ŠคํŠธ ๋˜์—ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ด๋„ ์•ˆ์ „ํ•˜๋‹ค.

    • ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์ด ๋ฐ”๋€” ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์ „๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ธฐ์ˆ  ์ง€์›์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค.

    • ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์Šคํ‚ค๋งˆ๋‚˜ ๋ฌธ๋ฒ•์ด ๋‹ค์Œ ๋ฒ ํƒ€ ๋˜๋Š” ์•ˆ์ •ํ™” API ๋ฒ„์ „์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ, ๋‹ค์Œ ๋ฒ„์ „์œผ๋กœ ์ด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ๊ฐ€ ์ œ๊ณต๋œ๋‹ค. ๋‹ค์Œ ๋ฒ ํƒ€ ๋˜๋Š” ์•ˆ์ •ํ™” API ๋ฒ„์ „์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ API ์˜ค๋ธŒ์ ํŠธ์˜ ํŽธ์ง‘ ๋˜๋Š” ์žฌ์ƒ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ ‡๊ฒŒ ์‰ฌ์šด ์ผ๋งŒ์€ ์•„๋‹ ๊ฒƒ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์šดํƒ€์ž„์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    • ์ด ์†Œํ”„ํŠธ์›จ์–ด๋Š” ํ”„๋กœ๋•์…˜ ์šฉ๋„๋กœ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ดํ›„ ์—ฌ๋Ÿฌ ๋ฒ„์ „์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฒ ํƒ€ API ๋ฒ„์ „์ด ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ํ›„์† ๋ฒ ํƒ€ ๋˜๋Š” ์•ˆ์ •ํ™” API ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฒ ํƒ€ API ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  • ์•ˆ์ •ํ™”(Stable):

    • ๋ฒ„์ „ ์ด๋ฆ„์ด vX์ด๊ณ  X ๋Š” ์ •์ˆ˜๋‹ค.
    • ์•ˆ์ •ํ™”๋œ API ๋ฒ„์ „์€ ์ดํ›„์˜ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฉ”์ด์ € ๋ฒ„์ „์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ˜„์žฌ๋กœ์จ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฉ”์ด์ € ๋ฒ„์ „์—์„œ ์•ˆ์ •ํ™”๋œ API๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋Š” ๊ณ„ํš์€ ์—†๋‹ค.

API ๊ทธ๋ฃน

API ๊ทธ๋ฃน์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€๋‹ค. API ๊ทธ๋ฃน์€ REST ๊ฒฝ๋กœ์™€ ์ง๋ ฌํ™”๋œ ์˜ค๋ธŒ์ ํŠธ์˜ apiVersion ํ•„๋“œ์— ๋ช…์‹œ๋œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ API ๊ทธ๋ฃน์ด ์žˆ๋‹ค.

  • ํ•ต์‹ฌ (๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”) ๊ทธ๋ฃน์€ REST ๊ฒฝ๋กœ /api/v1์— ์žˆ๋‹ค. ํ•ต์‹ฌ ๊ทธ๋ฃน์€ apiVersion ํ•„๋“œ์˜ ์ผ๋ถ€๋กœ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, apiVersion: v1 ๊ณผ ๊ฐ™๋‹ค.
  • ์ด๋ฆ„์ด ์žˆ๋Š” ๊ทธ๋ฃน์€ REST ๊ฒฝ๋กœ /apis/$GROUP_NAME/$VERSION์— ์žˆ์œผ๋ฉฐ apiVersion: $GROUP_NAME/$VERSION์„ ์‚ฌ์šฉํ•œ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด, apiVersion: batch/v1). ์ง€์›๋˜๋Š” API ๊ทธ๋ฃน ์ „์ฒด์˜ ๋ชฉ๋ก์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์ฐธ์กฐ ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

API ๊ทธ๋ฃน ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”

ํŠน์ • ๋ฆฌ์†Œ์Šค ๋ฐ API ๊ทธ๋ฃน์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋œ๋‹ค. API ์„œ๋ฒ„์—์„œ --runtime-config ๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. --runtime-config ํ”Œ๋ž˜๊ทธ๋Š” API ์„œ๋ฒ„์˜ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์„ ์„ค๋ช…ํ•˜๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ <key>=<value> ์Œ์„ ํ—ˆ์šฉํ•œ๋‹ค. ๋งŒ์•ฝ =<value> ๋ถ€๋ถ„์„ ์ƒ๋žตํ•˜๋ฉด, =true ๊ฐ€ ๋ช…์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • batch/v1 ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, --runtime-config=batch/v1=false ๋กœ ์„ค์ •
  • batch/v2alpha1 ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, --runtime-config=batch/v2alpha1 ์œผ๋กœ ์„ค์ •
  • ์˜ˆ๋ฅผ ๋“ค์–ด storage.k8s.io/v1beta1/csistoragecapacities์™€ ๊ฐ™์ด ํŠน์ • ๋ฒ„์ „์˜ API๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, --runtime-config=storage.k8s.io/v1beta1/csistoragecapacities์™€ ๊ฐ™์ด ์„ค์ •

์ง€์†์„ฑ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” etcd์— ๊ธฐ๋กํ•˜์—ฌ API ๋ฆฌ์†Œ์Šค ์ธก๋ฉด์—์„œ ์ง๋ ฌํ™”๋œ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

2.1 - ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ด ํŽ˜์ด์ง€๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค REST API๋ฅผ ์‚ฌ์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด API ํ˜ธ์ถœ ๋˜๋Š” ์š”์ฒญ/์‘๋‹ต ํƒ€์ž…์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋Œ€์ฒด๋กœ ์ธ์ฆ๊ณผ ๊ฐ™์€ ๊ณตํ†ต์˜ ํƒœ์Šคํฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ API ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์ฆ ๋˜๋Š” kubeconfig ํŒŒ์ผ ํฌ๋งท์„ ํ†ตํ•ด ์ž๊ฒฉ์ฆ๋ช…๊ณผ API ์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋‹ค์Œ์˜ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค SIG API Machinery์—์„œ ๊ณต์‹์ ์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

์–ธ์–ดํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ
Cgithub.com/kubernetes-client/c๋‘˜๋Ÿฌ๋ณด๊ธฐ
dotnetgithub.com/kubernetes-client/csharp๋‘˜๋Ÿฌ๋ณด๊ธฐ
Gogithub.com/kubernetes/client-go/๋‘˜๋Ÿฌ๋ณด๊ธฐ
Haskellgithub.com/kubernetes-client/haskell๋‘˜๋Ÿฌ๋ณด๊ธฐ
Javagithub.com/kubernetes-client/java๋‘˜๋Ÿฌ๋ณด๊ธฐ
JavaScriptgithub.com/kubernetes-client/javascript๋‘˜๋Ÿฌ๋ณด๊ธฐ
Perlgithub.com/kubernetes-client/perl/๋‘˜๋Ÿฌ๋ณด๊ธฐ
Pythongithub.com/kubernetes-client/python/๋‘˜๋Ÿฌ๋ณด๊ธฐ
Rubygithub.com/kubernetes-client/ruby/๋‘˜๋Ÿฌ๋ณด๊ธฐ

์ปค๋ฎค๋‹ˆํ‹ฐ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋‹ค์Œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํŒ€์ด ์•„๋‹Œ ๊ฐ๊ฐ์˜ ์ €์ž๋“ค์ด ์ œ๊ณตํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

์–ธ์–ดํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
Clojuregithub.com/yanatan16/clj-kubernetes-api
DotNetgithub.com/tonnyeremin/kubernetes_gen
DotNet (RestSharp)github.com/masroorhasan/Kubernetes.DotNet
Elixirgithub.com/obmarg/kazan
Elixirgithub.com/coryodaniel/k8s
Gogithub.com/ericchiang/k8s
Java (OSGi)bitbucket.org/amdatulabs/amdatu-kubernetes
Java (Fabric8, OSGi)github.com/fabric8io/kubernetes-client
Javagithub.com/manusa/yakc
Lispgithub.com/brendandburns/cl-k8s
Lispgithub.com/xh4/cube
Node.js (TypeScript)github.com/Goyoo/node-k8s-client
Node.jsgithub.com/ajpauwels/easy-k8s
Node.jsgithub.com/godaddy/kubernetes-client
Node.jsgithub.com/tenxcloud/node-kubernetes-client
Perlmetacpan.org/pod/Net::Kubernetes
PHPgithub.com/allansun/kubernetes-php-client
PHPgithub.com/maclof/kubernetes-client
PHPgithub.com/travisghansen/kubernetes-client-php
PHPgithub.com/renoki-co/php-k8s
Pythongithub.com/cloudcoil/cloudcoil
Pythongithub.com/fiaas/k8s
Pythongithub.com/gtsystem/lightkube
Pythongithub.com/mnubo/kubernetes-py
Pythongithub.com/tomplus/kubernetes_asyncio
Pythongithub.com/Frankkkkk/pykorm
Rubygithub.com/abonas/kubeclient
Rubygithub.com/k8s-ruby/k8s-ruby
Rubygithub.com/kontena/k8s-client
Rustgithub.com/clux/kube-rs
Rustgithub.com/ynqa/kubernetes-rust
Scalagithub.com/hagay3/skuber
Scalagithub.com/hnaderi/scala-k8s
Scalagithub.com/joan38/kubernetes-client
Swiftgithub.com/swiftkube/client

2.2 - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ํ—ฌ์Šค(health) ์—”๋“œํฌ์ธํŠธ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” API ์—”๋“œํฌ์ธํŠธ๋“ค์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฌ๋‹ค.

ํ—ฌ์Šค๋ฅผ ์œ„ํ•œ API ์—”๋“œํฌ์ธํŠธ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ๊ฐ€์ง€ API ์—”๋“œํฌ์ธํŠธ(healthz, livez ์™€ readyz)๋ฅผ ์ œ๊ณตํ•œ๋‹ค. healthz ์—”๋“œํฌ์ธํŠธ๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ(deprecated)๋์œผ๋ฉฐ (์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.16 ๋ฒ„์ „ ์ดํ›„), ๋Œ€์‹  ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ livez ์™€ readyz ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. livez ์—”๋“œํฌ์ธํŠธ๋Š” --livez-grace-period ํ”Œ๋ž˜๊ทธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. /readyz ์—”๋“œํฌ์ธํŠธ๋Š” --shutdown-delay-duration ํ”Œ๋ž˜๊ทธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ƒ์ (graceful)์œผ๋กœ ์…ง๋‹ค์šดํ•  ์ˆ˜ ์žˆ๋‹ค. API ์„œ๋ฒ„์˜ healthz/livez/readyz ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋จธ์‹ ์€ HTTP ์ƒํƒœ ์ฝ”๋“œ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ 200์€ ํ˜ธ์ถœ๋œ ์—”๋“œํฌ์ธํŠธ์— ๋”ฐ๋ผ API ์„œ๋ฒ„์˜ healthy/live/ready ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์•„๋ž˜ ํ‘œ์‹œ๋œ ๋” ์ž์„ธํ•œ ์˜ต์…˜์€ ์šด์˜์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ฑฐ๋‚˜ ํŠน์ • API ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์˜ ์˜ˆ์‹œ๋Š” ํ—ฌ์Šค API ์—”๋“œํฌ์ธํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.

๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•ด, verbose ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์‚ฌ ํ•ญ๋ชฉ๊ณผ ์ƒํƒœ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์šด์˜์ž๊ฐ€ ๋จธ์‹  ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹Œ, API ์„œ๋ฒ„์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.

curl -k https://localhost:6443/livez?verbose

์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋Š” ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

kubectl get --raw='/readyz?verbose'

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

[+]ping ok
[+]log ok
[+]etcd ok
[+]poststarthook/start-kube-apiserver-admission-initializer ok
[+]poststarthook/generic-apiserver-start-informers ok
[+]poststarthook/start-apiextensions-informers ok
[+]poststarthook/start-apiextensions-controllers ok
[+]poststarthook/crd-informer-synced ok
[+]poststarthook/bootstrap-controller ok
[+]poststarthook/rbac/bootstrap-roles ok
[+]poststarthook/scheduling/bootstrap-system-priority-classes ok
[+]poststarthook/start-cluster-authentication-info-controller ok
[+]poststarthook/start-kube-aggregator-informers ok
[+]poststarthook/apiservice-registration-controller ok
[+]poststarthook/apiservice-status-available-controller ok
[+]poststarthook/kube-apiserver-autoregistration ok
[+]autoregister-completion ok
[+]poststarthook/apiservice-openapi-controller ok
healthz check passed

๋˜ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„๋Š” ํŠน์ • ์ฒดํฌ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋‹ค์Œ ์˜ˆ์™€ ๊ฐ™์ด ์กฐํ•ฉ๋  ์ˆ˜ ์žˆ๋‹ค.

curl -k 'https://localhost:6443/readyz?verbose&exclude=etcd'

์ถœ๋ ฅ์—์„œ etcd ์ฒดํฌ๊ฐ€ ์ œ์™ธ๋œ ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

[+]ping ok
[+]log ok
[+]etcd excluded: ok
[+]poststarthook/start-kube-apiserver-admission-initializer ok
[+]poststarthook/generic-apiserver-start-informers ok
[+]poststarthook/start-apiextensions-informers ok
[+]poststarthook/start-apiextensions-controllers ok
[+]poststarthook/crd-informer-synced ok
[+]poststarthook/bootstrap-controller ok
[+]poststarthook/rbac/bootstrap-roles ok
[+]poststarthook/scheduling/bootstrap-system-priority-classes ok
[+]poststarthook/start-cluster-authentication-info-controller ok
[+]poststarthook/start-kube-aggregator-informers ok
[+]poststarthook/apiservice-registration-controller ok
[+]poststarthook/apiservice-status-available-controller ok
[+]poststarthook/kube-apiserver-autoregistration ok
[+]autoregister-completion ok
[+]poststarthook/apiservice-openapi-controller ok
[+]shutdown ok
healthz check passed

๊ฐœ๋ณ„ ํ—ฌ์Šค ์ฒดํฌ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.34 [alpha]

๊ฐ ๊ฐœ๋ณ„ ํ—ฌ์Šค ์ฒดํฌ๋Š” HTTP ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋…ธ์ถœํ•˜๋ฉฐ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ณ„ ์ฒดํฌ๋ฅผ ์œ„ํ•œ ์Šคํ‚ค๋งˆ๋Š” /livez/<healthcheck-name> ์ด๊ณ , ์—ฌ๊ธฐ์„œ livez ์™€ readyz ๋Š” API ์„œ๋ฒ„์˜ ํ™œ์„ฑ ์ƒํƒœ ๋˜๋Š” ์ค€๋น„ ์ƒํƒœ์ธ์ง€๋ฅผ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. <healthcheck-name> ๊ฒฝ๋กœ ์œ„์—์„œ ์„ค๋ช…ํ•œ verbose ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ , [+] ์™€ ok ์‚ฌ์ด์˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ๋ณ„ ํ—ฌ์Šค ์ฒดํฌ๋Š” ๋จธ์‹ ์—์„œ ์‚ฌ์šฉ๋˜์„œ๋Š” ์•ˆ๋˜๋ฉฐ, ์šด์˜์ž๊ฐ€ ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.

curl -k https://localhost:6443/livez/etcd

3.1 - ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.18 [stable]

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์€ ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ƒˆ ๋…ธ๋“œ๋ฅผ ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ์— ๊ฒฐํ•ฉํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์ „๋‹ฌ์ž ํ† ํฐ์ด๋‹ค. kubeadm์„ ์ง€์›ํ•˜๋„๋ก ๊ตฌ์ถ•๋˜์—ˆ์ง€๋งŒ kubeadm ์—†์ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ RBAC ์ •์ฑ…์„ ํ†ตํ•ด Kubelet TLS ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํ•‘ ์‹œ์Šคํ…œ๊ณผ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌ์ถ•๋˜์—ˆ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ๊ฐœ์š”

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์€ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํŠน์ • ์œ ํ˜•(bootstrap.kubernetes.io/token)์˜ ์‹œํฌ๋ฆฟ(Secret)์œผ๋กœ ์ •์˜๋œ๋‹ค. API ์„œ๋ฒ„์˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ธ์ฆ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์‹œํฌ๋ฆฟ์„ ์ฝ๋Š”๋‹ค. ๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๊ฐ€ TokenCleaner ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ œ๊ฑฐํ•œ๋‹ค. ํ† ํฐ์€ BootstrapSigner ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด "discovery" ํ”„๋กœ์„ธ์Šค์— ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • ์ปจํ”ผ๊ทธ๋งต(ConfigMap)์— ๋Œ€ํ•œ ์„œ๋ช…์„ ๋งŒ๋“œ๋Š” ๋ฐ๋„ ์‚ฌ์šฉ๋œ๋‹ค.

ํ† ํฐ ํ˜•์‹

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์€ abcdef.0123456789abcdef ํ˜•์‹์„ ์ทจํ•œ๋‹ค. ๋” ๊ณต์‹์ ์œผ๋กœ๋Š” ์ •๊ทœ์‹ [a-z0-9]{6}\.[a-z0-9]{16} ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

ํ† ํฐ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ "Token ID" ์ด๋ฉฐ ๊ณต๊ฐœ ์ •๋ณด๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ์ธ์ฆ์— ์‚ฌ์šฉํ•˜๋Š” ์‹œํฌ๋ฆฟ์˜ ์ผ๋ถ€๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํ† ํฐ์„ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ "Token Secret"์ด๋ฉฐ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹น์‚ฌ์ž์™€๋งŒ ๊ณต์œ ํ•ด์•ผ ํ•œ๋‹ค.

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ์ธ์ฆ ํ™œ์„ฑํ™”

API ์„œ๋ฒ„์—์„œ ๋‹ค์Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ์ธ์ฆ์ž๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

--enable-bootstrap-token-auth

ํ™œ์„ฑํ™”๋˜๋ฉด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์„ API ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•œ ์ „๋‹ฌ์ž ํ† ํฐ ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Authorization: Bearer 07401b.f395accd246ae52d

ํ† ํฐ์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„ system:bootstrap:<token id> ๋กœ ์ธ์ฆ๋˜๋ฉฐ system:bootstrappers ๊ทธ๋ฃน์˜ ๊ตฌ์„ฑ์›์ด๋‹ค. ํ† ํฐ์˜ ์‹œํฌ๋ฆฟ์— ์ถ”๊ฐ€ ๊ทธ๋ฃน์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž์—์„œ tokencleaner ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

--controllers=*,tokencleaner

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ์‹œํฌ๋ฆฟ ํ˜•์‹

๊ฐ๊ฐ์˜ ์œ ํšจํ•œ ํ† ํฐ์€ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์‹œํฌ๋ฆฟ์— ์˜ํ•ด ์ง€์›๋œ๋‹ค. ์ „์ฒด ๋””์ž์ธ ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์‹œํฌ๋ฆฟ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
kind: Secret
metadata:
  # Name MUST be of form "bootstrap-token-<token id>"
  name: bootstrap-token-07401b
  namespace: kube-system

# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
  # Human readable description. Optional.
  description: "The default bootstrap token generated by 'kubeadm init'."

  # Token ID and secret. Required.
  token-id: 07401b
  token-secret: f395accd246ae52d

  # Expiration. Optional.
  expiration: 2017-03-10T03:22:11Z

  # Allowed usages.
  usage-bootstrap-authentication: "true"
  usage-bootstrap-signing: "true"

  # Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
  auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress

์‹œํฌ๋ฆฟ ์œ ํ˜•์€ bootstrap.kubernetes.io/token ์ด์–ด์•ผ ํ•˜๊ณ  ์ด๋ฆ„์€ bootstrap-token-<token id>์—ฌ์•ผ ํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋„ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

usage-bootstrap-* ๋ฉค๋ฒ„๋Š” ์ด ์‹œํฌ๋ฆฟ์˜ ์šฉ๋„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๊ฐ’์„ true ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

  • usage-bootstrap-authentication ์€ ํ† ํฐ์„ API ์„œ๋ฒ„์— ๋ฒ ์–ด๋Ÿฌ ํ† ํฐ์œผ๋กœ ์ธ์ฆํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • usage-bootstrap-signing ์€ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์— ์„ค๋ช…๋œ cluster-info ์ปจํ”ผ๊ทธ๋งต์— ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

expiration ํ•„๋“œ๋Š” ํ† ํฐ์˜ ๋งŒ๋ฃŒ๋ฅผ ์ œ์–ดํ•œ๋‹ค. ๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ์ธ์ฆ์— ์‚ฌ์šฉ๋  ๋•Œ ๊ฑฐ๋ถ€๋˜๊ณ  ์ปจํ”ผ๊ทธ๋งต์„œ๋ช… ์ค‘์— ๋ฌด์‹œ๋œ๋‹ค. ๋งŒ๋ฃŒ๋œ ๊ฐ’์€ RFC3339๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ˆ๋Œ€ UTC ์‹œ๊ฐ„์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ๋‹ค. ๋งŒ๋ฃŒ๋œ ํ† ํฐ์„ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋ ค๋ฉด tokencleaner ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

kubeadm์„ ์‚ฌ์šฉํ•œ ํ† ํฐ ๊ด€๋ฆฌ

kubeadm ํˆด์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰์ค‘์ธ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubeadm token docs ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์ปจํ”ผ๊ทธ๋งต ์„œ๋ช…

ํ† ํฐ์€ ์ธ์ฆ ์™ธ์—๋„ ์ปจํ”ผ๊ทธ๋งต์— ์„œ๋ช…ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ API ์„œ๋ฒ„๋ฅผ ์‹ ๋ขฐํ•˜๊ธฐ ์ „์— ํด๋Ÿฌ์Šคํ„ฐ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ”„๋กœ์„ธ์Šค์˜ ์ดˆ๊ธฐ์— ์‚ฌ์šฉ๋œ๋‹ค. ์„œ๋ช…๋œ ์ปจํ”ผ๊ทธ๋งต์€ ๊ณต์œ  ํ† ํฐ์œผ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž์—์„œ bootstrapsigner ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ปจํ”ผ๊ทธ๋งต์„œ๋ช…์„ ํ™œ์„ฑํ™” ํ•œ๋‹ค.

--controllers=*,bootstrapsigner

์„œ๋ช…๋œ ์ปจํ”ผ๊ทธ๋งต์€ kube-public ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” cluster-info ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š๊ณ  TLS ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๋™์•ˆ ์ปจํ”ผ๊ทธ๋งต์„ ์ฝ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํ”ผ๊ทธ๋งต์— ํฌํ•จ๋œ ์„œ๋ช…์„ ํ™•์ธํ•˜์—ฌ ์ปจํ”ผ๊ทธ๋งต์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค.

์ปจํ”ผ๊ทธ๋งต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ๋‹ค.

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-info
  namespace: kube-public
data:
  jws-kubeconfig-07401b: eyJhbGciOiJIUzI1NiIsImtpZCI6IjA3NDAxYiJ9..tYEfbo6zDNo40MQE07aZcQX2m3EB2rO3NuXtxVMYm9U
  kubeconfig: |
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: <really long certificate data>
        server: https://10.138.0.2:6443
      name: ""
    contexts: []
    current-context: ""
    kind: Config
    preferences: {}
    users: []    

์ปจํ”ผ๊ทธ๋งต์˜ kubeconfig ๋ฉค๋ฒ„๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด๋งŒ ์ž…๋ ฅ๋œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ „๋‹ฌ๋˜๋Š” ํ•ต์‹ฌ์€ certificate-authority-data ์ด๋‹ค.
์ด๋Š” ํ–ฅํ›„ ํ™•๋Œ€๋  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋ช…์€ "detached" ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” JWS ์„œ๋ช…์ด๋‹ค. ์„œ๋ช…์„ ๊ฒ€์ฆํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๋Š” JWS ๊ทœ์น™(๋’ค๋กœ ์˜ค๋Š” = ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋™์•ˆ ์ธ์ฝ”๋”ฉ๋œ base64)์— ๋”ฐ๋ผ kubeconfig ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ธ์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์  ์‚ฌ์ด์— ์‚ฝ์ž…ํ•˜์—ฌ ์ „์ฒด JWS๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ „์ฒด ํ† ํฐ(์˜ˆ:07401b.f395accd246ae52d)์„ ๊ณต์œ  ์‹œํฌ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ HS256 ๋ฐฉ์‹(HMAC-SHA256)์„ ์‚ฌ์šฉํ•จ์œผ๋กœ JWS๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋ฐ˜๋“œ์‹œ HS256์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ kubeadm implementation details ์„น์…˜์„ ์ฐธ์กฐํ•˜๋ฉด ๋œ๋‹ค.

3.2 - ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ๊ด€๋ฆฌํ•˜๊ธฐ

์„œ๋น„์Šค์–ด์นด์šดํŠธ(ServiceAccount) ๋Š” ํŒŒ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์‹๋ณ„์ž๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

ํŒŒ๋“œ ๋‚ด๋ถ€์˜ ํ”„๋กœ์„ธ์Šค๋Š”, ์ž์‹ ์—๊ฒŒ ๋ถ€์—ฌ๋œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์˜ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ API ์„œ๋ฒ„์— ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋น„์Šค ์–ด์นด์šดํŠธ์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋Š”, ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ๊ตฌ์„ฑํ•˜๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์ด ๊ฐ€์ด๋“œ๋Š” ์„œ๋น„์Šค์–ด์นด์šดํŠธ์™€ ๊ด€๋ จ๋œ ๊ฐœ๋… ์ค‘ ์ผ๋ถ€๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ, ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ† ํฐ์„ ์–ป๊ฑฐ๋‚˜ ์ทจ์†Œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…ํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ ๋‚ด์šฉ๋“ค์„ ๋”ฐ๋ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” examplens๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์—†์„ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl create namespace examplens

์‚ฌ์šฉ์ž ์–ด์นด์šดํŠธ์™€ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ๋น„๊ต

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์‚ฌ์šฉ์ž ์–ด์นด์šดํŠธ์™€ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์˜ ๊ฐœ๋…์„ ๊ตฌ๋ถ„ํ•œ๋‹ค.

  • ์‚ฌ์šฉ์ž ์–ด์นด์šดํŠธ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ, ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๊ฒฝ์šฐ ํŒŒ๋“œ์˜ ์ผ๋ถ€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.
  • ์‚ฌ์šฉ์ž ์–ด์นด์šดํŠธ๋Š” ์ „์—ญ์ ์œผ๋กœ ๊ณ ๋ ค๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๊ฑธ์ณ ์ด๋ฆ„์ด ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค. ์–ด๋–ค ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ™•์ธํ•˜๋“ ์ง€ ๊ฐ„์—, ํŠน์ • ์‚ฌ์šฉ์ž๋ช…์€ ํ•ด๋‹น ์œ ์ €๋งŒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ณ„๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ๊ฐ์ž ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‚ฌ์šฉ์ž ์–ด์นด์šดํŠธ๋Š” ๊ธฐ์—… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ๋™๊ธฐํ™”๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์–ด์นด์šดํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํŠน๋ณ„ํ•œ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋ฉฐ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์— ์—ฐ๊ฒฐ๋œ๋‹ค. ๋ฐ˜๋ฉด์— ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋Š”, ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์— ๋”ฐ๋ผ ํŠน์ • ์ž‘์—…์„ ์œ„ํ•œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋ณด๋‹ค ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋‹ค. ์‹ค ์‚ฌ์šฉ์ž๋ฅผ ์˜จ๋ณด๋”ฉํ•˜๋Š” ๋‹จ๊ณ„์™€ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์€, ์›Œํฌ๋กœ๋“œ๊ฐ€ ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์„ ๋”ฐ๋ฅด๊ธฐ ์‰ฌ์›Œ์ง€๊ฒŒ ํ•œ๋‹ค.
  • ์‚ฌ๋žŒ๊ณผ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋‘˜์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ๋”์šฑ ์‰ฝ๊ฒŒ ๊ฐ์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์„ค์ •๋“ค์€ ๊ทธ ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์š”์†Œ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ์ •์˜๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋Š” ๋งŽ์€ ์ œ์•ฝ์—†์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํ• ๋‹น๋œ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์„ค์ •์€ ์ด์‹์„ฑ์ด ์ข‹๋‹ค.

๋ฐ”์ธ๋”ฉ๋œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ ๋ณผ๋ฅจ ๋ฉ”์ปค๋‹ˆ์ฆ˜

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.22 [stable]

๊ธฐ๋ณธ์ ์œผ๋กœ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ(๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด ์„œ๋น„์Šค์–ด์นด์šดํŠธ ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ)์€ ํ”„๋กœ์ ํ‹ฐ๋“œ ๋ณผ๋ฅจ์„ ํŒŒ๋“œ์— ์ถ”๊ฐ€ํ•˜๋ฉฐ, ์ด ๋ณผ๋ฅจ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ† ํฐ์„ ํฌํ•จํ•œ๋‹ค.

๋‹ค์Œ์€ ์‹คํ–‰๋œ ํŒŒ๋“œ์—์„œ ํ•ด๋‹น ํ† ํฐ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

...
  - name: kube-api-access-<random-suffix>
    projected:
      sources:
        - serviceAccountToken:
            path: token # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
        - configMap:
            items:
              - key: ca.crt
                path: ca.crt
            name: kube-root-ca.crt
        - downwardAPI:
            items:
              - fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
                path: namespace

์œ„์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ์„ธ ๊ฐ€์ง€ ์ •๋ณด๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์ ํ‹ฐ๋“œ ๋ณผ๋ฅจ์„ ์ •์˜ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, ๊ฐ ์ •๋ณด๋Š” ํ•ด๋‹น ๋ณผ๋ฅจ ๋‚ด์˜ ๋‹จ์ผ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ๋„ ํ•œ๋‹ค. ์„ธ ๊ฐ€์ง€ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์„œ๋น„์Šค์–ด์นด์šดํŠธํ† ํฐ(serviceAccountToken) ์ •๋ณด๋Š” kubelet์ด kube-apiserver๋กœ๋ถ€ํ„ฐ ์ทจ๋“ํ•œ ํ† ํฐ์„ ํฌํ•จํ•œ๋‹ค. kubelet์€ TokenRequest API๋ฅผ ํ†ตํ•ด ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ† ํฐ์„ ๋ฐœ๊ธ‰ ๋ฐ›๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ์ทจ๋“ํ•œ ํ† ํฐ์€ ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์ง€์ •๋œ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ดํ›„์— ๋งŒ๋ฃŒ๋œ๋‹ค(๊ธฐ๋ณธ๊ฐ’์€ 1์‹œ๊ฐ„์ด๋‹ค). ์ด ํ† ํฐ์€ ํŠน์ •ํ•œ ํŒŒ๋“œ์— ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ kube-apiserver๋ฅผ ๊ทธ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์‹œํฌ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณผ๋ฅจ์„ ์ถ”๊ฐ€ํ•˜๋˜ ์ด์ „ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋Œ€์ฒดํ•œ ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ์‹œํฌ๋ฆฟ์€ ํŒŒ๋“œ์˜ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ํ† ํฐ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋งŒ๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
  2. ์ปจํ”ผ๊ทธ๋งต(ConfigMap) ์ •๋ณด๋Š” ์ธ์ฆ ๋ฐ ์ธ๊ฐ€์— ๊ด€ํ•œ ๋ฒˆ๋“ค์„ ํฌํ•จํ•œ๋‹ค. ํŒŒ๋“œ๋“ค์€ ์ด๋Ÿฌํ•œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์˜ kube-apiserver(๋ฏธ๋“ค๋ฐ•์Šค๋‚˜ ์‹ค์ˆ˜๋กœ ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ํ”ผ์–ด๊ฐ€ ์•„๋‹Œ) ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. DownwardAPI ์ •๋ณด๋Š” ํŒŒ๋“œ๊ฐ€ ํฌํ•จ๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ํ•ด๋‹น ์ •๋ณด๋ฅผ ํŒŒ๋“œ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์œ„์˜ ์ •๋ณด๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋น„์Šค์–ด์นด์šดํŠธ์— ๋Œ€ํ•ด ์ˆ˜๋™์œผ๋กœ ์‹œํฌ๋ฆฟ ๊ด€๋ฆฌํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.22 ์ด์ „์˜ ๋ฒ„์ „๋“ค์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ฒฉ ์ฆ๋ช…๋“ค์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ–ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜› ๋ฉ”์ปค๋‹ˆ์ฆ˜๋“ค์€, ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ์— ๋งˆ์šดํŠธ ๋  ์ˆ˜ ์žˆ๋Š” ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๊ธฐ๋ฐ˜์„ ๋‘์—ˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.34์„ ํฌํ•จํ•œ ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š”, API ์ž๊ฒฉ ์ฆ๋ช…๋“ค์€ TokenRequest API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋กœ์ ํ‹ฐ๋“œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ์— ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ทจ๋“ํ•œ ํ† ํฐ์€ ์‹œ๊ฐ„ ์ œํ•œ์ด ์žˆ์œผ๋ฉฐ, ๋งˆ์šดํŠธ ๋˜์—ˆ๋˜ ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋งŒ๋ฃŒ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ‰์ƒ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š๋Š” ํ† ํฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์‹œํฌ๋ฆฟ์„ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•œ ๋ฒˆ ์‹œํฌ๋ฆฟ์„ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์„œ๋น„์Šค์–ด์นด์šดํŠธ์— ์—ฐ๊ฒฐํ–ˆ๋‹ค๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ์‹œํฌ๋ฆฟ์— ํ† ํฐ์„ ์ฑ„์šด๋‹ค.

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ๋“ค

ํ† ํฐ ์ปจํŠธ๋กค๋Ÿฌ

ํ† ํฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” kube-controller-manager ์˜ ์ผ๋ถ€๋กœ์จ ์‹คํ–‰๋˜๋ฉฐ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • ์„œ๋น„์Šค์–ด์นด์šดํŠธ์— ๋Œ€ํ•œ ์‚ญ์ œ๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค์–ด์นด์šดํŠธ ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ๊ฐ™์ด ์‚ญ์ œํ•œ๋‹ค.
  • ์„œ๋น„์Šค์–ด์นด์šดํŠธ ํ† ํฐ ์‹œํฌ๋ฆฟ์— ๋Œ€ํ•œ ์ถ”๊ฐ€๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ์ฐธ์กฐ๋œ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‹œํฌ๋ฆฟ์— ํ† ํฐ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์‹œํฌ๋ฆฟ์— ๋Œ€ํ•œ ์‚ญ์ œ๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ์„œ๋น„์Šค์–ด์นด์šดํŠธ์—์„œ ์ฐธ์กฐ ์ค‘์ธ ํ•ญ๋ชฉ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.

์„œ๋น„์Šค ์–ด์นด์šดํŠธ ๊ฐœ์ธํ‚ค ํŒŒ์ผ์€ --service-account-private-key-file ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ kube-controller-manager ์˜ ํ† ํฐ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ฐœ์ธํ‚ค๋Š” ์ƒ์„ฑ๋œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ์— ์„œ๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ --service-account-key-file ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ณต๊ฐœํ‚ค๋ฅผ kube-apiserver ์— ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ณต๊ฐœํ‚ค๋Š” ์ธ์ฆ ๊ณผ์ •์—์„œ ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค.

์„œ๋น„์Šค์–ด์นด์šดํŠธ ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ

ํŒŒ๋“œ ์ˆ˜์ •์€ ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ๊ตฌํ˜„๋œ๋‹ค. ์ด๊ฒƒ์€ API ์„œ๋ฒ„์˜ ์ผ๋ถ€์ด๋ฉฐ, ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํŒŒ๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ™œ์„ฑ ์ƒํƒœ(๋Œ€๋ถ€๋ถ„์˜ ๋ฐฐํฌ์—์„œ ๊ธฐ๋ณธ๊ฐ’)์ธ ๊ฒฝ์šฐ, ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒŒ๋“œ์˜ ์ƒ์„ฑ ์‹œ์ ์— ๋‹ค์Œ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. ํŒŒ๋“œ์— .spce.serviceAccountName ํ•ญ๋ชฉ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‹คํ–‰ํ•˜๋ ค๋Š” ํŒŒ๋“œ์˜ ์„œ๋น„์Šค์–ด์นด์šดํŠธ ์ด๋ฆ„์„ default๋กœ ์„ค์ •ํ•œ๋‹ค.
  2. ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‹คํ–‰๋˜๋Š” ํŒŒ๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์„œ๋น„์Šค์–ด์นด์šดํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹นํ•˜๋Š” ์ด๋ฆ„์˜ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒŒ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” default ์„œ๋น„์Šค์–ด์นด์šดํŠธ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค.
  3. ์„œ๋น„์Šค์–ด์นด์šดํŠธ์˜ automountServiceAccountToken ๋˜๋Š” ํŒŒ๋“œ์˜ automountServiceAccountToken ์ค‘ ์–ด๋А ๊ฒƒ๋„ false ๋กœ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด,
    • ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‹คํ–‰ํ•˜๋ ค๋Š” ํŒŒ๋“œ์— API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ† ํฐ์„ ํฌํ•จํ•˜๋Š” ๋ณผ๋ฅจ ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒŒ๋“œ์˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— volumeMount๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋ฏธ /var/run/secrets/kubernetes.io/serviceaccount ๊ฒฝ๋กœ์— ๋ณผ๋ฅจ์ด ๋งˆ์šดํŠธ ๋˜์–ด์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ณผ๋ฅจ์€ /var/run/secrets/kubernetes.io/serviceaccount ์œ„์น˜์— ๋งˆ์šดํŠธ๋˜๋ฉฐ, ์œˆ๋„์šฐ ๋…ธ๋“œ ์—ญ์‹œ ๋™์ผํ•œ ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธ๋œ๋‹ค.
  4. ํŒŒ๋“œ์˜ spec์— imagePullSecrets ์ด ์—†๋Š” ๊ฒฝ์šฐ, ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ServiceAccount์˜ imagePullSecrets์„ ๋ณต์‚ฌํ•˜์—ฌ ์ถ”๊ฐ€๋œ๋‹ค.

TokenRequest API

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.22 [stable]

์„œ๋น„์Šค์–ด์นด์šดํŠธ์˜ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค์ธ TokenRequest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ํ•ด๋‹น ์„œ๋น„์Šค์–ด์นด์šดํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ† ํฐ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ API ํ† ํฐ์„ ์–ป๊ธฐ ์œ„ํ•ด ์ด ์š”์ฒญ์„ ์ง์ ‘ ํ˜ธ์ถœํ•  ํ•„์š”๋Š” ์—†๋Š”๋ฐ, kubelet์ด ํ”„๋กœ์ ํ‹ฐ๋“œ ๋ณผ๋ฅจ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

kubectl์—์„œ TokenRequest API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ์œ„ํ•œ API ํ† ํฐ์„ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ํ™•์ธํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ(๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์„œ๋น„์Šค์–ด์นด์šดํŠธ ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ)์€ ํŒŒ๋“œ์— ํ”„๋กœ์ ํ‹ฐ๋“œ ๋ณผ๋ฅจ์„ ์ถ”๊ฐ€ํ•˜๊ณ , kubelet์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๋ณผ๋ฅจ์ด ํ† ํฐ์„ ํฌํ•จํ•˜๋Š”๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

(์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์‹œํฌ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณผ๋ฅจ์„ ์ถ”๊ฐ€ํ•˜๋˜ ์ด์ „ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋Œ€์ฒดํ•œ ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ์‹œํฌ๋ฆฟ์€ ํŒŒ๋“œ์˜ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ๋งŒ๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.)

์•„๋ž˜๋Š” ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

...
  - name: kube-api-access-<random-suffix>
    projected:
      defaultMode: 420 # 8์ง„์ˆ˜ 0644์— ๋Œ€ํ•œ 10์ง„์ˆ˜ ๊ฐ’
      sources:
        - serviceAccountToken:
            expirationSeconds: 3607
            path: token
        - configMap:
            items:
              - key: ca.crt
                path: ca.crt
            name: kube-root-ca.crt
        - downwardAPI:
            items:
              - fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
                path: namespace

์œ„์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ์„ธ ๊ฐ€์ง€ ์ •๋ณด๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์ ํ‹ฐ๋“œ ๋ณผ๋ฅจ์„ ์ •์˜ํ•œ๋‹ค.

  1. ์„œ๋น„์Šค์–ด์นด์šดํŠธํ† ํฐ(serviceAccountToken) ์ •๋ณด๋Š” kubelet์ด kube-apiserver๋กœ๋ถ€ํ„ฐ ์ทจ๋“ํ•œ ํ† ํฐ์„ ํฌํ•จํ•œ๋‹ค. kubelet์€ TokenRequest API๋ฅผ ํ†ตํ•ด ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ† ํฐ์„ ๋ฐœ๊ธ‰ ๋ฐ›๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ์ทจ๋“ํ•œ ํ† ํฐ์€ ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์ง€์ •๋œ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ดํ›„์— ๋งŒ๋ฃŒ๋œ๋‹ค(๊ธฐ๋ณธ๊ฐ’์€ 1์‹œ๊ฐ„์ด๋‹ค). ์ด ํ† ํฐ์€ ํŠน์ •ํ•œ ํŒŒ๋“œ์— ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ kube-apiserver๋ฅผ ๊ทธ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค.
  2. ์ปจํ”ผ๊ทธ๋งต(ConfigMap) ์ •๋ณด๋Š” ์ธ์ฆ ๋ฐ ์ธ๊ฐ€์— ๊ด€ํ•œ ๋ฒˆ๋“ค์„ ํฌํ•จํ•œ๋‹ค. ํŒŒ๋“œ๋“ค์€ ์ด๋Ÿฌํ•œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์˜ kube-apiserver(๋ฏธ๋“ค๋ฐ•์Šค๋‚˜ ์‹ค์ˆ˜๋กœ ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ํ”ผ์–ด๊ฐ€ ์•„๋‹Œ) ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. DownwardAPI ์ •๋ณด๋Š” ํŒŒ๋“œ๊ฐ€ ํฌํ•จ๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ํ•ด๋‹น ์ •๋ณด๋ฅผ ํŒŒ๋“œ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์œ„์˜ ์ •๋ณด๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ API ํ† ํฐ ์ƒ์„ฑํ•˜๊ธฐ

์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ์œ„ํ•œ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š๋Š” API ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ํ•ด๋‹น ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฐ–๋Š” kubernetes.io/service-account-token ํƒ€์ž…์˜ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ์‹œํฌ๋ฆฟ์„ ๊ฐฑ์‹ ํ•  ๊ฒƒ์ด๋‹ค.

์•„๋ž˜๋Š” ์‹œํฌ๋ฆฟ์„ ์œ„ํ•œ ์˜ˆ์ œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์ด๋‹ค.

apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: mysecretname
  annotations:
    kubernetes.io/service-account.name: myserviceaccount

์ด ์˜ˆ์ œ์— ๊ธฐ๋ฐ˜ํ•œ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

kubectl -n examplens create -f https://k8s.io/examples/secret/serviceaccount/mysecretname.yaml

์‹œํฌ๋ฆฟ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋ ค๋ฉด, ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

kubectl -n examplens describe secret mysecretname

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Name:           mysecretname
Namespace:      examplens
Labels:         <none>
Annotations:    kubernetes.io/service-account.name=myserviceaccount
                kubernetes.io/service-account.uid=8a85c4c4-8483-11e9-bc42-526af7764f64

Type:   kubernetes.io/service-account-token

Data
====
ca.crt:         1362 bytes
namespace:      9 bytes
token:          ...

๋งŒ์•ฝ examplens ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ํŒŒ๋“œ๋Š” ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ myserviceaccount ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋น„์Šค์–ด์นด์šดํŠธ ํ† ํฐ ์‹œํฌ๋ฆฟ ์‚ญ์ œ/๋ฌดํšจํ™”

๋งŒ์•ฝ ์ œ๊ฑฐํ•˜๋ ค๋Š” ํ† ํฐ์„ ํฌํ•จํ•˜๋Š” ์‹œํฌ๋ฆฟ์˜ ์ด๋ฆ„์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

kubectl delete secret name-of-secret

๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด, ๋จผ์ € ์‹œํฌ๋ฆฟ์„ ํ™•์ธํ•œ๋‹ค.

# ์•„๋ž˜ ๋ช…๋ น์–ด๋Š” 'examplens' ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
kubectl -n examplens get serviceaccount/example-automated-thing -o yaml

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"example-automated-thing","namespace":"examplens"}}      
  creationTimestamp: "2019-07-21T07:07:07Z"
  name: example-automated-thing
  namespace: examplens
  resourceVersion: "777"
  selfLink: /api/v1/namespaces/examplens/serviceaccounts/example-automated-thing
  uid: f23fd170-66f2-4697-b049-e1e266b7f835
secrets:
  - name: example-automated-thing-token-zyxwv

์ด์ œ ์‹œํฌ๋ฆฟ์˜ ์ด๋ฆ„์„ ์•Œ์•˜์œผ๋‹ˆ, ์‚ญ์ œํ•œ๋‹ค.

kubectl -n examplens delete secret/example-automated-thing-token-zyxwv

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ์„œ๋น„์Šค์–ด์นด์šดํŠธ์— ์‹œํฌ๋ฆฟ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Œ์„ ๊ฐ์ง€ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

kubectl -n examplens get serviceaccount/example-automated-thing -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"example-automated-thing","namespace":"examplens"}}      
  creationTimestamp: "2019-07-21T07:07:07Z"
  name: example-automated-thing
  namespace: examplens
  resourceVersion: "1026"
  selfLink: /api/v1/namespaces/examplens/serviceaccounts/example-automated-thing
  uid: f23fd170-66f2-4697-b049-e1e266b7f835
secrets:
  - name: example-automated-thing-token-4rdrh

์ •๋ฆฌํ•˜๊ธฐ

์˜ˆ์ œ๋ฅผ ์œ„ํ•ด examplens ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์—ˆ๋‹ค๋ฉด, ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl delete namespace examplens

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ๋“ค

์„œ๋น„์Šค์–ด์นด์šดํŠธ ์ปจํŠธ๋กค๋Ÿฌ

์„œ๋น„์Šค์–ด์นด์šดํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋“ค์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ํ™œ์„ฑํ™”๋œ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— "default"๋ผ๋Š” ์ด๋ฆ„์˜ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๊ฐ€ ์กด์žฌํ•˜๋„๋ก ํ•œ๋‹ค.

ํ† ํฐ ์ปจํŠธ๋กค๋Ÿฌ

ํ† ํฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” kube-controller-manager์˜ ์ผ๋ถ€๋กœ์จ ์‹คํ–‰๋˜๋ฉฐ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • ์„œ๋น„์Šค์–ด์นด์šดํŠธ์— ๋Œ€ํ•œ ์ƒ์„ฑ์„ ๊ฐ์‹œํ•˜๊ณ , ํ•ด๋‹น ์„œ๋น„์Šค์–ด์นด์šดํŠธ ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•˜์—ฌ API์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • ์„œ๋น„์Šค์–ด์นด์šดํŠธ์— ๋Œ€ํ•œ ์‚ญ์ œ๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค์–ด์นด์šดํŠธ ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ๊ฐ™์ด ์‚ญ์ œํ•œ๋‹ค.
  • ์„œ๋น„์Šค์–ด์นด์šดํŠธ ํ† ํฐ ์‹œํฌ๋ฆฟ์— ๋Œ€ํ•œ ์ถ”๊ฐ€๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ์ฐธ์กฐ๋œ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‹œํฌ๋ฆฟ์— ํ† ํฐ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์‹œํฌ๋ฆฟ์— ๋Œ€ํ•œ ์‚ญ์ œ๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ์„œ๋น„์Šค์–ด์นด์šดํŠธ์—์„œ ์ฐธ์กฐ ์ค‘์ธ ํ•ญ๋ชฉ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.

์„œ๋น„์Šค ์–ด์นด์šดํŠธ ๊ฐœ์ธํ‚ค ํŒŒ์ผ์€ --service-account-private-key-file ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ kube-controller-manager ์˜ ํ† ํฐ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ฐœ์ธํ‚ค๋Š” ์ƒ์„ฑ๋œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ์— ์„œ๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ --service-account-key-file ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ณต๊ฐœํ‚ค๋ฅผ kube-apiserver ์— ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ณต๊ฐœํ‚ค๋Š” ์ธ์ฆ ๊ณผ์ •์—์„œ ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

3.3 - ์ธ๊ฐ€ ๊ฐœ์š”

์ง€์›๋˜๋Š” ์ธ๊ฐ€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ฑ…์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ธ๊ฐ€์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ์ธ๊ฐ€(์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌ) ๋ฐ›๊ธฐ ์ „์— ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ(๋กœ๊ทธ์ธ)๋˜์–ด์•ผ ํ•œ๋‹ค. ์ธ์ฆ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์ ‘๊ทผ ์ œ์–ดํ•˜๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” REST API ์š”์ฒญ์— ๊ณตํ†ต์ ์ธ ์†์„ฑ์„ ์š”๊ตฌํ•œ๋‹ค. ์ด๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ธ๊ฐ€๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์ด์™ธ์— ๋‹ค๋ฅธ API๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์กด ์กฐ์ง ์ „์ฒด ๋˜๋Š” ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž ์ „์ฒด์˜ ์ ‘๊ทผ ์ œ์–ด ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์š”์ฒญ ํ—ˆ์šฉ ๋˜๋Š” ๊ฑฐ๋ถ€ ๊ฒฐ์ •

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” API ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ API ์š”์ฒญ์„ ์ธ๊ฐ€ํ•œ๋‹ค. ๋ชจ๋“  ์ •์ฑ…๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ชจ๋“  ์š”์ฒญ ์†์„ฑ์„ ํ‰๊ฐ€ํ•˜๊ณ  ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•œ๋‹ค. ๊ณ„์† ์ง„ํ–‰ํ•˜๋ ค๋ฉด API ์š”์ฒญ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ด ์ผ๋ถ€ ์ •์ฑ…์— ์˜ํ•ด ๋ฐ˜๋“œ์‹œ ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šน์ธ์ด ๊ฑฐ๋ถ€๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

(์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” API ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํŠน์ • ์˜ค๋ธŒ์ ํŠธ์˜ ํŠน์ • ํ•„๋“œ์— ์˜์กดํ•˜๋Š” ์ ‘๊ทผ ์ œ์–ด ๋ฐ ์ •์ฑ…์€ ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค.)

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ๊ฐ€ ๋ชจ๋“ˆ์ด ๊ตฌ์„ฑ๋˜๋ฉด ๊ฐ ๋ชจ๋“ˆ์ด ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธ๋œ๋‹ค. ์–ด๋А ์ธ๊ฐ€ ๋ชจ๋“ˆ์ด ์š”์ฒญ์„ ์Šน์ธํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ๊ฒฝ์šฐ, ๊ทธ ๊ฒฐ์ •์€ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜๋ฉฐ ๋‹ค๋ฅธ ์ธ๊ฐ€ ๋ชจ๋“ˆ์ด ์ฐธ๊ณ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ชจ๋“  ๋ชจ๋“ˆ์—์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ํ‰๊ฐ€๊ฐ€ ์—†์œผ๋ฉด ์š”์ฒญ์ด ๊ฑฐ๋ถ€๋œ๋‹ค. ์š”์ฒญ ๊ฑฐ๋ถ€๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ 403์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์š”์ฒญ ์†์„ฑ ๊ฒ€ํ† 

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋‹ค์Œ API ์š”์ฒญ ์†์„ฑ๋งŒ ๊ฒ€ํ† ํ•œ๋‹ค.

  • user - ์ธ์ฆ ์ค‘์— ์ œ๊ณต๋œ user ๋ฌธ์ž์—ด.
  • group - ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน ์ด๋ฆ„ ๋ชฉ๋ก.
  • extra - ์ธ์ฆ ๊ณ„์ธต์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌธ์ž์—ด ๊ฐ’์— ๋Œ€ํ•œ ์ž„์˜์˜ ๋ฌธ์ž์—ด ํ‚ค ๋งต.
  • API - ์š”์ฒญ์ด API ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€.
  • Request path - /api ๋˜๋Š” /healthz์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์—”๋“œํฌ์ธํŠธ์˜ ๊ฒฝ๋กœ.
  • API request verb - get, list, create, update, patch, watch, delete, deletecollection๊ณผ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์— ์‚ฌ์šฉํ•˜๋Š” API ๋™์‚ฌ. ๋ฆฌ์†Œ์Šค API ์—”๋“œํฌ์ธํŠธ์˜ ์š”์ฒญ ๋™์‚ฌ๋ฅผ ๊ฒฐ์ •ํ•˜๋ ค๋ฉด ์š”์ฒญ ๋™์‚ฌ ๊ฒฐ์ •์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • HTTP request verb - get, post, put, delete์ฒ˜๋Ÿผ ์†Œ๋ฌธ์ž HTTP ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์š”์ฒญ์— ์‚ฌ์šฉํ•œ๋‹ค.
  • Resource - ์ ‘๊ทผ ์ค‘์ธ ๋ฆฌ์†Œ์Šค์˜ ID ๋˜๋Š” ์ด๋ฆ„(๋ฆฌ์†Œ์Šค ์š”์ฒญ๋งŒ ํ•ด๋‹น) -- get, update, patch, delete ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ์˜ ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • Subresource - ์ ‘๊ทผ ์ค‘์ธ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค(๋ฆฌ์†Œ์Šค ์š”์ฒญ๋งŒ ํ•ด๋‹น).
  • Namespace - ์ ‘๊ทผ ์ค‘์ธ ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํ• ๋‹น๋œ ๋ฆฌ์†Œ์Šค ์š”์ฒญ๋งŒ ํ•ด๋‹น)
  • API group - ์ ‘๊ทผ ์ค‘์ธ API ๊ทธ๋ฃน(๋ฆฌ์†Œ์Šค ์š”์ฒญ์—๋งŒ ํ•ด๋‹น). ๋นˆ ๋ฌธ์ž์—ด์€ ํ•ต์‹ฌ(core) API ๊ทธ๋ฃน์„ ์ง€์ •ํ•œ๋‹ค.

์š”์ฒญ ๋™์‚ฌ ๊ฒฐ์ •

๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์š”์ฒญ /api/v1/... ๋˜๋Š” /apis/<group>/<version>/... ์ด์™ธ์— ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์š”์ฒญ์€ "๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์š”์ฒญ"์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ, ์š”์ฒญ์˜ ์†Œ๋ฌธ์ž HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๋™์‚ฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, /api ๋˜๋Š” /healthz์™€ ๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ GET ์š”์ฒญ์€ get์„ ๋™์‚ฌ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฆฌ์†Œ์Šค API ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์š”์ฒญ ๋™์‚ฌ๋ฅผ ๊ฒฐ์ •ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ๋œ HTTP ๋™์‚ฌ์™€ ํ•ด๋‹น ์š”์ฒญ์ด ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋ฆฌ์†Œ์Šค ๋ชจ์Œ์— ์ ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€ํ† ํ•œ๋‹ค.

HTTP ๋™์‚ฌ์š”์ฒญ ๋™์‚ฌ
POSTcreate
GET, HEADget(๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค), list(์ „์ฒด ์˜ค๋ธŒ์ ํŠธ ๋‚ด์šฉ์„ ํฌํ•จํ•œ ๋ฆฌ์†Œ์Šค ๋ชจ์Œ), watch(๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋ฆฌ์†Œ์Šค ๋ชจ์Œ์„ ์ฃผ์‹œ)
PUTupdate
PATCHpatch
DELETEdelete(๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค), deletecollection(๋ฆฌ์†Œ์Šค ๋ชจ์Œ)

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ข…์ข… ์ „๋ฌธ ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๊ฐ€์ ์ธ ๊ถŒํ•œ ์ธ๊ฐ€๋ฅผ ํ™•์ธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด,

  • RBAC
    • rbac.authorization.k8s.io API ๊ทธ๋ฃน์˜ roles ๋ฐ clusterroles ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ bind ๋™์‚ฌ.
  • ์ธ์ฆ
    • ํ•ต์‹ฌ API ๊ทธ๋ฃน์˜ users, groups, serviceaccounts์™€ authentication.k8s.io API ๊ทธ๋ฃน์˜ userextras ๋™์‚ฌ.

์ธ๊ฐ€ ๋ชจ๋“œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„๋Š” ๋ช‡ ๊ฐ€์ง€ ์ธ๊ฐ€ ๋ชจ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์Šน์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Node - ์‹คํ–‰๋˜๋„๋ก ์Šค์ผ€์ค„๋œ ํŒŒ๋“œ์— ๋”ฐ๋ผ kubelet์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ํŠน์ˆ˜ ๋ชฉ์  ์ธ๊ฐ€ ๋ชจ๋“œ. Node ์ธ๊ฐ€ ๋ชจ๋“œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Node ์ธ๊ฐ€๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • ABAC - ์†์„ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (ABAC, Attribute-based access control)๋Š” ์†์„ฑ๊ณผ ๊ฒฐํ•ฉํ•œ ์ •์ฑ…์˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์ ‘๊ทผ ์ œ์–ด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋งํ•œ๋‹ค. ์ด ์ •์ฑ…์€ ๋ชจ๋“  ์œ ํ˜•์˜ ์†์„ฑ(์‚ฌ์šฉ์ž ์†์„ฑ, ๋ฆฌ์†Œ์Šค ์†์„ฑ, ์˜ค๋ธŒ์ ํŠธ, ํ™˜๊ฒฝ ์†์„ฑ ๋“ฑ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ABAC ๋ชจ๋“œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ABAC ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • RBAC - ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด(RBAC, Role-based access control)๋Š” ๊ธฐ์—… ๋‚ด ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปดํ“จํ„ฐ๋‚˜ ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๊ทœ์ œํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด ๋งฅ๋ฝ์—์„œ ์ ‘๊ทผ์€ ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ์„ ๋ณด๊ฑฐ๋‚˜ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด๋‹ค. RBAC ๋ชจ๋“œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ RBAC ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
    • ์ง€์ •๋œ RBAC(์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด)์ด ์ธ๊ฐ€ ๊ฒฐ์ •์„ ์œ„ํ•ด rbac.authorization.k8s.io API ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ด€๋ฆฌ์ž๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ํ†ตํ•ด ๊ถŒํ•œ ์ •์ฑ…์„ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • RBAC์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด --authorization-mode=RBAC๋กœ API ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
  • Webhook - WebHook์€ HTTP ์ฝœ๋ฐฑ์ด๋‹ค(์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” HTTP POST์™€ HTTP POST๋ฅผ ํ†ตํ•œ ๊ฐ„๋‹จํ•œ ์ด๋ฒคํŠธ ์•Œ๋ฆผ). WebHook์„ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํŠน์ •ํ•œ ์ผ์ด ๋ฐœ์ƒํ•  ๋•Œ URL์— ๋ฉ”์‹œ์ง€๋ฅผ POST ํ•  ๊ฒƒ์ด๋‹ค. Webhook ๋ชจ๋“œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Webhook ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

API ์ ‘๊ทผ ํ™•์ธ

kubectl์€ API ์ธ์ฆ ๊ณ„์ธต์„ ์‹ ์†ํ•˜๊ฒŒ ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ auth can-i ํ•˜์œ„ ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ๋ช…๋ น์€ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด SelfSubjectAccessReview API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์‚ฌ์šฉ๋˜๋Š” ์ธ๊ฐ€ ๋ชจ๋“œ์— ๊ด€๊ณ„์—†์ด ์ž‘๋™ํ•œ๋‹ค.

kubectl auth can-i create deployments --namespace dev

๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

yes
kubectl auth can-i create deployments --namespace prod

๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

no

๊ด€๋ฆฌ์ž๋Š” ์ด๋ฅผ ์‚ฌ์šฉ์ž ๊ฐ€์žฅ(impersonation)๊ณผ ๋ณ‘ํ–‰ํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl auth can-i list secrets --namespace dev --as dave

๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

no

์œ ์‚ฌํ•˜๊ฒŒ, dev ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ dev-sa ์„œ๋น„์Šค์–ด์นด์šดํŠธ๊ฐ€ target ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ํŒŒ๋“œ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ๋‹ค.

kubectl auth can-i list pods \
	--namespace target \
	--as system:serviceaccount:dev:dev-sa

๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

yes

SelfSubjectAccessReview๋Š” authorization.k8s.io API ๊ทธ๋ฃน์˜ ์ผ๋ถ€๋กœ์„œ API ์„œ๋ฒ„ ์ธ๊ฐ€๋ฅผ ์™ธ๋ถ€ ์„œ๋น„์Šค์— ๋…ธ์ถœ์‹œํ‚จ๋‹ค. ์ด ๊ทธ๋ฃน์˜ ๊ธฐํƒ€ ๋ฆฌ์†Œ์Šค์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋œ๋‹ค.

  • SubjectAccessReview - ํ˜„์žฌ ์‚ฌ์šฉ์ž๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ฒ€ํ† . API ์„œ๋ฒ„์— ์ธ๊ฐ€ ๊ฒฐ์ •์„ ์œ„์ž„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, kubelet ๋ฐ ํ™•์žฅ(extension) API ์„œ๋ฒ„๋Š” ์ž์‹ ์˜ API์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ ‘๊ทผ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • LocalSubjectAccessReview - SubjectAccessReview์™€ ๋น„์Šทํ•˜์ง€๋งŒ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ œํ•œ๋œ๋‹ค.
  • SelfSubjectRulesReview - ์‚ฌ์šฉ์ž๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒ€ํ† . ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์ ‘๊ทผ์„ ๋น ๋ฅด๊ฒŒ ์š”์•ฝํ•ด์„œ ๋ณด๊ฑฐ๋‚˜ UI๊ฐ€ ์ž‘์—…์„ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

์ด๋Ÿฌํ•œ API๋Š” ๋ฐ˜ํ™˜๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ์‘๋‹ต "status" ํ•„๋“œ๊ฐ€ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์ธ ์ผ๋ฐ˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl create -f - -o yaml << EOF
apiVersion: authorization.k8s.io/v1
kind: SelfSubjectAccessReview
spec:
  resourceAttributes:
    group: apps
    resource: deployments
    verb: create
    namespace: dev
EOF

์ƒ์„ฑ๋œ SelfSubjectAccessReview ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: authorization.k8s.io/v1
kind: SelfSubjectAccessReview
metadata:
  creationTimestamp: null
spec:
  resourceAttributes:
    group: apps
    resource: deployments
    namespace: dev
    verb: create
status:
  allowed: true
  denied: false

์ธ๊ฐ€ ๋ชจ๋“ˆ์— ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ

์ •์ฑ…์— ํฌํ•จ๋œ ์ธ๊ฐ€ ๋ชจ๋“ˆ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์ •์ฑ…์— ํ”Œ๋ž˜๊ทธ๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

๋‹ค์Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • --authorization-mode=ABAC ์†์„ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด(ABAC) ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ฑ…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • --authorization-mode=RBAC ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด(RBAC) ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ฑ…์„ ๋งŒ๋“ค๊ณ  ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • --authorization-mode=Webhook WebHook์€ ์›๊ฒฉ REST ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๊ฐ€๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” HTTP ์ฝœ๋ฐฑ ๋ชจ๋“œ๋‹ค.
  • --authorization-mode=Node ๋…ธ๋“œ ์ธ๊ฐ€๋Š” kubelet์ด ์ƒ์„ฑํ•œ API ์š”์ฒญ์„ ํŠน๋ณ„ํžˆ ์ธ๊ฐ€์‹œํ‚ค๋Š” ํŠน์ˆ˜ ๋ชฉ์  ์ธ๊ฐ€ ๋ชจ๋“œ๋‹ค.
  • --authorization-mode=AlwaysDeny ์ด ํ”Œ๋ž˜๊ทธ๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ฐจ๋‹จํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ํ…Œ์ŠคํŠธ์—๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
  • --authorization-mode=AlwaysAllow ์ด ํ”Œ๋ž˜๊ทธ๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ํ—ˆ์šฉํ•œ๋‹ค. API ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธ๊ฐ€ ๋ชจ๋“ˆ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“ˆ์ด ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ๋ชจ๋“ˆ์ด ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์›Œํฌ๋กœ๋“œ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •์„ ํ†ตํ•œ ๊ถŒํ•œ ํ™•๋Œ€

๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํŒŒ๋“œ๋ฅผ ์ง์ ‘, ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์™€ ๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ/์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์—์„œ ์ž์‹ ์˜ ๊ถŒํ•œ์„ ํ™•๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ถŒํ•œ ํ™•๋Œ€ ๊ฒฝ๋กœ

  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ์ž„์˜์˜ ์‹œํฌ๋ฆฟ์„ ๋งˆ์šดํŠธ
    • ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์‹œํฌ๋ฆฟ์œผ๋กœ์˜ ์ ‘๊ทผ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
    • ๋” ๊ถŒํ•œ์ด ๋งŽ์€ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์˜ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ ํš๋“์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ์ž„์˜์˜ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ์‚ฌ์šฉ
    • ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ์ธ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์นญํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
    • ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” '๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์•ก์…˜'์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์ปจํ”ผ๊ทธ๋งต์„ ๋งˆ์šดํŠธ
    • ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์ •๋ณด(์˜ˆ: DB ํ˜ธ์ŠคํŠธ ์ด๋ฆ„) ํš๋“์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธ
    • ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์ •๋ณด์˜ ํš๋“ ๋ฐ ์ˆ˜์ •์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ

๋‹ค์Œ ๋‚ด์šฉ

3.4 - Kubelet ์ธ์ฆ/์ธ๊ฐ€

๊ฐœ์š”

kubelet์˜ HTTPS ์—”๋“œํฌ์ธํŠธ๋Š” ๋‹ค์–‘ํ•œ ๋ฏผ๊ฐ๋„์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ๋…ธ์ถœํ•˜๋ฉฐ, ๋…ธ๋“œ์™€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์˜ ๊ถŒํ•œ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

์ด ๋ฌธ์„œ๋Š” kubelet์˜ HTTPS ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ธ์ฆํ•˜๊ณ  ์ธ๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

Kubelet ์ธ์ฆ

๊ธฐ๋ณธ์ ์œผ๋กœ, ๋‹ค๋ฅธ ๊ตฌ์„ฑ์˜ ์ธ์ฆ ๋ฐฉ๋ฒ•์— ์˜ํ•ด ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์€ kubelet์˜ HTTPS ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์š”์ฒญ์€ ์ต๋ช…์˜ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, system:anonymous์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ system:unauthenticated ์˜ ๊ทธ๋ฃน์ด ๋ถ€์—ฌ๋œ๋‹ค.

์ต๋ช…์˜ ์ ‘๊ทผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ธ์ฆ๋˜์ง€ ์•Š์€ ์š”์ฒญ์— 401 Unauthorized ์‘๋‹ต์„ ๋ณด๋‚ด๋ ค๋ฉด ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • --anonymous-auth=false ํ”Œ๋ž˜๊ทธ๋กœ kubelet์„ ์‹œ์ž‘

kubelet์˜ HTTPS ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ X509 ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์ธ์ฆ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • --client-ca-file ํ”Œ๋ž˜๊ทธ๋กœ kubelet์„ ์‹œ์ž‘ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” CA ๋ฒˆ๋“ค์„ ์ œ๊ณต
  • --kubelet-client-certificate ๋ฐ --kubelet-client-key ํ”Œ๋ž˜๊ทธ๋กœ apiserver๋ฅผ ์‹œ์ž‘
  • ์ž์„ธํ•œ ๋‚ด์šฉ์€ apiserver ์ธ์ฆ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ 

API bearer ํ† ํฐ(์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ํฌํ•จ)์„ kubelet์˜ HTTPS ์—”๋“œํฌ์ธํŠธ ์ธ์ฆ์— ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • API ์„œ๋ฒ„์—์„œ authentication.k8s.io/v1beta1 API ๊ทธ๋ฃน์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
  • --authentication-token-webhook ๋ฐ --kubeconfig ํ”Œ๋ž˜๊ทธ๋กœ kubelet์„ ์‹œ์ž‘
  • kubelet์€ ๊ตฌ์„ฑ๋œ API ์„œ๋ฒ„์˜ TokenReview API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ bearer ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฒฐ์ •

Kubelet ์Šน์ธ

์„ฑ๊ณต์ ์œผ๋กœ ์ธ์ฆ๋œ ๋ชจ๋“  ์š”์ฒญ(์ต๋ช… ์š”์ฒญ ํฌํ•จ)์ด ์Šน์ธ๋œ๋‹ค. ๊ธฐ๋ณธ ์ธ๊ฐ€ ๋ชจ๋“œ๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” AlwaysAllow ์ด๋‹ค.

kubelet API์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์„ธ๋ถ„ํ™”ํ•˜๋Š” ๋ฐ๋Š” ๋‹ค์–‘ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค.

  • ์ต๋ช… ์ธ์ฆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ต๋ช… ์‚ฌ์šฉ์ž์˜ kubelet API ํ˜ธ์ถœ ๊ธฐ๋Šฅ์€ ์ œํ•œ๋˜์–ด์•ผ ํ•จ
  • bearer ํ† ํฐ ์ธ์ฆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ž„์˜์˜ API ์‚ฌ์šฉ์ž(API ๊ณ„์ •)์˜ kubelet API ํ˜ธ์ถœ ๊ธฐ๋Šฅ์€ ์ œํ•œ๋˜์–ด์•ผ ํ•จ
  • ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ตฌ์„ฑ๋œ CA์—์„œ ์„œ๋ช…ํ•œ ์ผ๋ถ€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋งŒ kubelet API๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•จ

kubelet API์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์„ธ๋ถ„ํ™”ํ•˜๋ ค๋ฉด API ์„œ๋ฒ„์— ๊ถŒํ•œ์„ ์œ„์ž„ํ•œ๋‹ค.

  • authorization.k8s.io/v1beta1 API ๊ทธ๋ฃน์ด API ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
  • --authorization-mode=Webhook ๋ฐ --kubeconfig ํ”Œ๋ž˜๊ทธ๋กœ kubelet์„ ์‹œ์ž‘
  • kubelet์€ ๊ตฌ์„ฑ๋œ API ์„œ๋ฒ„์˜ SubjectAccessReview API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์š”์ฒญ์ด ์Šน์ธ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ

kubelet์€ API ์š”์ฒญ์„ apiserver์™€ ๋™์ผํ•œ ์š”์ฒญ ์†์„ฑ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šน์ธํ•œ๋‹ค.

๋™์‚ฌ๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์˜ HTTP ๋™์‚ฌ๋กœ๋ถ€ํ„ฐ ๊ฒฐ์ •๋œ๋‹ค.

HTTP ๋™์‚ฌ์š”์ฒญ ๋™์‚ฌ
POSTcreate
GET, HEADget
PUTupdate
PATCHpatch
DELETEdelete

๋ฆฌ์†Œ์Šค ๋ฐ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์˜ ๊ฒฝ๋กœ๋กœ๋ถ€ํ„ฐ ๊ฒฐ์ •๋œ๋‹ค.

Kubelet API๋ฆฌ์†Œ์Šคํ•˜์œ„ ๋ฆฌ์†Œ์Šค
/stats/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/spec/*nodesspec
all othersnodesproxy

๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ API ๊ทธ๋ฃน ์†์„ฑ์€ ํ•ญ์ƒ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉฐ, ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์€ ํ•ญ์ƒ kubelet์˜ Node API ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„์ด๋‹ค.

์ด ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•  ๋•Œ, --kubelet-client-certificate ๋ฐ --kubelet-client-key ํ”Œ๋ž˜๊ทธ๋กœ ์‹๋ณ„๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์Œ ์†์„ฑ์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • verb=*, resource=nodes, subresource=proxy
  • verb=*, resource=nodes, subresource=stats
  • verb=*, resource=nodes, subresource=log
  • verb=*, resource=nodes, subresource=spec
  • verb=*, resource=nodes, subresource=metrics

4 - ์ž˜ ์•Œ๋ ค์ง„ ๋ ˆ์ด๋ธ”, ์–ด๋…ธํ…Œ์ด์…˜, ํ…Œ์ธํŠธ(Taint)

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋ชจ๋“  ๋ ˆ์ด๋ธ”๊ณผ ์–ด๋…ธํ…Œ์ด์…˜์„ kubernetes.io์™€ k8s.io ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•„๋ž˜์— ์ •์˜ํ•ด ๋†“์•˜๋‹ค.

์ด ๋ฌธ์„œ๋Š” ๊ฐ ๊ฐ’์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•œ ํ˜‘๋ ฅ ํฌ์ธํŠธ๋„ ์ œ๊ณตํ•œ๋‹ค.

API ์˜ค๋ธŒ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ ˆ์ด๋ธ”, ์–ด๋…ธํ…Œ์ด์…˜, ํ…Œ์ธํŠธ

app.kubernetes.io/component

์˜ˆ์‹œ: app.kubernetes.io/component: "database"

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ (์ผ๋ฐ˜์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ๋จ)

์•„ํ‚คํ…์ฒ˜ ๋‚ด์˜ ์ปดํฌ๋„ŒํŠธ.

์ถ”์ฒœํ•˜๋Š” ๋ ˆ์ด๋ธ”์„ ํ™•์ธํ•œ๋‹ค.

app.kubernetes.io/created-by (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

์˜ˆ์‹œ: app.kubernetes.io/created-by: "controller-manager"

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ (์ผ๋ฐ˜์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ๋จ)

๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ ์ปจํŠธ๋กค๋Ÿฌ/์‚ฌ์šฉ์ž.

app.kubernetes.io/instance

์˜ˆ์‹œ: app.kubernetes.io/instance: "mysql-abcxzy"

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ (์ผ๋ฐ˜์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ๋จ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ ํ•œ ์ด๋ฆ„. ๊ณ ์œ ํ•˜์ง€ ์•Š์€ ์ด๋ฆ„์„ ํ• ๋‹นํ•˜๋ ค๋ฉด, app.kubernetes.io/name๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ถ”์ฒœํ•˜๋Š” ๋ ˆ์ด๋ธ”์„ ํ™•์ธํ•œ๋‹ค.

app.kubernetes.io/managed-by

์˜ˆ์‹œ: app.kubernetes.io/managed-by: "helm"

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ (์ผ๋ฐ˜์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ๋จ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ.

์ถ”์ฒœํ•˜๋Š” ๋ ˆ์ด๋ธ”์„ ํ™•์ธํ•œ๋‹ค.

app.kubernetes.io/name

์˜ˆ์‹œ: app.kubernetes.io/name: "mysql"

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ (์ผ๋ฐ˜์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ๋จ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฆ„.

์ถ”์ฒœํ•˜๋Š” ๋ ˆ์ด๋ธ”์„ ํ™•์ธํ•œ๋‹ค.

app.kubernetes.io/part-of

์˜ˆ์‹œ: app.kubernetes.io/part-of: "wordpress"

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ (์ผ๋ฐ˜์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ๋จ)

ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์†ํ•œ ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„.

์ถ”์ฒœํ•˜๋Š” ๋ ˆ์ด๋ธ”์„ ํ™•์ธํ•œ๋‹ค.

app.kubernetes.io/version

์˜ˆ์‹œ: app.kubernetes.io/version: "5.7.21"

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ (์ผ๋ฐ˜์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ๋จ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ˜„์žฌ ๋ฒ„์ „.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๊ฐ’๋“ค์„ ํฌํ•จํ•œ๋‹ค.

์ถ”์ฒœํ•˜๋Š” ๋ ˆ์ด๋ธ”์„ ํ™•์ธํ•œ๋‹ค.

cluster-autoscaler.kubernetes.io/safe-to-evict

์˜ˆ์‹œ: cluster-autoscaler.kubernetes.io/safe-to-evict: "true"

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

์ด ์–ด๋…ธํ…Œ์ด์…˜์ด "true"๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ํŒŒ๋“œ ์ถ•์ถœ์„ ๋ง‰๋Š” ๋‹ค๋ฅธ ๊ทœ์น™์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ํด๋Ÿฌ์Šคํ„ฐ ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ํŒŒ๋“œ๋ฅผ ์ถ•์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด "false"๋กœ ์„ค์ •๋œ ํŒŒ๋“œ๋ฅผ ์ ˆ๋Œ€ ์ถ•์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ, ๊ณ„์†ํ•ด์„œ ์‹คํ–‰์„ ์œ ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ์ค‘์š”ํ•œ ํŒŒ๋“œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํด๋Ÿฌ์Šคํ„ฐ ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ๋Š” ํŒŒ๋“œ ์ˆ˜์ค€(Pod-level) ๋™์ž‘์„ ๋”ฐ๋ฅธ๋‹ค.

kubernetes.io/arch

์˜ˆ์‹œ: kubernetes.io/arch=amd64

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

Go์— ์˜ํ•ด ์ •์˜๋œ runtime.GOARCH ๊ฐ’์„ kubelet์ด ์ฝ์–ด์„œ ์ด ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค. arm ๋…ธ๋“œ์™€ x86 ๋…ธ๋“œ๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubernetes.io/os

์˜ˆ์‹œ: kubernetes.io/os=linux

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

Go์— ์˜ํ•ด ์ •์˜๋œ runtime.GOOS ๊ฐ’์„ kubelet์ด ์ฝ์–ด์„œ ์ด ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ(์˜ˆ: ๋ฆฌ๋ˆ…์Šค ๋ฐ ์œˆ๋„์šฐ ๋…ธ๋“œ)ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubernetes.io/metadata.name

์˜ˆ์‹œ: kubernetes.io/metadata.name=mynamespace

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

(์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์ผ๋ถ€์ธ) ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„๊ฐ€ ์ด ๋ ˆ์ด๋ธ”์„ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ค์ •ํ•œ๋‹ค. ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์ด๋ฆ„์œผ๋กœ ์ ์šฉ๋œ๋‹ค. ์ด ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†๋‹ค.

๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋ ˆ์ด๋ธ”์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubernetes.io/limit-ranger

์˜ˆ์‹œ: kubernetes.io/limit-ranger: "LimitRanger plugin set: cpu, memory request for container nginx; cpu, memory limit for container nginx"

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋– ํ•œ ๋ฆฌ์†Œ์Šค ํ•œ๋„๋„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ํ•œ๋„๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์ปจํ…Œ์ด๋„ˆ๋Š” CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฌด์ œํ•œ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ฆฌ๋ฐ‹๋ ˆ์ธ์ง€๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์ด๋‚˜ ํ•œ๋„ ๊ธฐ๋ณธ๊ฐ’์„ ํŒŒ๋“œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ๋ฐ‹๋ ˆ์ธ์ง€๋ฅผ ์ •์˜ํ•œ ๋’ค์— ๋ฐฐํฌ๋œ ํŒŒ๋“œ๋“ค์€ ์ด๋Ÿฌํ•œ ํ•œ๋„๊ฐ€ ์ ์šฉ๋œ๋‹ค. kubernetes.io/limit-ranger ์–ด๋…ธํ…Œ์ด์…˜์€ ํŒŒ๋“œ์— ๋Œ€ํ•ด ๋ฆฌ์†Œ์Šค ๊ธฐ๋ณธ๊ฐ’์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉ๋˜์—ˆ๋‹ค๊ณ  ๊ธฐ๋กํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฆฌ๋ฐ‹๋ ˆ์ธ์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

beta.kubernetes.io/arch (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

์ด ๋ ˆ์ด๋ธ”์€ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ๋Œ€์‹  kubernetes.io/arch ์„ ์‚ฌ์šฉํ•œ๋‹ค.

beta.kubernetes.io/os (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

์ด ๋ ˆ์ด๋ธ”์€ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ๋Œ€์‹  kubernetes.io/os ์„ ์‚ฌ์šฉํ•œ๋‹ค.

kubernetes.io/hostname

์˜ˆ์‹œ: kubernetes.io/hostname=ip-172-20-114-199.ec2.internal

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

kubelet์ด ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ์ฝ์–ด์„œ ์ด ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค. kubelet ์— --hostname-override ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์‹ค์ œ ํ˜ธ์ŠคํŠธ๋„ค์ž„๊ณผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด ๋ ˆ์ด๋ธ”์€ ํ† ํด๋กœ์ง€ ๊ณ„์ธต์˜ ์ผ๋ถ€๋กœ๋„ ์‚ฌ์šฉ๋œ๋‹ค. topology.kubernetes.io/zone์—์„œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํ™•์ธํ•œ๋‹ค.

kubernetes.io/change-cause

์˜ˆ์‹œ: kubernetes.io/change-cause=kubectl edit --record deployment foo

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์™œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๊ทธ ์ด์œ ๋ฅผ ๋‹ด๋Š”๋‹ค.

์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋Š” kubectl ๋ช…๋ น์— --record ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ ˆ์ด๋ธ”์ด ์ถ”๊ฐ€๋œ๋‹ค.

kubernetes.io/description

์˜ˆ์‹œ: kubernetes.io/description: "Description of K8s object."

์ ์šฉ ๋Œ€์ƒ: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์ฃผ์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ์˜ ํŠน์ • ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

kubernetes.io/enforce-mountable-secrets

์˜ˆ์‹œ: kubernetes.io/enforce-mountable-secrets: "true"

์ ์šฉ ๋Œ€์ƒ: ์„œ๋น„์Šค์–ด์นด์šดํŠธ(ServiceAccount)

์ด ์–ด๋…ธํ…Œ์ด์…˜์˜ ๊ฐ’์€ true๋กœ ์„ค์ •๋˜์–ด์•ผ๋งŒ ์ž‘๋™ํ•œ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€, ํ•ด๋‹น ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋กœ ๋™์ž‘์ค‘์ธ ํŒŒ๋“œ๊ฐ€ ๊ทธ ์„œ๋น„์Šค์–ด์นด์šดํŠธ์˜ secrets ํ•ญ๋ชฉ์— ๋ช…์‹œ๋œ Secret API ์˜ค๋ธŒ์ ํŠธ๋งŒ์„ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

node.kubernetes.io/exclude-from-external-load-balancer

์˜ˆ์‹œ: node.kubernetes.io/exclude-from-external-load-balancer

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ServiceNodeExclusion ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ํ•ด๋‹น ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋“ค๋กœ๋ถ€ํ„ฐ ํŠน์ • ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์ œ์™ธ์‹œํ‚ค๋„๋ก ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋Š” ๋ฐฑ์—”๋“œ ๋ชฉ๋ก์—์„œ ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์ œ์™ธ์‹œํ‚ค๋Š” ๋ช…๋ น์–ด์ด๋‹ค. kubectl label nodes <node-name> node.kubernetes.io/exclude-from-external-load-balancers=true

controller.kubernetes.io/pod-deletion-cost

์˜ˆ์‹œ: controller.kubernetes.io/pod-deletion-cost=10

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ ˆํ”Œ๋ฆฌ์นด์…‹(ReplicaSet) ๋‹ค์šด์Šค์ผ€์ผ ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ์ธ ํŒŒ๋“œ ์‚ญ์ œ ๋น„์šฉ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ๋ช…์‹œ๋œ ๊ฐ’์€ int32 ํƒ€์ž…์œผ๋กœ ํŒŒ์‹ฑ๋œ๋‹ค.

cluster-autoscaler.kubernetes.io/enable-ds-eviction

์˜ˆ์‹œ: cluster-autoscaler.kubernetes.io/enable-ds-eviction: "true"

์ ์šฉ ๋Œ€์ƒ: Pod

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ํด๋Ÿฌ์Šคํ„ฐ ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ๋ฐ๋ชฌ์…‹ ํŒŒ๋“œ๋ฅผ ์ถ•์ถœํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•œ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ฐ๋ชฌ์…‹ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋‚ด ๋ฐ๋ชฌ์…‹ ํŒŒ๋“œ์— ๋ช…์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด "true"๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ํŒŒ๋“œ ์ถ•์ถœ์„ ๋ง‰๋Š” ๋‹ค๋ฅธ ๊ทœ์น™์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ํด๋Ÿฌ์Šคํ„ฐ ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ํŒŒ๋“œ๋ฅผ ์ถ•์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ๋ฐ๋ชฌ์…‹ ํŒŒ๋“œ๋ฅผ ์ถ•์ถœํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ค‘์š”ํ•œ ๋ฐ๋ชฌ์…‹ ํŒŒ๋“œ์— ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ "false"๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํด๋Ÿฌ์Šคํ„ฐ ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์ „์ฒด ๋™์ž‘์„ ๋”ฐ๋ฅธ๋‹ค. ์ฆ‰, ํ•ด๋‹น ๊ตฌ์„ฑ์— ๋”ฐ๋ผ์„œ ๋ฐ๋ชฌ์…‹์„ ์ถ•์ถœํ•œ๋‹ค.

kubernetes.io/ingress-bandwidth

์˜ˆ์‹œ: kubernetes.io/ingress-bandwidth: 10M

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

ํŒŒ๋“œ์— QoS(quality-of-service)๋ฅผ ์ ์šฉํ•จ์œผ๋กœ์จ ๊ฐ€์šฉํ•œ ๋Œ€์—ญํญ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ๊ทธ๋ ˆ์Šค ํŠธ๋ž˜ํ”ฝ(ํŒŒ๋“œ๋กœ ํ–ฅํ•˜๋Š”)์€ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐ ์ค‘์ธ ํŒจํ‚ท์„ ํ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ํŒŒ๋“œ์˜ ๋Œ€์—ญํญ์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” JSON ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  kubernetes.io/ingress-bandwidth ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํŠธ๋ž˜ํ”ฝ์˜ ์†๋„๋ฅผ ๋ช…์‹œํ•œ๋‹ค. ์ธ๊ทธ๋ ˆ์Šค ์†๋„๋ฅผ ๋ช…์‹œํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์œ„๋Š” ์ดˆ๋‹น ๋น„ํŠธ(์ˆ˜๋Ÿ‰)์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 10M์€ ์ดˆ๋‹น 10 ๋ฉ”๊ฐ€๋น„ํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

kubernetes.io/egress-bandwidth

์˜ˆ์‹œ: kubernetes.io/egress-bandwidth: 10M

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

์ด๊ทธ๋ ˆ์Šค ํŠธ๋ž˜ํ”ฝ(ํŒŒ๋“œ๋กœ๋ถ€ํ„ฐ์˜)์€ ์„ค์ •๋œ ์†๋„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ํŒจํ‚ท์„ ์‚ญ์ œํ•˜๋Š” ์ •์ฑ…์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ํŒŒ๋“œ์— ๊ฑฐ๋Š” ์ œํ•œ์€ ๋‹ค๋ฅธ ํŒŒ๋“œ์˜ ๋Œ€์—ญํญ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ํŒŒ๋“œ์˜ ๋Œ€์—ญํญ์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” JSON ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  kubernetes.io/egress-bandwidth ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํŠธ๋ž˜ํ”ฝ์˜ ์†๋„๋ฅผ ๋ช…์‹œํ•œ๋‹ค. ์ด๊ทธ๋ ˆ์Šค ์†๋„๋ฅผ ๋ช…์‹œํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์œ„๋Š” ์ดˆ๋‹น ๋น„ํŠธ(์ˆ˜๋Ÿ‰)์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 10M์€ ์ดˆ๋‹น 10 ๋ฉ”๊ฐ€๋น„ํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

beta.kubernetes.io/instance-type (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

node.kubernetes.io/instance-type

์˜ˆ์‹œ: node.kubernetes.io/instance-type=m3.medium

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์— ์˜ํ•ด ์ •์˜๋œ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์˜ ๊ฐ’์„ kubelet์ด ์ฝ์–ด์„œ ์ด ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค. ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ๋ ˆ์ด๋ธ”์ด ์„ค์ •๋œ๋‹ค. ํŠน์ • ์›Œํฌ๋กœ๋“œ๋ฅผ ํŠน์ • ์ธ์Šคํ„ด์Šค ํƒ€์ž…์— ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋ ˆ์ด๋ธ”์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ž์› ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ธ์Šคํ„ด์Šค ํƒ€์ž… ๋ณด๋‹ค๋Š” ํŠน์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์Šค์ผ€์ค„๋ง์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค(์˜ˆ: g2.2xlarge ๋ฅผ ์š”๊ตฌํ•˜๊ธฐ๋ณด๋‹ค๋Š”, GPU๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์š”๊ตฌํ•œ๋‹ค).

failure-domain.beta.kubernetes.io/region (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

topology.kubernetes.io/region์„ ํ™•์ธํ•œ๋‹ค.

failure-domain.beta.kubernetes.io/zone (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

topology.kubernetes.io/zone์„ ํ™•์ธํ•œ๋‹ค.

statefulset.kubernetes.io/pod-name

์˜ˆ์‹œ:

statefulset.kubernetes.io/pod-name=mystatefulset-7

์Šคํ…Œ์ดํŠธํ’€์…‹(StatefulSet) ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํŒŒ๋“œ๋ฅผ ์œ„ํ•œ ์Šคํ…Œ์ดํŠธํ’€์…‹์„ ์ƒ์„ฑํ•˜๋ฉด, ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ํŒŒ๋“œ์— ์ด ๋ ˆ์ด๋ธ”์„ ์„ค์ •ํ•œ๋‹ค. ์ƒ์„ฑ๋˜๋Š” ํŒŒ๋“œ์˜ ์ด๋ฆ„์„ ์ด ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

์Šคํ…Œ์ดํŠธํ’€์…‹ ๋ฌธ์„œ์˜ ํŒŒ๋“œ ์ด๋ฆ„ ๋ ˆ์ด๋ธ”์—์„œ ์ƒ์„ธ ์‚ฌํ•ญ์„ ํ™•์ธํ•œ๋‹ค.

scheduler.alpha.kubernetes.io/node-selector

์˜ˆ์‹œ: scheduler.alpha.kubernetes.io/node-selector: "name-of-node-selector"

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

ํŒŒ๋“œ-๋…ธ๋“œ ์…€๋ ‰ํ„ฐ(PodNodeSelector)๋Š” ์ด ์–ด๋…ธํ…Œ์ด์…˜์˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ํŒŒ๋“œ๋“ค์— ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

topology.kubernetes.io/region

์˜ˆ์‹œ:

topology.kubernetes.io/region=us-east-1

topology.kubernetes.io/zone์„ ํ™•์ธํ•œ๋‹ค.

topology.kubernetes.io/zone

์˜ˆ์‹œ:

topology.kubernetes.io/zone=us-east-1c

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ, ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ(PersistentVolume)

๋…ธ๋“œ์˜ ๊ฒฝ์šฐ: ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ kubelet ๋˜๋Š” ์™ธ๋ถ€ cloud-controller-manager๊ฐ€ ์ด ์–ด๋…ธํ…Œ์ด์…˜์˜ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค. ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ๋ ˆ์ด๋ธ”์ด ์„ค์ •๋œ๋‹ค. ํ•˜์ง€๋งŒ, ํ† ํด๋กœ์ง€ ๋‚ด์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ๋ ˆ์ด๋ธ”์„ ๋…ธ๋“œ์— ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์˜ ๊ฒฝ์šฐ: ํ† ํด๋กœ์ง€ ์–ด์›จ์–ด ๋ณผ๋ฅจ ํ”„๋กœ๋น„์ €๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์— ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ์ œ์•ฝ์„ ์„ค์ •ํ•œ๋‹ค.

์˜์—ญ(zone)์€ ๋…ผ๋ฆฌ์  ๊ณ ์žฅ ๋„๋ฉ”์ธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ฐ€์šฉ์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์—ฌ๋Ÿฌ ์˜์—ญ์— ๊ฑธ์ณ ๊ตฌ์„ฑ๋œ๋‹ค. ์˜์—ญ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ •์˜๋Š” ์‚ฌ์—…์ž ๋ณ„ ์ธํ”„๋ผ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ์˜์—ญ์€ '์˜์—ญ ๋‚ด ๋งค์šฐ ๋‚ฎ์€ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์‹œ๊ฐ„, ์˜์—ญ ๋‚ด ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๋น„์šฉ ์—†์Œ, ๋‹ค๋ฅธ ์˜์—ญ์˜ ๊ณ ์žฅ์— ๋…๋ฆฝ์ ์ž„' ๋“ฑ์˜ ๊ณตํ†ต์ ์ธ ํŠน์„ฑ์„ ๊ฐ–๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ ์˜์—ญ ๋‚ด์˜ ๋…ธ๋“œ๋Š” ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ ์Šค์œ„์น˜๋ฅผ ๊ณต์œ ํ•˜์—ฌ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ ์˜์—ญ์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ ์Šค์œ„์น˜๋ฅผ ๊ณต์œ ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์ง€์—ญ(region)์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋” ํฐ ๋„๋ฉ”์ธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์ง€์—ญ์— ๊ฑธ์ณ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค. ์˜์—ญ์ด๋‚˜ ์ง€์—ญ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ •์˜๋Š” ์‚ฌ์—…์ž ๋ณ„ ์ธํ”„๋ผ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์—ญ์€ '์ง€์—ญ ๋‚ด ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์‹œ๊ฐ„๋ณด๋‹ค ์ง€์—ญ ๊ฐ„ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์‹œ๊ฐ„์ด ํผ, ์ง€์—ญ ๊ฐ„ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•จ, ๋‹ค๋ฅธ ์˜์—ญ/์ง€์—ญ์˜ ๊ณ ์žฅ์— ๋…๋ฆฝ์ ์ž„' ๋“ฑ์˜ ๊ณตํ†ต์ ์ธ ํŠน์„ฑ์„ ๊ฐ–๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ ์ง€์—ญ ๋‚ด์˜ ๋…ธ๋“œ๋Š” ์ „๋ ฅ ์ธํ”„๋ผ(์˜ˆ: UPS ๋˜๋Š” ๋ฐœ์ „๊ธฐ)๋ฅผ ๊ณต์œ ํ•˜์—ฌ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ ์ง€์—ญ์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ „๋ ฅ ์ธํ”„๋ผ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์˜์—ญ๊ณผ ์ง€์—ญ์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•œ๋‹ค.

  1. ์ง€์—ญ๊ณผ ์˜์—ญ์€ ๊ณ„์ธต์ ์ด๋‹ค. ์˜์—ญ์€ ์ง€์—ญ์˜ ์—„๊ฒฉํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ(strict subset)์ด๋ฉฐ, ํ•˜๋‚˜์˜ ์˜์—ญ์ด ๋‘ ๊ฐœ์˜ ์ง€์—ญ์— ์†ํ•  ์ˆ˜๋Š” ์—†๋‹ค.
  2. ์˜์—ญ ์ด๋ฆ„์€ ๋ชจ๋“  ์ง€์—ญ์— ๊ฑธ์ณ์„œ ์œ ์ผํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "africa-east-1" ๋ผ๋Š” ์ง€์—ญ์€ "africa-east-1a" ์™€ "africa-east-1b" ๋ผ๋Š” ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

ํ† ํด๋กœ์ง€ ๋ ˆ์ด๋ธ”์ด ๋ณ€๊ฒฝ๋˜๋Š” ์ผ์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ ์„œ๋Š” ๋‹ค๋ฅธ ์˜์—ญ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ด ์ •๋ณด๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ผ ์˜์—ญ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์˜ ํŒŒ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ํผ๋œจ๋ฆฐ๋‹ค(๋…ธ๋“œ ๊ณ ์žฅ์˜ ์˜ํ–ฅ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด - kubernetes.io/hostname ์ฐธ๊ณ ). ๋ณต์ˆ˜ ์˜์—ญ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š”, ์—ฌ๋Ÿฌ ์˜์—ญ์— ํผ๋œจ๋ฆฐ๋‹ค(์˜์—ญ ๊ณ ์žฅ์˜ ์˜ํ–ฅ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด). ์ด๋Š” SelectorSpreadPriority ๋ฅผ ํ†ตํ•ด ์‹คํ˜„๋œ๋‹ค.

SelectorSpreadPriority ๋Š” ์ตœ์„  ๋…ธ๋ ฅ(best effort) ๋ฐฐ์น˜ ๋ฐฉ๋ฒ•์ด๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์œ„์น˜ํ•œ ์˜์—ญ๋“ค์˜ ํŠน์„ฑ์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋ฉด(์˜ˆ: ๋…ธ๋“œ ์ˆซ์ž๊ฐ€ ๋‹ค๋ฆ„, ๋…ธ๋“œ ํƒ€์ž…์ด ๋‹ค๋ฆ„, ํŒŒ๋“œ ์ž์› ์š”๊ตฌ์‚ฌํ•ญ์ด ๋‹ค๋ฆ„), ํŒŒ๋“œ ์ˆซ์ž๋ฅผ ์˜์—ญ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด, ์˜์—ญ๋“ค์˜ ํŠน์„ฑ(๋…ธ๋“œ ์ˆซ์ž/ํƒ€์ž…)์„ ์ผ์น˜์‹œ์ผœ ๋ถˆ๊ท ํ˜• ๋ฐฐ์น˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ๋„ (VolumeZonePredicate ํ‘œ์‹œ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ) 'ํŒŒ๋“œ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋ณผ๋ฅจ'์ด ์œ„์น˜ํ•˜๋Š” ์˜์—ญ๊ณผ ๊ฐ™์€ ์˜์—ญ์— ํŒŒ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์˜์—ญ์—์„œ ๋ณผ๋ฅจ์— ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†๋‹ค.

PersistentVolumeLabel์ด ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์˜ ์ž๋™ ๋ ˆ์ด๋ธ”๋ง์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ ˆ์ด๋ธ”์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ PersistentVolumeLabel์ด ๋™์ž‘ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. PersistentVolumeLabel์ด ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํŒŒ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์˜์—ญ์— ์žˆ๋Š” ๋ณผ๋ฅจ์— ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ ์ค‘์ธ ์ธํ”„๋ผ์— ์ด๋Ÿฌํ•œ ์ œ์•ฝ์ด ์—†๋‹ค๋ฉด, ๋ณผ๋ฅจ์— ์˜์—ญ ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†๋‹ค.

volume.beta.kubernetes.io/storage-provisioner (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

์˜ˆ์‹œ: volume.beta.kubernetes.io/storage-provisioner: k8s.io/minikube-hostpath

์ ์šฉ ๋Œ€์ƒ: ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„(PersistentVolumeClaim)

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค.

volume.beta.kubernetes.io/mount-options (์‚ฌ์šฉ ์ค‘๋‹จ)

์˜ˆ์‹œ : volume.beta.kubernetes.io/mount-options: "ro,soft"

์ ์šฉ ๋Œ€์ƒ: ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ด€๋ฆฌ์ž๋Š”, ๋…ธ๋“œ์— ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์ด ๋งˆ์šดํŠธ๋  ๊ฒฝ์šฐ ์ถ”๊ฐ€์ ์ธ ๋งˆ์šดํŠธ ์˜ต์…˜์„ ๋ช…์„ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค.

volume.kubernetes.io/storage-provisioner

์ ์šฉ ๋Œ€์ƒ: ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ๋™์  ํ”„๋กœ๋น„์ €๋‹์ด ์š”๊ตฌ๋˜๋Š” PVC์— ์ถ”๊ฐ€๋  ์˜ˆ์ •์ด๋‹ค.

node.kubernetes.io/windows-build

์˜ˆ์‹œ: node.kubernetes.io/windows-build=10.0.17763

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

kubelet์ด Microsoft ์œˆ๋„์šฐ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๋ฉด, ์‚ฌ์šฉ ์ค‘์ธ Windows Server ๋ฒ„์ „์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด kubelet์ด ๋…ธ๋“œ์— ์ด ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ด ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์€ "MajorVersion.MinorVersion.BuildNumber"์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ–๋Š”๋‹ค.

service.kubernetes.io/headless

์˜ˆ์‹œ: service.kubernetes.io/headless=""

์ ์šฉ ๋Œ€์ƒ: ์„œ๋น„์Šค

์„œ๋น„์Šค๊ฐ€ ํ—ค๋“œ๋ฆฌ์Šค(headless)์ด๋ฉด, ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ์—”๋“œํฌ์ธํŠธ(Endpoints) ์˜ค๋ธŒ์ ํŠธ์— ์ด ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

kubernetes.io/service-name

์˜ˆ์‹œ: kubernetes.io/service-name="my-website"

์ ์šฉ ๋Œ€์ƒ: ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค(EndpointSlices)

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ด ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค์™€ ์„œ๋น„์Šค๋ฅผ ๊ฒฐํ•ฉํ•œ๋‹ค.

์ด ๋ ˆ์ด๋ธ”์€ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค๊ฐ€ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค์˜ ์ด๋ฆ„์„ ๊ธฐ๋กํ•œ๋‹ค. ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค๋Š” ์ด ๋ ˆ์ด๋ธ”์„ ์ž์‹ ๊ณผ ์—ฐ๊ฒฐ๋œ ์„œ๋น„์Šค์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

kubernetes.io/service-account.name

์˜ˆ์‹œ: kubernetes.io/service-account.name: "sa-name"

์ ์šฉ ๋Œ€์ƒ: ์‹œํฌ๋ฆฟ(Secret)

์ด ์–ด๋…ธํ…Œ์ด์…˜์—๋Š” ํ† ํฐ(kubernetes.io/service-account-token ํƒ€์ž…์˜ ์‹œํฌ๋ฆฟ์— ์ €์žฅ๋˜๋Š”)์ด ๋‚˜ํƒ€๋‚ด๋Š” ์„œ๋น„์Šค์–ด์นด์šดํŠธ์˜ ์ด๋ฆ„์„ ๊ธฐ๋กํ•œ๋‹ค.

kubernetes.io/service-account.uid

์˜ˆ์‹œ: kubernetes.io/service-account.uid: da68f9c6-9d26-11e7-b84e-002dc52800da

์ ์šฉ ๋Œ€์ƒ: ์‹œํฌ๋ฆฟ

์ด ์–ด๋…ธํ…Œ์ด์…˜์—๋Š” ํ† ํฐ(kubernetes.io/service-account-token ํƒ€์ž…์˜ ์‹œํฌ๋ฆฟ์— ์ €์žฅ๋˜๋Š”)์ด ๋‚˜ํƒ€๋‚ด๋Š” ์„œ๋น„์Šค์–ด์นด์šดํŠธ์˜ ๊ณ ์œ  ID๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.

kubernetes.io/legacy-token-last-used

์˜ˆ์‹œ: kubernetes.io/legacy-token-last-used: 2022-10-24

์ ์šฉ ๋Œ€์ƒ: ์‹œํฌ๋ฆฟ

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ kubernetes.io/service-account-token ํƒ€์ž…์„ ๊ฐ–๋Š” ์‹œํฌ๋ฆฟ์— ๋Œ€ํ•ด์„œ๋งŒ ์ด ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์€, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค์–ด์นด์šดํŠธ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•œ ์š”์ฒญ์„ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ•œ ๋‚ ์งœ(ISO 8601 ํ˜•์‹, UTC ์‹œ๊ฐ„๋Œ€)๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์–ป๊ธฐ ์ „์— ๊ธฐ์กด์˜ ํ† ํฐ์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ(์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.26์— ์ถ”๊ฐ€๋จ), ์ด ๋ ˆ์ด๋ธ”์€ ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

endpointslice.kubernetes.io/managed-by

์˜ˆ์‹œ: endpointslice.kubernetes.io/managed-by="controller"

์ ์šฉ ๋Œ€์ƒ: ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค

์ด ๋ ˆ์ด๋ธ”์€ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค(EndpointSlice)๋ฅผ ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์ด ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ์—”ํ‹ฐํ‹ฐ์— ์˜ํ•ด ๊ด€๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

endpointslice.kubernetes.io/skip-mirror

์˜ˆ์‹œ: endpointslice.kubernetes.io/skip-mirror="true"

์ ์šฉ ๋Œ€์ƒ: ์—”๋“œํฌ์ธํŠธ(Endpoints)

ํŠน์ • ์ž์›์— ์ด ๋ ˆ์ด๋ธ”์„ "true" ๋กœ ์„ค์ •ํ•˜์—ฌ, EndpointSliceMirroring ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ์ž์›์„ ๋ฏธ๋Ÿฌ๋งํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

service.kubernetes.io/service-proxy-name

์˜ˆ์‹œ: service.kubernetes.io/service-proxy-name="foo-bar"

์ ์šฉ ๋Œ€์ƒ: ์„œ๋น„์Šค

kube-proxy ์—๋Š” ์ปค์Šคํ…€ ํ”„๋ก์‹œ๋ฅผ ์œ„ํ•œ ์ด์™€ ๊ฐ™์€ ๋ ˆ์ด๋ธ”์ด ์žˆ์œผ๋ฉฐ, ์ด ๋ ˆ์ด๋ธ”์€ ์„œ๋น„์Šค ์ปจํŠธ๋กค์„ ์ปค์Šคํ…€ ํ”„๋ก์‹œ์— ์œ„์ž„ํ•œ๋‹ค.

experimental.windows.kubernetes.io/isolation-type (์‚ฌ์šฉ ์ค‘๋‹จ)

์˜ˆ์‹œ: experimental.windows.kubernetes.io/isolation-type: "hyperv"

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

Hyper-V ๊ฒฉ๋ฆฌ(isolation)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. Hyper-V ๊ฒฉ๋ฆฌ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  Hyper-V ๊ฒฉ๋ฆฌ๊ฐ€ ์ ์šฉ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด, kubelet์€ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ HyperVContainer=true ๋กœ ์„ค์ •ํ•˜์—ฌ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋ฉฐ, ํŒŒ๋“œ์—๋Š” experimental.windows.kubernetes.io/isolation-type=hyperv ์–ด๋…ธํ…Œ์ด์…˜์ด ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ingressclass.kubernetes.io/is-default-class

์˜ˆ์‹œ: ingressclass.kubernetes.io/is-default-class: "true"

์ ์šฉ ๋Œ€์ƒ: ์ธ๊ทธ๋ ˆ์Šคํด๋ž˜์Šค(IngressClass)

ํ•˜๋‚˜์˜ ์ธ๊ทธ๋ ˆ์Šคํด๋ž˜์Šค ๋ฆฌ์†Œ์Šค์— ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด "true"๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ํด๋ž˜์Šค๊ฐ€ ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ์ธ๊ทธ๋ ˆ์Šค(Ingress) ๋ฆฌ์†Œ์Šค๋Š” ํ•ด๋‹น ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ํ• ๋‹น๋  ๊ฒƒ์ด๋‹ค.

kubernetes.io/ingress.class (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

storageclass.kubernetes.io/is-default-class

์˜ˆ์‹œ: storageclass.kubernetes.io/is-default-class=true

์ ์šฉ ๋Œ€์ƒ: ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค(StorageClass)

ํ•˜๋‚˜์˜ ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค(StorageClass) ๋ฆฌ์†Œ์Šค์— ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด "true"๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ํด๋ž˜์Šค๊ฐ€ ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„ ๋ฆฌ์†Œ์Šค๋Š” ํ•ด๋‹น ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ํ• ๋‹น๋  ๊ฒƒ์ด๋‹ค.

alpha.kubernetes.io/provided-node-ip

์˜ˆ์‹œ: alpha.kubernetes.io/provided-node-ip: "10.0.0.1"

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

kubelet์ด ๋…ธ๋“œ์— ํ• ๋‹น๋œ IPv4 ์ฃผ์†Œ๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubelet์ด --cloud-provider ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค๋ฉด (์™ธ๋ถ€ ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ ํŠธ๋ฆฌ ๋‚ด(in-tree) ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ๋ชจ๋‘ ํฌํ•จ), kubelet์€ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๋…ธ๋“œ์— ์„ค์ •ํ•˜์—ฌ ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ(--node-ip)๋ฅผ ํ†ตํ•ด ์„ค์ •๋œ IP ์ฃผ์†Œ๋ฅผ ๋ช…์‹œํ•œ๋‹ค. cloud-controller-manager๋Š” ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์—๊ฒŒ ์ด IP ์ฃผ์†Œ๊ฐ€ ์œ ํšจํ•œ์ง€๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.

batch.kubernetes.io/job-completion-index

์˜ˆ์‹œ: batch.kubernetes.io/job-completion-index: "3"

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

kube-controller-manager์˜ ์žก(Job) ์ปจํŠธ๋กค๋Ÿฌ๋Š” Indexed ์™„๋ฃŒ ๋ชจ๋“œ๋กœ ์ƒ์„ฑ๋œ ํŒŒ๋“œ์— ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

kubectl.kubernetes.io/default-container

์˜ˆ์‹œ: kubectl.kubernetes.io/default-container: "front-end-app"

ํŒŒ๋“œ์˜ ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, kubectl logs ๋˜๋Š” kubectl exec ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ๋•Œ -c ๋˜๋Š” --container ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ์ด ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ช…์‹œ๋œ ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.

endpoints.kubernetes.io/over-capacity

์˜ˆ์‹œ: endpoints.kubernetes.io/over-capacity:truncated

์ ์šฉ ๋Œ€์ƒ: ์—”๋“œํฌ์ธํŠธ(Endpoints)

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€, ์—ฐ๊ฒฐ๋œ ์„œ๋น„์Šค์— 1000๊ฐœ ์ด์ƒ์˜ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์—”๋“œํฌ์ธํŠธ ์˜ค๋ธŒ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์—”๋“œํฌ์ธํŠธ์˜ ์šฉ๋Ÿ‰์ด ์ดˆ๊ณผ๋˜์—ˆ๊ฑฐ๋‚˜ ์—”๋“œํฌ์ธํŠธ์˜ ์ˆ˜๊ฐ€ 1000๊ฐœ๋กœ ์ž˜๋ ธ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ฐฑ์—”๋“œ ์—”๋“œํฌ์ธํŠธ์˜ ์ˆ˜๊ฐ€ 1000๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด, ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ฑฐํ•œ๋‹ค.

batch.kubernetes.io/job-tracking (์‚ฌ์šฉ ์ค‘๋‹จ)

์˜ˆ์‹œ: batch.kubernetes.io/job-tracking: ""

์ ์šฉ ๋Œ€์ƒ: ์žก

์žก์— ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ํŒŒ์ด๋„๋ผ์ด์ €(finalizer)๋ฅผ ์ด์šฉํ•˜์—ฌ ์žก ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ, ์•„์ง ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ ์ค‘์ธ ๋™์•ˆ ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žก์„ ์ถ”์ ํ•˜๋„๋ก ์•ˆ์ „ํ•˜๊ฒŒ ์ „ํ™˜ํ•œ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

scheduler.alpha.kubernetes.io/defaultTolerations

์˜ˆ์‹œ: scheduler.alpha.kubernetes.io/defaultTolerations: '[{"operator": "Equal", "value": "value1", "effect": "NoSchedule", "key": "dedicated-node"}]'

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ PodTolerationRestriction ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์˜ ํ‚ค๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋ฉฐ, ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  ํŒŒ๋“œ๋“ค์€ ์ด ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์ด ๋ถ€์—ฌ๋œ๋‹ค.

scheduler.alpha.kubernetes.io/preferAvoidPods (์‚ฌ์šฉ ์ค‘๋‹จ)

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด NodePreferAvoidPods ์Šค์ผ€์ค„๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.22์—์„œ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ๋Œ€์‹  ํ…Œ์ธํŠธ์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ์ดํ›„๋กœ ๋‚˜์˜ค๋Š” ํ…Œ์ธํŠธ๋Š” ๋ชจ๋‘ '์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ' ์ด๋‹ค.

node.kubernetes.io/not-ready

์˜ˆ์‹œ: node.kubernetes.io/not-ready:NoExecute

๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋…ธ๋“œ์˜ ํ—ฌ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋…ธ๋“œ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ธ์ง€๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ด ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•œ๋‹ค.

node.kubernetes.io/unreachable

์˜ˆ์‹œ: node.kubernetes.io/unreachable:NoExecute

๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋…ธ๋“œ ์ปจ๋””์…˜์ด Ready์—์„œ Unknown์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๋…ธ๋“œ์— ์ด ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

node.kubernetes.io/unschedulable

์˜ˆ์‹œ: node.kubernetes.io/unschedulable:NoSchedule

๊ฒฝ์Ÿ ์ƒํƒœ(race condition) ๋ฐœ์ƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, ์ƒ์„ฑ ์ค‘์ธ ๋…ธ๋“œ์— ์ด ํ…Œ์ธํŠธ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

node.kubernetes.io/memory-pressure

์˜ˆ์‹œ: node.kubernetes.io/memory-pressure:NoSchedule

kubelet์€ ๋…ธ๋“œ์˜ memory.available์™€ allocatableMemory.available์„ ๊ด€์ธกํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ•์„ ๊ฐ์ง€ํ•œ๋‹ค. ๊ทธ ๋’ค, ๊ด€์ธกํ•œ ๊ฐ’์„ kubelet์— ์„ค์ •๋œ ๋ฌธํ„ฑ๊ฐ’(threshold)๊ณผ ๋น„๊ตํ•˜์—ฌ ๋…ธ๋“œ ์ปจ๋””์…˜๊ณผ ํ…Œ์ธํŠธ์˜ ์ถ”๊ฐ€/์‚ญ์ œ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

node.kubernetes.io/disk-pressure

์˜ˆ์‹œ: node.kubernetes.io/disk-pressure:NoSchedule

kubelet์€ ๋…ธ๋“œ์˜ imagefs.available, imagefs.inodesFree, nodefs.available, nodefs.inodesFree(๋ฆฌ๋ˆ…์Šค์— ๋Œ€ํ•ด์„œ๋งŒ)๋ฅผ ๊ด€์ธกํ•˜์—ฌ ๋””์Šคํฌ ์••๋ฐ•์„ ๊ฐ์ง€ํ•œ๋‹ค. ๊ทธ ๋’ค, ๊ด€์ธกํ•œ ๊ฐ’์„ kubelet์— ์„ค์ •๋œ ๋ฌธํ„ฑ๊ฐ’(threshold)๊ณผ ๋น„๊ตํ•˜์—ฌ ๋…ธ๋“œ ์ปจ๋””์…˜๊ณผ ํ…Œ์ธํŠธ์˜ ์ถ”๊ฐ€/์‚ญ์ œ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

node.kubernetes.io/network-unavailable

์˜ˆ์‹œ: node.kubernetes.io/network-unavailable:NoSchedule

์‚ฌ์šฉ ์ค‘์ธ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์„ค์ •์„ ํ•„์š”๋กœ ํ•œ๋‹ค๊ณ  ๋ช…์‹œํ•˜๋ฉด, kubelet์ด ์ด ํ…Œ์ธํŠธ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ํด๋ผ์šฐ๋“œ ์ƒ์˜ ๋„คํŠธ์›Œํฌ ๊ฒฝ๋กœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์•ผ, ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ์ด ํ…Œ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•  ๊ฒƒ์ด๋‹ค.

node.kubernetes.io/pid-pressure

์˜ˆ์‹œ: node.kubernetes.io/pid-pressure:NoSchedule

kubelet์€ '/proc/sys/kernel/pid_max์˜ ํฌ๊ธฐ์˜ D-๊ฐ’'๊ณผ ๋…ธ๋“œ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ PID๋ฅผ ํ™•์ธํ•˜์—ฌ, pid.available ์ง€ํ‘œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” '์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ PID ์ˆ˜'๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ ๋’ค, ๊ด€์ธกํ•œ ์ง€ํ‘œ๋ฅผ kubelet์— ์„ค์ •๋œ ๋ฌธํ„ฑ๊ฐ’(threshold)๊ณผ ๋น„๊ตํ•˜์—ฌ ๋…ธ๋“œ ์ปจ๋””์…˜๊ณผ ํ…Œ์ธํŠธ์˜ ์ถ”๊ฐ€/์‚ญ์ œ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

node.kubernetes.io/out-of-service

์˜ˆ์‹œ: node.kubernetes.io/out-of-service:NoExecute

์‚ฌ์šฉ์ž๋Š” ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์„œ๋น„์Šค ์ค‘์ด ์•„๋‹ˆ๋ผ๊ณ  ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ NodeOutOfServiceVolumeDetach ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ kube-controller-manager์— ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ๋…ธ๋“œ๊ฐ€ ์ด ํ…Œ์ธํŠธ๋กœ ์ธํ•ด ์„œ๋น„์Šค ์ค‘์ด ์•„๋‹ˆ๋ผ๊ณ  ํ‘œ์‹œ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ, ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋˜ ๋งค์นญ๋˜๋Š” ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์ด ์—†๋Š” ํŒŒ๋“œ๋“ค์€ ๊ฐ•์ œ๋กœ ์‚ญ์ œ๋จ๊ณผ ๋™์‹œ์— ๋ณผ๋ฅจ์ด ๋ถ„๋ฆฌ๋œ๋‹ค. ์ด๋Š” ์„œ๋น„์Šค ์ค‘์ด ์•„๋‹Œ ๋…ธ๋“œ์˜ ํŒŒ๋“œ๋“ค์ด ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ๋น ๋ฅด๊ฒŒ ๋ณต๊ตฌ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

node.cloudprovider.kubernetes.io/uninitialized

์˜ˆ์‹œ: node.cloudprovider.kubernetes.io/uninitialized:NoSchedule

kubelet์ด "์™ธ๋ถ€" ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์— ์˜ํ•ด ์‹คํ–‰๋˜์—ˆ๋‹ค๋ฉด ๋…ธ๋“œ๊ฐ€ '์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ'ํ•œ ์ƒํƒœ๋ผ๊ณ  ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ด ํ…Œ์ธํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉฐ, ์ถ”ํ›„ cloud-controller-manager๊ฐ€ ์ด ๋…ธ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ด ํ…Œ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

node.cloudprovider.kubernetes.io/shutdown

์˜ˆ์‹œ: node.cloudprovider.kubernetes.io/shutdown:NoSchedule

๋…ธ๋“œ์˜ ์ƒํƒœ๊ฐ€ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ์ •์˜ํ•œ 'shutdown' ์ƒํƒœ์ด๋ฉด, ์ด์— ๋”ฐ๋ผ ๋…ธ๋“œ์— node.cloudprovider.kubernetes.io/shutdown ํ…Œ์ธํŠธ๊ฐ€ NoSchedule ๊ฐ’์œผ๋กœ ์„ค์ •๋œ๋‹ค.

pod-security.kubernetes.io/enforce

์˜ˆ์‹œ: pod-security.kubernetes.io/enforce: baseline

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ํŒŒ๋“œ ๋ณด์•ˆ ํ‘œ์ค€ ๋ ˆ๋ฒจ๊ณผ ์ƒ์‘ํ•˜๋Š” privileged, baseline, ๋˜๋Š” restricted ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค. ํŠนํžˆ enforce ๋ ˆ์ด๋ธ”์€ ํ‘œ์‹œ๋œ ์ˆ˜์ค€์— ์ •์˜๋œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ๋ ˆ์ด๋ธ” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ชจ๋“  ํŒŒ๋“œ์˜ ์ƒ์„ฑ์„ ๊ธˆ์ง€ํ•œ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํŒŒ๋“œ ๋ณด์•ˆ ์ ์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

pod-security.kubernetes.io/enforce-version

์˜ˆ์‹œ: pod-security.kubernetes.io/enforce-version: 1.34

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๊ฐ’์€ ๋ฐ˜๋“œ์‹œ latest์ด๊ฑฐ๋‚˜ v<MAJOR>.<MINOR> ํ˜•์‹์˜ ์œ ํšจํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „์ด์–ด์•ผ ํ•œ๋‹ค. ์„ค์ •๋œ ํŒŒ๋“œ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ๋•Œ ์ ์šฉํ•  ํŒŒ๋“œ ๋ณด์•ˆ ํ‘œ์ค€ ์ •์ฑ…์˜ ๋ฒ„์ „์ด ๊ฒฐ์ •๋œ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํŒŒ๋“œ ๋ณด์•ˆ ์ ์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

pod-security.kubernetes.io/audit

์˜ˆ์‹œ: pod-security.kubernetes.io/audit: baseline

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ํŒŒ๋“œ ๋ณด์•ˆ ํ‘œ์ค€ ๋ ˆ๋ฒจ๊ณผ ์ƒ์‘ํ•˜๋Š” privileged, baseline, ๋˜๋Š” restricted ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค. ํŠนํžˆ audit ๋ ˆ์ด๋ธ”์€ ํ‘œ์‹œ๋œ ์ˆ˜์ค€์— ์ •์˜๋œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ๋ ˆ์ด๋ธ” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์ง€๋งŒ, ํ•ด๋‹น ํŒŒ๋“œ์— audit ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํŒŒ๋“œ ๋ณด์•ˆ ์ ์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

pod-security.kubernetes.io/audit-version

์˜ˆ์‹œ: pod-security.kubernetes.io/audit-version: 1.34

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๊ฐ’์€ ๋ฐ˜๋“œ์‹œ latest์ด๊ฑฐ๋‚˜ v<MAJOR>.<MINOR> ํ˜•์‹์˜ ์œ ํšจํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „์ด์–ด์•ผ ํ•œ๋‹ค. ์„ค์ •๋œ ํŒŒ๋“œ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ๋•Œ ์ ์šฉํ•  ํŒŒ๋“œ ๋ณด์•ˆ ํ‘œ์ค€ ์ •์ฑ…์˜ ๋ฒ„์ „์ด ๊ฒฐ์ •๋œ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํŒŒ๋“œ ๋ณด์•ˆ ์ ์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

pod-security.kubernetes.io/warn

์˜ˆ์‹œ: pod-security.kubernetes.io/warn: baseline

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ํŒŒ๋“œ ๋ณด์•ˆ ํ‘œ์ค€ ๋ ˆ๋ฒจ๊ณผ ์ƒ์‘ํ•˜๋Š” privileged, baseline, ๋˜๋Š” restricted ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค. ํŠนํžˆ warn ๋ ˆ์ด๋ธ”์€ ํ•ด๋‹น ๋ ˆ์ด๋ธ”์ด ๋‹ฌ๋ฆฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—, ํ‘œ์‹œ๋œ ๋ ˆ๋ฒจ์— ๋ช…์‹œ๋œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ๊ทธ๋Ÿฌํ•œ ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ์žก, ์Šคํ…Œ์ดํŠธํ’€์…‹ ๋“ฑ๊ณผ ๊ฐ™์€ ํŒŒ๋“œ ํ…œํ”Œ๋ฆฟ์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ์—๋„ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํŒŒ๋“œ ๋ณด์•ˆ ์ ์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

pod-security.kubernetes.io/warn-version

์˜ˆ์‹œ: pod-security.kubernetes.io/warn-version: 1.34

์ ์šฉ ๋Œ€์ƒ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๊ฐ’์€ ๋ฐ˜๋“œ์‹œ latest์ด๊ฑฐ๋‚˜ v<MAJOR>.<MINOR> ํ˜•์‹์˜ ์œ ํšจํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „์ด์–ด์•ผ ํ•œ๋‹ค. ์„ค์ •๋œ ํŒŒ๋“œ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ๋•Œ ์ ์šฉํ•  ํŒŒ๋“œ ๋ณด์•ˆ ํ‘œ์ค€ ์ •์ฑ…์˜ ๋ฒ„์ „์ด ๊ฒฐ์ •๋œ๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ์žก, ์Šคํ…Œ์ดํŠธํ’€์…‹ ๋“ฑ๊ณผ ๊ฐ™์€ ํŒŒ๋“œ ํ…œํ”Œ๋ฆฟ์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ์—๋„ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํŒŒ๋“œ ๋ณด์•ˆ ์ ์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

kubernetes.io/psp (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

์˜ˆ์‹œ: kubernetes.io/psp: restricted

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ํŒŒ๋“œ์‹œํ๋ฆฌํ‹ฐํด๋ฆฌ์‹œ(PodSecurityPolicy)PodSecurityPolicies๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ด€๋ จ์ด ์žˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.34์€ ํŒŒ๋“œ์‹œํ๋ฆฌํ‹ฐํด๋ฆฌ์‹œ API๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํŒŒ๋“œ์‹œํ๋ฆฌํ‹ฐํด๋ฆฌ์‹œ ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํŒŒ๋“œ๋ฅผ ์Šน์ธํ–ˆ์„ ๋•Œ, ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒŒ๋“œ๊ฐ€ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฐ–๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜ ๊ฐ’์€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์—์„œ ์‚ฌ์šฉ๋œ ํŒŒ๋“œ์‹œํ๋ฆฌํ‹ฐํด๋ฆฌ์‹œ์˜ ์ด๋ฆ„์ด์—ˆ๋‹ค.

seccomp.security.alpha.kubernetes.io/pod (์‚ฌ์šฉ ์ค‘๋‹จ๋จ)

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.19๋ถ€ํ„ฐ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ์œผ๋ฉฐ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๋Œ€์‹  ํ•ด๋‹น ํŒŒ๋“œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ securityContext.seccompProfile ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํŒŒ๋“œ์˜ ๋ณด์•ˆ ์„ค์ •์„ ์ง€์ •ํ•˜๋ ค๋ฉด, ํŒŒ๋“œ ์ŠคํŽ™์— securityContext ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ํŒŒ๋“œ์˜ .spec ๋‚ด์˜ securityContext ํ•„๋“œ๋Š” ํŒŒ๋“œ ์ˆ˜์ค€ ๋ณด์•ˆ ์†์„ฑ์„ ์ •์˜ํ•œ๋‹ค. ํŒŒ๋“œ์˜ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๋ฉด, ํ•ด๋‹น ์„ค์ •์ด ํŒŒ๋“œ ๋‚ด์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ๋œ๋‹ค.

container.seccomp.security.alpha.kubernetes.io/[์ด๋ฆ„]

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.19๋ถ€ํ„ฐ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ์œผ๋ฉฐ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๋Œ€์‹  ํ•ด๋‹น ํŒŒ๋“œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ securityContext.seccompProfile ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. seccomp๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ syscall ์ œํ•œํ•˜๊ธฐ ํŠœํ† ๋ฆฌ์–ผ์—์„œ seccomp ํ”„๋กœํŒŒ์ผ์„ ํŒŒ๋“œ ๋˜๋Š” ํŒŒ๋“œ ๋‚ด ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•œ๋‹ค. ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— seccomp๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๋ฉฐ, ์ด๋Š” ํŒŒ๋“œ์˜ .spec ๋‚ด์— securityContext ๋ฅผ ์„ค์ •ํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅํ•˜๋‹ค.

snapshot.storage.kubernetes.io/allowVolumeModeChange

์˜ˆ์‹œ: snapshot.storage.kubernetes.io/allowVolumeModeChange: "true"

์ ์šฉ ๋Œ€์ƒ: VolumeSnapshotContent

๊ฐ’์€ true ํ˜น์€ false๋งŒ์„ ๋ฐ›๋Š”๋‹ค. ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„์ด ๋ณผ๋ฅจ์Šค๋ƒ…์ƒท(VolumeSnapshot)์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋  ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์Šค ๋ณผ๋ฅจ์˜ ๋ชจ๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์Šค๋ƒ…์ƒท์˜ ๋ณผ๋ฅจ ๋ชจ๋“œ ๋ณ€ํ™˜ํ•˜๊ธฐ์™€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค CSI ๊ฐœ๋ฐœ์ž์šฉ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

Audit์„ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜๋“ค

์ž์„ธํ•œ ์‚ฌํ•ญ์€ Audit ์–ด๋…ธํ…Œ์ด์…˜ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

kubeadm

kubeadm.alpha.kubernetes.io/cri-socket

์˜ˆ์‹œ: kubeadm.alpha.kubernetes.io/cri-socket: unix:///run/containerd/container.sock

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

kubeadm init/join์‹œ ์ฃผ์–ด์ง€๋Š” CRI ์†Œ์ผ“ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜. kubeadm์€ ๋…ธ๋“œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด ์ •๋ณด๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” KubeletConfiguration์˜ ํ•ญ๋ชฉ์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋…ธํ…Œ์ด์…˜์€ "alpha" ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๋‹ค.

kubeadm.kubernetes.io/etcd.advertise-client-urls

์˜ˆ์‹œ: kubeadm.kubernetes.io/etcd.advertise-client-urls: https://172.17.0.18:2379

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

etcd ํด๋ผ์ด์–ธํŠธ๋“ค์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” URL ๋ชฉ๋ก์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด, ๋กœ์ปฌ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” etcd ํŒŒ๋“œ์— ๋ฐฐ์น˜๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜. ์ฃผ๋กœ etcd ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ—ฌ์Šค ์ฒดํฌ์— ์‚ฌ์šฉํ•œ๋‹ค.

kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint

์˜ˆ์‹œ: kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: https://172.17.0.18:6443

์ ์šฉ ๋Œ€์ƒ: ํŒŒ๋“œ

์™ธ๋ถ€๋กœ ๋…ธ์ถœ์‹œํ‚ฌ API ์„œ๋ฒ„์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด, ๋กœ์ปฌ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” kube-apiserver ํŒŒ๋“œ์— ๋ฐฐ์น˜๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜.

kubeadm.kubernetes.io/component-config.hash

์˜ˆ์‹œ: kubeadm.kubernetes.io/component-config.hash: 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae

์ ์šฉ ๋Œ€์ƒ: ์ปจํ”ผ๊ทธ๋งต(ConfigMap)

์ปดํฌ๋„ŒํŠธ ์„ค์ •์„ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ”ผ๊ทธ๋งต์— ๋ฐฐ์น˜๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜. ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด์„œ kubeadm ๊ธฐ๋ณธ๊ฐ’๊ณผ ๋‹ค๋ฅธ ์„ค์ •๊ฐ’์„ ์ ์šฉํ–ˆ๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ํ•ด์‹œ(SHA-256)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

node-role.kubernetes.io/control-plane

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

kubeadm์ด ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์— ์ ์šฉ๋˜๋Š” ๋ ˆ์ด๋ธ”.

node-role.kubernetes.io/control-plane

์˜ˆ์‹œ: node-role.kubernetes.io/control-plane:NoSchedule

์ ์šฉ ๋Œ€์ƒ: ๋…ธ๋“œ

์ค‘์š”ํ•œ ์›Œํฌ๋กœ๋“œ๋งŒ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์— ์ ์šฉ์‹œํ‚ค๋Š” ํ…Œ์ธํŠธ.

node-role.kubernetes.io/master (์‚ฌ์šฉ ์ค‘๋‹จ)

์ ์šฉ ๋Œ€์ƒ: Node

์˜ˆ์‹œ: node-role.kubernetes.io/master:NoSchedule

์ด์ „ ๋ฒ„์ „์—์„œ kubeadm์ด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— ์ค‘์š”ํ•œ ์›Œํฌ๋กœ๋“œ๋งŒ ์Šค์ผ€์ค„๋งํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉํ–ˆ๋˜ ํ…Œ์ธํŠธ. node-role.kubernetes.io/control-plane๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค. kubeadm์€ ๋” ์ด์ƒ ํ•ด๋‹น ํ…Œ์ธํŠธ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

5 - ๋…ธ๋“œ ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐ

๋…ธ๋“œ, ๋ณผ๋ฅจ, ํŒŒ๋“œ, ์ปจํ…Œ์ด๋„ˆ ๋ ˆ๋ฒจ์—์„œ kubelet์ด ๋ณด๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฉ”ํŠธ๋ฆญ์— ์ ‘๊ทผํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜

kubelet์€ ๋…ธ๋“œ, ๋ณผ๋ฅจ, ํŒŒ๋“œ, ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์˜ ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•˜๋ฉฐ, ์ด ํ†ต๊ณ„๋ฅผ ์š”์•ฝ API(Summary API)์— ๊ธฐ๋กํ•œ๋‹ค.

ํ†ต๊ณ„ ์š”์•ฝ API์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํ”„๋ก์‹œํ•˜์—ฌ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ minikube๋ผ๋Š” ์ด๋ฆ„์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์š”์•ฝ API ์š”์ฒญ ์˜ˆ์‹œ์ด๋‹ค.

kubectl get --raw "/api/v1/nodes/minikube/proxy/stats/summary"

๋‹ค์Œ์€ curl์„ ์ด์šฉํ•˜์—ฌ ๋™์ผํ•œ API ํ˜ธ์ถœ์„ ํ•˜๋Š” ๋ช…๋ น์–ด๋‹ค.

# ๋จผ์ € "kubectl proxy"๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
# 8080 ๋ถ€๋ถ„์„ "kubectl proxy" ๋ช…๋ น์ด ํ• ๋‹นํ•ด ์ค€ ํฌํŠธ๋กœ ์น˜ํ™˜ํ•œ๋‹ค.
curl http://localhost:8080/api/v1/nodes/minikube/proxy/stats/summary

์š”์•ฝ ๋ฉ”ํŠธ๋ฆญ API ์†Œ์Šค

๊ธฐ๋ณธ์ ์œผ๋กœ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” kubelet ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ๋‚ด์žฅ cAdvisor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ์š”์•ฝ ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

CRI๋ฅผ ํ†ตํ•ด ์š”์•ฝ API ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.23 [alpha]

ํด๋Ÿฌ์Šคํ„ฐ์— PodAndContainerStatsFromCRI ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์ธํ„ฐํŽ˜์ด์Šค(CRI)๋ฅผ ํ†ตํ•œ ํ†ต๊ณ„ ์ •๋ณด ์ ‘๊ทผ์„ ์ง€์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, kubelet์€ cAdvisor๊ฐ€ ์•„๋‹Œ CRI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์˜ ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…ํ•˜๊ธฐ ํƒœ์Šคํฌ ํŽ˜์ด์ง€์—์„œ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ์— ์˜์กดํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.

6 - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ด์Šˆ์™€ ๋ณด์•ˆ

6.1 - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ด์Šˆ ํŠธ๋ž˜์ปค

๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜๋ ค๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ ๊ณต๊ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ฝ”๋“œ ์ž‘์—… ๋ฐ ๊ณต๊ฐœ ์ด์Šˆ๋Š” ๊นƒํ—ˆ๋ธŒ ์ด์Šˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ ๋œ๋‹ค.

๋ณด์•ˆ์— ๊ด€๋ จ๋œ ๊ณต์ง€์‚ฌํ•ญ์€ kubernetes-security-announce@googlegroups.com ๋ฉ”์ผ ๋ฆฌ์ŠคํŠธ๋กœ ์ „์†ก๋œ๋‹ค.

6.2 - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ๊ณผ ๊ณต๊ฐœ ์ •๋ณด

์ด ํŽ˜์ด์ง€๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ ๋ฐ ๊ณต๊ฐœ ์ •๋ณด๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

๋ณด์•ˆ ๊ณต์ง€

๋ณด์•ˆ ๋ฐ ์ฃผ์š” API ๊ณต์ง€์— ๋Œ€ํ•œ ์ด๋ฉ”์ผ์„ ์œ„ํ•ด์„œ๋Š” kubernetes-security-announce) ๊ทธ๋ฃน์— ๊ฐ€์ž…ํ•œ๋‹ค.

์ทจ์•ฝ์  ๋ณด๊ณ 

์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜คํ”ˆ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ทจ์•ฝ์ ์„ ๋ณด๊ณ ํ•˜๋Š” ๋ณด์•ˆ ์—ฐ๊ตฌ์›๋“ค๊ณผ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋งค์šฐ ๊ฐ์‚ฌํ•˜๊ณ  ์žˆ๋‹ค. ๋ชจ๋“  ๋ณด๊ณ ์„œ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ž์› ๋ด‰์‚ฌ์ž๋“ค์— ์˜ํ•ด ์ฒ ์ €ํžˆ ์กฐ์‚ฌ๋œ๋‹ค.

๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„๊ทธ ํ˜„์ƒ๊ธˆ ํ”„๋กœ๊ทธ๋žจ์— ์ทจ์•ฝ์ ์„ ์ œ์ถœํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ‘œ์ค€ํ™”๋œ ์‘๋‹ต์‹œ๊ฐ„์œผ๋กœ ์ทจ์•ฝ์ ์„ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ๋ณด์•ˆ ์„ธ๋ถ€ ๋‚ด์šฉ๊ณผ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋กœ ๋ถ€ํ„ฐ ์˜ˆ์ƒ๋˜๋Š” ์„ธ๋ถ€์‚ฌํ•ญ์„ security@kubernetes.io๋กœ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ธ๋‹ค.

๋ณด์•ˆ ๋Œ€์‘ ์œ„์›ํšŒ(Security Response Committee) ๊ตฌ์„ฑ์›์˜ GPG ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ชฉ๋ก์œผ๋กœ ์ด๋ฉ”์ผ์„ ์•”ํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. GPG๋ฅผ ์‚ฌ์šฉํ•œ ์•”ํ˜ธํ™”๋Š” ๊ณต๊ฐœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์–ธ์ œ ์ทจ์•ฝ์ ์„ ๋ณด๊ณ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ
  • ์ทจ์•ฝ์„ฑ์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ
    • ์ž์ฒด ์ทจ์•ฝ์„ฑ ๋ณด๊ณ  ๋ฐ ๊ณต๊ฐœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์ง์ ‘ ๋ณด๊ณ ํ•œ๋‹ค.

์–ธ์ œ ์ทจ์•ฝ์ ์„ ๋ณด๊ณ ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š”๊ฐ€?

  • ๋ณด์•ˆ์„ ์œ„ํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์กฐ์ •ํ•˜๋Š”๋ฐ ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ๋ณด์•ˆ ๊ด€๋ จ ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ๋ณด์•ˆ ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

๋ณด์•ˆ ์ทจ์•ฝ์  ๋Œ€์‘

๊ฐ ๋ณด๊ณ ์„œ๋Š” ๋ณด์•ˆ ๋Œ€์‘ ์œ„์›ํšŒ ์œ„์›๋“ค์— ์˜ํ•ด ์ž‘์—…์ผ 3์ผ ์ด๋‚ด์— ์ธ์ •๋˜๊ณ  ๋ถ„์„๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณด์•ˆ ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.

๋ณด์•ˆ ๋Œ€์‘ ์œ„์›ํšŒ์™€ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋“  ์ทจ์•ฝ์„ฑ ์ •๋ณด๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”„๋กœ์ ํŠธ ๋‚ด์— ์žˆ์œผ๋ฉฐ, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํ•œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์ „ํŒŒ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์‹ฌ์‚ฌ์—์„œ ํ™•์ธ๋œ ์ˆ˜์ •, ๋ฆด๋ฆฌ์Šค ๊ณ„ํš์œผ๋กœ ์ด๋™ํ•จ์— ๋”ฐ๋ผ ๋ฆฌํฌํ„ฐ๋ฅผ ๊ณ„์† ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ด๋‹ค.

๊ณต๊ฐœ ์‹œ๊ธฐ

๊ณต๊ฐœ ๋‚ ์งœ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ ๋Œ€์‘ ์œ„์›ํšŒ์™€ ๋ฒ„๊ทธ ์ œ์ถœ์ž๊ฐ€ ํ˜‘์ƒํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์™„ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋ฉด ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ๋ฒ„๊ทธ๋ฅผ ์™„์ „ํžˆ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ฒ„๊ทธ ๋˜๋Š” ํ”ฝ์Šค๊ฐ€ ์•„์ง ์™„์ „ํžˆ ์ดํ•ด๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์†”๋ฃจ์…˜์ด ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋ฒค๋” ํ˜‘๋ ฅ์„ ์œ„ํ•ด ๊ณต๊ฐœ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋‹ค. ๊ณต๊ฐœ ๊ธฐ๊ฐ„์€ ์ฆ‰์‹œ(ํŠนํžˆ ์ด๋ฏธ ๊ณต๊ฐœ์ ์œผ๋กœ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ)๋ถ€ํ„ฐ ๋ช‡ ์ฃผ๊นŒ์ง€๋‹ค. ๊ฐ„๋‹จํ•œ ์™„ํ™” ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์ทจ์•ฝ์ ์˜ ๊ฒฝ์šฐ ๋ณด๊ณ  ๋‚ ์งœ๋ถ€ํ„ฐ ๊ณต๊ฐœ ๋‚ ์งœ๊นŒ์ง€๋Š” 7์ผ ์ •๋„ ์†Œ์š”๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ ๋Œ€์‘ ์œ„์›ํšŒ๋Š” ๊ณต๊ฐœ ๋‚ ์งœ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์ตœ์ข… ๊ฒฐ์ •๊ถŒ์„ ๊ฐ–๋Š”๋‹ค.

7 - ๋…ธ๋“œ ๋ ˆํผ๋Ÿฐ์Šค ์ •๋ณด

์ด ์„น์…˜์—์„œ๋Š” ๋…ธ๋“œ์— ๊ด€ํ•œ ๋‹ค์Œ์˜ ๋ ˆํผ๋Ÿฐ์Šค ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฌธ์„œ์—์„œ๋„ ๋…ธ๋“œ ๋ ˆํผ๋Ÿฐ์Šค ์ƒ์„ธ์— ๋Œ€ํ•ด ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

7.1 - kubelet ์ฒดํฌํฌ์ธํŠธ API

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.25 [alpha]

์ปจํ…Œ์ด๋„ˆ ์ฒดํฌํฌ์ธํŠธ๋Š” ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์Šคํ…Œ์ดํŠธํ’€(stateful) ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ์Šคํ…Œ์ดํŠธํ’€ ๋ณต์‚ฌ๋ณธ์ด ์žˆ์œผ๋ฉด, ๋””๋ฒ„๊น… ๋˜๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์œ„ํ•ด ์ด๋ฅผ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒดํฌํฌ์ธํŠธ ์ปจํ…Œ์ด๋„ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ๋กœ ์ด๋™ํ•˜๋ฉด, ๋ณต์›๋œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ฒดํฌํฌ์ธํŠธ๋œ ์ง€์ ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ง€์ ์—์„œ ๊ณ„์† ์‹คํ–‰๋œ๋‹ค. ์ ์ ˆํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์‚ฌํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์ฒดํฌํฌ์ธํŠธ ์ƒ์„ฑ ์‹œ์—๋Š” ์œ ์˜ํ•ด์•ผ ํ•  ๋ณด์•ˆ ์‚ฌํ•ญ์ด ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ์ฒดํฌํฌ์ธํŠธ๋Š” ์ฒดํฌํฌ์ธํŠธ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ด๋Š” ๊ณง ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ์ปฌ ๋””์Šคํฌ์— ์ €์žฅ๋˜์–ด ์—ด๋žŒ์ด ๊ฐ€๋Šฅํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ์•„์นด์ด๋ธŒ(archive)์—๋Š” ๋ชจ๋“  ๊ฐœ์ธ ๋ฐ์ดํ„ฐ์™€ ์•”ํ˜ธํ™” ํ‚ค๊ฐ€ ํฌํ•จ๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‚ด๋ถ€ CRI ๊ตฌํ˜„์ฒด(๋…ธ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„)๋Š” ์ฒดํฌํฌ์ธํŠธ ์•„์นด์ด๋ธŒ๋ฅผ ์ƒ์„ฑ ์‹œ root ์‚ฌ์šฉ์ž๋งŒ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ์—ฌ์ „ํžˆ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ฒดํฌํฌ์ธํŠธ ์•„์นด์ด๋ธŒ๋ฅผ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์œผ๋กœ ์ „์†กํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์‹œ์Šคํ…œ์˜ ์ฒดํฌํฌ์ธํŠธ ์•„์นด์ด๋ธŒ ์†Œ์œ ์ž๊ฐ€ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์šด์˜

POST ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์˜ ์ฒดํฌํฌ์ธํŠธ ์ƒ์„ฑ

์ง€์ •๋œ ํŒŒ๋“œ์˜ ํŠน์ • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฒดํฌํฌ์ธํŠธํ•˜๋„๋ก kubelet์— ์ง€์‹œํ•œ๋‹ค.

kubelet ์ฒดํฌํฌ์ธํŠธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ์˜ ์ ‘๊ทผ์ด ์–ด๋–ป๊ฒŒ ์ œ์–ด๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubelet ์ธ์ฆ/์ธ๊ฐ€ ๋ ˆํผ๋Ÿฐ์Šค ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

kubelet์€ ๋‚ด๋ถ€ CRI ๊ตฌํ˜„์ฒด์— ์ฒดํฌํฌ์ธํŠธ๋ฅผ ์š”์ฒญํ•œ๋‹ค. ์ฒดํฌํฌ์ธํŠธ ์š”์ฒญ ์‹œ, kubelet์€ ์ฒดํฌํฌ์ธํŠธ ์•„์นด์ด๋ธŒ์˜ ์ด๋ฆ„์„ checkpoint-<podFullName>-<containerName>-<timestamp>.tar๋กœ ์ง€์ •ํ•˜๊ณ  ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ(--root-dir ๋กœ ์ง€์ • ๊ฐ€๋Šฅ) ์•„๋ž˜์˜ checkpoints ๋””๋ ‰ํ† ๋ฆฌ์— ์ฒดํฌํฌ์ธํŠธ ์•„์นด์ด๋ธŒ๋ฅผ ์ €์žฅํ•˜๋„๋ก ์š”์ฒญํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ /var/lib/kubelet/checkpoints์ด๋‹ค.

์ฒดํฌํฌ์ธํŠธ ์•„์นด์ด๋ธŒ๋Š” tar ํ˜•์‹์ด๋ฉฐ tar ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์•„์นด์ด๋ธŒ์˜ ๋‚ด์šฉ์€ ๋‚ด๋ถ€ CRI ๊ตฌํ˜„์ฒด(๋…ธ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„)์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

HTTP ์š”์ฒญ

POST /checkpoint/{namespace}/{pod}/{container}

ํŒŒ๋ผ๋ฏธํ„ฐ

  • namespace (๊ฒฝ๋กœ ๋‚ด ํŒŒ๋ผ๋ฏธํ„ฐ): ๋ฌธ์ž์—ด(string), ํ•„์ˆ˜

    ๋„ค์ž„์ŠคํŽ˜์ด์Šค(Namespace)
  • pod (๊ฒฝ๋กœ ๋‚ด ํŒŒ๋ผ๋ฏธํ„ฐ): ๋ฌธ์ž์—ด(string), ํ•„์ˆ˜

    ํŒŒ๋“œ(Pod)
  • container (๊ฒฝ๋กœ ๋‚ด ํŒŒ๋ผ๋ฏธํ„ฐ): ๋ฌธ์ž์—ด(string), ํ•„์ˆ˜

    ์ปจํ…Œ์ด๋„ˆ(Container)
  • timeout (์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ): ์ •์ˆ˜(integer)

    ์ฒดํฌํฌ์ธํŠธ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•  ์‹œ๊ฐ„์ œํ•œ(์ดˆ)์ด๋‹ค. ์‹œ๊ฐ„ ์ œํ•œ์ด 0 ๋˜๋Š” ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ CRI ์‹œ๊ฐ„ ์ œํ•œ ๊ฐ’์ด ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค. ์ฒดํฌํฌ์ธํŠธ ์ƒ์„ฑ ์‹œ๊ฐ„์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ํ•ด๋‹น ์ฒดํฌํฌ์ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.

์‘๋‹ต

200: OK

401: Unauthorized

404: Not Found (ContainerCheckpoint ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ)

404: Not Found (๋ช…์‹œํ•œ namespace, pod ๋˜๋Š” container๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ)

500: Internal Server Error (CRI ๊ตฌํ˜„์ฒด๊ฐ€ ์ฒดํฌํฌ์ธํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ (์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.))

500: Internal Server Error (CRI ๊ตฌํ˜„์ฒด๊ฐ€ ์ฒดํฌํฌ์ธํŠธ CRI API๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ (์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.))

7.2 - ๋„์ปค์‹ฌ ์ œ๊ฑฐ ๋ฐ CRI ํ˜ธํ™˜ ๋Ÿฐํƒ€์ž„ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ

์ด ๋ฌธ์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋„์ปค์‹ฌ ์‚ฌ์šฉ ์ค‘๋‹จ(deprecation) ๋ฐ ์ œ๊ฑฐ, ๋˜๋Š” ํ•ด๋‹น ์ œ๊ฑฐ๋ฅผ ๊ณ ๋ คํ•œ CRI ํ˜ธํ™˜ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์‚ฌ์šฉ์— ๊ด€ํ•œ ๊ธฐ์‚ฌ ๋ฐ ๊ธฐํƒ€ ํŽ˜์ด์ง€ ๋ชฉ๋ก์„ ์ œ๊ณตํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”„๋กœ์ ํŠธ

GitHub ์ด์Šˆ๋ฅผ ํ†ตํ•ด ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„์ปค์‹ฌ ์ œ๊ฑฐ ํ”ผ๋“œ๋ฐฑ ๋ฐ ์ด์Šˆ. (k/kubernetes/#106917)

์™ธ๋ถ€ ์†Œ์Šค

8 - ๋„คํŠธ์›Œํ‚น ๋ ˆํผ๋Ÿฐ์Šค

์ด ์„น์…˜์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น์˜ ๋ ˆํผ๋Ÿฐ์Šค ์ƒ์„ธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

8.1 - ์„œ๋น„์Šค๊ฐ€ ์ง€์›ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ง€์›ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋‹ค์Œ์˜ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•œ๋‹ค.

์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ, ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉํ•  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ† ์ฝœ์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด ๋ฌธ์„œ์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ํŠน์ˆ˜ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋ฉฐ, ์ด๋“ค ๋ชจ๋‘๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ „์†ก ํ”„๋กœํ† ์ฝœ(transport protocol)๋กœ TCP๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ง€์›ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

์„œ๋น„์Šค ํฌํŠธ์˜ protocol์— ๋Œ€ํ•ด ๋‹ค์Œ 3๊ฐœ์˜ ๊ฐ’์ด ์œ ํšจํ•˜๋‹ค.

SCTP

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.20 [stable]

SCTP ํŠธ๋ž˜ํ”ฝ์„ ์ง€์›ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค์— SCTP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. type: LoadBalancer ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ SCTP ์ง€์› ์—ฌ๋ถ€๋Š” ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. (๋Œ€๋ถ€๋ถ„ ์ง€์›ํ•˜์ง€ ์•Š์Œ)

SCTP๋Š” ์œˆ๋„์šฐ ๋…ธ๋“œ์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ฉ€ํ‹ฐํ™ˆ(multihomed) SCTP ์—ฐ๊ฒฐ ์ง€์›

๋ฉ€ํ‹ฐํ™ˆ SCTP ์—ฐ๊ฒฐ ์ง€์›์„ ์œ„ํ•ด์„œ๋Š” CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํŒŒ๋“œ์— ๋ณต์ˆ˜๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค.

๋ฉ€ํ‹ฐํ™ˆ SCTP ์—ฐ๊ฒฐ์—์„œ์˜ NAT๋Š” ์ƒ์‘ํ•˜๋Š” ์ปค๋„ ๋ชจ๋“ˆ ๋‚ด์˜ ํŠน์ˆ˜ํ•œ ๋กœ์ง์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

TCP

๋ชจ๋“  ์ข…๋ฅ˜์˜ ์„œ๋น„์Šค์— TCP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

UDP

๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค์— UDP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. type: LoadBalancer ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ, UDP ์ง€์› ์—ฌ๋ถ€๋Š” ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

ํŠน์ˆ˜ ์ผ€์ด์Šค

HTTP

ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ, LoadBalancer ๋ชจ๋“œ์˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—, HTTP / HTTPS ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹ฑ์„ ํ†ตํ•ด ํ•ด๋‹น ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ ์—”๋“œํฌ์ธํŠธ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ, ํŠธ๋ž˜ํ”ฝ์„ HTTP ์ˆ˜์ค€์—์„œ ์ œ์–ดํ•˜๋ ค๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค์˜ ํ”„๋กœํ† ์ฝœ์„ TCP๋กœ ์ง€์ •ํ•˜๊ณ  ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜(๋ณดํ†ต ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋งˆ๋‹ค ๋‹ค๋ฆ„)์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๊ตฌ์„ฑ์€ ์›Œํฌ๋กœ๋“œ๋กœ์˜ HTTPS (HTTP over TLS) ์ง€์› ๋ฐ ํ‰๋ฌธ HTTP ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ • ์—ฐ๊ฒฐ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ† ์ฝœ์„ http ๋˜๋Š” https๋กœ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ช…์‹œํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์—์„œ ์›Œํฌ๋กœ๋“œ๋กœ ๊ฐ€๋Š” ์„ธ์…˜์ด HTTP without TLS์ด๋ฉด http๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์—์„œ ์›Œํฌ๋กœ๋“œ๋กœ ๊ฐ€๋Š” ์„ธ์…˜์ด TLS ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด https๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

PROXY ํ”„๋กœํ† ์ฝœ

ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ์—, type: LoadBalancer๋กœ ์„ค์ •๋œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์™ธ๋ถ€์— ์กด์žฌํ•˜๋ฉด์„œ ์—ฐ๊ฒฐ๋“ค์„ PROXY ํ”„๋กœํ† ์ฝœ๋กœ ๊ฐ์‹ธ ์ „๋‹ฌํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ๋“ค์–ด์˜ค๋Š” ์—ฐ๊ฒฐ์„ ์„ค๋ช…ํ•˜๋Š” ์ดˆ๊ธฐ ์ผ๋ จ์˜ ์˜ฅํ…Ÿ(octets)์„ ์ „์†กํ•˜๋ฉฐ, ์ด๋Š” ๋‹ค์Œ์˜ ์˜ˆ์‹œ(PROXY ํ”„๋กœํ† ์ฝœ v1)์™€ ์œ ์‚ฌํ•˜๋‹ค.

PROXY TCP4 192.0.2.202 10.0.42.7 12345 7\r\n

ํ”„๋ก์‹œ ํ”„๋กœํ† ์ฝœ ํ”„๋ฆฌ์•ฐ๋ธ”(preamble) ๋’ค์— ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†กํ•œ ์›๋ณธ ๋ฐ์ดํ„ฐ์ด๋‹ค. ์–‘์ชฝ ์ค‘ ํ•œ์ชฝ์—์„œ ์—ฐ๊ฒฐ์„ ๋‹ซ์œผ๋ฉด, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋„ ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉฐ ๋‚จ์•„์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹  ๊ฐ€๋Šฅํ•œ ์ชฝ์œผ๋กœ ๋ณด๋‚ธ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š”, ํ”„๋กœํ† ์ฝœ์„ TCP๋กœ ์„ค์ •ํ•œ ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. ๋˜ํ•œ, ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋ณ„๋กœ ์ƒ์ดํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•˜์—ฌ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ๊ฐ ์ธ์ปค๋ฐ ์—ฐ๊ฒฐ์„ PROXY ํ”„๋กœํ† ์ฝœ๋กœ ๊ฐ์‹ธ๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

TLS

ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ์—, type: LoadBalancer๋กœ ์„ค์ •๋œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋•Œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊นŒ์ง€์˜ ์—ฐ๊ฒฐ์€ TLS ์•”ํ˜ธํ™”๋˜๊ณ  ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋Š” TLS ์„œ๋ฒ„ ํ”ผ์–ด๊ฐ€ ๋œ๋‹ค. ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋กœ๋ถ€ํ„ฐ ์›Œํฌ๋กœ๋“œ๊นŒ์ง€์˜ ์—ฐ๊ฒฐ์€ TLS์ผ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ํ‰๋ฌธ์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ •ํ™•ํ•œ ์˜ต์…˜์˜ ๋ฒ”์œ„๋Š” ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ๋˜๋Š” ์ปค์Šคํ…€ ์„œ๋น„์Šค ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š”, ํ”„๋กœํ† ์ฝœ์„ TCP๋กœ ์„ค์ •ํ•˜๊ณ  ์–ด๋…ธํ…Œ์ด์…˜(๋ณดํ†ต ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋ณ„๋กœ ์ƒ์ดํ•จ)์„ ์„ค์ •ํ•˜์—ฌ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ TLS ์„œ๋ฒ„๋กœ ์ž‘๋™ํ•˜๋„๋ก ๊ตฌ์„ฑํ•œ๋‹ค. ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋ณ„๋กœ ์ƒ์ดํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ TLS ์•„์ด๋ดํ‹ฐํ‹ฐ(์„œ๋ฒ„, ๊ทธ๋ฆฌ๊ณ  ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์›Œํฌ๋กœ๋“œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋„ ๊ฐ€๋Šฅ)๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

8.2 - ํฌํŠธ์™€ ํ”„๋กœํ† ์ฝœ

๋ฌผ๋ฆฌ์  ๋„คํŠธ์›Œํฌ ๋ฐฉํ™”๋ฒฝ์ด ์žˆ๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ฐ์ดํ„ฐ ์„ผํ„ฐ ๋˜๋Š” ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ์˜ ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ์™€ ๊ฐ™์ด ๋„คํŠธ์›Œํฌ ๊ฒฝ๊ณ„๊ฐ€ ์—„๊ฒฉํ•œ ํ™˜๊ฒฝ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ์™€ ํ”„๋กœํ† ์ฝœ์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค.

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ

ํ”„๋กœํ† ์ฝœ๋ฐฉํ–ฅํฌํŠธ ๋ฒ”์œ„์šฉ๋„์‚ฌ์šฉ ์ฃผ์ฒด
TCP์ธ๋ฐ”์šด๋“œ6443์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์ „๋ถ€
TCP์ธ๋ฐ”์šด๋“œ2379-2380etcd ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ APIkube-apiserver, etcd
TCP์ธ๋ฐ”์šด๋“œ10250Kubelet APISelf, ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ
TCP์ธ๋ฐ”์šด๋“œ10259kube-schedulerSelf
TCP์ธ๋ฐ”์šด๋“œ10257kube-controller-managerSelf

etcd ํฌํŠธ๊ฐ€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์„น์…˜์— ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, ์™ธ๋ถ€ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํฌํŠธ์—์„œ ์ž์ฒด etcd ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์›Œ์ปค ๋…ธ๋“œ

ํ”„๋กœํ† ์ฝœ๋ฐฉํ–ฅํฌํŠธ ๋ฒ”์œ„์šฉ๋„์‚ฌ์šฉ ์ฃผ์ฒด
TCP์ธ๋ฐ”์šด๋“œ10250Kubelet APISelf, ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ
TCP์ธ๋ฐ”์šด๋“œ30000-32767NodePort ์„œ๋น„์Šคโ€ ์ „๋ถ€

โ€  ๋…ธ๋“œํฌํŠธ(NodePort) ์„œ๋น„์Šค์˜ ๊ธฐ๋ณธ ํฌํŠธ ๋ฒ”์œ„.

๋ชจ๋“  ๊ธฐ๋ณธ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ์–ธ๊ธ‰๋œ ๊ธฐ๋ณธ๊ฐ’ ๋Œ€์‹  ํ•ด๋‹น ํฌํŠธ๋ฅผ ์—ด์–ด์•ผ ํ•œ๋‹ค.

์ข…์ข… ๋ฐœ์ƒํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋Š” API ์„œ๋ฒ„ ํฌํŠธ๋ฅผ 443์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๋˜๋Š”, API ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ํฌํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ , 443 ํฌํŠธ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋’ค์— API ์„œ๋ฒ„๋ฅผ ๋‘๊ณ , ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์—์„œ API ์„œ๋ฒ„๋กœ ๊ฐ€๋Š” ์š”์ฒญ์„ API ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ํฌํŠธ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

8.3 - ๊ฐ€์ƒ IP ๋ฐ ์„œ๋น„์Šค ํ”„๋ก์‹œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋Š” kube-proxy๋ฅผ ์‹คํ–‰ํ•œ๋‹ค(kube-proxy๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ง์ ‘ ๋ฐฐํฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด).

kube-proxy๋Š” ExternalName ์™ธ์˜ type์˜ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฐ€์ƒ IP ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•œ๋‹ค.

ํ•ญ์ƒ ๋ฐœ์ƒํ•˜๋Š” ์งˆ๋ฌธ์€, ์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก์‹œ์— ์˜์กดํ•˜๋Š”๊ฐ€ ํ•˜๋Š” ์ ์ด๋‹ค. ๋‹ค๋ฅธ ์ ‘๊ทผ๋ฒ•์ด ์žˆ๋Š”๊ฐ€? ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ A ๊ฐ’ (๋˜๋Š” IPv6์˜ ๊ฒฝ์šฐ AAAA)์„ ๊ฐ€์ง„ DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ๋ผ์šด๋“œ-๋กœ๋นˆ ์ด๋ฆ„ ํ™•์ธ ๋ฐฉ์‹์„ ์ทจํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

There are a few reasons for using proxying for Services:

  • ๋ ˆ์ฝ”๋“œ TTL์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ , ๋งŒ๋ฃŒ๋œ ์ด๋ฆ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๋Š” DNS ๊ตฌํ˜„์— ๋Œ€ํ•œ ์˜ค๋ž˜๋œ ์—ญ์‚ฌ๊ฐ€ ์žˆ๋‹ค.
  • ์ผ๋ถ€ ์•ฑ์€ DNS ๊ฒ€์ƒ‰์„ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฌด๊ธฐํ•œ์œผ๋กœ ์บ์‹œํ•œ๋‹ค.
  • ์•ฑ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ ์ ˆํžˆ ์žฌ-ํ™•์ธ์„ ํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, DNS ๋ ˆ์ฝ”๋“œ์˜ TTL์ด ๋‚ฎ๊ฑฐ๋‚˜ 0์ด๋ฉด DNS์— ๋ถ€ํ•˜๊ฐ€ ๋†’์•„ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋ณธ ํŽ˜์ด์ง€์˜ ๋’ท ๋ถ€๋ถ„์—์„œ ๋‹ค์–‘ํ•œ kube-proxy ๊ตฌํ˜„์ด ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  ์•Œ์•„๋‘์–ด์•ผ ํ•  ๊ฒƒ์€, kube-proxy๋ฅผ ๊ตฌ๋™ํ•  ๋•Œ, ์ปค๋„ ์ˆ˜์ค€์˜ ๊ทœ์น™์ด ์ˆ˜์ •(์˜ˆ๋ฅผ ๋“ค์–ด, iptables ๊ทœ์น™์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Œ)๋  ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” ๋•Œ๋กœ๋Š” ๋ฆฌ๋ถ€ํŠธ ์ „๊นŒ์ง€ ์ •๋ฆฌ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ, kube-proxy๋Š” ์ปดํ“จํ„ฐ์—์„œ ์ €์ˆ˜์ค€์˜, ํŠน๊ถŒ์„ ๊ฐ€์ง„(privileged) ๋„คํŠธ์›Œํ‚น ํ”„๋ก์‹œ ์„œ๋น„์Šค๊ฐ€ ๊ตฌ๋™๋จ์œผ๋กœ์จ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ด€๋ฆฌ์ž์— ์˜ํ•ด์„œ๋งŒ ๊ตฌ๋™๋˜์–ด์•ผ ํ•œ๋‹ค. ๋น„๋ก kube-proxy ์‹คํ–‰ ํŒŒ์ผ์ด cleanup ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์ด ๊ธฐ๋Šฅ์€ ๊ณต์‹์ ์ธ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„๋œ ๊ทธ๋Œ€๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 3๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํ…Œ์ดํŠธ๋ฆฌ์Šค ์ด๋ฏธ์ง€-์ฒ˜๋ฆฌ ๋ฐฑ์—”๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ์ด๋Ÿฌํ•œ ๋ ˆํ”Œ๋ฆฌ์นด๋Š” ๋Œ€์ฒด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฑ์—”๋“œ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ๋ฐฑ์—”๋“œ ์„ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‹ค์ œ ํŒŒ๋“œ๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ ์ธ์‹ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๋ฐฑ์—”๋“œ ์„ธํŠธ ์ž์ฒด๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•  ํ•„์š”๋„ ์—†๋‹ค.

ํ”„๋ก์‹œ ๋ชจ๋“œ๋“ค

kube-proxy๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ๊ธฐ๋™๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ™˜๊ฒฝ ์„ค์ •์— ๋”ฐ๋ผ ๊ฒฐ์ •๋จ์— ์œ ์˜ํ•œ๋‹ค.

  • kube-proxy์˜ ๊ตฌ์„ฑ์€ ์ปจํ”ผ๊ทธ๋งต(ConfigMap)์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น kube-proxy๋ฅผ ์œ„ํ•œ ์ปจํ”ผ๊ทธ๋งต์€ ์‹คํšจ์„ฑ์žˆ๊ฒŒ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ kube-proxy์˜ ํ”Œ๋ž˜๊ทธ์˜ ํ–‰์œ„๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • kube-proxy๋ฅผ ์œ„ํ•œ ํ•ด๋‹น ์ปจํ”ผ๊ทธ๋งต์€ ๊ธฐ๋™ ์ค‘ ๊ตฌ์„ฑ์˜ ์žฌ์ ์šฉ(live reloading)์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • kube-proxy๋ฅผ ์œ„ํ•œ ์ปจํ”ผ๊ทธ๋งต ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ธฐ๋™ ์‹œ์— ๊ฒ€์ฆ์ด๋‚˜ ํ™•์ธ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šด์˜ ์ฒด๊ณ„๊ฐ€ iptables ๋ช…๋ น์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ํ‘œ์ค€ ์ปค๋„ kube-proxy ๊ตฌํ˜„์ฒด๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

iptables ํ”„๋ก์‹œ ๋ชจ๋“œ

์ด ๋ชจ๋“œ์—์„œ๋Š”, kube-proxy๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์„œ๋น„์Šค, ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ์ถ”๊ฐ€์™€ ์ œ๊ฑฐ๋ฅผ ๊ฐ์‹œํ•œ๋‹ค. ๊ฐ ์„œ๋น„์Šค์— ๋Œ€ํ•ด, ์„œ๋น„์Šค์˜ clusterIP ๋ฐ port์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ์บก์ฒ˜ํ•˜๊ณ  ํ•ด๋‹น ํŠธ๋ž˜ํ”ฝ์„ ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ ์„ธํŠธ ์ค‘ ํ•˜๋‚˜๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(redirect)ํ•˜๋Š” iptables ๊ทœ์น™์„ ์„ค์น˜ํ•œ๋‹ค. ๊ฐ ์—”๋“œํฌ์ธํŠธ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด, ๋ฐฑ์—”๋“œ ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” iptables ๊ทœ์น™์„ ์„ค์น˜ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ, iptables ๋ชจ๋“œ์˜ kube-proxy๋Š” ๋ฐฑ์—”๋“œ๋ฅผ ์ž„์˜๋กœ ์„ ํƒํ•œ๋‹ค.

ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด iptables๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด๋“œ๋Š”๋ฐ, ์œ ์ €์ŠคํŽ˜์ด์Šค์™€ ์ปค๋„ ์ŠคํŽ˜์ด์Šค ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•  ํ•„์š”์—†์ด ๋ฆฌ๋ˆ…์Šค ๋„ทํ•„ํ„ฐ(netfilter)๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๋‹ค.

kube-proxy๊ฐ€ iptables ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ด๊ณ  ์„ ํƒ๋œ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋“œ๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด, ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•œ๋‹ค. ์ด๋Š” ์ด์ „์˜ userspace ๋ชจ๋“œ์™€ ๋‹ค๋ฅด๋‹ค. ์ด์ „์˜ userspace ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š”, kube-proxy๋Š” ์ฒซ ๋ฒˆ์งธ ํŒŒ๋“œ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ–ˆ์Œ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ๋กœ ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„ํ•œ๋‹ค.

ํŒŒ๋“œ ์ค€๋น„์„ฑ ํ”„๋กœ๋ธŒ(readiness probe)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, iptables ๋ชจ๋“œ์˜ kube-proxy๋Š” ์ •์ƒ์œผ๋กœ ํ…Œ์ŠคํŠธ๋œ ๋ฐฑ์—”๋“œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ์ด kube-proxy๋ฅผ ํ†ตํ•ด ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ํŒŒ๋“œ๋กœ ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

iptables ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ์„œ๋น„์Šค ๊ฐœ์š” ๋‹ค์ด์–ด๊ทธ๋žจ

์˜ˆ์‹œ

๋‹ค์‹œ ํ•œ๋ฒˆ, ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ณ ๋ คํ•œ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ๊ฐ€์ƒ IP ์ฃผ์†Œ(์˜ˆ : 10.0.0.1)๋ฅผ ํ• ๋‹นํ•œ๋‹ค. ์„œ๋น„์Šค ํฌํŠธ๋ฅผ 1234๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  kube-proxy ์ธ์Šคํ„ด์Šค๋Š” ์ƒˆ ์„œ๋น„์Šค์˜ ์ƒ์„ฑ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ก์‹œ๊ฐ€ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ฐ€์ƒ IP ์ฃผ์†Œ์—์„œ ์„œ๋น„์Šค-๋ณ„ ๊ทœ์น™์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋˜๋Š” ์ผ๋ จ์˜ iptables ๊ทœ์น™์„ ์„ค์น˜ํ•œ๋‹ค. ์„œ๋น„์Šค-๋ณ„ ๊ทœ์น™์€ ํŠธ๋ž˜ํ”ฝ์„ (๋ชฉ์ ์ง€ NAT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) ๋ฐฑ์—”๋“œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ-๋ณ„ ๊ทœ์น™์— ์—ฐ๊ฒฐํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค์˜ ๊ฐ€์ƒ IP ์ฃผ์†Œ์— ์—ฐ๊ฒฐํ•˜๋ฉด iptables ๊ทœ์น™์ด ์‹œ์ž‘ํ•œ๋‹ค. (์„ธ์…˜ ์–ดํ”ผ๋‹ˆํ‹ฐ(Affinity)์— ๋”ฐ๋ผ ๋˜๋Š” ๋ฌด์ž‘์œ„๋กœ) ๋ฐฑ์—”๋“œ๊ฐ€ ์„ ํƒ๋˜๊ณ , ํŒจํ‚ท์˜ ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ๋ฐฑ์—”๋“œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋œ๋‹ค.

ํŠธ๋ž˜ํ”ฝ์ด ๋…ธ๋“œ-ํฌํŠธ ๋˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ์—๋„, ์ด์™€ ๋™์ผํ•œ ๊ธฐ๋ณธ ํ๋ฆ„์ด ์‹คํ–‰๋˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ IP๋Š” ๋ณ€๊ฒฝ๋œ๋‹ค.

IPVS ํ”„๋ก์‹œ ๋ชจ๋“œ

ipvs ๋ชจ๋“œ์—์„œ, kube-proxy๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค์™€ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค๋ฅผ ๊ฐ์‹œํ•˜๊ณ , netlink ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ทธ์— ๋”ฐ๋ผ IPVS ๊ทœ์น™์„ ์ƒ์„ฑํ•˜๊ณ  IPVS ๊ทœ์น™์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค ๋ฐ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค์™€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•œ๋‹ค. ์ด ์ œ์–ด ๋ฃจํ”„๋Š” IPVS ์ƒํƒœ๊ฐ€ ์›ํ•˜๋Š” ์ƒํƒœ์™€ ์ผ์น˜ํ•˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค. ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋ฉด, IPVS๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ๋ณด๋‚ธ๋‹ค.

IPVS ํ”„๋ก์‹œ ๋ชจ๋“œ๋Š” iptables ๋ชจ๋“œ์™€ ์œ ์‚ฌํ•œ ๋„ทํ•„ํ„ฐ ํ›„ํฌ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ, ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ปค๋„ ์ŠคํŽ˜์ด์Šค์—์„œ ๋™์ž‘ํ•œ๋‹ค. ์ด๋Š” IPVS ๋ชจ๋“œ์˜ kube-proxy๋Š” iptables ๋ชจ๋“œ์˜ kube-proxy๋ณด๋‹ค ์ง€์—ฐ ์‹œ๊ฐ„์ด ์งง์€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜๊ณ , ํ”„๋ก์‹œ ๊ทœ์น™์„ ๋™๊ธฐํ™”ํ•  ๋•Œ ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ํ–ฅ์ƒ๋จ์„ ์˜๋ฏธํ•œ๋‹ค. ๋‹ค๋ฅธ ํ”„๋ก์‹œ ๋ชจ๋“œ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, IPVS ๋ชจ๋“œ๋Š” ๋†’์€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๋Ÿ‰๋„ ์ง€์›ํ•œ๋‹ค.

IPVS๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ๋กœ ๋ฐธ๋Ÿฐ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ทธ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • rr: ๋ผ์šด๋“œ-๋กœ๋นˆ
  • lc: ์ตœ์†Œ ์—ฐ๊ฒฐ (๊ฐ€์žฅ ์ ์€ ์ˆ˜์˜ ์—ด๋ ค์žˆ๋Š” ์—ฐ๊ฒฐ)
  • dh: ๋ชฉ์ ์ง€ ํ•ด์‹ฑ
  • sh: ์†Œ์Šค ํ•ด์‹ฑ
  • sed: ์ตœ๋‹จ ์˜ˆ์ƒ ์ง€์—ฐ (shortest expected delay)
  • nq: ํ ๋ฏธ์‚ฌ์šฉ (never queue)

IPVS ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ์„œ๋น„์Šค ๊ฐœ์š” ๋‹ค์ด์–ด๊ทธ๋žจ

์„ธ์…˜ ์–ดํ”ผ๋‹ˆํ‹ฐ

์ด๋Ÿฌํ•œ ํ”„๋ก์‹œ ๋ชจ๋ธ์—์„œ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค/์„œ๋น„์Šค/ํŒŒ๋“œ์— ๋Œ€ํ•ด ์ „ํ˜€ ๋ชจ๋ฅด๋”๋ผ๋„ ์„œ๋น„์Šค์˜ IP:ํฌํŠธ๋กœ ํ–ฅํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์€ ์ ์ ˆํ•œ ๋ฐฑ์—”๋“œ๋กœ ํ”„๋ก์‹œ๋œ๋‹ค.

ํŠน์ • ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์ด ๋งค๋ฒˆ ๋™์ผํ•œ ํŒŒ๋“œ๋กœ ์ „๋‹ฌ๋˜๋„๋ก ํ•˜๋ ค๋ฉด, ์„œ๋น„์Šค์˜ .spec.sessionAffinity๋ฅผ ClientIP๋กœ ์„ค์ •ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ธ์…˜ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’์€ None)

์„ธ์…˜ ๊ณ ์ •(Session stickiness) ํƒ€์ž„์•„์›ƒ

์„œ๋น„์Šค์˜ .spec.sessionAffinityConfig.clientIP.timeoutSeconds๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ์ตœ๋Œ€ ์„ธ์…˜ ๊ณ ์ • ์‹œ๊ฐ„์„ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’์€ 10800์œผ๋กœ, ์ด๋Š” 3์‹œ๊ฐ„์— ํ•ด๋‹น๋จ)

์„œ๋น„์Šค์— IP ์ฃผ์†Œ ํ• ๋‹น

๊ณ ์ •๋œ ๋ชฉ์ ์ง€๋กœ ์‹ค์ œ๋กœ ๋ผ์šฐํŒ…๋˜๋Š” ํŒŒ๋“œ IP ์ฃผ์†Œ์™€ ๋‹ฌ๋ฆฌ, ์„œ๋น„์Šค IP๋Š” ์‹ค์ œ๋กœ๋Š” ๋‹จ์ผ ํ˜ธ์ŠคํŠธ์—์„œ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹ ์—, kube-proxy๋Š” ํŒจํ‚ท ์ฒ˜๋ฆฌ ๋กœ์ง(์˜ˆ: ๋ฆฌ๋ˆ…์Šค์˜ iptables)์„ ์‚ฌ์šฉํ•˜์—ฌ, ํ•„์š”์— ๋”ฐ๋ผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋˜๋Š” ๊ฐ€์ƒ IP ์ฃผ์†Œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ VIP์— ์—ฐ๊ฒฐํ•˜๋ฉด, ํŠธ๋ž˜ํ”ฝ์ด ์ž๋™์œผ๋กœ ์ ์ ˆํ•œ ์—”๋“œํฌ์ธํŠธ๋กœ ์ „์†ก๋œ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ์„œ๋น„์Šค ์šฉ DNS๋Š” ์‹ค์ œ๋กœ๋Š” ์„œ๋น„์Šค์˜ ๊ฐ€์ƒ IP ์ฃผ์†Œ (๋ฐ ํฌํŠธ)๋กœ ์ฑ„์›Œ์ง„๋‹ค.

์ถฉ๋Œ ๋ฐฉ์ง€ํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ฃผ์š” ์ฒ ํ•™ ์ค‘ ํ•˜๋‚˜๋Š”, ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชปํ•œ ๊ฒƒ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์— ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค ์„ค๊ณ„ ์‹œ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํฌํŠธ ์„ ํƒ๊ณผ ์ถฉ๋Œํ•  ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•ด ์ž์‹ ์˜ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๊ฒฉ๋ฆฌ ์‹คํŒจ์ด๋‹ค.

์„œ๋น„์Šค์— ๋Œ€ํ•œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด, ๋‘ ๊ฐœ์˜ ์„œ๋น„์Šค๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” API ์„œ๋ฒ„์— ์„ค์ •๋˜์–ด ์žˆ๋Š” service-cluster-ip-range CIDR ๋ฒ”์œ„์—์„œ ๊ฐ ์„œ๋น„์Šค์— ๊ณ ์œ ํ•œ IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•œ๋‹ค.

๊ฐ ์„œ๋น„์Šค๊ฐ€ ๊ณ ์œ ํ•œ IP๋ฅผ ๋ฐ›๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๋‚ด๋ถ€ ํ• ๋‹น๊ธฐ๊ฐ€ etcd์—์„œ ๊ธ€๋กœ๋ฒŒ ํ• ๋‹น ๋งต์„ ์›์ž์ ์œผ๋กœ(atomically) ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์„œ๋น„์Šค๊ฐ€ IP ์ฃผ์†Œ ํ• ๋‹น์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋งต ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์— ์‹คํŒจํ•œ๋‹ค.

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ•ด๋‹น ๋งต์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค(์ธ-๋ฉ”๋ชจ๋ฆฌ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์ „ ๋ฒ„์ „์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง€์›์„ ์œ„ํ•ด ํ•„์š”ํ•จ). ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋˜ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํšจํ•˜์ง€ ์•Š์€ ํ• ๋‹น(์˜ˆ: ๊ด€๋ฆฌ์ž ๊ฐœ์ž…์— ์˜ํ•œ)์„ ์ฒดํฌํ•˜๊ณ  ๋” ์ด์ƒ ์–ด๋– ํ•œ ์„œ๋น„์Šค๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ• ๋‹น๋œ IP ์ฃผ์†Œ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

์„œ๋น„์Šค ๊ฐ€์ƒ IP ์ฃผ์†Œ์˜ IP ์ฃผ์†Œ ๋ฒ”์œ„

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.25 [beta]

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” min(max(16, cidrSize / 16), 256) ๊ณต์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ป์–ด์ง„ service-cluster-ip-range์˜ ํฌ๊ธฐ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ClusterIP ๋ฒ”์œ„๋ฅผ ๋‘ ๋Œ€์—ญ์œผ๋กœ ๋‚˜๋ˆ„๋ฉฐ, ์—ฌ๊ธฐ์„œ ์ด ๊ณต์‹์€ 16 ์ด์ƒ 256 ์ดํ•˜์ด๋ฉฐ, ๊ทธ ์‚ฌ์ด์— ๊ณ„๋‹จ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Œ ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋™์  IP ํ• ๋‹น ์‹œ ์ƒ์œ„ ๋Œ€์—ญ์—์„œ ์šฐ์„ ์ ์œผ๋กœ ์„ ํƒํ•˜๋ฉฐ, ์ด๋Š” ๊ณง ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ type: ClusterIP ์„œ๋น„์Šค์— ํŠน์ • IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ•˜์œ„ ๋Œ€์—ญ์—์„œ ๊ณจ๋ผ์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ํ• ๋‹น ์‹œ ์ถฉ๋Œ์˜ ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ServiceIPStaticSubrange ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” type: ClusterIP ์„œ๋น„์Šค์— ๋Œ€ํ•ด ์ˆ˜๋™ ๋ฐ ๋™์  ํ• ๋‹น IP ์ฃผ์†Œ๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๊ณต์œ ๋˜๋Š” ํ’€์„ ์‚ฌ์šฉํ•œ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ํด๋ฆฌ์‹œ

.spec.internalTrafficPolicy ๋ฐ .spec.externalTrafficPolicy ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์–ด๋–ป๊ฒŒ ์ •์ƒ(healthy, โ€œreadyโ€) ๋ฐฑ์—”๋“œ๋กœ ๋ผ์šฐํŒ…ํ• ์ง€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๋ถ€ ํŠธ๋ž˜ํ”ฝ ํด๋ฆฌ์‹œ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.22 [beta]

spec.internalTrafficPolicy ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋‚ด๋ถ€ ์†Œ์Šค์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์–ด๋–ป๊ฒŒ ๋ผ์šฐํŠธ๋ ์ง€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ•„๋“œ๋Š” Cluster ๋˜๋Š” Local๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•„๋“œ๋ฅผ Cluster๋กœ ์„ค์ •ํ•˜๋ฉด ๋‚ด๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์ค€๋น„ ์ƒํƒœ์˜ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋กœ ๋ผ์šฐํŠธํ•˜๋ฉฐ, Local๋กœ ์„ค์ •ํ•˜๋ฉด ์ค€๋น„ ์ƒํƒœ์˜ ๋…ธ๋“œ-๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๋กœ๋งŒ ๋ผ์šฐํŠธํ•œ๋‹ค. ๋งŒ์•ฝ ํŠธ๋ž˜ํ”ฝ ์ •์ฑ…์ด Local๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ ๋…ธ๋“œ-๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ, kube-proxy๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋“œ๋กญ์‹œํ‚จ๋‹ค.

์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ ํด๋ฆฌ์‹œ

spec.externalTrafficPolicy ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์™ธ๋ถ€ ์†Œ์Šค์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์–ด๋–ป๊ฒŒ ๋ผ์šฐํŠธ๋ ์ง€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ•„๋“œ๋Š” Cluster ๋˜๋Š” Local๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•„๋“œ๋ฅผ Cluster๋กœ ์„ค์ •ํ•˜๋ฉด ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์ค€๋น„ ์ƒํƒœ์˜ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋กœ ๋ผ์šฐํŠธํ•˜๋ฉฐ, Local๋กœ ์„ค์ •ํ•˜๋ฉด ์ค€๋น„ ์ƒํƒœ์˜ ๋…ธ๋“œ-๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๋กœ๋งŒ ๋ผ์šฐํŠธํ•œ๋‹ค. ๋งŒ์•ฝ ํŠธ๋ž˜ํ”ฝ ์ •์ฑ…์ด Local๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ ๋…ธ๋“œ-๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ, kube-proxy๋Š” ์—ฐ๊ด€๋œ ์„œ๋น„์Šค๋กœ์˜ ํŠธ๋ž˜ํ”ฝ์„ ํฌ์›Œ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ข…๋ฃŒ ์ค‘์ธ ์—”๋“œํฌ์ธํŠธ๋กœ ๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.26 [beta]

kube-proxy์— ๋Œ€ํ•ด ProxyTerminatingEndpoints ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ  ํŠธ๋ž˜ํ”ฝ ํด๋ฆฌ์‹œ๊ฐ€ Local์ด๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ kube-proxy๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์„ ํƒํ•  ๋•Œ ์ข€ ๋” ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด, kube-proxy๋Š” ๋…ธ๋“œ๊ฐ€ ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ '์ข…๋ฃŒ ์ค‘'์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋ชจ๋“  ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ข…๋ฃŒ ์ค‘์ด๋ฉด, kube-proxy๋Š” ์ข…๋ฃŒ ์ค‘์ธ ํ•ด๋‹น ์—”๋“œํฌ์ธํŠธ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•œ๋‹ค. ์ด์™ธ์˜ ๊ฒฝ์šฐ, kube-proxy๋Š” ์ข…๋ฃŒ ์ค‘์ด ์•„๋‹Œ ์—”๋“œํฌ์ธํŠธ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๋Š” ํŽธ์„ ์„ ํ˜ธํ•œ๋‹ค.

์ข…๋ฃŒ ์ค‘์ธ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ํฌ์›Œ๋”ฉ ์ •์ฑ… ๋•๋ถ„์—, externalTrafficPolicy: Local์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— NodePort ๋ฐ LoadBalancer ์„œ๋น„์Šค๊ฐ€ ์—ฐ๊ฒฐ๋“ค์„ ์ž๋น„๋กญ๊ฒŒ(gracefully) ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ๋กค๋ง ์—…๋ฐ์ดํŠธ๋  ๋•Œ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋’ค์— ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ํ•ด๋‹น ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ N๊ฐœ์—์„œ 0๊ฐœ ๊ฐ–๋„๋ก ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ถ€ ๊ฒฝ์šฐ์—, ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ํ—ฌ์Šค ์ฒดํฌ ํ”„๋กœ๋ธŒ ์‚ฌ์ด์˜ ๊ธฐ๊ฐ„์— ๋ ˆํ”Œ๋ฆฌ์นด 0๊ฐœ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. ์ข…๋ฃŒ ์ค‘์ธ ์—”๋“œํฌ์ธํŠธ๋กœ์˜ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ผ ๋‹ค์šด ์ค‘์ธ ๋…ธ๋“œ๊ฐ€ ํ•ด๋‹น ์ข…๋ฃŒ ์ค‘์ธ ํŒŒ๋“œ๋กœ์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ž๋น„๋กญ๊ฒŒ ์ˆ˜์‹  ๋ฐ ๋“œ๋ ˆ์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ๋“œ ์ข…๋ฃŒ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ์ด๋ฏธ ๋…ธ๋“œ์˜ ํ—ฌ์Šค ์ฒดํฌ๊ฐ€ ์‹คํŒจํ–ˆ์Œ์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฑ์—”๋“œ ํ’€์—์„œ ์™„์ „ํžˆ ์ œ๊ฑฐํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด, ์„œ๋น„์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—ฐ๊ฒฐ์„ ์ฝ์–ด ๋ณธ๋‹ค.

๋˜ํ•œ,

9 - ์„ค์น˜ ๋„๊ตฌ

9.1 - Kubeadm

Kubeadm์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ์„ ์œ„ํ•œ "๋น ๋ฅธ ๊ฒฝ๋กœ"์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ kubeadm init ๋ฐ kubeadm join ์„ ์ œ๊ณตํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ์ด๋‹ค.

kubeadm์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์„ค๊ณ„ ์ƒ, ์‹œ์Šคํ…œ ํ”„๋กœ๋น„์ €๋‹์ด ์•„๋‹Œ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ(bootstrapping)๋งŒ ๋‹ค๋ฃฌ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋Œ€์‹œ๋ณด๋“œ, ๋ชจ๋‹ˆํ„ฐ๋ง ์†”๋ฃจ์…˜ ๋ฐ ํด๋ผ์šฐ๋“œ๋ณ„ ์• ๋“œ์˜จ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์žˆ์œผ๋ฉด ์ข‹์€(nice-to-have) ์• ๋“œ์˜จ์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ๋ฒ”์œ„์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋Œ€์‹ , ์šฐ๋ฆฌ๋Š” ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋งž์ถคํ˜• ๋„๊ตฌ๊ฐ€ kubeadm ์œ„์— ๊ตฌ์ถ•๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋ฉฐ, ์ด์ƒ์ ์œผ๋กœ๋Š”, ๋ชจ๋“  ๋ฐฐํฌ์˜ ๊ธฐ๋ฐ˜์œผ๋กœ kubeadm์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทœ๊ฒฉ์„ ๋”ฐ๋ฅด๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ค์น˜ ๋ฐฉ๋ฒ•

kubeadm์„ ์„ค์น˜ํ•˜๋ ค๋ฉด, ์„ค์น˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

  • kubeadm init: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•œ๋‹ค.
  • kubeadm join: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์›Œ์ปค(worker) ๋…ธ๋“œ๋ฅผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์— ์กฐ์ธ์‹œํ‚จ๋‹ค.
  • kubeadm upgrade: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ๋‹ค.
  • kubeadm config: kubeadm v1.7.x ์ดํ•˜์˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ๊ฒฝ์šฐ, kubeadm upgrade ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ž์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  • kubeadm token: kubeadm join ์„ ์œ„ํ•œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • kubeadm reset: kubeadm init ๋˜๋Š” kubeadm join ์— ์˜ํ•œ ํ˜ธ์ŠคํŠธ์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋˜๋Œ๋ฆฐ๋‹ค.
  • kubeadm certs: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ธ์ฆ์„œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • kubeadm kubeconfig: kubeconfig ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • kubeadm version: kubeadm ๋ฒ„์ „์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • kubeadm alpha: ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ธฐ๋Šฅ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

9.1.1 - Kubeadm Generated

10 - ๋ช…๋ น์ค„ ๋„๊ตฌ (kubectl)

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋‹ค์Œ์„ ์ œ๊ณตํ•œ๋‹ค: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์ปค๋งจ๋“œ๋ผ์ธ ํˆด

์ด ํˆด์˜ ์ด๋ฆ„์€ kubectl์ด๋‹ค.

๊ตฌ์„ฑ์„ ์œ„ํ•ด, kubectl ์€ config ํŒŒ์ผ์„ $HOME/.kube ์—์„œ ์ฐพ๋Š”๋‹ค. KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ --kubeconfig ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋‹ค๋ฅธ kubeconfig ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ฐœ์š”๋Š” kubectl ๊ตฌ๋ฌธ์„ ๋‹ค๋ฃจ๊ณ , ์ปค๋งจ๋“œ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์ธ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ง€์›๋˜๋Š” ๋ชจ๋“  ํ”Œ๋ž˜๊ทธ ๋ฐ ํ•˜์œ„ ๋ช…๋ น์„ ํฌํ•จํ•œ ๊ฐ ๋ช…๋ น์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubectl ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์„ค์น˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” kubectl ์„ค์น˜๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ , ๋น ๋ฅธ ๊ฐ€์ด๋“œ๋Š” ์น˜ํŠธ ์‹œํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค. docker ๋ช…๋ น์ค„ ๋„๊ตฌ์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด, ๋„์ปค ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ kubectl์—์„œ ๋Œ€์‘๋˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ช…๋ น์–ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ๋ฌธ

ํ„ฐ๋ฏธ๋„ ์ฐฝ์—์„œ kubectl ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

kubectl [command] [TYPE] [NAME] [flags]

๋‹ค์Œ์€ command, TYPE, NAME ๊ณผ flags ์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค.

  • command: ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค์—์„œ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๋™์ž‘์„ ์ง€์ •ํ•œ๋‹ค. ์˜ˆ: create, get, describe, delete

  • TYPE: ๋ฆฌ์†Œ์Šค ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค. ๋ฆฌ์†Œ์Šค ํƒ€์ž…์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‹จ์ˆ˜ํ˜•, ๋ณต์ˆ˜ํ˜• ๋˜๋Š” ์•ฝ์–ด ํ˜•์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ๋ช…๋ น์€ ๋™์ผํ•œ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    kubectl get pod pod1
    kubectl get pods pod1
    kubectl get po pod1
    
  • NAME: ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์ด๋ฆ„์„ ์ƒ๋žตํ•˜๋ฉด, ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ํ‘œ์‹œ๋œ๋‹ค. ์˜ˆ: kubectl get pods

    ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ํƒ€์ž… ๋ฐ ์ด๋ฆ„๋ณ„๋กœ ๊ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ํƒ€์ž… ๋ฐ ์ด๋ฆ„์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

      • ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ํƒ€์ž…์ธ ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•œ๋‹ค. TYPE1 name1 name2 name<#>
        ์˜ˆ: kubectl get pod example-pod1 example-pod2

      • ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค ํƒ€์ž…์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•œ๋‹ค. TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>
        ์˜ˆ: kubectl get pod/example-pod1 replicationcontroller/example-rc1

    • ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ์ผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•œ๋‹ค. -f file1 -f file2 -f file<#>

  • flags: ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, -s ๋˜๋Š” --server ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์˜ ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋„์›€์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ํ„ฐ๋ฏธ๋„ ์ฐฝ์—์„œ kubectl help ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์ธ์ฆ๊ณผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜ค๋ฒ„๋ผ์ด๋“œ

๊ธฐ๋ณธ์ ์œผ๋กœ kubectl์€ ๋จผ์ € ์ž์‹ ์ด ํŒŒ๋“œ ์•ˆ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€, ์ฆ‰ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์žˆ๋Š”์ง€๋ฅผ ํŒ๋ณ„ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด KUBERNETES_SERVICE_HOST์™€ KUBERNETES_SERVICE_PORT ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ ํŒŒ์ผ์ด /var/run/secrets/kubernetes.io/serviceaccount/token ๊ฒฝ๋กœ์— ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ์„ธ ๊ฐ€์ง€๊ฐ€ ๋ชจ๋‘ ๊ฐ์ง€๋˜๋ฉด, ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์ธ์ฆ์ด ์ ์šฉ๋œ๋‹ค.

ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด, ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์ธ์ฆ ์‹œ์— POD_NAMESPACE ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ์˜ ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ค์ •์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ๋‹ค. ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ค์ •์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  ๋งค๋‹ˆํŽ˜์ŠคํŠธ์™€ ๋„๊ตฌ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค.

POD_NAMESPACE ํ™˜๊ฒฝ ๋ณ€์ˆ˜

POD_NAMESPACE ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๋Š” ์ž์›์— ๋Œ€ํ•œ CLI ์ž‘์—…์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์„ค์ •๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ seattle๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, kubectl get pods ๋ช…๋ น์€ seattle ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํŒŒ๋“œ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ํŒŒ๋“œ๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๋Š” ์ž์›์ด๋ฉฐ, ๋ช…๋ น์–ด์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํŠน์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. kubectl api-resources ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์—ฌ ํŠน์ • ์ž์›์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๋Š” ์ž์›์ธ์ง€ ํŒ๋ณ„ํ•œ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ --namespace <value> ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๋™์ž‘์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ๋‹ค.

kubectl์ด ์„œ๋น„์Šค์–ด์นด์šดํŠธ ํ† ํฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

๋งŒ์•ฝ

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ ํŒŒ์ผ์ด /var/run/secrets/kubernetes.io/serviceaccount/token ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธ๋˜์–ด ์žˆ๊ณ ,
  • KUBERNETES_SERVICE_HOST ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ ,
  • KUBERNETES_SERVICE_PORT ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ ,
  • kubectl ๋ช…๋ น์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด

kubectl์€ ์ž์‹ ์ด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. kubectl์€ ํ•ด๋‹น ์„œ๋น„์Šค์–ด์นด์šดํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(ํŒŒ๋“œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋™์ผํ•˜๋‹ค)๋ฅผ ์ธ์‹ํ•˜๊ณ  ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋™์ž‘ํ•œ๋‹ค. ์ด๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ์™€๋Š” ๋‹ค๋ฅธ๋ฐ, kubectl์ด ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์‹คํ–‰๋˜์—ˆ์œผ๋ฉฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ๋ช…์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ kubectl ๋ช…๋ น์–ด๋Š” ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ์—์„œ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ(current context)์— ์„ค์ •๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋™์ž‘ํ•œ๋‹ค. kubectl์ด ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

kubectl config set-context --current --namespace=<namespace-name>

๋ช…๋ น์–ด

๋‹ค์Œ ํ‘œ์—๋Š” ๋ชจ๋“  kubectl ์ž‘์—…์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…๊ณผ ์ผ๋ฐ˜์ ์ธ ๊ตฌ๋ฌธ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

๋ช…๋ น์–ด๊ตฌ๋ฌธ์„ค๋ช…
alphakubectl alpha SUBCOMMAND [flags]์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€ ์•Š์€ ์•ŒํŒŒ ๊ธฐ๋Šฅ์˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์„ ๋‚˜์—ดํ•œ๋‹ค.
annotatekubectl annotate (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags]ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
api-resourceskubectl api-resources [flags]์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ API ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•œ๋‹ค.
api-versionskubectl api-versions [flags]์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ API ๋ฒ„์ „์„ ๋‚˜์—ดํ•œ๋‹ค.
applykubectl apply -f FILENAME [flags]ํŒŒ์ผ์ด๋‚˜ ํ‘œ์ค€์ž…๋ ฅ(stdin)์œผ๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค์— ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ๋‹ค.
attachkubectl attach POD -c CONTAINER [-i] [-t] [flags]์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋ณด๊ฑฐ๋‚˜ ํ‘œ์ค€์ž…๋ ฅ์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•œ๋‹ค.
authkubectl auth [flags] [options]์Šน์ธ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.
autoscalekubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags]๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ๋“œ ์ง‘ํ•ฉ์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•œ๋‹ค.
certificatekubectl certificate SUBCOMMAND [options]์ธ์ฆ์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
cluster-infokubectl cluster-info [flags]ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋งˆ์Šคํ„ฐ์™€ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์—”๋“œํฌ์ธํŠธ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
completionkubectl completion SHELL [options]์ง€์ •๋œ ์…ธ(bash ๋˜๋Š” zsh)์— ๋Œ€ํ•œ ์…ธ ์™„์„ฑ ์ฝ”๋“œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
configkubectl config SUBCOMMAND [flags]kubeconfig ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ๋‹ค. ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๊ฐœ๋ณ„ ํ•˜์œ„ ๋ช…๋ น์„ ์ฐธ๊ณ ํ•œ๋‹ค.
convertkubectl convert -f FILENAME [options]๋‹ค๋ฅธ API ๋ฒ„์ „ ๊ฐ„์— ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•œ๋‹ค. YAML ๋ฐ JSON ํ˜•์‹์ด ๋ชจ๋‘ ํ—ˆ์šฉ๋œ๋‹ค. ์ฐธ๊ณ  - kubectl-convert ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.
cordonkubectl cordon NODE [options]๋…ธ๋“œ๋ฅผ ์Šค์ผ€์ค„ ๋ถˆ๊ฐ€๋Šฅ(unschedulable)์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค.
cpkubectl cp <file-spec-src> <file-spec-dest> [options]์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ทธ๋ฆฌ๊ณ  ์ปจํ…Œ์ด๋„ˆ๋กœ ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.
createkubectl create -f FILENAME [flags]ํŒŒ์ผ์ด๋‚˜ ํ‘œ์ค€์ž…๋ ฅ์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
deletekubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags]ํŒŒ์ผ, ํ‘œ์ค€์ž…๋ ฅ ๋˜๋Š” ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ, ์ด๋ฆ„, ๋ฆฌ์†Œ์Šค ์…€๋ ‰ํ„ฐ ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
describekubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags]ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค์˜ ์ž์„ธํ•œ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
diffkubectl diff -f FILENAME [flags]๋ผ์ด๋ธŒ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ํŒŒ์ผ์ด๋‚˜ ํ‘œ์ค€์ž…๋ ฅ์˜ ์ฐจ์ด์ ์„ ์ถœ๋ ฅํ•œ๋‹ค.
drainkubectl drain NODE [options]์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์ค€๋น„ ์ค‘์ธ ๋…ธ๋“œ๋ฅผ ๋“œ๋ ˆ์ธํ•œ๋‹ค.
editkubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags]๊ธฐ๋ณธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค ์ •์˜๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
eventskubectl eventsList events
execkubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค.
explainkubectl explain [--recursive=false] [flags]ํŒŒ๋“œ, ๋…ธ๋“œ, ์„œ๋น„์Šค ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
exposekubectl expose (-f FILENAME | TYPE NAME | TYPE/NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [flags]๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค ๋˜๋Š” ํŒŒ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค๋กœ ๋…ธ์ถœํ•œ๋‹ค.
getkubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags]ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•œ๋‹ค.
kustomizekubectl kustomize <dir> [flags] [options]kustomization.yaml ํŒŒ์ผ์˜ ์ง€์‹œ ์‚ฌํ•ญ์—์„œ ์ƒ์„ฑ๋œ API ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์„ ๋‚˜์—ดํ•œ๋‹ค. ์ธ์ˆ˜๋Š” ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฒฝ๋กœ์ด๊ฑฐ๋‚˜, ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ ๋ฃจํŠธ์™€ ๊ด€๋ จํ•˜์—ฌ ๊ฒฝ๋กœ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋™์ผํ•œ git ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ URL์ด์–ด์•ผ ํ•œ๋‹ค.
labelkubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags]ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
logskubectl logs POD [-c CONTAINER] [--follow] [flags]ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
optionskubectl options๋ชจ๋“  ๋ช…๋ น์— ์ ์šฉ๋˜๋Š” ์ „์—ญ ์ปค๋งจ๋“œ ๋ผ์ธ ์˜ต์…˜์„ ๋‚˜์—ดํ•œ๋‹ค.
patchkubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) --patch PATCH [flags]์ „๋žต์  ๋ณ‘ํ•ฉ ํŒจ์น˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์˜ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
pluginkubectl plugin [flags] [options]ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
port-forwardkubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags]ํ•˜๋‚˜ ์ด์ƒ์˜ ๋กœ์ปฌ ํฌํŠธ๋ฅผ ํŒŒ๋“œ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
proxykubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags]์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์— ํ”„๋ก์‹œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
replacekubectl replace -f FILENAMEํŒŒ์ผ ๋˜๋Š” ํ‘œ์ค€์ž…๋ ฅ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ต์ฒดํ•œ๋‹ค.
rolloutkubectl rollout SUBCOMMAND [options]๋ฆฌ์†Œ์Šค์˜ ๋กค์•„์›ƒ์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์œ ํšจํ•œ ๋ฆฌ์†Œ์Šค ํƒ€์ž…์—๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ(deployment), ๋ฐ๋ชฌ์…‹(daemonset)๊ณผ ์Šคํ…Œ์ดํŠธํ’€์…‹(statefulset)์ด ํฌํ•จ๋œ๋‹ค.
runkubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client|none] [--overrides=inline-json] [flags]ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ง€์ •๋œ ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
scalekubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags]์ง€์ •๋œ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์˜ ํฌ๊ธฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
setkubectl set SUBCOMMAND [options]์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
taintkubectl taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N [options]ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ์—์„œ ํ…Œ์ธํŠธ(taint)๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
topkubectl top [flags] [options]๋ฆฌ์†Œ์Šค(CPU/๋ฉ”๋ชจ๋ฆฌ/์Šคํ† ๋ฆฌ์ง€) ์‚ฌ์šฉ๋Ÿ‰์„ ํ‘œ์‹œํ•œ๋‹ค.
uncordonkubectl uncordon NODE [options]๋…ธ๋“œ๋ฅผ ์Šค์ผ€์ค„ ๊ฐ€๋Šฅ(schedulable)์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค.
versionkubectl version [--client] [flags]ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „์„ ํ‘œ์‹œํ•œ๋‹ค.
waitkubectl wait ([-f FILENAME] | resource.group/resource.name | resource.group [(-l label | --all)]) [--for=delete|--for condition=available] [options]์‹คํ—˜(experimental) ๊ธฐ๋Šฅ: ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค์—์„œ ํŠน์ • ์กฐ๊ฑด์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

๋ช…๋ น ๋™์ž‘์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๋ ค๋ฉด kubectl ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค ํƒ€์ž…

๋‹ค์Œ ํ‘œ์—๋Š” ์ง€์›๋˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ํƒ€์ž…๊ณผ ํ•ด๋‹น ์•ฝ์–ด๊ฐ€ ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค.

(์ด ์ถœ๋ ฅ์€ kubectl api-resources ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.25.0 ์—์„œ์˜ ์ถœ๋ ฅ์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.)

NAMESHORTNAMESAPIVERSIONNAMESPACEDKIND
bindingsv1trueBinding
componentstatusescsv1falseComponentStatus
configmapscmv1trueConfigMap
endpointsepv1trueEndpoints
eventsevv1trueEvent
limitrangeslimitsv1trueLimitRange
namespacesnsv1falseNamespace
nodesnov1falseNode
persistentvolumeclaimspvcv1truePersistentVolumeClaim
persistentvolumespvv1falsePersistentVolume
podspov1truePod
podtemplatesv1truePodTemplate
replicationcontrollersrcv1trueReplicationController
resourcequotasquotav1trueResourceQuota
secretsv1trueSecret
serviceaccountssav1trueServiceAccount
servicessvcv1trueService
mutatingwebhookconfigurationsadmissionregistration.k8s.io/v1falseMutatingWebhookConfiguration
validatingwebhookconfigurationsadmissionregistration.k8s.io/v1falseValidatingWebhookConfiguration
customresourcedefinitionscrd,crdsapiextensions.k8s.io/v1falseCustomResourceDefinition
apiservicesapiregistration.k8s.io/v1falseAPIService
controllerrevisionsapps/v1trueControllerRevision
daemonsetsdsapps/v1trueDaemonSet
deploymentsdeployapps/v1trueDeployment
replicasetsrsapps/v1trueReplicaSet
statefulsetsstsapps/v1trueStatefulSet
tokenreviewsauthentication.k8s.io/v1falseTokenReview
localsubjectaccessreviewsauthorization.k8s.io/v1trueLocalSubjectAccessReview
selfsubjectaccessreviewsauthorization.k8s.io/v1falseSelfSubjectAccessReview
selfsubjectrulesreviewsauthorization.k8s.io/v1falseSelfSubjectRulesReview
subjectaccessreviewsauthorization.k8s.io/v1falseSubjectAccessReview
horizontalpodautoscalershpaautoscaling/v2trueHorizontalPodAutoscaler
cronjobscjbatch/v1trueCronJob
jobsbatch/v1trueJob
certificatesigningrequestscsrcertificates.k8s.io/v1falseCertificateSigningRequest
leasescoordination.k8s.io/v1trueLease
endpointslicesdiscovery.k8s.io/v1trueEndpointSlice
eventsevevents.k8s.io/v1trueEvent
flowschemasflowcontrol.apiserver.k8s.io/v1beta2falseFlowSchema
prioritylevelconfigurationsflowcontrol.apiserver.k8s.io/v1beta2falsePriorityLevelConfiguration
ingressclassesnetworking.k8s.io/v1falseIngressClass
ingressesingnetworking.k8s.io/v1trueIngress
networkpoliciesnetpolnetworking.k8s.io/v1trueNetworkPolicy
runtimeclassesnode.k8s.io/v1falseRuntimeClass
poddisruptionbudgetspdbpolicy/v1truePodDisruptionBudget
podsecuritypoliciespsppolicy/v1beta1falsePodSecurityPolicy
clusterrolebindingsrbac.authorization.k8s.io/v1falseClusterRoleBinding
clusterrolesrbac.authorization.k8s.io/v1falseClusterRole
rolebindingsrbac.authorization.k8s.io/v1trueRoleBinding
rolesrbac.authorization.k8s.io/v1trueRole
priorityclassespcscheduling.k8s.io/v1falsePriorityClass
csidriversstorage.k8s.io/v1falseCSIDriver
csinodesstorage.k8s.io/v1falseCSINode
csistoragecapacitiesstorage.k8s.io/v1trueCSIStorageCapacity
storageclassesscstorage.k8s.io/v1falseStorageClass
volumeattachmentsstorage.k8s.io/v1falseVolumeAttachment

์ถœ๋ ฅ ์˜ต์…˜

ํŠน์ • ๋ช…๋ น์˜ ์ถœ๋ ฅ์„ ์„œ์‹ํ™”ํ•˜๊ฑฐ๋‚˜ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋‹ค์Œ ์„น์…˜์„ ์ฐธ๊ณ ํ•œ๋‹ค. ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ ์˜ต์…˜์„ ์ง€์›ํ•˜๋Š” ๋ช…๋ น์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubectl ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์ถœ๋ ฅ ์„œ์‹ํ™”

๋ชจ๋“  kubectl ๋ช…๋ น์˜ ๊ธฐ๋ณธ ์ถœ๋ ฅ ํ˜•์‹์€ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ ํ˜•์‹์ด๋‹ค. ํŠน์ • ํ˜•์‹์œผ๋กœ ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด, ์ง€์›๋˜๋Š” kubectl ๋ช…๋ น์— -o ๋˜๋Š” --output ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ๋ฌธ

kubectl [command] [TYPE] [NAME] -o <output_format>

kubectl ๋ช…๋ น์— ๋”ฐ๋ผ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ ํ˜•์‹์ด ์ง€์›๋œ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹์„ค๋ช…
-o custom-columns=<spec>์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์—ด ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ถœ๋ ฅํ•œ๋‹ค.
-o custom-columns-file=<filename><filename> ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์—ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ถœ๋ ฅํ•œ๋‹ค.
-o jsonJSON ํ˜•์‹์˜ API ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
-o jsonpath=<template>jsonpath ํ‘œํ˜„์‹์— ์ •์˜๋œ ํ•„๋“œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
-o jsonpath-file=<filename><filename> ํŒŒ์ผ์—์„œ jsonpath ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜๋œ ํ•„๋“œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
-o name๋ฆฌ์†Œ์Šค ์ด๋ฆ„๋งŒ ์ถœ๋ ฅํ•œ๋‹ค.
-o wide์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค. ํŒŒ๋“œ์˜ ๊ฒฝ์šฐ, ๋…ธ๋“œ ์ด๋ฆ„์ด ํฌํ•จ๋œ๋‹ค.
-o yamlYAML ํ˜•์‹์˜ API ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
์˜ˆ์ œ

์ด ์˜ˆ์ œ์—์„œ, ๋‹ค์Œ์˜ ๋ช…๋ น์€ ๋‹จ์ผ ํŒŒ๋“œ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ YAML ํ˜•์‹์˜ ์˜ค๋ธŒ์ ํŠธ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get pod web-pod-13je7 -o yaml

๊ธฐ์–ตํ•˜๊ธฐ: ๊ฐ ๋ช…๋ น์ด ์ง€์›ํ•˜๋Š” ์ถœ๋ ฅ ํ˜•์‹์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubectl ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์—ด

์‚ฌ์šฉ์ž ์ •์˜ ์—ด์„ ์ •์˜ํ•˜๊ณ  ์›ํ•˜๋Š” ์„ธ๋ถ€ ์ •๋ณด๋งŒ ํ…Œ์ด๋ธ”์— ์ถœ๋ ฅํ•˜๋ ค๋ฉด, custom-columns ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์—ด์„ ์ธ๋ผ์ธ์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. -o custom-columns=<spec> ๋˜๋Š” -o custom-columns-file=<filename>

์˜ˆ์ œ

์ธ๋ผ์ธ:

kubectl get pods <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion

ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ:

kubectl get pods <pod-name> -o custom-columns-file=template.txt

template.txt ํŒŒ์ผ์— ํฌํ•จ๋œ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

NAME          RSRC
metadata.name metadata.resourceVersion

๋‘ ๋ช…๋ น ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๋‹ค.

NAME           RSRC
submit-queue   610995

์„œ๋ฒ„์ธก ์—ด

kubectl ๋Š” ์„œ๋ฒ„์—์„œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ํŠน์ • ์—ด ์ •๋ณด ์ˆ˜์‹ ์„ ์ง€์›ํ•œ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก, ์ฃผ์–ด์ง„ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์™€ ๊ด€๋ จ๋œ ์—ด๊ณผ ํ–‰์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ์„œ๋ฒ„๊ฐ€ ์ถœ๋ ฅ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์บก์Аํ™”ํ•˜๋„๋ก ํ•˜์—ฌ, ๋™์ผํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•ด ์‚ฌ์šฉ๋œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ผ๊ด€๋œ ์ถœ๋ ฅ์„ ํ—ˆ์šฉํ•œ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด, kubectl get ๋ช…๋ น์— --server-print=false ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์˜ˆ์ œ

ํŒŒ๋“œ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค.

kubectl get pods <pod-name> --server-print=false

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๋‹ค.

NAME       AGE
pod-name   1m

์˜ค๋ธŒ์ ํŠธ ๋ชฉ๋ก ์ •๋ ฌ

ํ„ฐ๋ฏธ๋„ ์ฐฝ์—์„œ ์ •๋ ฌ๋œ ๋ชฉ๋ก์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด, ์ง€์›๋˜๋Š” kubectl ๋ช…๋ น์— --sort-by ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. --sort-by ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •๋ ฌํ•œ๋‹ค. ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด, jsonpath ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ตฌ๋ฌธ

kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>
์˜ˆ์ œ

์ด๋ฆ„๋ณ„๋กœ ์ •๋ ฌ๋œ ํŒŒ๋“œ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋ ค๋ฉด, ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ๋‹ค.

kubectl get pods --sort-by=.metadata.name

์˜ˆ์ œ: ์ผ๋ฐ˜์ ์ธ ์ž‘์—…

๋‹ค์Œ ์˜ˆ์ œ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” kubectl ์กฐ์ž‘ ์‹คํ–‰์— ์ต์ˆ™ํ•ด์ง„๋‹ค.

kubectl apply - ํŒŒ์ผ ๋˜๋Š” ํ‘œ์ค€์ž…๋ ฅ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

# example-service.yaml์˜ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
kubectl apply -f example-service.yaml

# example-controller.yaml์˜ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
kubectl apply -f example-controller.yaml

# <directory> ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ .yaml, .yml ๋˜๋Š” .json ํŒŒ์ผ์— ์ •์˜๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
kubectl apply -f <directory>

kubectl get - ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•œ๋‹ค.

# ๋ชจ๋“  ํŒŒ๋“œ๋ฅผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ๋‚˜์—ดํ•œ๋‹ค.
kubectl get pods

# ๋ชจ๋“  ํŒŒ๋“œ๋ฅผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ๋‚˜์—ดํ•˜๊ณ  ์ถ”๊ฐ€ ์ •๋ณด(์˜ˆ: ๋…ธ๋“œ ์ด๋ฆ„)๋ฅผ ํฌํ•จํ•œ๋‹ค.
kubectl get pods -o wide

# ์ง€์ •๋œ ์ด๋ฆ„์˜ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ๋‚˜์—ดํ•œ๋‹ค. ํŒ: 'replicationcontroller' ๋ฆฌ์†Œ์Šค ํƒ€์ž…์„ 'rc'๋กœ ์งง๊ฒŒ ๋ฐ”๊ฟ”์“ธ ์ˆ˜ ์žˆ๋‹ค.
kubectl get replicationcontroller <rc-name>

# ๋ชจ๋“  ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค๋ฅผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ํ•จ๊ป˜ ๋‚˜์—ดํ•œ๋‹ค.
kubectl get rc,services

# ๋ชจ๋“  ๋ฐ๋ชฌ ์…‹์„ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ๋‚˜์—ดํ•œ๋‹ค.
kubectl get ds

# ๋…ธ๋“œ server01์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ํŒŒ๋“œ๋ฅผ ๋‚˜์—ดํ•œ๋‹ค.
kubectl get pods --field-selector=spec.nodeName=server01

kubectl describe - ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค์˜ ๊ธฐ๋ณธ ์ƒํƒœ๋ฅผ ๋””ํดํŠธ๋กœ ํ‘œ์‹œํ•œ๋‹ค.

# ๋…ธ๋“œ ์ด๋ฆ„์ด <node-name>์ธ ๋…ธ๋“œ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํ‘œ์‹œํ•œ๋‹ค.
kubectl describe nodes <node-name>

# ํŒŒ๋“œ ์ด๋ฆ„์ด <pod-name> ์ธ ํŒŒ๋“œ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
kubectl describe pods/<pod-name>

# ์ด๋ฆ„์ด <rc-name>์ธ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ํŒŒ๋“œ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
# ๊ธฐ์–ตํ•˜๊ธฐ: ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ํŒŒ๋“œ์—๋Š” ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ ์ด๋ฆ„์ด ์ ‘๋‘์‚ฌ๋กœ ๋ถ™๋Š”๋‹ค.
kubectl describe pods <rc-name>

# ๋ชจ๋“  ํŒŒ๋“œ์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
kubectl describe pods

kubectl delete - ํŒŒ์ผ, ํ‘œ์ค€์ž…๋ ฅ ๋˜๋Š” ๋ ˆ์ด๋ธ” ์„ ํƒ๊ธฐ, ์ด๋ฆ„, ๋ฆฌ์†Œ์Šค ์„ ํƒ๊ธฐ๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

# pod.yaml ํŒŒ์ผ์— ์ง€์ •๋œ ํƒ€์ž…๊ณผ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
kubectl delete -f pod.yaml

# '<label-key>=<label-value>' ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋ชจ๋“  ํŒŒ๋“œ์™€ ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
kubectl delete pods,services -l <label-key>=<label-value>

# ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํŒŒ๋“œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
kubectl delete pods --all

kubectl exec - ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค.

# ํŒŒ๋“œ <pod-name>์—์„œ 'date'๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, ์ฒซ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ถœ๋ ฅ๋œ๋‹ค.
kubectl exec <pod-name> -- date

# ํŒŒ๋“œ <pod-name>์˜ <container-name> ์ปจํ…Œ์ด๋„ˆ์—์„œ 'date'๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.
kubectl exec <pod-name> -c <container-name> -- date

# ํŒŒ๋“œ <pod-name>์—์„œ ๋Œ€ํ™”์‹ TTY๋ฅผ ์—ฐ๊ฒฐํ•ด /bin/bash๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, ์ฒซ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ถœ๋ ฅ๋œ๋‹ค.
kubectl exec -ti <pod-name> -- /bin/bash

kubectl logs - ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

# ํŒŒ๋“œ <pod-name>์—์„œ ๋กœ๊ทธ์˜ ์Šค๋ƒ…์ƒท์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
kubectl logs <pod-name>

# ํŒŒ๋“œ <pod-name>์—์„œ ๋กœ๊ทธ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‹œ์ž‘ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น 'tail -f'์™€ ๋น„์Šทํ•˜๋‹ค.
kubectl logs -f <pod-name>

kubectl diff - ์ œ์•ˆ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์—…๋ฐ์ดํŠธ์˜ ์ฐจ์ด์ ์„ ๋ณธ๋‹ค.

# "pod.json"์— ํฌํ•จ๋œ ๋ฆฌ์†Œ์Šค์˜ ์ฐจ์ด์ ์„ ์ถœ๋ ฅํ•œ๋‹ค.
kubectl diff -f pod.json

# ํ‘œ์ค€์ž…๋ ฅ์—์„œ ํŒŒ์ผ์„ ์ฝ์–ด ์ฐจ์ด์ ์„ ์ถœ๋ ฅํ•œ๋‹ค.
cat service.yaml | kubectl diff -f -

์˜ˆ์ œ: ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž‘์„ฑ ๋ฐ ์‚ฌ์šฉ

kubectl ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž‘์„ฑ๊ณผ ์‚ฌ์šฉ์— ์ต์ˆ™ํ•ด์ง€๋ ค๋ฉด ๋‹ค์Œ์˜ ์˜ˆ์ œ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

# ์–ด๋–ค ์–ธ์–ด๋กœ๋“  ๊ฐ„๋‹จํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค๊ณ  "kubectl-" ์ ‘๋‘์‚ฌ๋กœ
# ์‹œ์ž‘ํ•˜๋„๋ก ์‹คํ–‰ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.
cat ./kubectl-hello
#!/bin/sh

# ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ "hello world"๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค
echo "hello world"

์ž‘์„ฑํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค

chmod a+x ./kubectl-hello

# ๊ทธ๋ฆฌ๊ณ  PATH์˜ ์œ„์น˜๋กœ ์˜ฎ๊ธด๋‹ค
sudo mv ./kubectl-hello /usr/local/bin
sudo chown root:root /usr/local/bin

# ์ด์ œ kubectl ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค๊ณ  "์„ค์น˜ํ–ˆ๋‹ค".
# kubectl์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ผ๋ฐ˜ ๋ช…๋ น์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
kubectl hello
hello world
# ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ฐฐ์น˜ํ•œ $PATH์˜ ํด๋”์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ญ์ œํ•˜์—ฌ,
# ํ”Œ๋Ÿฌ๊ทธ์ธ์„ "์ œ๊ฑฐ"ํ•  ์ˆ˜ ์žˆ๋‹ค
sudo rm /usr/local/bin/kubectl-hello

kubectl ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ณด๋ ค๋ฉด, kubectl plugin list ํ•˜์œ„ ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค.

kubectl plugin list

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๋‹ค.

The following kubectl-compatible plugins are available:

/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo
/usr/local/bin/kubectl-bar

kubectl plugin list ๋Š” ๋˜ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜ํ•ด ์ฐจ๋‹จ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

sudo chmod -x /usr/local/bin/kubectl-foo # ์‹คํ–‰ ๊ถŒํ•œ ์ œ๊ฑฐ
kubectl plugin list
The following kubectl-compatible plugins are available:

/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo
  - warning: /usr/local/bin/kubectl-foo identified as a plugin, but it is not executable
/usr/local/bin/kubectl-bar

error: one plugin warning was found

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ธฐ์กด kubectl ๋ช…๋ น ์œ„์— ๋ณด๋‹ค ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์ˆ˜๋‹จ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

cat ./kubectl-whoami

๋‹ค์Œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋Š” ์ด๋ฏธ kubectl-whoami ์— ๋‹ค์Œ ๋‚ด์šฉ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

#!/bin/bash

# ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ˜„์žฌ ์„ ํƒ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ˜„์žฌ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ
# ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด 'kubectl config' ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค.
kubectl config view --template='{{ range .contexts }}{{ if eq .name "'$(kubectl config current-context)'" }}Current user: {{ printf "%s\n" .context.user }}{{ end }}{{ end }}'

์œ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‹คํ–‰ํ•˜๋ฉด KUBECONFIG ํŒŒ์ผ์—์„œ ํ˜„์žฌ์˜ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํฌํ•จ๋œ ์ถœ๋ ฅ์ด ์ œ๊ณต๋œ๋‹ค.

# ํŒŒ์ผ์„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค
sudo chmod +x ./kubectl-whoami

# ๊ทธ๋ฆฌ๊ณ  PATH๋กœ ์˜ฎ๊ธด๋‹ค
sudo mv ./kubectl-whoami /usr/local/bin

kubectl whoami
Current user: plugins-user

๋‹ค์Œ ๋‚ด์šฉ

10.1 - kubectl ์น˜ํŠธ ์‹œํŠธ

์ด ํŽ˜์ด์ง€๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” kubectl ์ปค๋งจ๋“œ์™€ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ๋ชฉ๋ก์„ ํฌํ•จํ•œ๋‹ค.

Kubectl ์ž๋™ ์™„์„ฑ

BASH

source <(kubectl completion bash) # bash-completion ํŒจํ‚ค์ง€๋ฅผ ๋จผ์ € ์„ค์น˜ํ•œ ํ›„, bash์˜ ์ž๋™ ์™„์„ฑ์„ ํ˜„์žฌ ์…ธ์— ์„ค์ •ํ•œ๋‹ค
echo "source <(kubectl completion bash)" >> ~/.bashrc # ์ž๋™ ์™„์„ฑ์„ bash ์…ธ์— ์˜๊ตฌ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค

๋˜ํ•œ, kubectl์˜ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์•ฝ์นญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

alias k=kubectl
complete -o default -F __start_kubectl k

ZSH

source <(kubectl completion zsh)  # ํ˜„์žฌ ์…ธ์— zsh์˜ ์ž๋™ ์™„์„ฑ ์„ค์ •
echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc # ์ž๋™ ์™„์„ฑ์„ zsh ์…ธ์— ์˜๊ตฌ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

--all-namespaces ์— ๋Œ€ํ•œ ๋…ธํŠธ

--all-namespaces๋ฅผ ๋ถ™์—ฌ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, --all-namespaces์˜ ์ถ•์•ฝํ˜•์„ ์•Œ์•„ ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

kubectl -A

Kubectl ์ปจํ…์ŠคํŠธ์™€ ์„ค์ •

kubectl์ด ํ†ต์‹ ํ•˜๊ณ  ์„ค์ • ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์„ค์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” kubeconfig๋ฅผ ์ด์šฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„ ์ธ์ฆ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

kubectl config view # ๋ณ‘ํ•ฉ๋œ kubeconfig ์„ค์ •์„ ํ‘œ์‹œํ•œ๋‹ค.

# ๋™์‹œ์— ์—ฌ๋Ÿฌ kubeconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ณ‘ํ•ฉ๋œ ๊ตฌ์„ฑ์„ ํ™•์ธํ•œ๋‹ค
KUBECONFIG=~/.kube/config:~/.kube/kubconfig2

kubectl config view

# e2e ์‚ฌ์šฉ์ž์˜ ์•”ํ˜ธ๋ฅผ ํ™•์ธํ•œ๋‹ค
kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'

kubectl config view -o jsonpath='{.users[].name}'     # ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž ์ถœ๋ ฅ
kubectl config view -o jsonpath='{.users[*].name}'    # ์‚ฌ์šฉ์ž ๋ฆฌ์ŠคํŠธ ์กฐํšŒ
kubectl config get-contexts                           # ์ปจํ…์ŠคํŠธ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
kubectl config current-context                        # ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ์ถœ๋ ฅ
kubectl config use-context my-cluster-name            # my-cluster-name๋ฅผ ๊ธฐ๋ณธ ์ปจํ…์ŠคํŠธ๋กœ ์„ค์ •

kubectl config set-cluster my-cluster-name            # kubeconfig์— ํด๋Ÿฌ์Šคํ„ฐ ์—”ํŠธ๋ฆฌ๋ฅผ ์„ค์ •

# kubeconfig์— ์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ ์š”์ฒญ์— ์‚ฌ์šฉํ•  ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ URL์„ ๊ตฌ์„ฑํ•œ๋‹ค.
kubectl config set-cluster my-cluster-name --proxy-url=my-proxy-url

# ๊ธฐ๋ณธ ์ธ์ฆ์„ ์ง€์›ํ•˜๋Š” ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ kubeconf์— ์ถ”๊ฐ€ํ•œ๋‹ค
kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword

# ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ๋ชจ๋“  ํ›„์† kubectl ์ปค๋งจ๋“œ์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•œ๋‹ค
kubectl config set-context --current --namespace=ggckad-s2

# ํŠน์ • ์‚ฌ์šฉ์ž์™€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…์ŠคํŠธ ์„ค์ •
kubectl config set-context gce --user=cluster-admin --namespace=foo \
  && kubectl config use-context gce

kubectl config unset users.foo                       # foo ์‚ฌ์šฉ์ž ์‚ญ์ œ

# ์ปจํ…์ŠคํŠธ/๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ค์ •/์กฐํšŒํ•˜๋Š” ๋‹จ์ถ• ๋ช…๋ น (bash ๋ฐ bash ํ˜ธํ™˜ ์…ธ์—์„œ๋งŒ ๋™์ž‘ํ•จ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ค์ •์„ ์œ„ํ•ด kn ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๊ฐ€ ์„ค์ •๋˜์–ด์•ผ ํ•จ)
alias kx='f() { [ "$1" ] && kubectl config use-context $1 || kubectl config current-context ; } ; f'
alias kn='f() { [ "$1" ] && kubectl config set-context --current --namespace $1 || kubectl config view --minify | grep namespace | cut -d" " -f6 ; } ; f'

Kubectl apply

apply๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•œ๋‹ค. kubectl apply๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•  ๋•Œ ๊ถŒ์žฅ๋œ๋‹ค. Kubectl Book์„ ์ฐธ๊ณ ํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” JSON์ด๋‚˜ YAML๋กœ ์ •์˜๋œ๋‹ค. ํŒŒ์ผ ํ™•์žฅ์ž๋Š” .yaml , .yml, .json ์ด ์‚ฌ์šฉ๋œ๋‹ค.

kubectl apply -f ./my-manifest.yaml            # ๋ฆฌ์†Œ์Šค(๋“ค) ์ƒ์„ฑ
kubectl apply -f ./my1.yaml -f ./my2.yaml      # ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ€ํ„ฐ ์ƒ์„ฑ
kubectl apply -f ./dir                         # dir ๋‚ด ๋ชจ๋“  ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์—์„œ ๋ฆฌ์†Œ์Šค(๋“ค) ์ƒ์„ฑ
kubectl apply -f https://git.io/vPieo          # url๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค(๋“ค) ์ƒ์„ฑ
kubectl create deployment nginx --image=nginx  # nginx ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘

# "Hello World"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์žก(Job) ์ƒ์„ฑ
kubectl create job hello --image=busybox:1.28 -- echo "Hello World"

# ๋งค๋ถ„๋งˆ๋‹ค "Hello World"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํฌ๋ก ์žก(CronJob) ์ƒ์„ฑ
kubectl create cronjob hello --image=busybox:1.28   --schedule="*/1 * * * *" -- echo "Hello World"

kubectl explain pods                           # ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ์กฐํšŒ

# stdin์œผ๋กœ ๋‹ค์ˆ˜์˜ YAML ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - sleep
    - "1000000"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - sleep
    - "1000"
EOF

# ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค๋กœ ์‹œํฌ๋ฆฟ ์ƒ์„ฑ
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: $(echo -n "s33msi4" | base64 -w0)
  username: $(echo -n "jane" | base64 -w0)
EOF

๋ฆฌ์†Œ์Šค ์กฐํšŒ ๋ฐ ์ฐพ๊ธฐ

# ๊ธฐ๋ณธ ์ถœ๋ ฅ์„ ์œ„ํ•œ Get ์ปค๋งจ๋“œ
kubectl get services                          # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ์„œ๋น„์Šค์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pods --all-namespaces             # ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ํŒŒ๋“œ์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pods -o wide                      # ํ•ด๋‹นํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ํŒŒ๋“œ์˜ ์ƒ์„ธ ๋ชฉ๋ก ์กฐํšŒ
kubectl get deployment my-dep                 # ํŠน์ • ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pods                              # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ํŒŒ๋“œ์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pod my-pod -o yaml                # ํŒŒ๋“œ์˜ YAML ์กฐํšŒ

# ์ƒ์„ธ ์ถœ๋ ฅ์„ ์œ„ํ•œ Describe ์ปค๋งจ๋“œ
kubectl describe nodes my-node
kubectl describe pods my-pod

# Name์œผ๋กœ ์ •๋ ฌ๋œ ์„œ๋น„์Šค์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get services --sort-by=.metadata.name

# ์žฌ์‹œ์ž‘ ํšŸ์ˆ˜๋กœ ์ •๋ ฌ๋œ ํŒŒ๋“œ์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

# PersistentVolumes์„ ์šฉ๋Ÿ‰๋ณ„๋กœ ์ •๋ ฌํ•ด์„œ ์กฐํšŒ
kubectl get pv --sort-by=.spec.capacity.storage

# app=cassandra ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ชจ๋“  ํŒŒ๋“œ์˜ ๋ ˆ์ด๋ธ” ๋ฒ„์ „ ์กฐํšŒ
kubectl get pods --selector=app=cassandra -o \
  jsonpath='{.items[*].metadata.labels.version}'

# ์˜ˆ๋ฅผ ๋“ค์–ด 'ca.crt'์™€ ๊ฐ™์ด ์ ์ด ์žˆ๋Š” ํ‚ค๊ฐ’์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค
kubectl get configmap myconfig \
  -o jsonpath='{.data.ca\.crt}'

# ๋ฐ‘์ค„(`_`) ๋Œ€์‹  ๋Œ€์‹œ(`-`)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ base64 ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์„ ์กฐํšŒ
kubectl get secret my-secret --template='{{index .data "key-name-with-dashes"}}'

# ๋ชจ๋“  ์›Œ์ปค ๋…ธ๋“œ ์กฐํšŒ (์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 'node-role.kubernetes.io/control-plane'
# ์œผ๋กœ ๋ช…๋ช…๋œ ๋ผ๋ฒจ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ œ์™ธ)
kubectl get node --selector='!node-role.kubernetes.io/control-plane'

# ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ๋ฅผ ์กฐํšŒ
kubectl get pods --field-selector=status.phase=Running

# ๋ชจ๋“  ๋…ธ๋“œ์˜ ์™ธ๋ถ€IP๋ฅผ ์กฐํšŒ
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# ํŠน์ • RC์— ์†ํ•ด์žˆ๋Š” ํŒŒ๋“œ ์ด๋ฆ„์˜ ๋ชฉ๋ก ์กฐํšŒ
# "jq" ์ปค๋งจ๋“œ๋Š” jsonpath๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ๋ณ€ํ™˜์— ์œ ์šฉํ•˜๋‹ค. https://stedolan.github.io/jq/ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})

# ๋ชจ๋“  ํŒŒ๋“œ(๋˜๋Š” ๋ ˆ์ด๋ธ”์„ ์ง€์›ํ•˜๋Š” ๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ)์˜ ๋ ˆ์ด๋ธ” ์กฐํšŒ
kubectl get pods --show-labels

# ์–ด๋–ค ๋…ธ๋“œ๊ฐ€ ์ค€๋น„๋๋Š”์ง€ ํ™•์ธ
JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
 && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"

# ์™ธ๋ถ€ ๋„๊ตฌ ์—†์ด ๋””์ฝ”๋”ฉ๋œ ์‹œํฌ๋ฆฟ ์ถœ๋ ฅ
kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}'

# ํŒŒ๋“œ์— ์˜ํ•ด ํ˜„์žฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์‹œํฌ๋ฆฟ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq

# ๋ชจ๋“  ํŒŒ๋“œ์˜ ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ(initContainer)์˜ ์ปจํ…Œ์ด๋„ˆID ๋ชฉ๋ก ์กฐํšŒ
# ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ(initContainer)๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ์ •์ง€๋œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3

# ํƒ€์ž„์Šคํƒฌํ”„๋กœ ์ •๋ ฌ๋œ ์ด๋ฒคํŠธ ๋ชฉ๋ก ์กฐํšŒ
kubectl get events --sort-by=.metadata.creationTimestamp

# ๋ชจ๋“  Warning ํƒ€์ž… ์ด๋ฒคํŠธ ์กฐํšŒ
kubectl events --types=Warning

# ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์ ์šฉ๋œ ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•œ๋‹ค.
kubectl diff -f ./my-manifest.yaml

# ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜๋œ ๋ชจ๋“  ํ‚ค์˜ ๋งˆ์นจํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
# ๋ณต์žกํ•œ ์ค‘์ฒฉ JSON ๊ตฌ์กฐ ๋‚ด์—์„œ ํ‚ค๋ฅผ ์ฐพ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.
kubectl get nodes -o json | jq -c 'paths|join(".")'

# ํŒŒ๋“œ ๋“ฑ์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜๋œ ๋ชจ๋“  ํ‚ค์˜ ๋งˆ์นจํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
kubectl get pods -o json | jq -c 'paths|join(".")'

# ๋ชจ๋“  ํŒŒ๋“œ์— ๋Œ€ํ•ด ENV๋ฅผ ์ƒ์„ฑํ•œ๋‹ค(๊ฐ ํŒŒ๋“œ์— ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๊ณ , ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ๊ณ , `env` ๋ช…๋ น์–ด๊ฐ€ ๋™์ž‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •).
# `env` ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ง€์›๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ชจ๋“  ํŒŒ๋“œ์— ์‹คํ–‰ํ•  ๋•Œ์—๋„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.
for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod -- env; done

# ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ status ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒํ•œ๋‹ค.
kubectl get deployment nginx-deployment --subresource=status

๋ฆฌ์†Œ์Šค ์—…๋ฐ์ดํŠธ

kubectl set image deployment/frontend www=image:v2               # "frontend" ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ "www" ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋กค๋ง ์—…๋ฐ์ดํŠธ
kubectl rollout history deployment/frontend                      # ํ˜„ ๋ฆฌ๋น„์ „์„ ํฌํ•จํ•œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ์ด๋ ฅ์„ ์ฒดํฌ
kubectl rollout undo deployment/frontend                         # ์ด์ „ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋กœ ๋กค๋ฐฑ
kubectl rollout undo deployment/frontend --to-revision=2         # ํŠน์ • ๋ฆฌ๋น„์ „์œผ๋กœ ๋กค๋ฐฑ
kubectl rollout status -w deployment/frontend                    # ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ "frontend" ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ƒํƒœ๋ฅผ ๊ฐ์‹œ
kubectl rollout restart deployment/frontend                      # "frontend" ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋กค๋ง ์žฌ์‹œ์ž‘


cat pod.json | kubectl replace -f -                              # stdin์œผ๋กœ ์ „๋‹ฌ๋œ JSON์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ๋“œ ๊ต์ฒด

# ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ•์ œ ๊ต์ฒด, ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑํ•จ. ์ด๊ฒƒ์€ ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จ์‹œํ‚ด.
kubectl replace --force -f ./pod.json

# ๋ณต์ œ๋œ nginx๋ฅผ ์œ„ํ•œ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 80 ํฌํŠธ๋กœ ์„œ๋น„์Šคํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ๋Š” 8000 ํฌํŠธ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
kubectl expose rc nginx --port=80 --target-port=8000

# ๋‹จ์ผ-์ปจํ…Œ์ด๋„ˆ ํŒŒ๋“œ์˜ ์ด๋ฏธ์ง€ ๋ฒ„์ „(ํƒœ๊ทธ)์„ v4๋กœ ์—…๋ฐ์ดํŠธ
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

kubectl label pods my-pod new-label=awesome                      # ๋ ˆ์ด๋ธ” ์ถ”๊ฐ€
kubectl label pods my-pod new-label-                             # ๋ ˆ์ด๋ธ” ์ œ๊ฑฐ
kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq       # ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€
kubectl autoscale deployment foo --min=2 --max=10                # ๋””ํ”Œ๋กœ์ด๋จผํŠธ "foo" ์˜คํ† ์Šค์ผ€์ผ

๋ฆฌ์†Œ์Šค ํŒจ์น˜

# ๋…ธ๋“œ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

# ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋ฐ์ดํŠธ. ๋ณ‘ํ•ฉ(merge) ํ‚ค์ด๋ฏ€๋กœ, spec.containers[*].name์ด ํ•„์š”
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

# ์œ„์น˜ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ json ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋ฐ์ดํŠธ
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'

# ์œ„์น˜ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ json ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ livenessProbe ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋น„ํ™œ์„ฑํ™”
kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'

# ์œ„์น˜ ๋ฐฐ์—ด์— ์ƒˆ ์š”์†Œ ์ถ”๊ฐ€
kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'

# ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ scale ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋ฅผ ํŒจ์น˜ํ•˜์—ฌ ๋ ˆํ”Œ๋ฆฌ์นด ์ˆ˜ ์—…๋ฐ์ดํŠธ
kubectl patch deployment nginx-deployment --subresource='scale' --type='merge' -p '{"spec":{"replicas":2}}'

๋ฆฌ์†Œ์Šค ํŽธ์ง‘

์„ ํ˜ธํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋กœ ๋ชจ๋“  API ๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl edit svc/docker-registry                      # docker-registry๋ผ๋Š” ์„œ๋น„์Šค ํŽธ์ง‘
KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ ์‚ฌ์šฉ

๋ฆฌ์†Œ์Šค ์Šค์ผ€์ผ๋ง

kubectl scale --replicas=3 rs/foo                                 # 'foo'๋ผ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ 3์œผ๋กœ ์Šค์ผ€์ผ
kubectl scale --replicas=3 -f foo.yaml                            # "foo.yaml"์— ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค์˜ ํฌ๊ธฐ๋ฅผ 3์œผ๋กœ ์Šค์ผ€์ผ
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # mysql์ด๋ผ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ํ˜„์žฌ ํฌ๊ธฐ๊ฐ€ 2์ธ ๊ฒฝ์šฐ, mysql์„ 3์œผ๋กœ ์Šค์ผ€์ผ
kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ ์Šค์ผ€์ผ

๋ฆฌ์†Œ์Šค ์‚ญ์ œ

kubectl delete -f ./pod.json                                      # pod.json์— ์ง€์ •๋œ ์œ ํ˜• ๋ฐ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod unwanted --now                                 # ์œ ์˜ˆ ์‹œ๊ฐ„ ์—†์ด ์ฆ‰์‹œ ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod,service baz foo                                # "baz", "foo"์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํŒŒ๋“œ์™€ ์„œ๋น„์Šค ์‚ญ์ œ
kubectl delete pods,services -l name=myLabel                      # name=myLabel ๋ผ๋ฒจ์„ ๊ฐ€์ง„ ํŒŒ๋“œ์™€ ์„œ๋น„์Šค ์‚ญ์ œ
kubectl -n my-ns delete pod,svc --all                             # my-ns ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ํŒŒ๋“œ์™€ ์„œ๋น„์Šค ์‚ญ์ œ
# awk pattern1 ๋˜๋Š” pattern2์— ๋งค์นญ๋˜๋Š” ๋ชจ๋“  ํŒŒ๋“œ ์‚ญ์ œ
kubectl get pods  -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs  kubectl delete -n mynamespace pod

์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉ

kubectl logs my-pod                                 # ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout)
kubectl logs -l name=myLabel                        # name์ด myLabel์ธ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout)
kubectl logs my-pod --previous                      # ์ปจํ…Œ์ด๋„ˆ์˜ ์ด์ „ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์— ๋Œ€ํ•œ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout)
kubectl logs my-pod -c my-container                 # ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout, ๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl logs -l name=myLabel -c my-container        # name์ด myLabel์ธ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout)
kubectl logs my-pod -c my-container --previous      # ์ปจํ…Œ์ด๋„ˆ์˜ ์ด์ „ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์— ๋Œ€ํ•œ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout, ๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl logs -f my-pod                              # ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆผ ํŒŒ๋“œ ๋กœ๊ทธ(stdout)
kubectl logs -f my-pod -c my-container              # ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆผ ํŒŒ๋“œ ๋กœ๊ทธ(stdout, ๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl logs -f -l name=myLabel --all-containers    # name์ด myLabel์ธ ๋ชจ๋“  ํŒŒ๋“œ์˜ ๋กœ๊ทธ ์ŠคํŠธ๋ฆฌ๋ฐ (stdout)
kubectl run -i --tty busybox --image=busybox:1.28 -- sh  # ๋Œ€ํ™”ํ˜• ์…ธ๋กœ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰
kubectl run nginx --image=nginx -n mynamespace      # mynamespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ nginx ํŒŒ๋“œ 1๊ฐœ ์‹คํ–‰
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml
                                                    # nginx ํŒŒ๋“œ์— ๋Œ€ํ•œ spec์„ ์ƒ์„ฑํ•˜๊ณ , pod.yaml์ด๋ผ๋Š” ํŒŒ์ผ์— ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ธฐ๋กํ•œ๋‹ค.
kubectl attach my-pod -i                            # ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐ
kubectl port-forward my-pod 5000:6000               # ๋กœ์ปฌ ๋จธ์‹ ์˜ 5000๋ฒˆ ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ , my-pod์˜ 6000๋ฒˆ ํฌํŠธ๋กœ ์ „๋‹ฌ
kubectl exec my-pod -- ls /                         # ๊ธฐ์กด ํŒŒ๋“œ์—์„œ ๋ช…๋ น ์‹คํ–‰(ํ•œ ๊ฐœ ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl exec --stdin --tty my-pod -- /bin/sh        # ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ๋กœ ๋Œ€ํ™”ํ˜• ์…ธ ์•ก์„ธ์Šค(1 ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl exec my-pod -c my-container -- ls /         # ๊ธฐ์กด ํŒŒ๋“œ์—์„œ ๋ช…๋ น ์‹คํ–‰(๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl top pod POD_NAME --containers               # ํŠน์ • ํŒŒ๋“œ์™€ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋ฉ”ํŠธ๋ฆญ ํ‘œ์‹œ
kubectl top pod POD_NAME --sort-by=cpu              # ์ง€์ •ํ•œ ํŒŒ๋“œ์— ๋Œ€ํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ํ‘œ์‹œํ•˜๊ณ  'cpu' ๋˜๋Š” 'memory'๋ณ„๋กœ ์ •๋ ฌ

์ปจํ…Œ์ด๋„ˆ๋กœ/์ปจํ…Œ์ด๋„ˆ์—์„œ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณต์‚ฌ

kubectl cp /tmp/foo_dir my-pod:/tmp/bar_dir            # ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ /tmp/foo_dir ๋ฅผ ํ˜„์žฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ /tmp/bar_dir ๋กœ ๋ณต์‚ฌ
kubectl cp /tmp/foo my-pod:/tmp/bar -c my-container    # ๋กœ์ปฌ ํŒŒ์ผ /tmp/foo ๋ฅผ my-pod ํŒŒ๋“œ์˜ my-container ์ปจํ…Œ์ด๋„ˆ ์•ˆ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ
kubectl cp /tmp/foo my-namespace/my-pod:/tmp/bar       # ๋กœ์ปฌ ํŒŒ์ผ /tmp/foo ๋ฅผ my-namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ
kubectl cp my-namespace/my-pod:/tmp/foo /tmp/bar       # my-namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ ํŒŒ์ผ /tmp/foo ๋ฅผ ๋กœ์ปฌ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ
tar cf - /tmp/foo | kubectl exec -i -n my-namespace my-pod -- tar xf - -C /tmp/bar           # ๋กœ์ปฌ ํŒŒ์ผ /tmp/foo ๋ฅผ my-namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ
kubectl exec -n my-namespace my-pod -- tar cf - /tmp/foo | tar xf - -C /tmp/bar    # my-namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ ํŒŒ์ผ /tmp/foo ๋ฅผ ๋กœ์ปฌ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ

๋””ํ”Œ๋กœ์ด๋จผํŠธ, ์„œ๋น„์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉ

kubectl logs deploy/my-deployment                         # ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๋Œ€ํ•œ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (๋‹จ์ผ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl logs deploy/my-deployment -c my-container         # ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๋Œ€ํ•œ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)

kubectl port-forward svc/my-service 5000                  # ๋กœ์ปฌ ๋จธ์‹ ์˜ 5000๋ฒˆ ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ , my-service์˜ ๋™์ผํ•œ(5000๋ฒˆ) ํฌํŠธ๋กœ ์ „๋‹ฌ
kubectl port-forward svc/my-service 5000:my-service-port  # ๋กœ์ปฌ ๋จธ์‹ ์˜ 5000๋ฒˆ ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ , my-service์˜ <my-service-port> ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํฌํŠธ๋กœ ์ „๋‹ฌ

kubectl port-forward deploy/my-deployment 5000:6000       # ๋กœ์ปฌ ๋จธ์‹ ์˜ 5000๋ฒˆ ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ , <my-deployment> ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํŒŒ๋“œ์˜ 6000๋ฒˆ ํฌํŠธ๋กœ ์ „๋‹ฌ
kubectl exec deploy/my-deployment -- ls                   # <my-deployment> ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ฒซ๋ฒˆ์งธ ํŒŒ๋“œ์˜ ์ฒซ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ์— ๋ช…๋ น์–ด ์‹คํ–‰ (๋‹จ์ผ- ๋˜๋Š” ๋‹ค์ค‘-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)

๋…ธ๋“œ, ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ƒํ˜ธ ์ž‘์šฉ

kubectl cordon my-node                                                # my-node๋ฅผ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์—†๋„๋ก ํ‘œ๊ธฐ
kubectl drain my-node                                                 # ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด์„œ my-node๋ฅผ ์ค€๋น„ ์ƒํƒœ๋กœ ๋น„์›€
kubectl uncordon my-node                                              # my-node๋ฅผ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‘œ๊ธฐ
kubectl top node my-node                                              # ์ฃผ์–ด์ง„ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ฉ”ํŠธ๋ฆญ ํ‘œ์‹œ
kubectl cluster-info                                                  # ๋งˆ์Šคํ„ฐ ๋ฐ ์„œ๋น„์Šค์˜ ์ฃผ์†Œ ํ‘œ์‹œ
kubectl cluster-info dump                                             # ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ stdout์œผ๋กœ ๋คํ”„
kubectl cluster-info dump --output-directory=/path/to/cluster-state   # ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ /path/to/cluster-state์œผ๋กœ ๋คํ”„

# ํ˜„์žฌ ๋…ธ๋“œ์— ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ํ…Œ์ธํŠธ(taint)๋“ค์„ ํ™•์ธ
kubectl get nodes -o='custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect'

# ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” key์™€ effect๋ฅผ ๊ฐ–๋Š” ํ…Œ์ธํŠธ์˜ ๊ฒฝ์šฐ, ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
kubectl taint nodes foo dedicated=special-user:NoSchedule

๋ฆฌ์†Œ์Šค ํƒ€์ž…

๋‹จ์ถ•๋ช…, API ๊ทธ๋ฃน๊ณผ ํ•จ๊ป˜ ์ง€์›๋˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์œ ํ˜•๋“ค, ๊ทธ๊ฒƒ๋“ค์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ์ข…๋ฅ˜(Kind)๋ฅผ ๋‚˜์—ด:

kubectl api-resources

API ๋ฆฌ์†Œ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ์ž‘์—…:

kubectl api-resources --namespaced=true      # ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค
kubectl api-resources --namespaced=false     # ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค
kubectl api-resources -o name                # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์˜ ๋‹จ์ˆœํ•œ (๋ฆฌ์†Œ์Šค ์ด๋ฆ„๋งŒ) ์ถœ๋ ฅ
kubectl api-resources -o wide                # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์˜ ํ™•์žฅ๋œ ("wide"๋กœ ์•Œ๋ ค์ง„) ์ถœ๋ ฅ
kubectl api-resources --verbs=list,get       # "list"์™€ "get"์˜ ์š”์ฒญ ๋™์‚ฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ถœ๋ ฅ
kubectl api-resources --api-group=extensions # "extensions" API ๊ทธ๋ฃน์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค

์ถœ๋ ฅ ํ˜•์‹ ์ง€์ •

ํŠน์ • ํ˜•์‹์œผ๋กœ ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ถœ๋ ฅํ•˜๋ ค๋ฉด, ์ง€์›๋˜๋Š” kubectl ๋ช…๋ น์— -o (๋˜๋Š” --output) ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹์„ธ๋ถ€ ์‚ฌํ•ญ
-o=custom-columns=<๋ช…์„ธ>์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์—ด ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ์ถœ๋ ฅ
-o=custom-columns-file=<ํŒŒ์ผ๋ช…><ํŒŒ์ผ๋ช…>ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์—ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ์ถœ๋ ฅ
-o=jsonJSON ํ˜•์‹์˜ API ์˜ค๋ธŒ์ ํŠธ ์ถœ๋ ฅ
-o=jsonpath=<ํ…œํ”Œ๋ฆฟ>jsonpath ํ‘œํ˜„์‹์— ์ •์˜๋œ ํ•„๋“œ ์ถœ๋ ฅ
-o=jsonpath-file=<ํŒŒ์ผ๋ช…><ํŒŒ์ผ๋ช…> ํŒŒ์ผ์—์„œ jsonpath ํ‘œํ˜„์‹์— ์ •์˜๋œ ํ•„๋“œ ์ถœ๋ ฅ
-o=name๋ฆฌ์†Œ์Šค ๋ช…๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ๊ทธ ์™ธ์—๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š์Œ
-o=wide์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ผ๋ฐ˜-ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ , ํŒŒ๋“œ์˜ ๊ฒฝ์šฐ ๋…ธ๋“œ ๋ช…์ด ํฌํ•จ
-o=yamlYAML ํ˜•์‹์˜ API ์˜ค๋ธŒ์ ํŠธ ์ถœ๋ ฅ

-o=custom-columns ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ:

# ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ์ด๋ฏธ์ง€
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'

# `default` ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ํŒŒ๋“œ๋ณ„๋กœ ๊ทธ๋ฃน์ง€์–ด ์ถœ๋ ฅ
kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"

 # "registry.k8s.io/coredns:1.6.2" ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์ด๋ฏธ์ง€
kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="registry.k8s.io/coredns:1.6.2")].image'

# ์ด๋ฆ„์— ๊ด€๊ณ„์—†์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์•„๋ž˜์˜ ๋ชจ๋“  ํ•„๋“œ
kubectl get pods -A -o=custom-columns='DATA:metadata.*'

๋” ๋งŽ์€ ์˜ˆ์ œ๋Š” kubectl ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

Kubectl ์ถœ๋ ฅ ๋กœ๊ทธ ์ƒ์„ธ ๋ ˆ๋ฒจ(verbosity)๊ณผ ๋””๋ฒ„๊น…

Kubectl ๋กœ๊ทธ ์ƒ์„ธ ๋ ˆ๋ฒจ(verbosity)์€ -v ๋˜๋Š”--v ํ”Œ๋ž˜๊ทธ์™€ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋กœ ์ œ์–ด๋œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋กœ๊น… ๊ทœ์น™๊ณผ ๊ด€๋ จ ๋กœ๊ทธ ๋ ˆ๋ฒจ์ด ์—ฌ๊ธฐ์— ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

๋กœ๊ทธ ๋ ˆ๋ฒจ์„ธ๋ถ€ ์‚ฌํ•ญ
--v=0์ผ๋ฐ˜์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜์ž(operator)์—๊ฒŒ ํ•ญ์ƒ ๋ณด์—ฌ์ง€๊ฒŒ ํ•˜๊ธฐ์—๋Š” ์œ ์šฉํ•จ.
--v=1์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ ์ ˆํ•œ ๊ธฐ๋ณธ ๋กœ๊ทธ ์ˆ˜์ค€.
--v=2์„œ๋น„์Šค์™€ ์‹œ์Šคํ…œ์˜ ์ค‘์š”ํ•œ ๋ณ€ํ™”์™€ ๊ด€๋ จ์ด์žˆ๋Š” ์ค‘์š”ํ•œ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ์ •์ƒ ์ƒํƒœ ์ •๋ณด. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ ๊ถŒ์žฅ๋˜๋Š” ๊ธฐ๋ณธ ๋กœ๊ทธ ์ˆ˜์ค€์ด๋‹ค.
--v=3๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ™•์žฅ ์ •๋ณด.
--v=4๋””๋ฒ„๊ทธ ์ˆ˜์ค€ ์ƒ์„ธํ™”.
--v=5ํŠธ๋ ˆ์ด์Šค ์ˆ˜์ค€ ์ƒ์„ธํ™”.
--v=6์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ‘œ์‹œ.
--v=7HTTP ์š”์ฒญ ํ—ค๋”๋ฅผ ํ‘œ์‹œ.
--v=8HTTP ์š”์ฒญ ๋‚ด์šฉ์„ ํ‘œ์‹œ.
--v=9๋‚ด์šฉ์„ ์ž˜๋ผ ๋‚ด์ง€ ์•Š๊ณ  HTTP ์š”์ฒญ ๋‚ด์šฉ์„ ํ‘œ์‹œ.

๋‹ค์Œ ๋‚ด์šฉ

10.2 - kubectl

์‹œ๋†‰์‹œ์Šค

kubectl์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋ฅผ ์ œ์–ดํ•œ๋‹ค.

์ž์„ธํ•œ ์ •๋ณด๋Š” kubectl ๊ฐœ์š”๋ฅผ ํ™•์ธํ•œ๋‹ค.

kubectl [flags]

์˜ต์…˜

--add-dir-header
true์ธ ๊ฒฝ์šฐ, ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ ํ—ค๋”์— ํŒŒ์ผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
--alsologtostderr
ํ‘œ์ค€ ์—๋Ÿฌ์™€ ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
--as string
์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์‚ฌ์šฉ์ž ์ด๋ฆ„
--as-group stringArray
์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ทธ๋ฃน. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
--azure-container-registry-config string
Azure ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ตฌ์„ฑ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ด๋‹ค.
--cache-dir string     ๊ธฐ๋ณธ๊ฐ’: "$HOME/.kube/cache"
๊ธฐ๋ณธ ์บ์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ
--certificate-authority string
์ธ์ฆ ๊ธฐ๊ด€์˜ ์ธ์ฆ์„œ์— ๋Œ€ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ
--client-certificate string
TLS์šฉ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ
--client-key string
TLS์šฉ ํด๋ผ์ด์–ธํŠธ ํ‚ค์˜ ํŒŒ์ผ ๊ฒฝ๋กœ
--cloud-provider-gce-l7lb-src-cidrs cidrs     ๊ธฐ๋ณธ๊ฐ’: 130.211.0.0/22,35.191.0.0/16
L7 LB ํŠธ๋ž˜ํ”ฝ ํ”„๋ก์‹œ ๋ฐ ์ƒํƒœ ํ™•์ธ์„ ์œ„ํ•ด GCE ๋ฐฉํ™”๋ฒฝ์—์„œ ์˜คํ”ˆ๋œ CIDR
--cloud-provider-gce-lb-src-cidrs cidrs     ๊ธฐ๋ณธ๊ฐ’: 130.211.0.0/22,209.85.152.0/22,209.85.204.0/22,35.191.0.0/16
L4 LB ํŠธ๋ž˜ํ”ฝ ํ”„๋ก์‹œ ๋ฐ ์ƒํƒœ ํ™•์ธ์„ ์œ„ํ•ด GCE ๋ฐฉํ™”๋ฒฝ์—์„œ ์˜คํ”ˆ๋œ CIDR
--cluster string
์‚ฌ์šฉํ•  kubeconfig ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„
--context string
์‚ฌ์šฉํ•  kubeconfig ์ฝ˜ํ…์ŠคํŠธ์˜ ์ด๋ฆ„
--default-not-ready-toleration-seconds int     ๊ธฐ๋ณธ๊ฐ’: 300
์•„์ง ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์ด ์—†๋Š” ๋ชจ๋“  ํŒŒ๋“œ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” notReady:NoExecute์— ๋Œ€ํ•œ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์˜ tolerationSeconds๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
--default-unreachable-toleration-seconds int     ๊ธฐ๋ณธ๊ฐ’: 300
์•„์ง ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์ด ์—†์–ด์„œ ๊ธฐ๋ณธ์ธ unreachable:NoExecute๊ฐ€ ์ถ”๊ฐ€๋œ ๋ชจ๋“  ํŒŒ๋“œ์— ๋Œ€ํ•œ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์˜ tolerationSeconds๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
-h, --help
kubectl์— ๋Œ€ํ•œ ๋„์›€๋ง
--insecure-skip-tls-verify
true์ธ ๊ฒฝ์šฐ, ์„œ๋ฒ„ ์ธ์ฆ์„œ์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ HTTPS ์—ฐ๊ฒฐ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
--kubeconfig string
CLI ์š”์ฒญ์— ์‚ฌ์šฉํ•  kubeconfig ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ด๋‹ค.
--log-backtrace-at traceLocation     ๊ธฐ๋ณธ๊ฐ’: :0
๋กœ๊น…์ด file:N์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค.
--log-dir string
๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋กœ๊ทธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.
--log-file string
๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, ์ด ๋กœ๊ทธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค.
--log-file-max-size uint     ๊ธฐ๋ณธ๊ฐ’: 1800
๋กœ๊ทธ ํŒŒ์ผ์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•œ๋‹ค. ๋‹จ์œ„๋Š” ๋ฉ”๊ฐ€ ๋ฐ”์ดํŠธ์ด๋‹ค. ๊ฐ’์ด 0์ด๋ฉด, ํŒŒ์ผ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” ๋ฌด์ œํ•œ์ด๋‹ค.
--log-flush-frequency duration     ๊ธฐ๋ณธ๊ฐ’: 5s
๋กœ๊ทธ๋ฅผ ๋น„์šฐ๋Š” ๊ฐ„๊ฒฉ์˜ ์ตœ๋Œ€ ์‹œ๊ฐ„(์ดˆ)
--logtostderr     ๊ธฐ๋ณธ๊ฐ’: true
ํŒŒ์ผ ๋Œ€์‹  ํ‘œ์ค€ ์—๋Ÿฌ์— ๊ธฐ๋ก
--match-server-version
ํด๋ผ์ด์–ธํŠธ ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•˜๋Š” ์„œ๋ฒ„ ๋ฒ„์ „ ํ•„์š”
-n, --namespace string
์ง€์ •๋œ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ CLI ์š”์ฒญ์˜ ๋ฒ”์œ„๊ฐ€ ๋จ
--one-output
true์ด๋ฉด, ๋กœ๊ทธ๋ฅผ ๊ธฐ๋ณธ ์‹ฌ๊ฐ๋„ ์ˆ˜์ค€์œผ๋กœ๋งŒ ๊ธฐ๋กํ•œ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฐ๊ฐ์˜ ๋” ๋‚ฎ์€ ์‹ฌ๊ฐ๋„ ์ˆ˜์ค€์—๋„ ๊ธฐ๋กํ•จ).
--password string
API ์„œ๋ฒ„์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ธ์ฆ์„ ์œ„ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ
--profile string     ๊ธฐ๋ณธ๊ฐ’: "none"
์บก์ฒ˜ํ•  ํ”„๋กœํŒŒ์ผ์˜ ์ด๋ฆ„. (none|cpu|heap|goroutine|threadcreate|block|mutex) ์ค‘ ํ•˜๋‚˜
--profile-output string     ๊ธฐ๋ณธ๊ฐ’: "profile.pprof"
ํ”„๋กœํŒŒ์ผ์„ ์“ธ ํŒŒ์ผ์˜ ์ด๋ฆ„
--request-timeout string     ๊ธฐ๋ณธ๊ฐ’: "0"
๋‹จ์ผ ์„œ๋ฒ„ ์š”์ฒญ์„ ํฌ๊ธฐํ•˜๊ธฐ ์ „์— ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์ด๋‹ค. 0์ด ์•„๋‹Œ ๊ฐ’์—๋Š” ํ•ด๋‹น ์‹œ๊ฐ„ ๋‹จ์œ„(์˜ˆ: 1s, 2m, 3h)๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ฐ’์ด 0์ด๋ฉด ์š”์ฒญ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์ง€ ์•Š๋Š”๋‹ค.
-s, --server string
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์˜ ์ฃผ์†Œ์™€ ํฌํŠธ
--skip-headers
true์ด๋ฉด, ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์—์„œ ํ—ค๋” ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
--skip-log-headers
true์ด๋ฉด, ๋กœ๊ทธ ํŒŒ์ผ์„ ์—ด ๋•Œ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
--stderrthreshold severity     ๊ธฐ๋ณธ๊ฐ’: 2
์ด ์ž„๊ณ„๊ฐ’ ์ด์ƒ์˜ ๋กœ๊ทธ๋Š” ํ‘œ์ค€ ์—๋Ÿฌ๋กœ ์ด๋™ํ•œ๋‹ค.
--tls-server-name string
์„œ๋ฒ„ ์ธ์ฆ์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์‚ฌ์šฉํ•  ์„œ๋ฒ„ ์ด๋ฆ„. ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด, ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด ์‚ฌ์šฉ๋œ๋‹ค.
--token string
API ์„œ๋ฒ„ ์ธ์ฆ์„ ์œ„ํ•œ ๋ฒ ์–ด๋Ÿฌ(Bearer) ํ† ํฐ
--user string
์‚ฌ์šฉํ•  kubeconfig ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„
--username string
API ์„œ๋ฒ„์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ธ์ฆ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„
-v, --v Level
๋กœ๊ทธ ์ˆ˜์ค€์˜ ์ž์„ธํ•œ ์ •๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž
--version version[=true]
๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ
--vmodule moduleSpec
ํŒŒ์ผ ํ•„ํ„ฐ๋ง ๋กœ๊น…์„ ์œ„ํ•œ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ pattern=N ์„ค์ • ๋ชฉ๋ก
--warnings-as-errors
์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๊ฒฝ๊ณ ๋ฅผ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  0์ด ์•„๋‹Œ ์ข…๋ฃŒ ์ฝ”๋“œ๋กœ ์ข…๋ฃŒ

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

tr>

KUBECONFIG
kubectl ๊ตฌ์„ฑ ("kubeconfig") ํŒŒ์ผ ๊ฒฝ๋กœ. ๊ธฐ๋ณธ: "$HOME/.kube/config"
KUBECTL_COMMAND_HEADERS
false๋กœ ์„ค์ •ํ•˜๋ฉด, ํ˜ธ์ถœ๋œ kubectl ๋ช…๋ น(์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „ v1.22 ์ด์ƒ)์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ํ•ด์ œ
KUBECTL_EXPLAIN_OPENAPIV3
`kubectl explain` ํ˜ธ์ถœ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒˆ๋กœ์šด OpenAPIv3 ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ „ํ™˜. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.24 ์ดํ›„๋กœ, OpenAPIV3 ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™” ๋˜์–ด์žˆ๋‹ค.

๋” ๋ณด๊ธฐ

  • kubectl annotate - ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์–ด๋…ธํ…Œ์ด์…˜ ์—…๋ฐ์ดํŠธ
  • kubectl api-resources - ์„œ๋ฒ„์—์„œ ์ง€์›๋˜๋Š” API ๋ฆฌ์†Œ์Šค ์ถœ๋ ฅ
  • kubectl api-versions - "๊ทธ๋ฃน/๋ฒ„์ „" ํ˜•์‹์œผ๋กœ ์„œ๋ฒ„์—์„œ ์ง€์›๋˜๋Š” API ๋ฒ„์ „์„ ์ถœ๋ ฅ
  • kubectl apply - ํŒŒ์ผ๋ช… ๋˜๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ๊ตฌ์„ฑ ์ ์šฉ
  • kubectl attach - ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐ
  • kubectl auth - ๊ถŒํ•œ ๊ฒ€์‚ฌ
  • kubectl autoscale - ๋””ํ”Œ๋กœ์ด๋จผํŠธ(Deployment), ๋ ˆํ”Œ๋ฆฌ์นด์…‹(ReplicaSet) ๋˜๋Š” ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜์ปจํŠธ๋กค๋Ÿฌ(ReplicationController) ์ž๋™ ์Šค์ผ€์ผ๋ง
  • kubectl certificate - ์ธ์ฆ์„œ ๋ฆฌ์†Œ์Šค ์ˆ˜์ •
  • kubectl cluster-info - ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด ํ‘œ์‹œ
  • kubectl completion - ์ง€์ •๋œ ์…ธ(bash ๋˜๋Š” zsh)์— ๋Œ€ํ•œ ์…ธ ์™„์„ฑ ์ฝ”๋“œ ์ถœ๋ ฅ
  • kubectl config - kubeconfig ํŒŒ์ผ ์ˆ˜์ •
  • kubectl cordon - ๋…ธ๋“œ๋ฅผ unschedulable๋กœ ํ‘œ์‹œ
  • kubectl cp - ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณต์‚ฌ
  • kubectl create - ํŒŒ์ผ ๋˜๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ
  • kubectl debug - ์›Œํฌ๋กœ๋“œ์™€ ๋…ธ๋“œ์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋””๋ฒ„๊น… ์„ธ์…˜ ์ƒ์„ฑ
  • kubectl delete - ํŒŒ์ผ๋ช…, ํ‘œ์ค€ ์ž…๋ ฅ, ๋ฆฌ์†Œ์Šค ๋ฐ ์ด๋ฆ„, ๋˜๋Š” ๋ฆฌ์†Œ์Šค ๋ฐ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋กœ ๋ฆฌ์†Œ์Šค ์‚ญ์ œ
  • kubectl describe - ํŠน์ • ๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃน์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ‘œ์‹œ
  • kubectl diff - ์ ์šฉ ์˜ˆ์ • ๋ฒ„์ „๊ณผ ๋ผ์ด๋ธŒ ๋ฒ„์ „ ๋น„๊ต
  • kubectl drain - ์œ ์ง€ ๋ณด์ˆ˜ ์ค€๋น„ ์ค‘ ๋…ธ๋“œ ๋“œ๋ ˆ์ธ
  • kubectl edit - ์„œ๋ฒ„์—์„œ ๋ฆฌ์†Œ์Šค ํŽธ์ง‘
  • kubectl events - ์ด๋ฒคํŠธ ๋ชฉ๋ก ๋‚˜์—ด
  • kubectl exec - ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ปค๋งจ๋“œ ์‹คํ–‰
  • kubectl explain - ๋ฆฌ์†Œ์Šค์˜ ๋ฌธ์„œ
  • kubectl expose - ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋˜๋Š” ํŒŒ๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ƒˆ๋กœ์šด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค๋กœ ๋…ธ์ถœ
  • kubectl get - ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค ํ‘œ์‹œ
  • kubectl kustomize - ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” ์›๊ฒฉ URL์—์„œ kustomization ๋Œ€์ƒ์„ ๋นŒ๋“œ
  • kubectl label - ๋ฆฌ์†Œ์Šค์˜ ๋ ˆ์ด๋ธ” ์—…๋ฐ์ดํŠธ
  • kubectl logs - ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋กœ๊ทธ ์ถœ๋ ฅ
  • kubectl options - ๋ชจ๋“  ์ปค๋งจ๋“œ์—์„œ ์ƒ์†๋œ ํ”Œ๋ž˜๊ทธ ๋ชฉ๋ก์„ ์ถœ๋ ฅ
  • kubectl patch - ๋ฆฌ์†Œ์Šค ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ
  • kubectl plugin - ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณต
  • kubectl port-forward - ํ•˜๋‚˜ ์ด์ƒ์˜ ๋กœ์ปฌ ํฌํŠธ๋ฅผ ํŒŒ๋“œ๋กœ ์ „๋‹ฌ
  • kubectl proxy - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์— ๋Œ€ํ•œ ํ”„๋ก์‹œ ์‹คํ–‰
  • kubectl replace - ํŒŒ์ผ๋ช… ๋˜๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ ๋ฆฌ์†Œ์Šค ๊ต์ฒด
  • kubectl rollout - ๋ฆฌ์†Œ์Šค ๋กค์•„์›ƒ ๊ด€๋ฆฌ
  • kubectl run - ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํŠน์ • ์ด๋ฏธ์ง€ ์‹คํ–‰
  • kubectl scale - ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ๋˜๋Š” ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ƒˆ ํฌ๊ธฐ ์„ค์ •
  • kubectl set - ์˜ค๋ธŒ์ ํŠธ์— ํŠน์ • ๊ธฐ๋Šฅ ์„ค์ •
  • kubectl taint - ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ์—์„œ ํ…Œ์ธํŠธ(taint) ์—…๋ฐ์ดํŠธ
  • kubectl top - ๋ฆฌ์†Œ์Šค(CPU/๋ฉ”๋ชจ๋ฆฌ/์Šคํ† ๋ฆฌ์ง€) ์‚ฌ์šฉ๋Ÿ‰์„ ํ‘œ์‹œ
  • kubectl uncordon - ๋…ธ๋“œ๋ฅผ schedulable๋กœ ํ‘œ์‹œ
  • kubectl version - ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด ์ถœ๋ ฅ
  • kubectl wait - ์‹คํ—˜์ (experimental) ๊ธฐ๋Šฅ: ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด์„œ ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ(wait)

10.3 - JSONPath ์ง€์›

Kubectl์€ JSONPath ํ…œํ”Œ๋ฆฟ์„ ์ง€์›ํ•œ๋‹ค.

JSONPath ํ…œํ”Œ๋ฆฟ์€ ์ค‘๊ด„ํ˜ธ {}๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ JSONPath ํ‘œํ˜„์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. Kubectl์€ JSONPath ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ JSON ์˜ค๋ธŒ์ ํŠธ์˜ ํŠน์ • ํ•„๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์ถœ๋ ฅ ํ˜•์‹์„ ์ง€์ •ํ•œ๋‹ค. ์›๋ณธ JSONPath ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ ์™ธ์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๊ณผ ๊ตฌ๋ฌธ์ด ์œ ํšจํ•˜๋‹ค.

  1. ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JSONPath ํ‘œํ˜„์‹ ๋‚ด๋ถ€์˜ ํ…์ŠคํŠธ๋ฅผ ์ธ์šฉํ•œ๋‹ค.
  2. ๋ชฉ๋ก์„ ๋ฐ˜๋ณตํ•˜๋ ค๋ฉด range, end ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  3. ๋ชฉ๋ก์—์„œ ๋’ค๋กœ ์ด๋™ํ•˜๋ ค๋ฉด negative slice ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. negative ์ธ๋ฑ์Šค๋Š” ๋ชฉ๋ก์„ "์ˆœํ™˜(wrap around)" ํ•˜์ง€ ์•Š์œผ๋ฉฐ, -index + listLength >= 0 ์ธ ํ•œ ์œ ํšจํ•˜๋‹ค.

JSON ์ž…๋ ฅ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

{
  "kind": "List",
  "items":[
    {
      "kind":"None",
      "metadata":{"name":"127.0.0.1"},
      "status":{
        "capacity":{"cpu":"4"},
        "addresses":[{"type": "LegacyHostIP", "address":"127.0.0.1"}]
      }
    },
    {
      "kind":"None",
      "metadata":{"name":"127.0.0.2"},
      "status":{
        "capacity":{"cpu":"8"},
        "addresses":[
          {"type": "LegacyHostIP", "address":"127.0.0.2"},
          {"type": "another", "address":"127.0.0.3"}
        ]
      }
    }
  ],
  "users":[
    {
      "name": "myself",
      "user": {}
    },
    {
      "name": "e2e",
      "user": {"username": "admin", "password": "secret"}
    }
  ]
}
FunctionDescriptionExampleResult
text์ผ๋ฐ˜ ํ…์ŠคํŠธkind is {.kind}kind is List
@ํ˜„์žฌ ์˜ค๋ธŒ์ ํŠธ{@}์ž…๋ ฅ๊ณผ ๋™์ผ
. or []์ž์‹ ์˜คํผ๋ ˆ์ดํ„ฐ{.kind}, {['kind']} or {['name\.type']}List
..์žฌ๊ท€ ํ•˜ํ–ฅ(recursive descent){..name}127.0.0.1 127.0.0.2 myself e2e
*์™€์ผ๋“œ ์นด๋“œ. ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ{.items[*].metadata.name}[127.0.0.1 127.0.0.2]
[start:end:step]์•„๋ž˜ ์ฒจ์ž ์˜คํผ๋ ˆ์ดํ„ฐ{.users[0].name}myself
[,]์กฐํ•ฉ ์˜คํผ๋ ˆ์ดํ„ฐ{.items[*]['metadata.name', 'status.capacity']}127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8]
?()ํ•„ํ„ฐ{.users[?(@.name=="e2e")].user.password}secret
range, end๋ฐ˜๋ณต ๋ชฉ๋ก{range .items[*]}[{.metadata.name}, {.status.capacity}] {end}[127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]]
''ํ•ด์„๋œ ๋ฌธ์ž์—ด ์ธ์šฉ{range .items[*]}{.metadata.name}{'\t'}{end}127.0.0.1 127.0.0.2

kubectl ๋ฐ JSONPath ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

kubectl get pods -o json
kubectl get pods -o=jsonpath='{@}'
kubectl get pods -o=jsonpath='{.items[0]}'
kubectl get pods -o=jsonpath='{.items[0].metadata.name}'
kubectl get pods -o=jsonpath="{.items[*]['metadata.name', 'status.capacity']}"
kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.startTime}{"\n"}{end}'

10.4 - ๋„์ปค ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ kubectl

๋‹น์‹ ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปค๋งจ๋“œ ๋ผ์ธ ๋„๊ตฌ์ธ kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ API ์„œ๋ฒ„์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๋„์ปค ์ปค๋งจ๋“œ ๋ผ์ธ ๋„๊ตฌ์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด kubectl์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋„์ปค์˜ ํ•˜์œ„ ๋ช…๋ น์„ ๋ณด์—ฌ์ฃผ๊ณ  kubectl๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

docker run

nginx ๋””ํ”Œ๋กœ์ด๋จผํŠธ(Deployment)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ•ด๋‹น ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๋ ค๋ฉด, kubectl create deployment์„ ์ฐธ๊ณ ํ•œ๋‹ค.

docker:

docker run -d --restart=always -e DOMAIN=cluster --name nginx-app -p 80:80 nginx
55c103fa129692154a7652490236fee9be47d70a8dd562281ae7d2f9a339a6db
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
55c103fa1296        nginx               "nginx -g 'daemon ofโ€ฆ"   9 seconds ago       Up 9 seconds        0.0.0.0:80->80/tcp   nginx-app

kubectl:

# nginx ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค
kubectl create deployment --image=nginx nginx-app
deployment.apps/nginx-app created
# nginx-app ์— env๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
kubectl set env deployment/nginx-app  DOMAIN=cluster
deployment.apps/nginx-app env updated
# ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ํฌํŠธ๋ฅผ ๋…ธ์ถœ
kubectl expose deployment nginx-app --port=80 --name=nginx-http
service "nginx-http" exposed

kubectl์„ ์‚ฌ์šฉํ•˜๋ฉด, N๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ nginx๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ N์€ ์ŠคํŽ™์— ๋ช…์‹œ๋œ ๋ ˆํ”Œ๋ฆฌ์นด ์ˆ˜์ด๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๋‹ค. ๋˜ํ•œ ํŒŒ๋“œ์˜ ๋ ˆ์ด๋ธ”๊ณผ ์…€๋Ÿญํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€๋Š” docker run -d ... ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰๋œ๋‹ค. ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด kubectl run์„ ์ด์šฉํ•˜์—ฌ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl run [-i] [--tty] --attach <name> --image=<image>

docker run ... ๊ณผ ๋‹ฌ๋ฆฌ --attach ๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ‘œ์ค€ ์ž…๋ ฅ(stdin), ํ‘œ์ค€ ์ถœ๋ ฅ(stdout) ๋ฐ ํ‘œ์ค€ ์˜ค๋ฅ˜(stderr)๊ฐ€ ๋ถ™๋Š”๋‹ค. ์—ฐ๊ฒฐ๋œ(attached) ์ŠคํŠธ๋ฆผ์„ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค(docker -a ...). ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ถ„๋ฆฌ(detach)ํ•˜๋ ค๋ฉด ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค(escape sequence) Ctrl+P๋ฅผ ์ž…๋ ฅํ•œ ๋‹ค์Œ Ctrl+Q๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

docker ps

ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ชฉ๋ก์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” kubectl get์„ ์ฐธ๊ณ ํ•œ๋‹ค.

docker:

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS                NAMES
14636241935f        ubuntu:16.04        "echo test"              5 seconds ago        Exited (0) 5 seconds ago                        cocky_fermi
55c103fa1296        nginx               "nginx -g 'daemon ofโ€ฆ"   About a minute ago   Up About a minute          0.0.0.0:80->80/tcp   nginx-app

kubectl:

kubectl get po
NAME                        READY     STATUS      RESTARTS   AGE
nginx-app-8df569cb7-4gd89   1/1       Running     0          3m
ubuntu                      0/1       Completed   0          20s

docker attach

์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด kubectl attach๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

docker:

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
55c103fa1296        nginx               "nginx -g 'daemon ofโ€ฆ"   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp   nginx-app
docker attach 55c103fa1296
...

kubectl:

kubectl get pods
NAME              READY     STATUS    RESTARTS   AGE
nginx-app-5jyvm   1/1       Running   0          10m
kubectl attach -it nginx-app-5jyvm
...

์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ถ„๋ฆฌํ•˜๋ ค๋ฉด ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค Ctrl+P๋ฅผ ์ž…๋ ฅํ•œ ๋‹ค์Œ Ctrl+Q๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

docker exec

์ปจํ…Œ์ด๋„ˆ์—์„œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด kubectl exec๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

docker:

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
55c103fa1296        nginx               "nginx -g 'daemon ofโ€ฆ"   6 minutes ago       Up 6 minutes        0.0.0.0:80->80/tcp   nginx-app
docker exec 55c103fa1296 cat /etc/hostname
55c103fa1296

kubectl:

kubectl get po
NAME              READY     STATUS    RESTARTS   AGE
nginx-app-5jyvm   1/1       Running   0          10m
kubectl exec nginx-app-5jyvm -- cat /etc/hostname
nginx-app-5jyvm

๋Œ€ํ™”ํ˜• ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

docker:

docker exec -ti 55c103fa1296 /bin/sh
# exit

kubectl:

kubectl exec -ti nginx-app-5jyvm -- /bin/sh
# exit

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์…ธ ์–ป๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

docker logs

์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ํ‘œ์ค€ ์ž…๋ ฅ(stdout)/ํ‘œ์ค€ ์˜ค๋ฅ˜(stderr)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด kubectl logs๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

docker:

docker logs -f a9e
192.168.9.1 - - [14/Jul/2015:01:04:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
192.168.9.1 - - [14/Jul/2015:01:04:03 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"

kubectl:

kubectl logs -f nginx-app-zibvs
10.240.63.110 - - [14/Jul/2015:01:09:01 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.26.0" "-"
10.240.63.110 - - [14/Jul/2015:01:09:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.26.0" "-"

ํŒŒ๋“œ์™€ ์ปจํ…Œ์ด๋„ˆ์—๋Š” ๊ทผ์†Œํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ํŒŒ๋“œ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค. ์ด๋Š” ๋„์ปค์˜ ์‹คํ–‰ ์˜ต์…˜์ธ --restart=always์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ํฐ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ๋„์ปค์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ถœ๋ ฅ์ด ์—ฐ๊ฒฐ๋˜์ง€๋งŒ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๊ฒฝ์šฐ ๊ฐ ํ˜ธ์ถœ์€ ๋ณ„๊ฐœ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ด์ „ ์‹คํ–‰์˜ ์ถœ๋ ฅ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

kubectl logs --previous nginx-app-zibvs
10.240.63.110 - - [14/Jul/2015:01:09:01 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.26.0" "-"
10.240.63.110 - - [14/Jul/2015:01:09:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.26.0" "-"

์ž์„ธํ•œ ์ •๋ณด๋Š” ๋กœ๊น… ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

docker stop ๊ณผ docker rm

์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์‚ญ์ œํ•˜๋ ค๋ฉด kubectl delete์„ ์ฐธ๊ณ ํ•œ๋‹ค.

docker:

docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                         NAMES
a9ec34d98787        nginx               "nginx -g 'daemon of"  22 hours ago        Up 22 hours         0.0.0.0:80->80/tcp, 443/tcp   nginx-app
docker stop a9ec34d98787
a9ec34d98787
docker rm a9ec34d98787
a9ec34d98787

kubectl:

kubectl get deployment nginx-app
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-app    1/1     1            1           2m
kubectl get po -l app=nginx-app
NAME                         READY     STATUS    RESTARTS   AGE
nginx-app-2883164633-aklf7   1/1       Running   0          2m
kubectl delete deployment nginx-app
deployment "nginx-app" deleted
kubectl get po -l app=nginx-app
# ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค

docker login

kubectl์€ docker login์™€ ์ง์ ‘์ ์ธ ์œ ์‚ฌ์ ์€ ์—†๋‹ค. ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์™€ ํ•จ๊ป˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์‚ฌ์šฉ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

docker version

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด kubectl version์„ ์ฐธ๊ณ ํ•œ๋‹ค.

docker:

docker version
Client version: 1.7.0
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 0baf609
OS/Arch (client): linux/amd64
Server version: 1.7.0
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 0baf609
OS/Arch (server): linux/amd64

kubectl:

kubectl version
Client Version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.9+a3d1dfa6f4335", GitCommit:"9b77fed11a9843ce3780f70dd251e92901c43072", GitTreeState:"dirty", BuildDate:"2017-08-29T20:32:58Z", OpenPaasKubernetesVersion:"v1.03.02", GoVersion:"go1.7.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.9+a3d1dfa6f4335", GitCommit:"9b77fed11a9843ce3780f70dd251e92901c43072", GitTreeState:"dirty", BuildDate:"2017-08-29T20:32:58Z", OpenPaasKubernetesVersion:"v1.03.02", GoVersion:"go1.7.5", Compiler:"gc", Platform:"linux/amd64"}

docker info

ํ™˜๊ฒฝ ๋ฐ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” kubectl cluster-info๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

docker:

docker info
Containers: 40
Images: 168
Storage Driver: aufs
 Root Dir: /usr/local/google/docker/aufs
 Backing Filesystem: extfs
 Dirs: 248
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-53-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 12
Total Memory: 31.32 GiB
Name: k8s-is-fun.mtv.corp.google.com
ID: ADUV:GCYR:B3VJ:HMPO:LNPQ:KD5S:YKFQ:76VN:IANZ:7TFV:ZBF4:BYJO
WARNING: No swap limit support

kubectl:

kubectl cluster-info
Kubernetes master is running at https://203.0.113.141
KubeDNS is running at https://203.0.113.141/api/v1/namespaces/kube-system/services/kube-dns/proxy
kubernetes-dashboard is running at https://203.0.113.141/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy
Grafana is running at https://203.0.113.141/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
Heapster is running at https://203.0.113.141/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy
InfluxDB is running at https://203.0.113.141/api/v1/namespaces/kube-system/services/monitoring-influxdb/proxy

10.5 - kubectl ์‚ฌ์šฉ ๊ทœ์น™

kubectl์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌ์šฉ ๊ทœ์น™.

์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ์—์„œ kubectl ์‚ฌ์šฉ

์Šคํฌ๋ฆฝํŠธ์˜ ์•ˆ์ •์ ์ธ ์ถœ๋ ฅ์„ ์œ„ํ•ด์„œ

  • -o name, -o json, -o yaml, -o go-template ํ˜น์€ -o jsonpath์™€ ๊ฐ™์€ ๋จธ์‹  ์ง€ํ–ฅ(machine-oriented) ์ถœ๋ ฅ ์–‘์‹ ์ค‘ ํ•˜๋‚˜๋ฅผ ์š”์ฒญํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด jobs.v1.batch/myjob๊ณผ ๊ฐ™์ด ์ „์ฒด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด kubectl์ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • ๋ฌธ๋งฅ, ์„ค์ • ๋˜๋Š” ๊ธฐํƒ€ ์•”๋ฌต์  ์ƒํƒœ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

์„œ๋ธŒ๋ฆฌ์†Œ์Šค

  • kubectl์˜ get, patch, edit ๋ฐ replace์™€ ๊ฐ™์€ ๋ช…๋ น์–ด์—์„œ ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด --subresource ์•ŒํŒŒ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ, status์™€ scale ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋งŒ ์ง€์›๋œ๋‹ค.
  • ์„œ๋ธŒ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ API ๊ณ„์•ฝ์€ ์ „์ฒด ๋ฆฌ์†Œ์Šค์™€ ๋™์ผํ•˜๋‹ค. status ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒˆ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด๋„, ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋ฅผ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•œ๋‹ค.

๋ชจ๋ฒ” ์‚ฌ๋ก€

kubectl run

kubectl run์œผ๋กœ infrastructure as code๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ

  • ๋ฒ„์ „์ด ๋ช…์‹œ๋œ ํƒœ๊ทธ๋กœ ์ด๋ฏธ์ง€๋ฅผ ํƒœ๊ทธํ•˜๊ณ  ๊ทธ ํƒœ๊ทธ๋ฅผ ์ƒˆ๋กœ์šด ๋ฒ„์ „์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, :latest๊ฐ€ ์•„๋‹Œ :v1234, v1.2.3, r03062016-1-4๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค(์ž์„ธํ•œ ์ •๋ณด๋Š” ๊ตฌ์„ฑ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค).
  • ๋งŽ์€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ ์šฉ๋œ ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • ํ•„์š”ํ•˜์ง€๋งŒ kubectl run ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ์€ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์†Œ์Šค ์ฝ”๋“œ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ๋„ฃ์–ด์„œ ์ „ํ™˜ํ•œ๋‹ค.

--dry-run ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ๋กœ ์ œ์ถœํ•˜์ง€ ์•Š๊ณ  ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ณด๋‚ผ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

kubectl apply

  • kubectl apply๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค. kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” Kubectl ์ฑ…์„ ์ฐธ๊ณ ํ•œ๋‹ค.

11 - ์ปดํฌ๋„ŒํŠธ ๋„๊ตฌ

11.1 - ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ

์ด ํŽ˜์ด์ง€์—๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ์— ๋Œ€ํ•œ ๊ฐœ์š”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

๊ธฐ๋Šฅ์˜ ๋‹จ๊ณ„(stage)์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๊ธฐ๋Šฅ ๋‹จ๊ณ„๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๊ฐœ์š”

๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๋Š” ์ผ๋ จ์˜ ํ‚ค=๊ฐ’ ์Œ์ด๋‹ค. ๊ฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ --feature-gates ์ปค๋งจ๋“œ ๋ผ์ธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ผœ๊ฑฐ๋‚˜ ๋Œ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ์ง‘ํ•ฉ์„ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ „์ฒด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ์ง‘ํ•ฉ์„ ๋ณด๋ ค๋ฉด -h ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. kubelet๊ณผ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด, ๊ธฐ๋Šฅ ์Œ ๋ชฉ๋ก์— ์ง€์ •๋œ --feature-gates ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

--feature-gates=...,GracefulNodeShutdown=true

๋‹ค์Œ ํ‘œ๋Š” ๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ์š”์•ฝํ•œ ๊ฒƒ์ด๋‹ค.

์•ŒํŒŒ ๋˜๋Š” ๋ฒ ํƒ€ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ

์•ŒํŒŒ ๋˜๋Š” ๋ฒ ํƒ€ ๋‹จ๊ณ„์— ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ
๊ธฐ๋Šฅ๋””ํดํŠธ๋‹จ๊ณ„๋„์ž…์ข…๋ฃŒ
APIListChunkingfalse์•ŒํŒŒ1.81.8
APIListChunkingtrue๋ฒ ํƒ€1.9
APIPriorityAndFairnessfalse์•ŒํŒŒ1.181.19
APIPriorityAndFairnesstrue๋ฒ ํƒ€1.20
APIResponseCompressionfalse์•ŒํŒŒ1.71.15
APIResponseCompressiontrue๋ฒ ํƒ€1.16
APISelfSubjectAttributesReviewfalse์•ŒํŒŒ1.26
APIServerIdentityfalse์•ŒํŒŒ1.201.25
APIServerIdentitytrue๋ฒ ํƒ€1.26
APIServerTracingfalse์•ŒํŒŒ1.22
AllowInsecureBackendProxytrue๋ฒ ํƒ€1.17
AnyVolumeDataSourcefalse์•ŒํŒŒ1.181.23
AnyVolumeDataSourcetrue๋ฒ ํƒ€1.24
AppArmortrue๋ฒ ํƒ€1.4
CPUManagerPolicyAlphaOptionsfalse์•ŒํŒŒ1.23
CPUManagerPolicyBetaOptionstrue๋ฒ ํƒ€1.23
CPUManagerPolicyOptionsfalse์•ŒํŒŒ1.221.22
CPUManagerPolicyOptionstrue๋ฒ ํƒ€1.23
CSIMigrationPortworxfalse์•ŒํŒŒ1.231.24
CSIMigrationPortworxfalse๋ฒ ํƒ€1.25
CSIMigrationRBDfalse์•ŒํŒŒ1.23
CSINodeExpandSecretfalse์•ŒํŒŒ1.25
CSIVolumeHealthfalse์•ŒํŒŒ1.21
CrossNamespaceVolumeDataSourcefalse์•ŒํŒŒ1.26
ContainerCheckpointfalse์•ŒํŒŒ1.25
ContextualLoggingfalse์•ŒํŒŒ1.24
CustomCPUCFSQuotaPeriodfalse์•ŒํŒŒ1.12
CustomResourceValidationExpressionsfalse์•ŒํŒŒ1.231.24
CustomResourceValidationExpressionstrue๋ฒ ํƒ€1.25
DisableCloudProvidersfalse์•ŒํŒŒ1.22
DisableKubeletCloudCredentialProvidersfalse์•ŒํŒŒ1.23
DownwardAPIHugePagesfalse์•ŒํŒŒ1.201.20
DownwardAPIHugePagesfalse๋ฒ ํƒ€1.211.21
DownwardAPIHugePagestrue๋ฒ ํƒ€1.22
DynamicResourceAllocationfalse์•ŒํŒŒ1.26
EndpointSliceTerminatingConditionfalse์•ŒํŒŒ1.201.21
EndpointSliceTerminatingConditiontrue๋ฒ ํƒ€1.22
ExpandedDNSConfigfalse์•ŒํŒŒ1.22
ExperimentalHostUserNamespaceDefaultingfalse๋ฒ ํƒ€1.5
GRPCContainerProbefalse์•ŒํŒŒ1.231.23
GRPCContainerProbetrue๋ฒ ํƒ€1.24
GracefulNodeShutdownfalse์•ŒํŒŒ1.201.20
GracefulNodeShutdowntrue๋ฒ ํƒ€1.21
GracefulNodeShutdownBasedOnPodPriorityfalse์•ŒํŒŒ1.231.23
GracefulNodeShutdownBasedOnPodPrioritytrue๋ฒ ํƒ€1.24
HPAContainerMetricsfalse์•ŒํŒŒ1.20
HPAScaleToZerofalse์•ŒํŒŒ1.16
HonorPVReclaimPolicyfalse์•ŒํŒŒ1.23
InTreePluginAWSUnregisterfalse์•ŒํŒŒ1.21
InTreePluginAzureDiskUnregisterfalse์•ŒํŒŒ1.21
InTreePluginAzureFileUnregisterfalse์•ŒํŒŒ1.21
InTreePluginGCEUnregisterfalse์•ŒํŒŒ1.21
InTreePluginOpenStackUnregisterfalse์•ŒํŒŒ1.21
InTreePluginPortworxUnregisterfalse์•ŒํŒŒ1.23
InTreePluginRBDUnregisterfalse์•ŒํŒŒ1.23
InTreePluginvSphereUnregisterfalse์•ŒํŒŒ1.21
IPTablesOwnershipCleanupfalse์•ŒํŒŒ1.25
JobMutableNodeSchedulingDirectivestrue๋ฒ ํƒ€1.23
JobPodFailurePolicyfalse์•ŒํŒŒ1.251.25
JobPodFailurePolicytrue๋ฒ ํƒ€1.26
JobReadyPodsfalse์•ŒํŒŒ1.231.23
JobReadyPodstrue๋ฒ ํƒ€1.24
JobTrackingWithFinalizersfalse์•ŒํŒŒ1.221.22
JobTrackingWithFinalizersfalse๋ฒ ํƒ€1.231.24
JobTrackingWithFinalizerstrue๋ฒ ํƒ€1.25
KMSv2false์•ŒํŒŒ1.25
KubeletInUserNamespacefalse์•ŒํŒŒ1.22
KubeletPodResourcesfalse์•ŒํŒŒ1.131.14
KubeletPodResourcestrue๋ฒ ํƒ€1.15
KubeletPodResourcesGetAllocatablefalse์•ŒํŒŒ1.211.22
KubeletPodResourcesGetAllocatabletrue๋ฒ ํƒ€1.23
KubeletTracingfalse์•ŒํŒŒ1.25
LegacyServiceAccountTokenTrackingfalse์•ŒํŒŒ1.26
LocalStorageCapacityIsolationFSQuotaMonitoringfalse์•ŒํŒŒ1.151.24
LocalStorageCapacityIsolationFSQuotaMonitoringtrue๋ฒ ํƒ€1.25
LogarithmicScaleDownfalse์•ŒํŒŒ1.211.21
LogarithmicScaleDowntrue๋ฒ ํƒ€1.22
MatchLabelKeysInPodTopologySpreadfalse์•ŒํŒŒ1.25
MaxUnavailableStatefulSetfalse์•ŒํŒŒ1.24
MemoryManagerfalse์•ŒํŒŒ1.211.21
MemoryManagertrue๋ฒ ํƒ€1.22
MemoryQoSfalse์•ŒํŒŒ1.22
MinDomainsInPodTopologySpreadfalse์•ŒํŒŒ1.241.24
MinDomainsInPodTopologySpreadfalse๋ฒ ํƒ€1.25
MixedProtocolLBServicefalse์•ŒํŒŒ1.201.23
MixedProtocolLBServicetrue๋ฒ ํƒ€1.24
MultiCIDRRangeAllocatorfalse์•ŒํŒŒ1.25
NetworkPolicyStatusfalse์•ŒํŒŒ1.24
NodeInclusionPolicyInPodTopologySpreadfalse์•ŒํŒŒ1.25
NodeOutOfServiceVolumeDetachfalse์•ŒํŒŒ1.241.25
NodeOutOfServiceVolumeDetachtrue๋ฒ ํƒ€1.26
NodeSwapfalse์•ŒํŒŒ1.22
OpenAPIEnumsfalse์•ŒํŒŒ1.231.23
OpenAPIEnumstrue๋ฒ ํƒ€1.24
OpenAPIV3false์•ŒํŒŒ1.231.23
OpenAPIV3true๋ฒ ํƒ€1.24
PDBUnhealthyPodEvictionPolicyfalse์•ŒํŒŒ1.26
PodAndContainerStatsFromCRIfalse์•ŒํŒŒ1.23
PodDeletionCostfalse์•ŒํŒŒ1.211.21
PodDeletionCosttrue๋ฒ ํƒ€1.22
PodDisruptionConditionsfalse์•ŒํŒŒ1.251.25
PodDisruptionConditionstrue๋ฒ ํƒ€1.26
PodHasNetworkConditionfalse์•ŒํŒŒ1.25
PodSchedulingReadinessfalse์•ŒํŒŒ1.26
ProbeTerminationGracePeriodfalse์•ŒํŒŒ1.211.21
ProbeTerminationGracePeriodfalse๋ฒ ํƒ€1.221.24
ProbeTerminationGracePeriodtrue๋ฒ ํƒ€1.25
ProcMountTypefalse์•ŒํŒŒ1.12
ProxyTerminatingEndpointsfalse์•ŒํŒŒ1.221.25
ProxyTerminatingEndpointstrue๋ฒ ํƒ€1.26
QOSReservedfalse์•ŒํŒŒ1.11
ReadWriteOncePodfalse์•ŒํŒŒ1.22
RecoverVolumeExpansionFailurefalse์•ŒํŒŒ1.23
RemainingItemCountfalse์•ŒํŒŒ1.151.15
RemainingItemCounttrue๋ฒ ํƒ€1.16
RetroactiveDefaultStorageClassfalse์•ŒํŒŒ1.251.25
RetroactiveDefaultStorageClasstrue๋ฒ ํƒ€1.26
RotateKubeletServerCertificatefalse์•ŒํŒŒ1.71.11
RotateKubeletServerCertificatetrue๋ฒ ํƒ€1.12
SELinuxMountReadWriteOncePodfalse์•ŒํŒŒ1.25
SeccompDefaultfalse์•ŒํŒŒ1.221.24
SeccompDefaulttrue๋ฒ ํƒ€1.25
ServerSideFieldValidationfalse์•ŒํŒŒ1.231.24
ServerSideFieldValidationtrue๋ฒ ํƒ€1.25
SizeMemoryBackedVolumesfalse์•ŒํŒŒ1.201.21
SizeMemoryBackedVolumestrue๋ฒ ํƒ€1.22
StatefulSetAutoDeletePVCfalse์•ŒํŒŒ1.22
StatefulSetStartOrdinalfalse์•ŒํŒŒ1.26
StorageVersionAPIfalse์•ŒํŒŒ1.20
StorageVersionHashfalse์•ŒํŒŒ1.141.14
StorageVersionHashtrue๋ฒ ํƒ€1.15
TopologyAwareHintsfalse์•ŒํŒŒ1.211.22
TopologyAwareHintsfalse๋ฒ ํƒ€1.231.23
TopologyAwareHintstrue๋ฒ ํƒ€1.24
TopologyManagerfalse์•ŒํŒŒ1.161.17
TopologyManagertrue๋ฒ ํƒ€1.18
TopologyManagerPolicyAlphaOptionsfalse์•ŒํŒŒ1.26
TopologyManagerPolicyBetaOptionsfalse๋ฒ ํƒ€1.26
TopologyManagerPolicyOptionsfalse์•ŒํŒŒ1.26
UserNamespacesStatelessPodsSupportfalse์•ŒํŒŒ1.25
ValidatingAdmissionPolicyfalse์•ŒํŒŒ1.26
VolumeCapacityPriorityfalse์•ŒํŒŒ1.21-
WinDSRfalse์•ŒํŒŒ1.14
WinOverlayfalse์•ŒํŒŒ1.141.19
WinOverlaytrue๋ฒ ํƒ€1.20
WindowsHostNetworkfalse์•ŒํŒŒ1.26

์Šน๊ธ‰ ๋˜๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ๋œ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ

์Šน๊ธ‰ ๋˜๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ
๊ธฐ๋Šฅ๋””ํดํŠธ๋‹จ๊ณ„๋„์ž…์ข…๋ฃŒ
AdvancedAuditingfalse์•ŒํŒŒ1.71.7
AdvancedAuditingtrue๋ฒ ํƒ€1.81.11
AdvancedAuditingtrueGA1.12-
CPUManagerfalse์•ŒํŒŒ1.81.9
CPUManagertrue๋ฒ ํƒ€1.101.25
CPUManagertrueGA1.26-
CSIInlineVolumefalse์•ŒํŒŒ1.151.15
CSIInlineVolumetrue๋ฒ ํƒ€1.161.24
CSIInlineVolumetrueGA1.25-
CSIMigrationfalse์•ŒํŒŒ1.141.16
CSIMigrationtrue๋ฒ ํƒ€1.171.24
CSIMigrationtrueGA1.25-
CSIMigrationAWSfalse์•ŒํŒŒ1.141.16
CSIMigrationAWSfalse๋ฒ ํƒ€1.171.22
CSIMigrationAWStrue๋ฒ ํƒ€1.231.24
CSIMigrationAWStrueGA1.25-
CSIMigrationAzureDiskfalse์•ŒํŒŒ1.151.18
CSIMigrationAzureDiskfalse๋ฒ ํƒ€1.191.22
CSIMigrationAzureDisktrue๋ฒ ํƒ€1.231.23
CSIMigrationAzureDisktrueGA1.24
CSIMigrationAzureFilefalse์•ŒํŒŒ1.151.20
CSIMigrationAzureFilefalse๋ฒ ํƒ€1.211.23
CSIMigrationAzureFiletrue๋ฒ ํƒ€1.241.25
CSIMigrationAzureFiletrueGA1.26
CSIMigrationGCEfalse์•ŒํŒŒ1.141.16
CSIMigrationGCEfalse๋ฒ ํƒ€1.171.22
CSIMigrationGCEtrue๋ฒ ํƒ€1.231.24
CSIMigrationGCEtrueGA1.25-
CSIMigrationvSpherefalse์•ŒํŒŒ1.181.18
CSIMigrationvSpherefalse๋ฒ ํƒ€1.191.24
CSIMigrationvSpheretrue๋ฒ ํƒ€1.251.25
CSIMigrationvSpheretrueGA1.26-
CSIMigrationOpenStackfalse์•ŒํŒŒ1.141.17
CSIMigrationOpenStacktrue๋ฒ ํƒ€1.181.23
CSIMigrationOpenStacktrueGA1.24
CSIStorageCapacityfalse์•ŒํŒŒ1.191.20
CSIStorageCapacitytrue๋ฒ ํƒ€1.211.23
CSIStorageCapacitytrueGA1.24-
ControllerManagerLeaderMigrationfalse์•ŒํŒŒ1.211.21
ControllerManagerLeaderMigrationtrue๋ฒ ํƒ€1.221.23
ControllerManagerLeaderMigrationtrueGA1.24-
CronJobTimeZonefalse์•ŒํŒŒ1.241.24
CronJobTimeZonetrue๋ฒ ํƒ€1.25
DaemonSetUpdateSurgefalse์•ŒํŒŒ1.211.21
DaemonSetUpdateSurgetrue๋ฒ ํƒ€1.221.24
DaemonSetUpdateSurgetrueGA1.25-
DefaultPodTopologySpreadfalse์•ŒํŒŒ1.191.19
DefaultPodTopologySpreadtrue๋ฒ ํƒ€1.201.23
DefaultPodTopologySpreadtrueGA1.24-
DelegateFSGroupToCSIDriverfalse์•ŒํŒŒ1.221.22
DelegateFSGroupToCSIDrivertrue๋ฒ ํƒ€1.231.25
DelegateFSGroupToCSIDrivertrueGA1.26-
DisableAcceleratorUsageMetricsfalse์•ŒํŒŒ1.191.19
DisableAcceleratorUsageMetricstrue๋ฒ ํƒ€1.201.24
DisableAcceleratorUsageMetricstrueGA1.25-
DevicePluginsfalse์•ŒํŒŒ1.81.9
DevicePluginstrue๋ฒ ํƒ€1.101.25
DevicePluginstrueGA1.26-
DryRunfalse์•ŒํŒŒ1.121.12
DryRuntrue๋ฒ ํƒ€1.131.18
DryRuntrueGA1.19-
DynamicKubeletConfigfalse์•ŒํŒŒ1.41.10
DynamicKubeletConfigtrue๋ฒ ํƒ€1.111.21
DynamicKubeletConfigfalseDeprecated1.22-
EfficientWatchResumptionfalse์•ŒํŒŒ1.201.20
EfficientWatchResumptiontrue๋ฒ ํƒ€1.211.23
EfficientWatchResumptiontrueGA1.24-
EphemeralContainersfalse์•ŒํŒŒ1.161.22
EphemeralContainerstrue๋ฒ ํƒ€1.231.24
EphemeralContainerstrueGA1.25-
EventedPLEGfalse์•ŒํŒŒ1.26-
ExecProbeTimeouttrueGA1.20-
ExpandCSIVolumesfalse์•ŒํŒŒ1.141.15
ExpandCSIVolumestrue๋ฒ ํƒ€1.161.23
ExpandCSIVolumestrueGA1.24-
ExpandInUsePersistentVolumesfalse์•ŒํŒŒ1.111.14
ExpandInUsePersistentVolumestrue๋ฒ ํƒ€1.151.23
ExpandInUsePersistentVolumestrueGA1.24-
ExpandPersistentVolumesfalse์•ŒํŒŒ1.81.10
ExpandPersistentVolumestrue๋ฒ ํƒ€1.111.23
ExpandPersistentVolumestrueGA1.24-
IdentifyPodOSfalse์•ŒํŒŒ1.231.23
IdentifyPodOStrue๋ฒ ํƒ€1.241.24
IdentifyPodOStrueGA1.25-
IndexedJobfalse์•ŒํŒŒ1.211.21
IndexedJobtrue๋ฒ ํƒ€1.221.23
IndexedJobtrueGA1.24-
JobTrackingWithFinalizersfalse์•ŒํŒŒ1.221.22
JobTrackingWithFinalizersfalse๋ฒ ํƒ€1.231.24
JobTrackingWithFinalizerstrue๋ฒ ํƒ€1.251.25
JobTrackingWithFinalizerstrueGA1.26-
KubeletCredentialProvidersfalse์•ŒํŒŒ1.201.23
KubeletCredentialProviderstrue๋ฒ ํƒ€1.241.25
KubeletCredentialProviderstrueGA1.26-
LegacyServiceAccountTokenNoAutoGenerationtrue๋ฒ ํƒ€1.241.25
LegacyServiceAccountTokenNoAutoGenerationtrueGA1.26-
LocalStorageCapacityIsolationfalse์•ŒํŒŒ1.71.9
LocalStorageCapacityIsolationtrue๋ฒ ํƒ€1.101.24
LocalStorageCapacityIsolationtrueGA1.25-
NetworkPolicyEndPortfalse์•ŒํŒŒ1.211.21
NetworkPolicyEndPorttrue๋ฒ ํƒ€1.221.24
NetworkPolicyEndPorttrueGA1.25-
NonPreemptingPriorityfalse์•ŒํŒŒ1.151.18
NonPreemptingPrioritytrue๋ฒ ํƒ€1.191.23
NonPreemptingPrioritytrueGA1.24-
PodAffinityNamespaceSelectorfalse์•ŒํŒŒ1.211.21
PodAffinityNamespaceSelectortrue๋ฒ ํƒ€1.221.23
PodAffinityNamespaceSelectortrueGA1.24-
PodSecurityfalse์•ŒํŒŒ1.221.22
PodSecuritytrue๋ฒ ํƒ€1.231.24
PodSecuritytrueGA1.25
PreferNominatedNodefalse์•ŒํŒŒ1.211.21
PreferNominatedNodetrue๋ฒ ํƒ€1.221.23
PreferNominatedNodetrueGA1.24-
RemoveSelfLinkfalse์•ŒํŒŒ1.161.19
RemoveSelfLinktrue๋ฒ ํƒ€1.201.23
RemoveSelfLinktrueGA1.24-
ServerSideApplyfalse์•ŒํŒŒ1.141.15
ServerSideApplytrue๋ฒ ํƒ€1.161.21
ServerSideApplytrueGA1.22-
ServiceInternalTrafficPolicyfalse์•ŒํŒŒ1.211.21
ServiceInternalTrafficPolicytrue๋ฒ ํƒ€1.221.25
ServiceInternalTrafficPolicytrueGA1.26-
ServiceIPStaticSubrangefalse์•ŒํŒŒ1.241.24
ServiceIPStaticSubrangetrue๋ฒ ํƒ€1.251.25
ServiceIPStaticSubrangetrueGA1.26-
ServiceLBNodePortControlfalse์•ŒํŒŒ1.201.21
ServiceLBNodePortControltrue๋ฒ ํƒ€1.221.23
ServiceLBNodePortControltrueGA1.24-
ServiceLoadBalancerClassfalse์•ŒํŒŒ1.211.21
ServiceLoadBalancerClasstrue๋ฒ ํƒ€1.221.23
ServiceLoadBalancerClasstrueGA1.24-
StatefulSetMinReadySecondsfalse์•ŒํŒŒ1.221.22
StatefulSetMinReadySecondstrue๋ฒ ํƒ€1.231.24
StatefulSetMinReadySecondstrueGA1.25-
SuspendJobfalse์•ŒํŒŒ1.211.21
SuspendJobtrue๋ฒ ํƒ€1.221.23
SuspendJobtrueGA1.24-
WatchBookmarkfalse์•ŒํŒŒ1.151.15
WatchBookmarktrue๋ฒ ํƒ€1.161.16
WatchBookmarktrueGA1.17-
WindowsHostProcessContainersfalse์•ŒํŒŒ1.221.22
WindowsHostProcessContainerstrue๋ฒ ํƒ€1.231.25
WindowsHostProcessContainerstrueGA1.26-

๊ธฐ๋Šฅ ์‚ฌ์šฉ

๊ธฐ๋Šฅ ๋‹จ๊ณ„

๊ธฐ๋Šฅ์€ ์•ŒํŒŒ, ๋ฒ ํƒ€ ๋˜๋Š” GA ๋‹จ๊ณ„์ผ ์ˆ˜ ์žˆ๋‹ค. ์•ŒํŒŒ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค.
  • ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒ„๊ทธ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์€ ์‚ฌ์ „ ํ†ต์ง€์—†์ด ์–ธ์ œ๋“ ์ง€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค.
  • API๋Š” ์ดํ›„ ์†Œํ”„ํŠธ์›จ์–ด ๋ฆด๋ฆฌ์Šค์—์„œ ์˜ˆ๊ณ ์—†์ด ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฒ„๊ทธ์˜ ์œ„ํ—˜์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์žฅ๊ธฐ ์ง€์›์ด ๋ถ€์กฑํ•˜์—ฌ, ๋‹จ๊ธฐ ํ…Œ์ŠคํŠธ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋ฒ ํƒ€ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค.
  • ์ด ๊ธฐ๋Šฅ์€ ์ž˜ ํ…Œ์ŠคํŠธ๋˜์—ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.
  • ์„ธ๋ถ€ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ „์ฒด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์€ ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์˜ค๋ธŒ์ ํŠธ์˜ ์Šคํ‚ค๋งˆ ๋ฐ/๋˜๋Š” ์‹œ๋งจํ‹ฑ์€ ํ›„์† ๋ฒ ํƒ€ ๋˜๋Š” ์•ˆ์ • ๋ฆด๋ฆฌ์Šค์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด, ๋‹ค์Œ ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•œ๋‹ค. API ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œ, ํŽธ์ง‘ ๋ฐ ์žฌ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํŽธ์ง‘ ๊ณผ์ •์—์„œ ์•ฝ๊ฐ„์˜ ์ƒ๊ฐ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๊ธฐ๋Šฅ์— ์˜์กดํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋‹ค์šดํƒ€์ž„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ›„์† ๋ฆด๋ฆฌ์Šค์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—…๋ฌด์ƒ ์ค‘์š”ํ•˜์ง€ ์•Š์€(non-business-critical) ์šฉ๋„๋กœ๋งŒ ๊ถŒ์žฅํ•œ๋‹ค. ๋…๋ฆฝ์ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด ์ œํ•œ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

GA(General Availability) ๊ธฐ๋Šฅ์€ ์•ˆ์ • ๊ธฐ๋Šฅ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์ด ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ด ๊ธฐ๋Šฅ์€ ํ•ญ์ƒ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ•ด๋‹น ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
  • ์—ฌ๋Ÿฌ ํ›„์† ๋ฒ„์ „์˜ ๋ฆด๋ฆฌ์Šค๋œ ์†Œํ”„ํŠธ์›จ์–ด์— ์•ˆ์ •์ ์ธ ๊ธฐ๋Šฅ์˜ ๋ฒ„์ „์ด ํฌํ•จ๋œ๋‹ค.

๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ๋ชฉ๋ก

๊ฐ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ํŠน์ • ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

  • APIListChunking: API ํด๋ผ์ด์–ธํŠธ๊ฐ€ API ์„œ๋ฒ„์—์„œ (LIST ๋˜๋Š” GET) ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒญํฌ(chunks)๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • APIPriorityAndFairness: ๊ฐ ์„œ๋ฒ„์˜ ์šฐ์„  ์ˆœ์œ„์™€ ๊ณต์ •์„ฑ์„ ํ†ตํ•ด ๋™์‹œ ์š”์ฒญ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. (RequestManagement ์—์„œ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋จ)
  • APIResponseCompression: LIST ๋˜๋Š” GET ์š”์ฒญ์— ๋Œ€ํ•œ API ์‘๋‹ต์„ ์••์ถ•ํ•œ๋‹ค.
  • APIServerIdentity: ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ API ์„œ๋ฒ„์— ID๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
  • APIServerTracing: API ์„œ๋ฒ„์—์„œ ๋ถ„์‚ฐ ์ถ”์ (tracing)์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ถ”์ ํŽ˜์ด์ง€๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.
  • APISelfSubjectAttributesReview: ์‚ฌ์šฉ์ž๋กœ ํ•˜์—ฌ๊ธˆ ์š”์ฒญ์„ ํ•˜๋Š” ์ฃผ์ฒด(subject)์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” SelfSubjectReview API๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ์„œ์˜ ์ธ์ฆ ์ •๋ณด API ์ ‘๊ทผ์„ ํ™•์ธํ•œ๋‹ค.
  • AdvancedAuditing: ๊ณ ๊ธ‰ ๊ฐ์‚ฌ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • AllowInsecureBackendProxy: ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ๋“œ ๋กœ๊ทธ ์š”์ฒญ์—์„œ kubelet์˜ TLS ํ™•์ธ์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • AnyVolumeDataSource: PVC์˜ DataSource ๋กœ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • AppArmor: ๋ฆฌ๋ˆ…์Šค ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ํŒŒ๋“œ์— ๋Œ€ํ•œ AppArmor ํ•„์ˆ˜ ์ ‘๊ทผ ์ œ์–ด์˜ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ AppArmor ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • ContainerCheckpoint: kubelet์˜ ์ฒดํฌํฌ์ธํŠธ API๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubelet ์ฒดํฌํฌ์ธํŠธ API๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • ControllerManagerLeaderMigration: HA ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ kube-controller-manager์˜ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์„ ์™ธ๋ถ€ controller-manager(์˜ˆ๋ฅผ ๋“ค๋ฉด, cloud-controller-manager)๋กœ ๋‹ค์šดํƒ€์ž„ ์—†์ด ๋ผ์ด๋ธŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋„๋ก kube-controller-manager์™€ cloud-controller-manager์˜ ๋ฆฌ๋” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Leader Migration)์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • CPUManager: ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์˜ CPU ์–ดํ”ผ๋‹ˆํ‹ฐ ์ง€์›์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. CPU ๊ด€๋ฆฌ ์ •์ฑ…์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • CPUManagerPolicyAlphaOptions: CPUManager ์ •์ฑ… ์ค‘ ์‹คํ—˜์ ์ด๋ฉฐ ์•ŒํŒŒ ํ’ˆ์งˆ์ธ ์˜ต์…˜์˜ ๋ฏธ์„ธ ์กฐ์ •์„ ํ—ˆ์šฉํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ํ’ˆ์งˆ ์ˆ˜์ค€์ด ์•ŒํŒŒ์ธ CPUManager ์˜ต์…˜์˜ ๊ทธ๋ฃน์„ ๋ณดํ˜ธํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ๋ฒ ํƒ€ ๋˜๋Š” ์•ˆ์ •(stable) ์ƒํƒœ๋กœ ์Šน๊ธ‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
  • CPUManagerPolicyBetaOptions: CPUManager ์ •์ฑ… ์ค‘ ์‹คํ—˜์ ์ด๋ฉฐ ๋ฒ ํƒ€ ํ’ˆ์งˆ์ธ ์˜ต์…˜์˜ ๋ฏธ์„ธ ์กฐ์ •์„ ํ—ˆ์šฉํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ํ’ˆ์งˆ ์ˆ˜์ค€์ด ๋ฒ ํƒ€์ธ CPUManager ์˜ต์…˜์˜ ๊ทธ๋ฃน์„ ๋ณดํ˜ธํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ์•ˆ์ •(stable) ์ƒํƒœ๋กœ ์Šน๊ธ‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
  • CPUManagerPolicyOptions: CPUManager ์ •์ฑ…์˜ ๋ฏธ์„ธ ์กฐ์ •์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • CrossNamespaceVolumeDataSource: ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ„ ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‚ฌ์šฉ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉฐ, ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„์˜ dataSourceRef ํ•„๋“œ์— ์†Œ์Šค ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ธฐ์žฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • CSIInlineVolume: ํŒŒ๋“œ์— ๋Œ€ํ•œ CSI ์ธ๋ผ์ธ ๋ณผ๋ฅจ ์ง€์›์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • CSIMigration: shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ†ตํ•ด ๋ณผ๋ฅจ ์ž‘์—…์„ ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์‚ฌ์ „ ์„ค์น˜๋œ ํ•ด๋‹น CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • CSIMigrationAWS: shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ†ตํ•ด ๋ณผ๋ฅจ ์ž‘์—…์„ AWS-EBS ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ EBS CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ EBS CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ์—์„œ์˜ ๋งˆ์šดํŠธ ๋™์ž‘์— ๋Œ€ํ•ด ์ธ-ํŠธ๋ฆฌ EBS ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ์˜ ํด๋ฐฑ(falling back)์„ ์ง€์›ํ•œ๋‹ค. ํ”„๋กœ๋น„์ „ ๋™์ž‘์— ๋Œ€ํ•ด์„œ๋Š” ํด๋ฐฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋ฐ, ํ”„๋กœ๋น„์ „ ๋™์ž‘์€ ํ•ด๋‹น CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • CSIMigrationAzureDisk: shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ†ตํ•ด ๋ณผ๋ฅจ ์ž‘์—…์„ Azure-Disk ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ AzureDisk CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ AzureDisk CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ์—์„œ์˜ ๋งˆ์šดํŠธ ๋™์ž‘์— ๋Œ€ํ•ด ์ธ-ํŠธ๋ฆฌ AzureDisk ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ์˜ ํด๋ฐฑ(falling back)์„ ์ง€์›ํ•œ๋‹ค. ํ”„๋กœ๋น„์ „ ๋™์ž‘์— ๋Œ€ํ•ด์„œ๋Š” ํด๋ฐฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋ฐ, ํ”„๋กœ๋น„์ „ ๋™์ž‘์€ ํ•ด๋‹น CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด CSIMigration ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • CSIMigrationAzureFile: shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ†ตํ•ด ๋ณผ๋ฅจ ์ž‘์—…์„ Azure-File ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ AzureFile CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ AzureFile CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ์—์„œ์˜ ๋งˆ์šดํŠธ ๋™์ž‘์— ๋Œ€ํ•ด ์ธ-ํŠธ๋ฆฌ AzureFile ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ์˜ ํด๋ฐฑ(falling back)์„ ์ง€์›ํ•œ๋‹ค. ํ”„๋กœ๋น„์ „ ๋™์ž‘์— ๋Œ€ํ•ด์„œ๋Š” ํด๋ฐฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋ฐ, ํ”„๋กœ๋น„์ „ ๋™์ž‘์€ ํ•ด๋‹น CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด CSIMigration ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • CSIMigrationGCE: shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ†ตํ•ด ๋ณผ๋ฅจ ์ž‘์—…์„ GCE-PD ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ PD CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ PD CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ์—์„œ์˜ ๋งˆ์šดํŠธ ๋™์ž‘์— ๋Œ€ํ•ด ์ธ-ํŠธ๋ฆฌ GCE ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ์˜ ํด๋ฐฑ(falling back)์„ ์ง€์›ํ•œ๋‹ค. ํ”„๋กœ๋น„์ „ ๋™์ž‘์— ๋Œ€ํ•ด์„œ๋Š” ํด๋ฐฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋ฐ, ํ”„๋กœ๋น„์ „ ๋™์ž‘์€ ํ•ด๋‹น CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด CSIMigration ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • CSIMigrationOpenStack: shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ†ตํ•ด ๋ณผ๋ฅจ ์ž‘์—…์„ Cinder ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ Cinder CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ Cinder CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ์—์„œ์˜ ๋งˆ์šดํŠธ ๋™์ž‘์— ๋Œ€ํ•ด ์ธ-ํŠธ๋ฆฌ Cinder ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ์˜ ํด๋ฐฑ(falling back)์„ ์ง€์›ํ•œ๋‹ค. ํ”„๋กœ๋น„์ „ ๋™์ž‘์— ๋Œ€ํ•ด์„œ๋Š” ํด๋ฐฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋ฐ, ํ”„๋กœ๋น„์ „ ๋™์ž‘์€ ํ•ด๋‹น CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด CSIMigration ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • csiMigrationRBD: RBD ํŠธ๋ฆฌ ๋‚ด(in-tree) ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๊ฐ€๋Š” ๋ณผ๋ฅจ ์ž‘์—…์„ Ceph RBD CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŠธํ•˜๋Š” ์‹ฌ(shim)๊ณผ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์— CSIMigration ๋ฐ csiMigrationRBD ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๊ณ , Ceph CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ํŠธ๋ฆฌ ๋‚ด(in-tree) RBD ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก์„ ๊ธˆ์ง€์‹œํ‚ค๋Š” InTreePluginRBDUnregister ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ์— ์˜ํ•ด ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค.
  • CSIMigrationvSphere: vSphere ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ vSphere CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ณผ๋ฅจ ์ž‘์—…์„ ๋ผ์šฐํŒ…ํ•˜๋Š” shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ vSphere CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ์—์„œ์˜ ๋งˆ์šดํŠธ ๋™์ž‘์— ๋Œ€ํ•ด ์ธ-ํŠธ๋ฆฌ vSphere ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ์˜ ํด๋ฐฑ(falling back)์„ ์ง€์›ํ•œ๋‹ค. ํ”„๋กœ๋น„์ „ ๋™์ž‘์— ๋Œ€ํ•ด์„œ๋Š” ํด๋ฐฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋ฐ, ํ”„๋กœ๋น„์ „ ๋™์ž‘์€ ํ•ด๋‹น CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด CSIMigration ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • CSIMigrationPortworx: Portworx ํŠธ๋ฆฌ ๋‚ด(in-tree) ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๊ฐ€๋Š” ๋ณผ๋ฅจ ์ž‘์—…์„ Portworx CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŠธํ•˜๋Š” ์‹ฌ(shim)๊ณผ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. Portworx CSI ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์„ค์น˜ ๋ฐ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • CSINodeExpandSecret: CSI ๋“œ๋ผ์ด๋ฒ„๊ฐ€ NodeExpandVolume ์ž‘์—… ์ˆ˜ํ–‰ ์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œํฌ๋ฆฟ ์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ๋“œ๋ผ์ด๋ฒ„์— ์ „์†ก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
  • CSIStorageCapacity: CSI ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„ํ•  ๋•Œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰์„ ์ฐธ๊ณ ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ csi ๋ณผ๋ฅจ ์œ ํ˜• ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • CSIVolumeHealth: ๋…ธ๋“œ์—์„œ์˜ CSI ๋ณผ๋ฅจ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • ContextualLogging: ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด, ์ปจํ…์Šค์ธ„์–ผ ๋กœ๊น…์„ ์ง€์›ํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋กœ๊ทธ ์ถœ๋ ฅ์— ์ถ”๊ฐ€ ์ƒ์„ธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ControllerManagerLeaderMigration: kube-controller-manager ๋ฐ cloud-controller-manager์— ๋Œ€ํ•œ ๋ฆฌ๋” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง€์›ํ•œ๋‹ค.
  • CronJobTimeZone: ํฌ๋ก ์žก์˜ ์„ ํƒ์  timeZone ํ•„๋“œ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • CustomCPUCFSQuotaPeriod: kubelet config์—์„œ cpuCFSQuotaPeriod ๋ฅผ ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • CustomResourceValidationExpressions: x-kubernetes-validations ํ™•์žฅ ๊ธฐ๋Šฅ์œผ๋กœ ์ž‘์„ฑ๋œ ๊ฒ€์ฆ ๊ทœ์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ‘œํ˜„ ์–ธ์–ด ๊ฒ€์ฆ(expression language validation)์„ CRD์— ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • DaemonSetUpdateSurge: ๋…ธ๋“œ๋‹น ์—…๋ฐ์ดํŠธ ์ค‘ ๊ฐ€์šฉ์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋ฐ๋ชฌ์…‹ ์›Œํฌ๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค. ๋ฐ๋ชฌ์…‹์—์„œ ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • DefaultPodTopologySpread: PodTopologySpread ์Šค์ผ€์ค„๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ถ„๋ฐฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • DelegateFSGroupToCSIDriver: CSI ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ง€์›ํ•  ๊ฒฝ์šฐ, NodeStageVolume ๋ฐ NodePublishVolume CSI ํ˜ธ์ถœ์„ ํ†ตํ•ด fsGroup๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํŒŒ๋“œ์˜ securityContext์—์„œ fsGroup๋ฅผ ๋“œ๋ผ์ด๋ธŒ์— ์ ์šฉํ•˜๋Š” ์—ญํ• ์„ ์œ„์ž„ํ•œ๋‹ค.
  • DevicePlugins: ๋…ธ๋“œ์—์„œ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋ฐ˜ ๋ฆฌ์†Œ์Šค ํ”„๋กœ๋น„์ €๋‹์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • DisableAcceleratorUsageMetrics: kubelet์ด ์ˆ˜์ง‘ํ•œ ์•ก์…€๋Ÿฌ๋ ˆ์ดํ„ฐ ์ง€ํ‘œ ๋น„ํ™œ์„ฑํ™”.
  • DisableCloudProviders: kube-apiserver, kube-controller-manager, --cloud-provider ์ปดํฌ๋„ŒํŠธ ํ”Œ๋ž˜๊ทธ์™€ ๊ด€๋ จ๋œ kubelet์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • DisableKubeletCloudCredentialProviders: ์ด๋ฏธ์ง€ ํ’€ ํฌ๋ฆฌ๋ด์…œ์„ ์œ„ํ•ด ํด๋ผ์šฐ๋“œ ํ”„๋กœ๋ฐ”์ด๋” ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” kubelet ๋‚ด๋ถ€(in-tree) ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • DownwardAPIHugePages: ๋‹ค์šด์›Œ๋“œ API์—์„œ hugepages ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • DryRun: ์„œ๋ฒ„ ์ธก์˜ dry run ์š”์ฒญ์„ ์š”์ฒญ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋ณ‘ํ•ฉ ๋ฐ ๋ณ€ํ™”๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • DynamicKubeletConfig: kubelet์˜ ๋™์  ๊ตฌ์„ฑ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ง€์›ํ•˜๋Š” ๋ฒ„์ „ ์ฐจ์ด(supported skew policy) ๋ฐ”๊นฅ์—์„œ๋Š” ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” 1.24์— kubelet์—์„œ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค. kubelet ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • EndpointSliceTerminatingCondition: ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค terminating ๋ฐ serving ์กฐ๊ฑด ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • EfficientWatchResumption: ์Šคํ† ๋ฆฌ์ง€์—์„œ ์ƒ์„ฑ๋œ ๋ถ๋งˆํฌ(์ง„ํ–‰ ์•Œ๋ฆผ) ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ์‹œ ์ž‘์—…์—๋งŒ ์ ์šฉ๋œ๋‹ค.
  • EphemeralContainers: ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • EventedPLEG: kubelet์ด CRI์— ๋Œ€ํ•œ ํ™•์žฅ(extension)์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์œผ๋กœ๋ถ€ํ„ฐ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ดํ”„์‚ฌ์ดํด ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค(PLEG๋Š” โ€œPod lifecycle event generatorโ€์˜ ์•ฝ์ž). ์ด ๊ธฐ๋Šฅ์ด ํšจ๊ณผ์ ์ด๋ ค๋ฉด, ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์˜ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ดํ”„์‚ฌ์ดํด ์ด๋ฒคํŠธ ๊ธฐ๋Šฅ๋„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์ด ์ปจํ…Œ์ด๋„ˆ ๋ผ์ดํ”„์‚ฌ์ดํด ์ด๋ฒคํŠธ ์ง€์› ์—ฌ๋ถ€๋ฅผ ์˜ฅ์‹œํ•˜์ง€ ์•Š์œผ๋ฉด, kubelet์€ ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋”๋ผ๋„ ์ž๋™์œผ๋กœ ๊ธฐ์กด(legacy) ์ผ๋ฐ˜ PLEG ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ „ํ™˜ํ•œ๋‹ค.
  • ExecProbeTimeout : kubelet์ด exec ํ”„๋กœ๋ธŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ๊ธฐ์กด ์›Œํฌ๋กœ๋“œ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ exec ํ”„๋กœ๋ธŒ ์ œํ•œ ์‹œ๊ฐ„์„ ๋ฌด์‹œํ•œ ํ˜„์žฌ ์ˆ˜์ •๋œ ๊ฒฐํ•จ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์กด์žฌํ•œ๋‹ค. ์ค€๋น„์„ฑ ํ”„๋กœ๋ธŒ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • ExpandCSIVolumes: CSI ๋ณผ๋ฅจ ํ™•์žฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • ExpandedDNSConfig: ๋” ๋งŽ์€ DNS ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ์™€ ๋” ๊ธด DNS ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด kubelet๊ณผ kube-apiserver๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์ด ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค(Containerd: v1.5.6 ์ด์ƒ, CRI-O: v1.22 ์ด์ƒ). ํ™•์žฅ๋œ DNS ๊ตฌ์„ฑ์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • ExpandInUsePersistentVolumes: ์‚ฌ์šฉ ์ค‘์ธ PVC๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ ์ค‘์ธ ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„ ํฌ๊ธฐ ์กฐ์ •์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • ExpandPersistentVolumes: ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ ํ™•์žฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ ํด๋ ˆ์ž„ ํ™•์žฅ์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • ExperimentalHostUserNamespaceDefaulting: ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ˜ธ์ŠคํŠธ๋กœ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ํ˜ธ์ŠคํŠธ ๋งˆ์šดํŠธ, ๊ถŒํ•œ์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ํŠน์ • ๋น„-๋„ค์ž„์ŠคํŽ˜์ด์Šค(non-namespaced) ๊ธฐ๋Šฅ(์˜ˆ: MKNODE, SYS_MODULE ๋“ฑ)์„ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ๋„์ปค ๋ฐ๋ชฌ์—์„œ ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์žฌ ๋งคํ•‘์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋งŒ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค.
  • GracefulNodeShutdown : kubelet์—์„œ ์ •์ƒ ์ข…๋ฃŒ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์‹œ์Šคํ…œ ์ข…๋ฃŒ ์ค‘์— kubelet์€ ์ข…๋ฃŒ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Graceful Node Shutdown์„ ์ฐธ์กฐํ•œ๋‹ค.
  • GracefulNodeShutdownBasedOnPodPriority: ๊ทธ๋ ˆ์ด์Šคํ’€(graceful) ๋…ธ๋“œ ์…ง๋‹ค์šด์„ ํ•  ๋•Œ kubelet์ด ํŒŒ๋“œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • GRPCContainerProbe: ํ™œ์„ฑ ํ”„๋กœ๋ธŒ(Liveness Probe), ์ค€๋น„์„ฑ ํ”„๋กœ๋ธŒ(Readiness Probe), ์Šคํƒ€ํŠธ์—… ํ”„๋กœ๋ธŒ(Startup Probe)์— ๋Œ€ํ•ด gRPC ํ”„๋กœ๋ธŒ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ํ™œ์„ฑ/์ค€๋น„์„ฑ/์Šคํƒ€ํŠธ์—… ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • HonorPVReclaimPolicy: ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ ํšŒ์ˆ˜ ์ •์ฑ…์ด Delete์ธ ๊ฒฝ์šฐ PV-PVC ์‚ญ์ œ ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ์ •์ฑ…์„ ์ค€์ˆ˜ํ•œ๋‹ค. ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ ์‚ญ์ œ ๋ณดํ˜ธ ํŒŒ์ด๋„๋ผ์ด์ €(finalizer) ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • HPAContainerMetrics: HorizontalPodAutoscaler ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋Œ€์ƒ ํŒŒ๋“œ์˜ ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™•์žฅํ•œ๋‹ค.
  • HPAScaleToZero: ์‚ฌ์šฉ์ž ์ •์˜ ๋˜๋Š” ์™ธ๋ถ€ ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ๋•Œ HorizontalPodAutoscaler ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด minReplicas ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  • IPTablesOwnershipCleanup: ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด kubelet์ด ๋” ์ด์ƒ ๋ ˆ๊ฑฐ์‹œ IPTables ๊ทœ์น™์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
  • IdentifyPodOS: ํŒŒ๋“œ OS ํ•„๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด API ์„œ๋ฒ„ ๊ด€๋ฆฌ ์‹œ ํŒŒ๋“œ์˜ OS๋ฅผ ์ •์„์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.34์—์„œ, pod.spec.os.name ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ windows ์™€ linux ์ด๋‹ค.
  • IndexedJob: ์žก ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํŒŒ๋“œ ์™„๋ฃŒ(completion)๋ฅผ ์™„๋ฃŒ ์ธ๋ฑ์Šค์— ๋”ฐ๋ผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.
  • InTreePluginAWSUnregister: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์— aws-ebs ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•œ๋‹ค.
  • InTreePluginAzureDiskUnregister: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์— azuredisk ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•œ๋‹ค.
  • InTreePluginAzureFileUnregister: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์— azurefile ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•œ๋‹ค.
  • InTreePluginGCEUnregister: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์— gce-pd ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•œ๋‹ค.
  • InTreePluginOpenStackUnregister: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์— ์˜คํ”ˆ์Šคํƒ cinder ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•œ๋‹ค.
  • InTreePluginPortworxUnregister: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์— Portworx ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•œ๋‹ค.
  • InTreePluginRBDUnregister: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์— RBD ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•œ๋‹ค.
  • InTreePluginvSphereUnregister: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์— vSphere ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•œ๋‹ค.
  • JobMutableNodeSchedulingDirectives: ์žก์˜ ํŒŒ๋“œ ํ…œํ”Œ๋ฆฟ์— ์žˆ๋Š” ๋…ธ๋“œ ์Šค์ผ€์ค„๋ง ์ง€์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • JobPodFailurePolicy: ์‚ฌ์šฉ์ž๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋‚˜ ํŒŒ๋“œ ์ƒํƒœ์— ๋”ฐ๋ผ ํŒŒ๋“œ์˜ ์žฅ์• ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • JobReadyPods: ํŒŒ๋“œ ์ปจ๋””์…˜์ด Ready์ธ ํŒŒ๋“œ์˜ ์ˆ˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. Ready์ธ ํŒŒ๋“œ์˜ ์ˆ˜๋Š” ์žก ์ƒํƒœ์˜ status ํ•„๋“œ์— ๊ธฐ๋ก๋œ๋‹ค.
  • JobTrackingWithFinalizers: ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฌด์ œํ•œ์œผ๋กœ ๋‚จ์•„ ์žˆ๋Š” ํŒŒ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์žก์˜ ์™„๋ฃŒ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์žก ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์™„๋ฃŒ๋œ ํŒŒ๋“œ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์™„๋ฃŒ๋œ ํŒŒ๋“œ์˜ ์žก ์ƒํƒœ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • KMSv2: ์ €์žฅ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”(encryption at rest)๋ฅผ ์œ„ํ•œ KMS v2 API๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” KMS ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”ํ•˜๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • KubeletCredentialProviders: ์ด๋ฏธ์ง€ ํ’€ ์ž๊ฒฉ ์ฆ๋ช…์— ๋Œ€ํ•ด kubelet exec ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • KubeletInUserNamespace: user namespace์—์„œ kubelet ์‹คํ–‰์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ์œ ์ €๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋…ธ๋“œ ์ปดํฌ๋„ŒํŠธ ์‹คํ–‰์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • KubeletPodResources: kubelet์˜ ํŒŒ๋“œ ๋ฆฌ์†Œ์Šค gPRC ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์žฅ์น˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€์›์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • KubeletPodResourcesGetAllocatable: kubelet์˜ ํŒŒ๋“œ ๋ฆฌ์†Œ์Šค GetAllocatableResources ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ด API๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋…ธ๋“œ์˜ ์—ฌ์œ  ์ปดํ“จํŒ… ์ž์›์„ ์ž˜ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก, ํ• ๋‹น ๊ฐ€๋Šฅ ์ž์›์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž์› ํ• ๋‹น ๋ณด๊ณ ํ•œ๋‹ค.
  • KubeletTracing: kubelet์— ๋ถ„์‚ฐ ์ถ”์ ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ, kubelet CRI ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ธ์ฆ๋œ http ์„œ๋ฒ„๋“ค์€ OpenTelemetry ์ถ”์  ๋ฒ”์œ„๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ถ”์  ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • LegacyServiceAccountTokenNoAutoGeneration: ์‹œํฌ๋ฆฟ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ์˜ ์ž๋™ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•œ๋‹ค.
  • LegacyServiceAccountTokenTracking: ์‹œํฌ๋ฆฟ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ์˜ ์‚ฌ์šฉ์„ ์ถ”์ ํ•œ๋‹ค.
  • LocalStorageCapacityIsolation: ๋กœ์ปฌ ์ž„์‹œ ์Šคํ† ๋ฆฌ์ง€์™€ emptyDir ๋ณผ๋ฅจ์˜ sizeLimit ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • LocalStorageCapacityIsolationFSQuotaMonitoring: ๋กœ์ปฌ ์ž„์‹œ ์Šคํ† ๋ฆฌ์ง€์— LocalStorageCapacityIsolation ์ด ํ™œ์„ฑํ™”๋˜๊ณ  emptyDir ๋ณผ๋ฅจ์˜ ๋ฐฑ์—… ํŒŒ์ผ์‹œ์Šคํ…œ์ด ํ”„๋กœ์ ํŠธ ์ฟผํ„ฐ๋ฅผ ์ง€์›ํ•˜๊ณ  ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ, ํŒŒ์ผ์‹œ์Šคํ…œ ์‚ฌ์šฉ๋ณด๋‹ค๋Š” ํ”„๋กœ์ ํŠธ ์ฟผํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ emptyDir ๋ณผ๋ฅจ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์ •ํ™•์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
  • LogarithmicScaleDown: ์ปจํŠธ๋กค๋Ÿฌ ์Šค์ผ€์ผ ๋‹ค์šด ์‹œ์— ํŒŒ๋“œ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋กœ๊ทธ ์Šค์ผ€์ผ๋กœ ๋ฒ„์ผ“ํ™”ํ•˜์—ฌ ์ถ•์ถœํ•  ํŒŒ๋“œ๋ฅผ ๋ฐ˜-๋žœ๋คํ•˜๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ธฐ๋ฒ•์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • MatchLabelKeysInPodTopologySpread: ํŒŒ๋“œ ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์˜ matchLabelKeys ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • MaxUnavailableStatefulSet: ์Šคํ…Œ์ดํŠธํ’€์…‹์˜ ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ „๋žต์— ๋Œ€ํ•ด maxUnavailable ํ•„๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด ํ•„๋“œ๋Š” ์—…๋ฐ์ดํŠธ ๋™์•ˆ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ(unavailable) ์ƒํƒœ์˜ ํŒŒ๋“œ๋ฅผ ๋ช‡ ๊ฐœ๊นŒ์ง€ ํ—ˆ์šฉํ• ์ง€๋ฅผ ์ •ํ•œ๋‹ค.
  • MemoryManager: NUMA ํ† ํด๋กœ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • MemoryQoS: cgroup v2 ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ/์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ๋ฐ ์‚ฌ์šฉ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.
  • MinDomainsInPodTopologySpread: ํŒŒ๋“œ ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด ๋‚ด์˜ minDomains ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • MixedProtocolLBService: ๋™์ผํ•œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์œ ํ˜• ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค์—์„œ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • MultiCIDRRangeAllocator: MultiCIDR ๋ฒ”์œ„ ํ• ๋‹น๊ธฐ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • NetworkPolicyEndPort: ๋„คํŠธ์›Œํฌํด๋ฆฌ์‹œ(NetworkPolicy) ์˜ค๋ธŒ์ ํŠธ์—์„œ ๋‹จ์ผ ํฌํŠธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ ๋Œ€์‹ ์— ํฌํŠธ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก, endPort ํ•„๋“œ์˜ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • NetworkPolicyStatus: ๋„คํŠธ์›Œํฌํด๋ฆฌ์‹œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด status ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • NodeInclusionPolicyInPodTopologySpread: ํŒŒ๋“œ ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ๋น„๋Œ€์นญ๋„๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํŒŒ๋“œ ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์˜ nodeAffinityPolicy์™€ nodeTaintsPolicy๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • NodeOutOfServiceVolumeDetach: ๋…ธ๋“œ๊ฐ€ node.kubernetes.io/out-of-service ํ…Œ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๋ถˆ๊ฐ€(out-of-service)๋กœ ํ‘œ์‹œ๋˜๋ฉด, ๋…ธ๋“œ์— ์žˆ๋˜ ์ด ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ๋“œ๋Š” ๊ฐ•์ œ๋กœ ์‚ญ์ œ๋˜๋ฉฐ, ์ข…๋ฃŒ๋˜๋Š” ํŒŒ๋“œ์— ๋Œ€ํ•œ ๋ณผ๋ฅจ ํ•ด์ œ(detach) ๋™์ž‘๋„ ์ฆ‰์‹œ ์ˆ˜ํ–‰๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ์‚ญ์ œ๋œ ํŒŒ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ๋น ๋ฅด๊ฒŒ ๋ณต๊ตฌ๋  ์ˆ˜ ์žˆ๋‹ค.
  • NodeSwap: ๋…ธ๋“œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์›Œํฌ๋กœ๋“œ์šฉ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ ค๋ฉด kubelet์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ KubeletConfiguration.failSwapOn๋ฅผ false๋กœ ์„ค์ •ํ•œ ํ›„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • NonPreemptingPriority: ํ”„๋ผ์ด์–ด๋ฆฌํ‹ฐํด๋ž˜์Šค(PriorityClass)์™€ ํŒŒ๋“œ์— preemptionPolicy ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • OpenAPIEnums: API ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฆฌํ„ด๋œ ์ŠคํŽ™ ๋‚ด OpenAPI ์Šคํ‚ค๋งˆ์˜ "enum" ํ•„๋“œ ์ฑ„์šฐ๊ธฐ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • OpenAPIV3: API ์„œ๋ฒ„์˜ OpenAPI v3 ๋ฐœํ–‰์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • PDBUnhealthyPodEvictionPolicy: PodDisruptionBudget์˜ unhealthyPodEvictionPolicy ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ๋น„์ •์ƒ(unhealthy) ํŒŒ๋“œ๊ฐ€ ์–ด๋А ์‹œ์ ์— ์ถ•์ถœ ๋Œ€์ƒ์ด ๋ ์ง€๋ฅผ ์ด ํ•„๋“œ์— ๋ช…์‹œํ•œ๋‹ค. ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” ๋น„์ •์ƒ ํŒŒ๋“œ ์ถ•์ถœ ์ •์ฑ…์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • PodDeletionCost: ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ๋‹ค์šด์Šค์ผ€์ผ ์‹œ ์‚ญ์ œ๋  ํŒŒ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋„๋ก, ํŒŒ๋“œ ์‚ญ์ œ ๋น„์šฉ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • PodAffinityNamespaceSelector: ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์…€๋ ‰ํ„ฐ ๊ธฐ๋Šฅ๊ณผ CrossNamespacePodAffinity ์ฟผํ„ฐ ๋ฒ”์œ„ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • PodAndContainerStatsFromCRI: kubelet์ด ์ปจํ…Œ์ด๋„ˆ์™€ ํŒŒ๋“œ์— ๋Œ€ํ•œ ํ†ต๊ณ„์น˜๋“ค์„ cAdvisor๊ฐ€ ์•„๋‹Œ CRI ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์œผ๋กœ๋ถ€ํ„ฐ ์ˆ˜์ง‘ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.
  • PodDisruptionConditions: ์ค‘๋‹จ(disruption)์œผ๋กœ ์ธํ•ด ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŒŒ๋“œ ์ปจ๋””์…˜์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ์ง€์›ํ•œ๋‹ค.
  • PodHasNetworkCondition: kubelet์ด ํŒŒ๋“œ์— ํŒŒ๋“œ ๋„คํŠธ์›Œํฌ ์ค€๋น„์„ฑ ์ปจ๋””์…˜์„ ํ‘œ์‹œํ•˜๋„๋ก ์ง€์›ํ•œ๋‹ค.
  • PodSchedulingReadiness: ํŒŒ๋“œ์˜ ์Šค์ผ€์ค„๋ง ์ค€๋น„์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก schedulingGates ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • PodSecurity: PodSecurity ์–ด๋“œ๋ฏธ์…˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.
  • PreferNominatedNode: ์ด ํ”Œ๋ž˜๊ทธ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์กด์žฌํ•˜๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๊ฒ€์‚ฌํ•˜๊ธฐ ์ „์— ์ง€์ •๋œ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ๊ฒ€์‚ฌํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์Šค์ผ€์ค„๋Ÿฌ์— ์•Œ๋ ค์ค€๋‹ค.
  • ProbeTerminationGracePeriod: ํŒŒ๋“œ์˜ ํ”„๋กœ๋ธŒ-์ˆ˜์ค€ terminationGracePeriodSeconds ์„ค์ •ํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ๋” ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ๊ธฐ๋Šฅ๊ฐœ์„  ์ œ์•ˆ์„ ์ฐธ๊ณ ํ•œ๋‹ค.
  • ProcMountType: SecurityContext์˜ procMount ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ proc ํƒ€์ž…์˜ ๋งˆ์šดํŠธ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ProxyTerminatingEndpoints: ExternalTrafficPolicy=Local์ผ ๋•Œ ์ข…๋ฃŒ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก kube-proxy๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • QOSReserved: QoS ์ˆ˜์ค€์—์„œ ๋ฆฌ์†Œ์Šค ์˜ˆ์•ฝ์„ ํ—ˆ์šฉํ•˜์—ฌ ๋‚ฎ์€ QoS ์ˆ˜์ค€์˜ ํŒŒ๋“œ๊ฐ€ ๋” ๋†’์€ QoS ์ˆ˜์ค€์—์„œ ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๋กœ ํŒŒ์—ด๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค (ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ํ•ด๋‹น).
  • ReadWriteOncePod: ReadWriteOncePod ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ ์—‘์„ธ์Šค ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • RecoverVolumeExpansionFailure: ์ด์ „์— ์‹คํŒจํ–ˆ๋˜ ๋ณผ๋ฅจ ํ™•์žฅ์œผ๋กœ๋ถ€ํ„ฐ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก, ์‚ฌ์šฉ์ž๊ฐ€ PVC๋ฅผ ๋” ์ž‘์€ ํฌ๊ธฐ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋ณผ๋ฅจ ํ™•์žฅ ์‹œ ์˜ค๋ฅ˜ ๋ณต๊ตฌ์—์„œ ์ž์„ธํ•œ ์‚ฌํ•ญ์„ ํ™•์ธํ•œ๋‹ค.
  • RemainingItemCount: API ์„œ๋ฒ„๊ฐ€ ์ฒญํฌ(chunking) ๋ชฉ๋ก ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์—์„œ ๋‚จ์€ ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.
  • RemoveSelfLink: ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ์™€ ์ฝœ๋ ‰์…˜์— ๋Œ€ํ•ด .metadata.selfLink ํ•„๋“œ๋ฅผ ๋นˆ ์นธ(๋นˆ ๋ฌธ์ž์—ด)์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด ํ•„๋“œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.16์—์„œ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด, .metadata.selfLink ํ•„๋“œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์กด์žฌํ•˜์ง€๋งŒ, ํ•ญ์ƒ ๋นˆ ์นธ์œผ๋กœ ์œ ์ง€๋œ๋‹ค.
  • RetroactiveDefaultStorageClass: ์—ฐ๊ฒฐ์ด ํ•ด์ œ๋œ(unbound) PVC์— ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค๋ฅผ ์†Œ๊ธ‰์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • RotateKubeletServerCertificate: kubelet์—์„œ ์„œ๋ฒ„ TLS ์ธ์ฆ์„œ์˜ ๋กœํ…Œ์ด์…˜์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ kubelet ๊ตฌ์„ฑ์„ ํ™•์ธํ•œ๋‹ค.
  • SELinuxMountReadWriteOncePod: kubelet์œผ๋กœ ํ•˜์—ฌ๊ธˆ, ๋ณผ๋ฅจ์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์— ๋Œ€ํ•ด SELinux ๋ ˆ์ด๋ธ”์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๋Œ€์‹  ์˜ฌ๋ฐ”๋ฅธ SELinux ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • SeccompDefault: ๋ชจ๋“  ์›Œํฌ๋กœ๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌ๋ถ„ ํ”„๋กœํŒŒ์ผ๋กœ RuntimeDefault์„ ์‚ฌ์šฉํ•œ๋‹ค. seccomp ํ”„๋กœํŒŒ์ผ์€ ํŒŒ๋“œ ๋ฐ ์ปจํ…Œ์ด๋„ˆ securityContext์— ์ง€์ •๋˜์–ด ์žˆ๋‹ค.
  • SELinuxMountReadWriteOncePod: kubelet์œผ๋กœ ํ•˜์—ฌ๊ธˆ, ๋ณผ๋ฅจ์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์— ๋Œ€ํ•ด SELinux ๋ ˆ์ด๋ธ”์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๋Œ€์‹  ์˜ฌ๋ฐ”๋ฅธ SELinux ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • ServerSideApply: API ์„œ๋ฒ„์—์„œ SSA(Sever Side Apply) ๊ฒฝ๋กœ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • ServerSideFieldValidation: ์„œ๋ฒ„-์‚ฌ์ด๋“œ(server-side) ํ•„๋“œ ๊ฒ€์ฆ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ด๋Š” ๋ฆฌ์†Œ์Šค ์Šคํ‚ค๋งˆ์˜ ๊ฒ€์ฆ์ด ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ(์˜ˆ: kubectl create ๋˜๋Š” kubectl apply ๋ช…๋ น์ค„)๊ฐ€ ์•„๋‹ˆ๋ผ API ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ˆ˜ํ–‰๋จ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ServiceInternalTrafficPolicy: ์„œ๋น„์Šค์—์„œ internalTrafficPolicy ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • ServiceLBNodePortControl: ์„œ๋น„์Šค์—์„œ allocateLoadBalancerNodePorts ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • ServiceLoadBalancerClass: ์„œ๋น„์Šค์—์„œ loadBalancerClass ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๊ตฌํ˜„์ฒด์˜ ์ข…๋ฅ˜ ํ™•์ธํ•˜๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • ServiceIPStaticSubrange: ClusterIP ๋ฒ”์œ„๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ์„œ๋น„์Šค ClusterIP ํ• ๋‹น ์ „๋žต์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ClusterIP ๋™์  ํ• ๋‹น์„ ์ฃผ๋กœ ์ƒ์œ„ ๋ฒ”์œ„์—์„œ ์ˆ˜ํ–‰ํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ์ • ClusterIP๋ฅผ ํ•˜์œ„ ๋ฒ”์œ„์—์„œ ํ• ๋‹นํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋„ ์ถฉ๋Œ ํ™•๋ฅ ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค. ๋” ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • SizeMemoryBackedVolumes: memory-backed ๋ณผ๋ฅจ(๋ณดํ†ต emptyDir ๋ณผ๋ฅจ)์˜ ํฌ๊ธฐ ์ƒํ•œ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก kubelets๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • StatefulSetMinReadySeconds: ์Šคํ…Œ์ดํŠธํ’€์…‹ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ minReadySeconds๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • StatefulSetStartOrdinal: ์Šคํ…Œ์ดํŠธํ’€์…‹ ๋‚ด์—์„œ ์‹œ์ž‘ ์„œ์ˆ˜(start ordinal)๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ ์„œ์ˆ˜๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • StorageVersionAPI: ์Šคํ† ๋ฆฌ์ง€ ๋ฒ„์ „ API๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • StorageVersionHash: API ์„œ๋ฒ„๊ฐ€ ๋””์Šค์ปค๋ฒ„๋ฆฌ์—์„œ ์Šคํ† ๋ฆฌ์ง€ ๋ฒ„์ „ ํ•ด์‹œ๋ฅผ ๋…ธ์ถœํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.
  • SuspendJob: ์žก ์ค‘์ง€/์žฌ์‹œ์ž‘ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์žก ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • TopologyAwareHints: ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค(EndpointSlices)์—์„œ ํ† ํด๋กœ์ง€ ํžŒํŠธ ๊ธฐ๋ฐ˜ ํ† ํด๋กœ์ง€-์–ด์›จ์–ด ๋ผ์šฐํŒ…์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ† ํด๋กœ์ง€ ์ธ์ง€ ํžŒํŠธ ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • TopologyManager: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์„ธ๋ถ„ํ™”๋œ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค ํ• ๋‹น์„ ์กฐ์ •ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ๋…ธ๋“œ์˜ ํ† ํด๋กœ์ง€ ๊ด€๋ฆฌ ์ •์ฑ… ์ œ์–ด๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
  • TopologyManagerPolicyAlphaOptions: ํ† ํด๋กœ์ง€ ๋งค๋‹ˆ์ € ํด๋ฆฌ์‹œ(topology manager policy)์˜ ์‹คํ—˜์ ์ด๊ณ  ์•ŒํŒŒ ํ’ˆ์งˆ์ธ ์˜ต์…˜์˜ ๋ฏธ์„ธ ์กฐ์ • ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ํ’ˆ์งˆ ์ˆ˜์ค€์ด ์•ŒํŒŒ ์ƒํƒœ์ธ ํ† ํด๋กœ์ง€ ๋งค๋‹ˆ์ € ์˜ต์…˜ ๊ตฐ์„ ์ œ์–ดํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ์•ž์œผ๋กœ๋„ ๋ฒ ํƒ€ ๋˜๋Š” ์•ˆ์ • ์ƒํƒœ๋กœ ์Šน๊ธ‰๋˜์ง€ ์•Š๋Š”๋‹ค.
  • TopologyManagerPolicyBetaOptions: ํ† ํด๋กœ์ง€ ๋งค๋‹ˆ์ € ํด๋ฆฌ์‹œ(topology manager policy)์˜ ์‹คํ—˜์ ์ด๊ณ  ๋ฒ ํƒ€ ํ’ˆ์งˆ์ธ ์˜ต์…˜์˜ ๋ฏธ์„ธ ์กฐ์ • ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ํ’ˆ์งˆ ์ˆ˜์ค€์ด ๋ฒ ํƒ€ ์ƒํƒœ์ธ ํ† ํด๋กœ์ง€ ๋งค๋‹ˆ์ € ์˜ต์…˜ ๊ตฐ์„ ์ œ์–ดํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ์•ž์œผ๋กœ๋„ ์•ˆ์ • ์ƒํƒœ๋กœ ์Šน๊ธ‰๋˜์ง€ ์•Š๋Š”๋‹ค.
  • TopologyManagerPolicyOptions: ํ† ํด๋กœ์ง€ ๋งค๋‹ˆ์ € ํด๋ฆฌ์‹œ(topology manager policy)์˜ ๋ฏธ์„ธ ์กฐ์ • ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • UserNamespacesStatelessPodsSupport: ์Šคํ…Œ์ดํŠธ๋ฆฌ์Šค(stateless) ํŒŒ๋“œ์— ๋Œ€ํ•œ ์œ ์ € ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ง€์› ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • ValidatingAdmissionPolicy: ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค์— CEL(Common Expression Language) ๊ฒ€์ฆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ValidatingAdmissionPolicy ์ง€์› ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • VolumeCapacityPriority: ๊ฐ€์šฉ PV ์šฉ๋Ÿ‰์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ํ† ํด๋กœ์ง€์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • WatchBookmark: ๊ฐ์‹œ์ž ๋ถ๋งˆํฌ(watch bookmark) ์ด๋ฒคํŠธ ์ง€์›์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.
  • WinDSR: kube-proxy๊ฐ€ ์œˆ๋„์šฐ์šฉ DSR ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • WinOverlay: kube-proxy๊ฐ€ ์œˆ๋„์šฐ์šฉ ์˜ค๋ฒ„๋ ˆ์ด ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • WindowsHostProcessContainers: ์œˆ๋„์šฐ HostProcess ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ง€์›์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

  • ์‚ฌ์šฉ ์ค‘๋‹จ ์ •์ฑ…์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.24๋ถ€ํ„ฐ, ์ƒˆ๋กœ์šด ๋ฒ ํƒ€ API๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. ๋ฒ ํƒ€ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, ์—ฐ๊ด€๋œ API ๋ฆฌ์†Œ์Šค๋„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, storage.k8s.io/v1beta1/csistoragecapacities์™€ ๊ฐ™์€ ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, --runtime-config=storage.k8s.io/v1beta1/csistoragecapacities๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์ƒ์„ธ ์‚ฌํ•ญ์€ API ๋ฒ„์ „ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•œ๋‹ค.

11.2 - ์ œ๊ฑฐ๋œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ

์ด ํŽ˜์ด์ง€๋Š” ๊ทธ๊ฐ„ ์ œ๊ฑฐ๋œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ์˜ ๋ชฉ๋ก์„ ๋‚˜์—ดํ•œ๋‹ค. ์ด ํŽ˜์ด์ง€์˜ ์ •๋ณด๋Š” ์ฐธ๊ณ ์šฉ์ด๋‹ค. ์ œ๊ฑฐ๋œ(removed) ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ๋” ์ด์ƒ ์œ ํšจํ•œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋กœ ์ธ์‹๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์กธ์—…(GA'ed)์ด๋‚˜ ์‚ฌ์šฉ ์ค‘๋‹จ๋œ(deprecated) ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ์™€ ๋‹ค๋ฅด๋‹ค. ๋ฐ˜๋ฉด, ์Šน๊ธ‰๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์ค‘๋‹จ๋œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋Š” ๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ธ์‹ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์–ด๋– ํ•œ ๋™์ž‘ ์ฐจ์ด๋„ ์œ ๋ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ๋ณด๋ ค๋ฉด, ์•ŒํŒŒ/๋ฒ ํƒ€ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ํ‘œ ๋˜๋Š” ์Šน๊ธ‰/์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์ œ๊ฑฐ๋œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ

๋‹ค์Œ์€ ์•„๋ž˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค.

  • "๋„์ž…" ์—ด์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์ฒ˜์Œ ๋„์ž…๋˜๊ฑฐ๋‚˜ ๋ฆด๋ฆฌ์Šค ๋‹จ๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆด๋ฆฌ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • "์ข…๋ฃŒ" ์—ด์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆด๋ฆฌ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋งŒ์•ฝ ๊ธฐ๋Šฅ ๋‹จ๊ณ„๊ฐ€ "์‚ฌ์šฉ ์ค‘๋‹จ" ๋˜๋Š” "GA" ๋ผ๋ฉด, "์ข…๋ฃŒ" ์—ด์˜ ๊ฐ’์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ๋œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆด๋ฆฌ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
์ œ๊ฑฐ๋œ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ
๊ธฐ๋Šฅ๋””ํดํŠธ๋‹จ๊ณ„๋„์ž…์ข…๋ฃŒ
Acceleratorsfalse์•ŒํŒŒ1.61.10
Accelerators-์‚ฌ์šฉ ์ค‘๋‹จ1.111.11
AffinityInAnnotationsfalse์•ŒํŒŒ1.61.7
AffinityInAnnotations-์‚ฌ์šฉ ์ค‘๋‹จ1.81.8
AllowExtTrafficLocalEndpointsfalse๋ฒ ํƒ€1.41.6
AllowExtTrafficLocalEndpointstrueGA1.71.9
AttachVolumeLimitfalse์•ŒํŒŒ1.111.11
AttachVolumeLimittrue๋ฒ ํƒ€1.121.16
AttachVolumeLimittrueGA1.171.21
BalanceAttachedNodeVolumesfalse์•ŒํŒŒ1.111.21
BalanceAttachedNodeVolumesfalse์‚ฌ์šฉ ์ค‘๋‹จ1.221.22
BlockVolumefalse์•ŒํŒŒ1.91.12
BlockVolumetrue๋ฒ ํƒ€1.131.17
BlockVolumetrueGA1.181.21
BoundServiceAccountTokenVolumefalse์•ŒํŒŒ1.131.20
BoundServiceAccountTokenVolumetrue๋ฒ ํƒ€1.211.21
BoundServiceAccountTokenVolumetrueGA1.221.23
CRIContainerLogRotationfalse์•ŒํŒŒ1.101.10
CRIContainerLogRotationtrue๋ฒ ํƒ€1.111.20
CRIContainerLogRotationtrueGA1.211.22
CSIBlockVolumefalse์•ŒํŒŒ1.111.13
CSIBlockVolumetrue๋ฒ ํƒ€1.141.17
CSIBlockVolumetrueGA1.181.21
CSIDriverRegistryfalse์•ŒํŒŒ1.121.13
CSIDriverRegistrytrue๋ฒ ํƒ€1.141.17
CSIDriverRegistrytrueGA1.181.21
CSIMigrationAWSCompletefalse์•ŒํŒŒ1.171.20
CSIMigrationAWSComplete-์‚ฌ์šฉ ์ค‘๋‹จ1.211.21
CSIMigrationAzureDiskCompletefalse์•ŒํŒŒ1.171.20
CSIMigrationAzureDiskComplete-์‚ฌ์šฉ ์ค‘๋‹จ1.211.21
CSIMigrationAzureFileCompletefalse์•ŒํŒŒ1.171.20
CSIMigrationAzureFileComplete-์‚ฌ์šฉ ์ค‘๋‹จ1.211.21
CSIMigrationGCECompletefalse์•ŒํŒŒ1.171.20
CSIMigrationGCEComplete-์‚ฌ์šฉ ์ค‘๋‹จ1.211.21
CSIMigrationOpenStackCompletefalse์•ŒํŒŒ1.171.20
CSIMigrationOpenStackComplete-์‚ฌ์šฉ ์ค‘๋‹จ1.211.21
CSIMigrationvSphereCompletefalse๋ฒ ํƒ€1.191.21
CSIMigrationvSphereComplete-์‚ฌ์šฉ ์ค‘๋‹จ1.221.22
CSINodeInfofalse์•ŒํŒŒ1.121.13
CSINodeInfotrue๋ฒ ํƒ€1.141.16
CSINodeInfotrueGA1.171.22
CSIPersistentVolumefalse์•ŒํŒŒ1.91.9
CSIPersistentVolumetrue๋ฒ ํƒ€1.101.12
CSIPersistentVolumetrueGA1.131.16
CSIServiceAccountTokenfalse์•ŒํŒŒ1.201.20
CSIServiceAccountTokentrue๋ฒ ํƒ€1.211.21
CSIServiceAccountTokentrueGA1.221.24
CSIVolumeFSGroupPolicyfalse์•ŒํŒŒ1.191.19
CSIVolumeFSGroupPolicytrue๋ฒ ํƒ€1.201.22
CSIVolumeFSGroupPolicytrueGA1.231.25
ConfigurableFSGroupPolicyfalse์•ŒํŒŒ1.181.19
ConfigurableFSGroupPolicytrue๋ฒ ํƒ€1.201.22
ConfigurableFSGroupPolicytrueGA1.231.25
CronJobControllerV2false์•ŒํŒŒ1.201.20
CronJobControllerV2true๋ฒ ํƒ€1.211.21
CronJobControllerV2trueGA1.221.23
CSRDurationtrue๋ฒ ํƒ€1.221.23
CSRDurationtrueGA1.241.25
CustomPodDNSfalse์•ŒํŒŒ1.91.9
CustomPodDNStrue๋ฒ ํƒ€1.101.13
CustomPodDNStrueGA1.141.16
CustomResourceDefaultingfalse์•ŒํŒŒ1.151.15
CustomResourceDefaultingtrue๋ฒ ํƒ€1.161.16
CustomResourceDefaultingtrueGA1.171.18
CustomResourcePublishOpenAPIfalse์•ŒํŒŒ1.141.14
CustomResourcePublishOpenAPItrue๋ฒ ํƒ€1.151.15
CustomResourcePublishOpenAPItrueGA1.161.18
CustomResourceSubresourcesfalse์•ŒํŒŒ1.101.10
CustomResourceSubresourcestrue๋ฒ ํƒ€1.111.15
CustomResourceSubresourcestrueGA1.161.18
CustomResourceValidationfalse์•ŒํŒŒ1.81.8
CustomResourceValidationtrue๋ฒ ํƒ€1.91.15
CustomResourceValidationtrueGA1.161.18
CustomResourceWebhookConversionfalse์•ŒํŒŒ1.131.14
CustomResourceWebhookConversiontrue๋ฒ ํƒ€1.151.15
CustomResourceWebhookConversiontrueGA1.161.18
DynamicAuditingfalse์•ŒํŒŒ1.131.18
DynamicAuditing-์‚ฌ์šฉ ์ค‘๋‹จ1.191.19
DynamicProvisioningSchedulingfalse์•ŒํŒŒ1.111.11
DynamicProvisioningScheduling-์‚ฌ์šฉ ์ค‘๋‹จ1.12-
DynamicVolumeProvisioningtrue์•ŒํŒŒ1.31.7
DynamicVolumeProvisioningtrueGA1.81.12
EnableAggregatedDiscoveryTimeouttrue์‚ฌ์šฉ ์ค‘๋‹จ1.161.17
EnableEquivalenceClassCachefalse์•ŒํŒŒ1.81.12
EnableEquivalenceClassCache-์‚ฌ์šฉ ์ค‘๋‹จ1.131.23
EndpointSlicefalse์•ŒํŒŒ1.161.16
EndpointSlicefalse๋ฒ ํƒ€1.171.17
EndpointSlicetrue๋ฒ ํƒ€1.181.20
EndpointSlicetrueGA1.211.24
EndpointSliceNodeNamefalse์•ŒํŒŒ1.201.20
EndpointSliceNodeNametrueGA1.211.24
EndpointSliceProxyingfalse์•ŒํŒŒ1.181.18
EndpointSliceProxyingtrue๋ฒ ํƒ€1.191.21
EndpointSliceProxyingtrueGA1.221.24
EvenPodsSpreadfalse์•ŒํŒŒ1.161.17
EvenPodsSpreadtrue๋ฒ ํƒ€1.181.18
EvenPodsSpreadtrueGA1.191.21
ExperimentalCriticalPodAnnotationfalse์•ŒํŒŒ1.51.12
ExperimentalCriticalPodAnnotationfalse์‚ฌ์šฉ ์ค‘๋‹จ1.131.16
ExternalPolicyForExternalIPtrueGA1.181.22
GCERegionalPersistentDisktrue๋ฒ ํƒ€1.101.12
GCERegionalPersistentDisktrueGA1.131.16
GenericEphemeralVolumefalse์•ŒํŒŒ1.191.20
GenericEphemeralVolumetrue๋ฒ ํƒ€1.211.22
GenericEphemeralVolumetrueGA1.231.24
HugePageStorageMediumSizefalse์•ŒํŒŒ1.181.18
HugePageStorageMediumSizetrue๋ฒ ํƒ€1.191.21
HugePageStorageMediumSizetrueGA1.221.24
HugePagesfalse์•ŒํŒŒ1.81.9
HugePagestrue๋ฒ ํƒ€1.101.13
HugePagestrueGA1.141.16
HyperVContainerfalse์•ŒํŒŒ1.101.19
HyperVContainerfalse์‚ฌ์šฉ ์ค‘๋‹จ1.201.20
IPv6DualStackfalse์•ŒํŒŒ1.151.20
IPv6DualStacktrue๋ฒ ํƒ€1.211.22
IPv6DualStacktrueGA1.231.24
ImmutableEphemeralVolumesfalse์•ŒํŒŒ1.181.18
ImmutableEphemeralVolumestrue๋ฒ ํƒ€1.191.20
ImmutableEphemeralVolumestrueGA1.211.24
IngressClassNamespacedParamsfalse์•ŒํŒŒ1.211.21
IngressClassNamespacedParamstrue๋ฒ ํƒ€1.221.22
IngressClassNamespacedParamstrueGA1.231.24
Initializersfalse์•ŒํŒŒ1.71.13
Initializers-์‚ฌ์šฉ ์ค‘๋‹จ1.141.14
KubeletConfigFilefalse์•ŒํŒŒ1.81.9
KubeletConfigFile-์‚ฌ์šฉ ์ค‘๋‹จ1.101.10
KubeletPluginsWatcherfalse์•ŒํŒŒ1.111.11
KubeletPluginsWatchertrue๋ฒ ํƒ€1.121.12
KubeletPluginsWatchertrueGA1.131.16
LegacyNodeRoleBehaviorfalse์•ŒํŒŒ1.161.18
LegacyNodeRoleBehaviortrue๋ฒ ํƒ€1.191.20
LegacyNodeRoleBehaviorfalseGA1.211.22
MountContainersfalse์•ŒํŒŒ1.91.16
MountContainersfalse์‚ฌ์šฉ ์ค‘๋‹จ1.171.17
MountPropagationfalse์•ŒํŒŒ1.81.9
MountPropagationtrue๋ฒ ํƒ€1.101.11
MountPropagationtrueGA1.121.14
NamespaceDefaultLabelNametrue๋ฒ ํƒ€1.211.21
NamespaceDefaultLabelNametrueGA1.221.23
NodeDisruptionExclusionfalse์•ŒํŒŒ1.161.18
NodeDisruptionExclusiontrue๋ฒ ํƒ€1.191.20
NodeDisruptionExclusiontrueGA1.211.22
NodeLeasefalse์•ŒํŒŒ1.121.13
NodeLeasetrue๋ฒ ํƒ€1.141.16
NodeLeasetrueGA1.171.23
PVCProtectionfalse์•ŒํŒŒ1.91.9
PVCProtection-์‚ฌ์šฉ ์ค‘๋‹จ1.101.10
PersistentLocalVolumesfalse์•ŒํŒŒ1.71.9
PersistentLocalVolumestrue๋ฒ ํƒ€1.101.13
PersistentLocalVolumestrueGA1.141.16
PodDisruptionBudgetfalse์•ŒํŒŒ1.31.4
PodDisruptionBudgettrue๋ฒ ํƒ€1.51.20
PodDisruptionBudgettrueGA1.211.25
PodOverheadfalse์•ŒํŒŒ1.161.17
PodOverheadtrue๋ฒ ํƒ€1.181.23
PodOverheadtrueGA1.241.25
PodPriorityfalse์•ŒํŒŒ1.81.10
PodPrioritytrue๋ฒ ํƒ€1.111.13
PodPrioritytrueGA1.141.18
PodReadinessGatesfalse์•ŒํŒŒ1.111.11
PodReadinessGatestrue๋ฒ ํƒ€1.121.13
PodReadinessGatestrueGA1.141.16
PodShareProcessNamespacefalse์•ŒํŒŒ1.101.11
PodShareProcessNamespacetrue๋ฒ ํƒ€1.121.16
PodShareProcessNamespacetrueGA1.171.19
RequestManagementfalse์•ŒํŒŒ1.151.16
RequestManagement-์‚ฌ์šฉ ์ค‘๋‹จ1.171.17
ResourceLimitsPriorityFunctionfalse์•ŒํŒŒ1.91.18
ResourceLimitsPriorityFunction-์‚ฌ์šฉ ์ค‘๋‹จ1.191.19
ResourceQuotaScopeSelectorsfalse์•ŒํŒŒ1.111.11
ResourceQuotaScopeSelectorstrue๋ฒ ํƒ€1.121.16
ResourceQuotaScopeSelectorstrueGA1.171.18
RootCAConfigMapfalse์•ŒํŒŒ1.131.19
RootCAConfigMaptrue๋ฒ ํƒ€1.201.20
RootCAConfigMaptrueGA1.211.22
RotateKubeletClientCertificatetrue๋ฒ ํƒ€1.81.18
RotateKubeletClientCertificatetrueGA1.191.21
RunAsGrouptrue๋ฒ ํƒ€1.141.20
RunAsGrouptrueGA1.211.22
RuntimeClassfalse์•ŒํŒŒ1.121.13
RuntimeClasstrue๋ฒ ํƒ€1.141.19
RuntimeClasstrueGA1.201.24
SCTPSupportfalse์•ŒํŒŒ1.121.18
SCTPSupporttrue๋ฒ ํƒ€1.191.19
SCTPSupporttrueGA1.201.22
ScheduleDaemonSetPodsfalse์•ŒํŒŒ1.111.11
ScheduleDaemonSetPodstrue๋ฒ ํƒ€1.121.16
ScheduleDaemonSetPodstrueGA1.171.18
SelectorIndexfalse์•ŒํŒŒ1.181.18
SelectorIndextrue๋ฒ ํƒ€1.191.19
SelectorIndextrueGA1.201.25
ServiceAccountIssuerDiscoveryfalse์•ŒํŒŒ1.181.19
ServiceAccountIssuerDiscoverytrue๋ฒ ํƒ€1.201.20
ServiceAccountIssuerDiscoverytrueGA1.211.23
ServiceAppProtocolfalse์•ŒํŒŒ1.181.18
ServiceAppProtocoltrue๋ฒ ํƒ€1.191.19
ServiceAppProtocoltrueGA1.201.22
ServiceLoadBalancerFinalizerfalse์•ŒํŒŒ1.151.15
ServiceLoadBalancerFinalizertrue๋ฒ ํƒ€1.161.16
ServiceLoadBalancerFinalizertrueGA1.171.20
ServiceNodeExclusionfalse์•ŒํŒŒ1.81.18
ServiceNodeExclusiontrue๋ฒ ํƒ€1.191.20
ServiceNodeExclusiontrueGA1.211.22
ServiceTopologyfalse์•ŒํŒŒ1.171.19
ServiceTopologyfalse์‚ฌ์šฉ ์ค‘๋‹จ1.201.22
SetHostnameAsFQDNfalse์•ŒํŒŒ1.191.19
SetHostnameAsFQDNtrue๋ฒ ํƒ€1.201.21
SetHostnameAsFQDNtrueGA1.221,24
StartupProbefalse์•ŒํŒŒ1.161.17
StartupProbetrue๋ฒ ํƒ€1.181.19
StartupProbetrueGA1.201.23
StorageObjectInUseProtectiontrue๋ฒ ํƒ€1.101.10
StorageObjectInUseProtectiontrueGA1.111.24
StreamingProxyRedirectsfalse๋ฒ ํƒ€1.51.5
StreamingProxyRedirectstrue๋ฒ ํƒ€1.61.17
StreamingProxyRedirectstrue์‚ฌ์šฉ ์ค‘๋‹จ1.181.21
StreamingProxyRedirectsfalse์‚ฌ์šฉ ์ค‘๋‹จ1.221.24
SupportIPVSProxyModefalse์•ŒํŒŒ1.81.8
SupportIPVSProxyModefalse๋ฒ ํƒ€1.91.9
SupportIPVSProxyModetrue๋ฒ ํƒ€1.101.10
SupportIPVSProxyModetrueGA1.111.20
SupportNodePidsLimitfalse์•ŒํŒŒ1.141.14
SupportNodePidsLimittrue๋ฒ ํƒ€1.151.19
SupportNodePidsLimittrueGA1.201.23
SupportPodPidsLimitfalse์•ŒํŒŒ1.101.13
SupportPodPidsLimittrue๋ฒ ํƒ€1.141.19
SupportPodPidsLimittrueGA1.201.23
Sysctlstrue๋ฒ ํƒ€1.111.20
SysctlstrueGA1.211.22
TTLAfterFinishedfalse์•ŒํŒŒ1.121.20
TTLAfterFinishedtrue๋ฒ ํƒ€1.211.22
TTLAfterFinishedtrueGA1.231.24
TaintBasedEvictionsfalse์•ŒํŒŒ1.61.12
TaintBasedEvictionstrue๋ฒ ํƒ€1.131.17
TaintBasedEvictionstrueGA1.181.20
TaintNodesByConditionfalse์•ŒํŒŒ1.81.11
TaintNodesByConditiontrue๋ฒ ํƒ€1.121.16
TaintNodesByConditiontrueGA1.171.18
TokenRequestfalse์•ŒํŒŒ1.101.11
TokenRequesttrue๋ฒ ํƒ€1.121.19
TokenRequesttrueGA1.201.21
TokenRequestProjectionfalse์•ŒํŒŒ1.111.11
TokenRequestProjectiontrue๋ฒ ํƒ€1.121.19
TokenRequestProjectiontrueGA1.201.21
ValidateProxyRedirectsfalse์•ŒํŒŒ1.121.13
ValidateProxyRedirectstrue๋ฒ ํƒ€1.141.21
ValidateProxyRedirectstrue์‚ฌ์šฉ ์ค‘๋‹จ1.221.24
VolumePVCDataSourcefalse์•ŒํŒŒ1.151.15
VolumePVCDataSourcetrue๋ฒ ํƒ€1.161.17
VolumePVCDataSourcetrueGA1.181.21
VolumeSchedulingfalse์•ŒํŒŒ1.91.9
VolumeSchedulingtrue๋ฒ ํƒ€1.101.12
VolumeSchedulingtrueGA1.131.16
VolumeSnapshotDataSourcefalse์•ŒํŒŒ1.121.16
VolumeSnapshotDataSourcetrue๋ฒ ํƒ€1.171.19
VolumeSnapshotDataSourcetrueGA1.201.22
VolumeSubpathtrueGA1.101.24
VolumeSubpathEnvExpansionfalse์•ŒํŒŒ1.141.14
VolumeSubpathEnvExpansiontrue๋ฒ ํƒ€1.151.16
VolumeSubpathEnvExpansiontrueGA1.171.24
WarningHeaderstrue๋ฒ ํƒ€1.191.21
WarningHeaderstrueGA1.221.24
WindowsEndpointSliceProxyingfalse์•ŒํŒŒ1.191.20
WindowsEndpointSliceProxyingtrue๋ฒ ํƒ€1.211.21
WindowsEndpointSliceProxyingtrueGA1.221.24
WindowsGMSAfalse์•ŒํŒŒ1.141.15
WindowsGMSAtrue๋ฒ ํƒ€1.161.17
WindowsGMSAtrueGA1.181.20
WindowsRunAsUserNamefalse์•ŒํŒŒ1.161.16
WindowsRunAsUserNametrue๋ฒ ํƒ€1.171.17
WindowsRunAsUserNametrueGA1.181.20

Descriptions for removed feature gates

  • Accelerators: ๋„์ปค ์—”์ง„ ์‚ฌ์šฉ ์‹œ Nvidia GPU ์ง€์›์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ดˆ๊ธฐ ํ˜•ํƒœ๋ฅผ ์ œ๊ณตํ•˜์˜€์œผ๋ฉฐ, ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ๋Œ€์•ˆ์„ ์œ„ํ•ด์„œ๋Š” ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™•์ธํ•œ๋‹ค.

  • AffinityInAnnotations: ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๋˜๋Š” ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • AllowExtTrafficLocalEndpoints: ์„œ๋น„์Šค๊ฐ€ ์™ธ๋ถ€ ์š”์ฒญ์„ ๋…ธ๋“œ์˜ ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  • AttachVolumeLimit: ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ ์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ์„ ๋ณด๊ณ ํ•˜๋„๋ก ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋™์  ๋ณผ๋ฅจ ์ œํ•œ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • BalanceAttachedNodeVolumes: ์Šค์ผ€์ค„๋ง ์‹œ ๊ท ํ˜• ์žกํžŒ ๋ฆฌ์†Œ์Šค ํ• ๋‹น์„ ์œ„ํ•ด ๊ณ ๋ คํ•  ๋…ธ๋“œ์˜ ๋ณผ๋ฅจ ์ˆ˜๋ฅผ ํฌํ•จํ•œ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋™์•ˆ CPU, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ  ๋ฐ ๋ณผ๋ฅจ ์ˆ˜๊ฐ€ ๋” ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๊ฐ€ ์„ ํ˜ธ๋œ๋‹ค.

  • BlockVolume: ํŒŒ๋“œ์—์„œ ์›์‹œ ๋ธ”๋ก ์žฅ์น˜์˜ ์ •์˜์™€ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›์‹œ ๋ธ”๋ก ๋ณผ๋ฅจ ์ง€์›์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • BoundServiceAccountTokenVolume: ServiceAccountTokenVolumeProjection์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์ ์…˜ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„œ๋น„์Šค์–ด์นด์šดํŠธ ๋ณผ๋ฅจ์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” serviceaccount_stale_tokens_total ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ ํ† ํฐ์— ์˜์กดํ•˜๋Š” ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์›Œํฌ๋กœ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ --service-account-extend-token-expiration=false ํ”Œ๋ž˜๊ทธ๋กœ kube-apiserver๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ํ™•์žฅ ํ† ํฐ ๊ธฐ๋Šฅ์„ ๋ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ”์šด๋“œ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ํ™•์ธํ•œ๋‹ค.

  • CRIContainerLogRotation: CRI ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์— ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ๋กœํ…Œ์ด์…˜์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ๋กœ๊ทธ ํŒŒ์ผ ์‚ฌ์ด์ฆˆ ๊ธฐ๋ณธ๊ฐ’์€ 10MB์ด๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ ๋‹น ์ตœ๋Œ€ ๋กœ๊ทธ ํŒŒ์ผ ์ˆ˜ ๊ธฐ๋ณธ๊ฐ’์€ 5์ด๋‹ค. ์ด ๊ฐ’์€ kubelet ํ™˜๊ฒฝ์„ค์ •์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋…ธ๋“œ ๋ ˆ๋ฒจ์—์„œ์˜ ๋กœ๊น…์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • CSIBlockVolume: ์™ธ๋ถ€ CSI ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ csi ์›์‹œ ๋ธ”๋ก ๋ณผ๋ฅจ ์ง€์›์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • CSIDriverRegistry: csi.storage.k8s.io์—์„œ CSIDriver API ์˜ค๋ธŒ์ ํŠธ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋กœ์ง์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • CSIMigrationAWSComplete: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ EBS ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•˜๊ณ  shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ ์ž‘์—…์„ AWS-EBS ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ EBS CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— CSIMigration๊ณผ CSIMigrationAWS ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  EBS CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ธ-ํŠธ๋ฆฌ EBS ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ๋ง‰๋Š” InTreePluginAWSUnregister ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋กœ ์ธํ•ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • CSIMigrationAzureDiskComplete: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ Azure-Disk ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•˜๊ณ  shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ ์ž‘์—…์„ Azure-Disk ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ AzureDisk CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— CSIMigration๊ณผ CSIMigrationAzureDisk ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  AzureDisk CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ธ-ํŠธ๋ฆฌ AzureDisk ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ๋ง‰๋Š” InTreePluginAzureDiskUnregister ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋กœ ์ธํ•ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • CSIMigrationAzureFileComplete: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ Azure ํŒŒ์ผ ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•˜๊ณ  shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ†ตํ•ด ๋ณผ๋ฅจ ์ž‘์—…์„ Azure ํŒŒ์ผ ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ AzureFile CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— CSIMigration๊ณผ CSIMigrationAzureFile ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  AzureFile CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ธ-ํŠธ๋ฆฌ AzureFile ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ๋ง‰๋Š” InTreePluginAzureFileUnregister ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋กœ ์ธํ•ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • CSIMigrationGCEComplete: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ GCE-PD ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•˜๊ณ  shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ†ตํ•ด ๋ณผ๋ฅจ ์ž‘์—…์„ GCE-PD ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ PD CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. CSIMigration๊ณผ CSIMigrationGCE ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  PD CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ธ-ํŠธ๋ฆฌ GCE PD ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ๋ง‰๋Š” InTreePluginGCEUnregister ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋กœ ์ธํ•ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • CSIMigrationOpenStackComplete: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ Cinder ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•˜๊ณ  shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์ด Cinder ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ Cinder CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ณผ๋ฅจ ์ž‘์—…์„ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— CSIMigration๊ณผ CSIMigrationOpenStack ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  Cinder CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ธ-ํŠธ๋ฆฌ openstack cinder ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ๋ง‰๋Š” InTreePluginOpenStackUnregister ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋กœ ์ธํ•ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • CSIMigrationvSphereComplete: kubelet ๋ฐ ๋ณผ๋ฅจ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ vSphere ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก์„ ์ค‘์ง€ํ•˜๊ณ  shim ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ vSphere ์ธ-ํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ vSphere CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ณผ๋ฅจ ์ž‘์—…์„ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. CSIMigration ๋ฐ CSIMigrationvSphere ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  vSphere CSI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ธ-ํŠธ๋ฆฌ vsphere ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋“ฑ๋ก์„ ๋ง‰๋Š” InTreePluginvSphereUnregister ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋กœ ์ธํ•ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • CSINodeInfo: csi.storage.k8s.io ๋‚ด์˜ CSINodeInfo API ์˜ค๋ธŒ์ ํŠธ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋กœ์ง์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • CSIPersistentVolume: CSI (Container Storage Interface) ํ˜ธํ™˜ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ํ”„๋กœ๋น„์ €๋‹๋œ ๋ณผ๋ฅจ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • CSIServiceAccountToken : ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜๋Š” ํŒŒ๋“œ์˜ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก CSI ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ํ† ํฐ ์š”์ฒญ์„ ์ฐธ์กฐํ•œ๋‹ค.

  • CSIVolumeFSGroupPolicy: CSI๋“œ๋ผ์ด๋ฒ„๊ฐ€ fsGroupPolicy ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค. ์ด ํ•„๋“œ๋Š” CSI๋“œ๋ผ์ด๋ฒ„์—์„œ ์ƒ์„ฑ๋œ ๋ณผ๋ฅจ์ด ๋งˆ์šดํŠธ๋  ๋•Œ ๋ณผ๋ฅจ ์†Œ์œ ๊ถŒ๊ณผ ๊ถŒํ•œ ์ˆ˜์ •์„ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•œ๋‹ค.

  • CSRDuration: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค CSR API๋ฅผ ํ†ตํ•ด ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ์˜ ๊ธฐ๊ฐ„์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ConfigurableFSGroupPolicy: ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ๋“œ์— ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•  ๋•Œ fsGroups์— ๋Œ€ํ•œ ๋ณผ๋ฅจ ๊ถŒํ•œ ๋ณ€๊ฒฝ ์ •์ฑ…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŒŒ๋“œ์˜ ๋ณผ๋ฅจ ๊ถŒํ•œ ๋ฐ ์†Œ์œ ๊ถŒ ๋ณ€๊ฒฝ ์ •์ฑ… ๊ตฌ์„ฑ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • CronJobControllerV2: ํฌ๋ก ์žก(CronJob) ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋Œ€์ฒด ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋™์ผํ•œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฒ„์ „ 1์ด ์„ ํƒ๋œ๋‹ค.

  • CustomPodDNS: dnsConfig ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ์˜ DNS ์„ค์ •์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŒŒ๋“œ์˜ DNS ์„ค์ •์„ ํ™•์ธํ•œ๋‹ค.

  • CustomResourceDefaulting: OpenAPI v3 ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์Šคํ‚ค๋งˆ์—์„œ ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•œ CRD ์ง€์›์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • CustomResourcePublishOpenAPI: CRD OpenAPI ์‚ฌ์–‘์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

  • CustomResourceSubresources: ์ปค์Šคํ…€๋ฆฌ์†Œ์Šค๋ฐํ”ผ๋‹ˆ์…˜์—์„œ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค์—์„œ /status ๋ฐ /scale ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • CustomResourceValidation: ์ปค์Šคํ…€๋ฆฌ์†Œ์Šค๋ฐํ”ผ๋‹ˆ์…˜์—์„œ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค์—์„œ ์Šคํ‚ค๋งˆ ๊ธฐ๋ฐ˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • CustomResourceWebhookConversion: ์ปค์Šคํ…€๋ฆฌ์†Œ์Šค๋ฐํ”ผ๋‹ˆ์…˜์—์„œ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์›น ํ›… ๊ธฐ๋ฐ˜์˜ ๋ณ€ํ™˜์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • DynamicAuditing: v1.19 ์ด์ „์˜ ๋ฒ„์ „์—์„œ ๋™์  ๊ฐ์‚ฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ๋‹ค.

  • DynamicProvisioningScheduling: ๋ณผ๋ฅจ ํ† ํด๋กœ์ง€๋ฅผ ์ธ์‹ํ•˜๊ณ  PV ํ”„๋กœ๋น„์ €๋‹์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ™•์žฅํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ v1.12์˜ VolumeScheduling ๊ธฐ๋Šฅ์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค.

  • DynamicVolumeProvisioning: ํŒŒ๋“œ์— ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ์˜ ๋™์  ํ”„๋กœ๋น„์ €๋‹์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • EnableAggregatedDiscoveryTimeout: ์ˆ˜์ง‘๋œ ๊ฒ€์ƒ‰ ํ˜ธ์ถœ์—์„œ 5์ดˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • EnableEquivalenceClassCache: ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•  ๋•Œ ๋…ธ๋“œ์˜ ๋™๋“ฑ์„ฑ์„ ์บ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

  • EndpointSlice: ๋ณด๋‹ค ์Šค์ผ€์ผ๋ง ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋„คํŠธ์›Œํฌ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค(EndpointSlices)๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค ํ™œ์„ฑํ™”๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • EndpointSliceNodeName : ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค nodeName ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • EndpointSliceProxying: ํ™œ์„ฑํ™”๋˜๋ฉด, ๋ฆฌ๋ˆ…์Šค์—์„œ ์‹คํ–‰๋˜๋Š” kube-proxy๋Š” ์—”๋“œํฌ์ธํŠธ ๋Œ€์‹  ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค๋ฅผ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค ํ™œ์„ฑํ™”๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • EvenPodsSpread: ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ ๊ฐ„์— ํŒŒ๋“œ๋ฅผ ๊ท ๋“ฑํ•˜๊ฒŒ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ๋“œ ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • ExperimentalCriticalPodAnnotation: ํŠน์ • ํŒŒ๋“œ์— critical ๋กœ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์„œ ์Šค์ผ€์ค„๋ง์ด ๋ณด์žฅ๋˜๋„๋ก ํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ v1.13๋ถ€ํ„ฐ ํŒŒ๋“œ ์šฐ์„  ์ˆœ์œ„ ๋ฐ ์„ ์ ์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค.

  • ExternalPolicyForExternalIP: ExternalTrafficPolicy๊ฐ€ ์„œ๋น„์Šค(Service) ExternalIP์— ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

  • GCERegionalPersistentDisk: GCE์—์„œ ์ง€์—ญ PD ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • GenericEphemeralVolume: ์ผ๋ฐ˜ ๋ณผ๋ฅจ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์ž„์‹œ, ์ธ๋ผ์ธ ๋ณผ๋ฅจ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค(ํƒ€์‚ฌ ์Šคํ† ๋ฆฌ์ง€ ๊ณต๊ธ‰ ์—…์ฒด, ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์ถ”์ , ์Šค๋ƒ…์ƒท์œผ๋กœ๋ถ€ํ„ฐ ๋ณต์› ๋“ฑ์—์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ). ์ž„์‹œ ๋ณผ๋ฅจ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • HugePageStorageMediumSize: ์‚ฌ์ „ ํ• ๋‹น๋œ huge page์˜ ์—ฌ๋Ÿฌ ํฌ๊ธฐ๋ฅผ ์ง€์›ํ•œ๋‹ค.

  • HugePages: ์‚ฌ์ „ ํ• ๋‹น๋œ huge page์˜ ํ• ๋‹น ๋ฐ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • HyperVContainer: ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ„ํ•œ Hyper-V ๊ฒฉ๋ฆฌ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • IPv6DualStack: IPv6์„ ์œ„ํ•œ ์ด์ค‘ ์Šคํƒ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • ImmutableEphemeralVolumes: ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๊ฐœ๋ณ„ ์‹œํฌ๋ฆฟ(Secret)๊ณผ ์ปจํ”ผ๊ทธ๋งต(ConfigMap)์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š”(immutable) ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

  • IngressClassNamespacedParams: ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฒ”์œ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ IngressClass ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ IngressClass.spec.parameters์— Scope ๋ฐ Namespace์˜ 2 ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • Initializers: Initializers ์–ด๋“œ๋ฏธ์…˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ์‹œ ๋น„๋™๊ธฐ ํ˜‘์กฐ(asynchronous coordination)๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.

  • KubeletConfigFile: ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ํŒŒ์ผ์—์„œ kubelet ๊ตฌ์„ฑ์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํ†ตํ•ด kubelet ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • KubeletPluginsWatcher: kubelet์ด CSI ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๋ธŒ ๊ธฐ๋ฐ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ์‹œ์ž(watcher) ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • LegacyNodeRoleBehavior: ๋น„ํ™œ์„ฑํ™”๋˜๋ฉด, ์„œ๋น„์Šค ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋ฐ ๋…ธ๋“œ ์ค‘๋‹จ์˜ ๋ ˆ๊ฑฐ์‹œ ๋™์ž‘์€ NodeDisruptionExclusion ๊ณผ ServiceNodeExclusion ์— ์˜ํ•ด ์ œ๊ณต๋œ ๊ธฐ๋Šฅ๋ณ„ ๋ ˆ์ด๋ธ”์„ ๋Œ€์‹ ํ•˜์—ฌ node-role.kubernetes.io/master ๋ ˆ์ด๋ธ”์„ ๋ฌด์‹œํ•œ๋‹ค.

  • MountContainers: ํ˜ธ์ŠคํŠธ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ณผ๋ฅจ ๋งˆ์šดํ„ฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • MountPropagation: ํ•œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ํŒŒ๋“œ๋กœ ๋งˆ์šดํŠธ๋œ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋งˆ์šดํŠธ ์ „ํŒŒ(propagation)์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • NamespaceDefaultLabelName: API ์„œ๋ฒ„๋กœ ํ•˜์—ฌ๊ธˆ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” (immutable) ๋ ˆ์ด๋ธ” kubernetes.io/metadata.name์„ ์„ค์ •ํ•˜๋„๋ก ํ•œ๋‹ค. (๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์ด๋ฆ„๋„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)

  • NodeDisruptionExclusion: ์˜์—ญ(zone) ์žฅ์•  ์‹œ ๋…ธ๋“œ๊ฐ€ ์ œ์™ธ๋˜์ง€ ์•Š๋„๋ก ๋…ธ๋“œ ๋ ˆ์ด๋ธ” node.kubernetes.io/exclude-disruption ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • NodeLease: ์ƒˆ๋กœ์šด ๋ฆฌ์Šค(Lease) API๊ฐ€ ๋…ธ๋“œ ์ƒํƒœ ์‹ ํ˜ธ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ํ•˜ํŠธ๋น„ํŠธ(heartbeats)๋ฅผ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

  • PVCProtection: ํŒŒ๋“œ์—์„œ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„(PVC)์ด ์‚ญ์ œ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

  • PersistentLocalVolumes: ํŒŒ๋“œ์—์„œ local ๋ณผ๋ฅจ ์œ ํ˜•์˜ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. local ๋ณผ๋ฅจ์„ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

  • PodDisruptionBudget: PodDisruptionBudget ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • PodOverhead: ํŒŒ๋“œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ๋“œ์˜ค๋ฒ„ํ—ค๋“œ(PodOverhead) ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • PodPriority: ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ๋“œ์˜ ์Šค์ผ€์ค„๋ง ์ทจ์†Œ์™€ ์„ ์ ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • PodReadinessGates: ํŒŒ๋“œ ์ค€๋น„์„ฑ ํ‰๊ฐ€๋ฅผ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด PodReadinessGate ํ•„๋“œ ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŒŒ๋“œ์˜ ์ค€๋น„์„ฑ ๊ฒŒ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • PodShareProcessNamespace: ํŒŒ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ๋“œ์—์„œ shareProcessNamespace ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ”„๋กœ์„ธ์Šค ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ณต์œ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • RequestManagement: ๊ฐ API ์„œ๋ฒ„์—์„œ ์šฐ์„  ์ˆœ์œ„ ๋ฐ ๊ณต์ •์„ฑ์œผ๋กœ ์š”์ฒญ ๋™์‹œ์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 1.17 ์ดํ›„ APIPriorityAndFairness ์—์„œ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค.

  • ResourceLimitsPriorityFunction: ์ž…๋ ฅ ํŒŒ๋“œ์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๋„ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ์— ๊ฐ€๋Šฅํ•œ ์ตœ์ € ์ ์ˆ˜ 1์„ ํ• ๋‹นํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ ์šฐ์„  ์ˆœ์œ„ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์˜๋„๋Š” ๋™์ผํ•œ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋Š๋Š” ๊ฒƒ์ด๋‹ค.

  • ResourceQuotaScopeSelectors: ๋ฆฌ์†Œ์Šค ์ฟผํ„ฐ ๋ฒ”์œ„ ์…€๋ ‰ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • RootCAConfigMap: ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— kube-root-ca.crt๋ผ๋Š” ์ปจํ”ผ๊ทธ๋งต์„ ๊ฒŒ์‹œํ•˜๋„๋ก kube-controller-manager ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ์ด ์ปจํ”ผ๊ทธ๋งต์—๋Š” kube-apiserver์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” CA ๋ฒˆ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ”์šด๋“œ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์ฐธ์กฐํ•œ๋‹ค.

  • RotateKubeletClientCertificate: kubelet์—์„œ ํด๋ผ์ด์–ธํŠธ TLS ์ธ์ฆ์„œ์˜ ๋กœํ…Œ์ด์…˜์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubelet ๊ตฌ์„ฑ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • RunAsGroup: ์ปจํ…Œ์ด๋„ˆ์˜ init ํ”„๋กœ์„ธ์Šค์— ์„ค์ •๋œ ๊ธฐ๋ณธ ๊ทธ๋ฃน ID ์ œ์–ด๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • RuntimeClass: ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„ํด๋ž˜์Šค(RuntimeClass) ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • SCTPSupport: ํŒŒ๋“œ, ์„œ๋น„์Šค, ์—”๋“œํฌ์ธํŠธ, ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค ๋ฐ ๋„คํŠธ์›Œํฌํด๋ฆฌ์‹œ ์ •์˜์—์„œ SCTP protocol ๊ฐ’์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • ScheduleDaemonSetPods: ๋ฐ๋ชฌ์…‹(DaemonSet) ์ปจํŠธ๋กค๋Ÿฌ ๋Œ€์‹  ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ๋ฐ๋ชฌ์…‹ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

  • SelectorIndex: API ์„œ๋ฒ„ ๊ฐ์‹œ(watch) ์บ์‹œ์˜ ๋ ˆ์ด๋ธ” ๋ฐ ํ•„๋“œ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฉ๋ก ์ž‘์—…์„ ๊ฐ€์†ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ServiceAccountIssuerDiscovery: API ์„œ๋ฒ„์—์„œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ๋ฐœํ–‰์ž์— ๋Œ€ํ•ด OIDC ๋””์Šค์ปค๋ฒ„๋ฆฌ ์—”๋“œํฌ์ธํŠธ(๋ฐœ๊ธ‰์ž ๋ฐ JWKS URL)๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŒŒ๋“œ์˜ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ๊ตฌ์„ฑ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • ServiceAppProtocol: ์„œ๋น„์Šค์™€ ์—”๋“œํฌ์ธํŠธ์—์„œ appProtocol ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • ServiceLoadBalancerFinalizer: ์„œ๋น„์Šค ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์— ๋Œ€ํ•œ Finalizer ๋ณดํ˜ธ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • ServiceNodeExclusion: ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๊ฐ€ ์ƒ์„ฑํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์—์„œ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค. "node.kubernetes.io/exclude-from-external-load-balancers"๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ServiceTopology: ์„œ๋น„์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ ํ† ํด๋กœ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„œ๋น„์Šคํ† ํด๋กœ์ง€(ServiceTopology)๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • SetHostnameAsFQDN: ์ „์ฒด ์ฃผ์†Œ ๋„๋ฉ”์ธ ์ด๋ฆ„(FQDN)์„ ํŒŒ๋“œ์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ํŒŒ๋“œ์˜ setHostnameAsFQDN ํ•„๋“œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • StartupProbe: kubelet์—์„œ ์Šคํƒ€ํŠธ์—… ํ”„๋กœ๋ธŒ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • StorageObjectInUseProtection: ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ ๋˜๋Š” ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—ฌ์ „ํžˆ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ ์‚ญ์ œ๋ฅผ ์—ฐ๊ธฐํ•œ๋‹ค.

  • StreamingProxyRedirects: ์ŠคํŠธ๋ฆฌ๋ฐ ์š”์ฒญ์„ ์œ„ํ•ด ๋ฐฑ์—”๋“œ(kubelet)์—์„œ ๋ฆฌ๋””๋ ‰์…˜์„ ๊ฐ€๋กœ์ฑ„์„œ ๋”ฐ๋ฅด๋„๋ก API ์„œ๋ฒ„์— ์ง€์‹œํ•œ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ์š”์ฒญ์˜ ์˜ˆ๋กœ๋Š” exec, attach ๋ฐ port-forward ์š”์ฒญ์ด ์žˆ๋‹ค.

  • SupportIPVSProxyMode: IPVS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์„œ๋น„์Šค ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„œ๋น„์Šค ํ”„๋ก์‹œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • SupportNodePidsLimit: ๋…ธ๋“œ์—์„œ PID ์ œํ•œ ์ง€์›์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. --system-reserved ๋ฐ --kube-reserved ์˜ต์…˜์˜ pid=<number> ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ง€์ •๋œ ์ˆ˜์˜ ํ”„๋กœ์„ธ์Šค ID๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์™€ ๊ฐ๊ฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ ๋ฐ๋ชฌ์— ๋Œ€ํ•ด ์˜ˆ์•ฝ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • SupportPodPidsLimit: ํŒŒ๋“œ์˜ PID ์ œํ•œ์— ๋Œ€ํ•œ ์ง€์›์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • Sysctls: ๊ฐ ํŒŒ๋“œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ปค๋„ ํŒŒ๋ผ๋ฏธํ„ฐ(sysctl)๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ sysctl์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • TTLAfterFinished: TTL ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‹คํ–‰์ด ๋๋‚œ ํ›„ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

  • TaintBasedEvictions: ๋…ธ๋“œ์˜ ํ…Œ์ธํŠธ(taint) ๋ฐ ํŒŒ๋“œ์˜ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋…ธ๋“œ์—์„œ ํŒŒ๋“œ๋ฅผ ์ถ•์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…Œ์ธํŠธ์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • TaintNodesByCondition: ๋…ธ๋“œ ์ปจ๋””์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ํ…Œ์ธํŠธ ๋…ธ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • TokenRequest: ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ๋ฆฌ์†Œ์Šค์—์„œ TokenRequest ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • TokenRequestProjection: projected ๋ณผ๋ฅจ์„ ํ†ตํ•ด ์„œ๋น„์Šค ์–ด์นด์šดํŠธ ํ† ํฐ์„ ํŒŒ๋“œ์— ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ValidateProxyRedirects: ์ด ํ”Œ๋ž˜๊ทธ๋Š” API ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ๋กœ๋งŒ ๋ฆฌ๋””๋ ‰์…˜๋˜๋Š”๊ฐ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•œ๋‹ค. StreamingProxyRedirects ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.

  • VolumePVCDataSource: ๊ธฐ์กด PVC๋ฅผ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

  • VolumeScheduling: ๋ณผ๋ฅจ ํ† ํด๋กœ์ง€ ์ธ์‹ ์Šค์ผ€์ค„๋ง์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„(PVC) ๋ฐ”์ธ๋”ฉ์ด ์Šค์ผ€์ค„๋ง ๊ฒฐ์ •์„ ์ธ์‹ํ•˜๋„๋ก ํ•œ๋‹ค. ๋˜ํ•œ PersistentLocalVolumes ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ local ๋ณผ๋ฅจ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • VolumeSnapshotDataSource: ๋ณผ๋ฅจ ์Šค๋ƒ…์ƒท ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ง€์›์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • VolumeSubpath: ์ปจํ…Œ์ด๋„ˆ์— ๋ณผ๋ฅจ์˜ ํ•˜์œ„ ๊ฒฝ๋กœ(subpath)๋ฅผ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • VolumeSubpathEnvExpansion: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ subPath๋กœ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด subPathExpr ํ•„๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

  • WarningHeaders: API ์‘๋‹ต์—์„œ ๊ฒฝ๊ณ  ํ—ค๋”๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  • WindowsEndpointSliceProxying: ํ™œ์„ฑํ™”๋˜๋ฉด, ์œˆ๋„์šฐ์—์„œ ์‹คํ–‰๋˜๋Š” kube-proxy๋Š” ์—”๋“œํฌ์ธํŠธ ๋Œ€์‹  ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค๋ฅผ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค ํ™œ์„ฑํ™”ํ•˜๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • WindowsGMSA: ํŒŒ๋“œ์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์œผ๋กœ GMSA ์ž๊ฒฉ ์ฆ๋ช… ์ŠคํŽ™์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • WindowsRunAsUserName : ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ(non-default) ์‚ฌ์šฉ์ž๋กœ ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ RunAsUserName ๊ตฌ์„ฑ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

11.3 - kube-proxy

์‹œ๋†‰์‹œ์Šค

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํฌ ํ”„๋ก์‹œ๋Š” ๊ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋œ๋‹ค. ์ด๋Š” ๊ฐ ๋…ธ๋“œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ •์˜๋œ ์„œ๋น„์Šค๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉฐ ๋‹จ์ˆœํ•œ TCP, UDP ๋ฐ SCTP ์ŠคํŠธ๋ฆผ ํฌ์›Œ๋”ฉ ๋˜๋Š” ๋ผ์šด๋“œ ๋กœ๋นˆ TCP, UDP ๋ฐ SCTP ํฌ์›Œ๋”ฉ์„ ๋ฐฑ์—”๋“œ ์…‹์—์„œ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋น„์Šค ํด๋Ÿฌ์ŠคํŠธ IP ๋ฐ ํฌํŠธ๋Š” ํ˜„์žฌ ์„œ๋น„์Šค ํ”„๋ก์‹œ์— ์˜ํ•ด ์—ด๋ฆฐ ํฌํŠธ๋ฅผ ์ง€์ •ํ•˜๋Š” Docker-links-compatible ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํด๋Ÿฌ์Šคํ„ฐ IP์— ํด๋Ÿฌ์Šคํ„ฐ DNS๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„ ํƒ์  ์• ๋“œ์˜จ์ด ์žˆ๋‹ค. ์œ ์ €๋Š” apiserver API๋กœ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ”„๋ก์‹œ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

kube-proxy [flags]

์˜ต์…˜

--add_dir_header

true์ธ ๊ฒฝ์šฐ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ ํ—ค๋”์— ์ถ”๊ฐ€ํ•œ๋‹ค.

--alsologtostderr

ํŒŒ์ผ๊ณผ ํ•จ๊ป˜, ํ‘œ์ค€ ์—๋Ÿฌ์—๋„ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

--bind-address string     ๊ธฐ๋ณธ๊ฐ’: 0.0.0.0

ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ์„œ๋น„์Šคํ•  IP ์ฃผ์†Œ(๋ชจ๋“  IPv4 ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ '0.0.0.0'์œผ๋กœ ์„ค์ •, ๋ชจ๋“  IPv6 ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ '::'๋กœ ์„ค์ •)

--bind-address-hard-fail

true์ธ ๊ฒฝ์šฐ kube-proxy๋Š” ํฌํŠธ ๋ฐ”์ธ๋”ฉ ์‹คํŒจ๋ฅผ ์น˜๋ช…์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

--boot-id-file string     ๊ธฐ๋ณธ๊ฐ’: "/proc/sys/kernel/random/boot_id"

boot-id๋ฅผ ์œ„ํ•ด ํ™•์ธํ•  ํŒŒ์ผ ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๋ถ„๋ฆฌ). ๊ฐ€์žฅ ๋จผ์ € ๋ฐœ๊ฒฌ๋˜๋Š” ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•œ๋‹ค.

--cleanup

true์ธ ๊ฒฝ์šฐ iptables ๋ฐ ipvs ๊ทœ์น™์„ ์ œ๊ฑฐํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

--cluster-cidr string

ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ํŒŒ๋“œ์˜ CIDR ๋ฒ”์œ„. ๊ตฌ์„ฑ ํ›„์—๋Š” ์ด ๋ฒ”์œ„ ๋ฐ–์—์„œ ์„œ๋น„์Šค ํด๋Ÿฌ์Šคํ„ฐ IP๋กœ ์ „์†ก๋˜๋Š” ํŠธ๋ž˜ํ”ฝ์€ ๋งˆ์Šค์ปค๋ ˆ์ด๋“œ๋˜๊ณ  ํŒŒ๋“œ์—์„œ ์™ธ๋ถ€ LoadBalancer IP๋กœ ์ „์†ก๋œ ํŠธ๋ž˜ํ”ฝ์€ ๋Œ€์‹  ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ IP๋กœ ์ „์†ก๋œ๋‹ค. ๋“€์–ผ-์Šคํƒ(dual-stack) ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ์šฐ, ๊ฐ IP ์ฒด๊ณ„(IPv4์™€ IPv6)๋ณ„๋กœ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ CIDR์„ ํฌํ•จํ•˜๋Š” ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๋ถ„๋ฆฌ)์„ ๊ฐ€์ง„๋‹ค. --config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

--config string

์„ค์ • ํŒŒ์ผ์˜ ๊ฒฝ๋กœ.

--config-sync-period duration     ๊ธฐ๋ณธ๊ฐ’: 15m0s

apiserver์˜ ์„ค์ •์ด ๊ฐฑ์‹ ๋˜๋Š” ๋นˆ๋„. 0๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค.

--conntrack-max-per-core int32     ๊ธฐ๋ณธ๊ฐ’: 32768

CPU ์ฝ”์–ด๋‹น ์ถ”์ ํ•  ์ตœ๋Œ€ NAT ์—ฐ๊ฒฐ ์ˆ˜(ํ•œ๋„(limit)๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  contrack-min์„ ๋ฌด์‹œํ•˜๋ ค๋ฉด 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค)(

--conntrack-min int32     ๊ธฐ๋ณธ๊ฐ’: 131072

conntrack-max-per-core์™€ ๊ด€๊ณ„์—†์ด ํ• ๋‹นํ•  ์ตœ์†Œ conntrack ํ•ญ๋ชฉ ์ˆ˜(ํ•œ๋„๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋ ค๋ฉด conntrack-max-per-core๊ฐ’์„ 0์œผ๋กœ ์„ค์ •).

--conntrack-tcp-timeout-close-wait duration     ๊ธฐ๋ณธ๊ฐ’: 1h0m0s

CLOSE_WAIT ์ƒํƒœ์˜ TCP ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ NAT ์‹œ๊ฐ„ ์ดˆ๊ณผ

--conntrack-tcp-timeout-established duration     ๊ธฐ๋ณธ๊ฐ’: 24h0m0s

์„ค์ •๋œ TCP ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์œ ํœด์‹œ๊ฐ„ ์ดˆ๊ณผ(๊ฐ’์ด 0์ด๋ฉด ๊ทธ๋Œ€๋กœ ์œ ์ง€)

--detect-local-mode LocalMode

๋กœ์ปฌ ํŠธ๋ž˜ํ”ฝ์„ ํƒ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ชจ๋“œ. --config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

--feature-gates <์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ 'key=True|False' ์Œ๋“ค>

์•ŒํŒŒ/์‹คํ—˜์  ๊ธฐ๋Šฅ์˜ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” `key=value` ์Œ์˜ ์ง‘ํ•ฉ. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

APIListChunking=true|false (BETA - default=true)
APIPriorityAndFairness=true|false (BETA - default=true)
APIResponseCompression=true|false (BETA - default=true)
APIServerIdentity=true|false (ALPHA - default=false)
APIServerTracing=true|false (ALPHA - default=false)
AllAlpha=true|false (ALPHA - default=false)
AllBeta=true|false (BETA - default=false)
AnyVolumeDataSource=true|false (BETA - default=true)
AppArmor=true|false (BETA - default=true)
CPUManager=true|false (BETA - default=true)
CPUManagerPolicyAlphaOptions=true|false (ALPHA - default=false)
CPUManagerPolicyBetaOptions=true|false (BETA - default=true)
CPUManagerPolicyOptions=true|false (BETA - default=true)
CSIMigrationAzureFile=true|false (BETA - default=true)
CSIMigrationPortworx=true|false (BETA - default=false)
CSIMigrationRBD=true|false (ALPHA - default=false)
CSIMigrationvSphere=true|false (BETA - default=true)
CSINodeExpandSecret=true|false (ALPHA - default=false)
CSIVolumeHealth=true|false (ALPHA - default=false)
ContainerCheckpoint=true|false (ALPHA - default=false)
CronJobTimeZone=true|false (BETA - default=true)
CustomCPUCFSQuotaPeriod=true|false (ALPHA - default=false)
CustomResourceValidationExpressions=true|false (BETA - default=true)
DelegateFSGroupToCSIDriver=true|false (BETA - default=true)
DevicePlugins=true|false (BETA - default=true)
DisableCloudProviders=true|false (ALPHA - default=false)
DisableKubeletCloudCredentialProviders=true|false (ALPHA - default=false)
DownwardAPIHugePages=true|false (BETA - default=true)
EndpointSliceTerminatingCondition=true|false (BETA - default=true)
ExpandedDNSConfig=true|false (ALPHA - default=false)
ExperimentalHostUserNamespaceDefaulting=true|false (BETA - default=false)
GRPCContainerProbe=true|false (BETA - default=true)
GracefulNodeShutdown=true|false (BETA - default=true)
GracefulNodeShutdownBasedOnPodPriority=true|false (BETA - default=true)
HPAContainerMetrics=true|false (ALPHA - default=false)
HPAScaleToZero=true|false (ALPHA - default=false)
HonorPVReclaimPolicy=true|false (ALPHA - default=false)
IPTablesOwnershipCleanup=true|false (ALPHA - default=false)
InTreePluginAWSUnregister=true|false (ALPHA - default=false)
InTreePluginAzureDiskUnregister=true|false (ALPHA - default=false)
InTreePluginAzureFileUnregister=true|false (ALPHA - default=false)
InTreePluginGCEUnregister=true|false (ALPHA - default=false)
InTreePluginOpenStackUnregister=true|false (ALPHA - default=false)
InTreePluginPortworxUnregister=true|false (ALPHA - default=false)
InTreePluginRBDUnregister=true|false (ALPHA - default=false)
InTreePluginvSphereUnregister=true|false (ALPHA - default=false)
JobMutableNodeSchedulingDirectives=true|false (BETA - default=true)
JobPodFailurePolicy=true|false (ALPHA - default=false)
JobReadyPods=true|false (BETA - default=true)
JobTrackingWithFinalizers=true|false (BETA - default=true)
KMSv2=true|false (ALPHA - default=false)
KubeletCredentialProviders=true|false (BETA - default=true)
KubeletInUserNamespace=true|false (ALPHA - default=false)
KubeletPodResources=true|false (BETA - default=true)
KubeletPodResourcesGetAllocatable=true|false (BETA - default=true)
KubeletTracing=true|false (ALPHA - default=false)
LegacyServiceAccountTokenNoAutoGeneration=true|false (BETA - default=true)
LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (BETA - default=true)
LogarithmicScaleDown=true|false (BETA - default=true)
MatchLabelKeysInPodTopologySpread=true|false (ALPHA - default=false)
MaxUnavailableStatefulSet=true|false (ALPHA - default=false)
MemoryManager=true|false (BETA - default=true)
MemoryQoS=true|false (ALPHA - default=false)
MinDomainsInPodTopologySpread=true|false (BETA - default=false)
MixedProtocolLBService=true|false (BETA - default=true)
MultiCIDRRangeAllocator=true|false (ALPHA - default=false)
NetworkPolicyStatus=true|false (ALPHA - default=false)
NodeInclusionPolicyInPodTopologySpread=true|false (ALPHA - default=false)
NodeOutOfServiceVolumeDetach=true|false (ALPHA - default=false)
NodeSwap=true|false (ALPHA - default=false)
OpenAPIEnums=true|false (BETA - default=true)
OpenAPIV3=true|false (BETA - default=true)
PodAndContainerStatsFromCRI=true|false (ALPHA - default=false)
PodDeletionCost=true|false (BETA - default=true)
PodDisruptionConditions=true|false (ALPHA - default=false)
PodHasNetworkCondition=true|false (ALPHA - default=false)
ProbeTerminationGracePeriod=true|false (BETA - default=true)
ProcMountType=true|false (ALPHA - default=false)
ProxyTerminatingEndpoints=true|false (ALPHA - default=false)
QOSReserved=true|false (ALPHA - default=false)
ReadWriteOncePod=true|false (ALPHA - default=false)
RecoverVolumeExpansionFailure=true|false (ALPHA - default=false)
RemainingItemCount=true|false (BETA - default=true)
RetroactiveDefaultStorageClass=true|false (ALPHA - default=false)
RotateKubeletServerCertificate=true|false (BETA - default=true)
SELinuxMountReadWriteOncePod=true|false (ALPHA - default=false)
SeccompDefault=true|false (BETA - default=true)
ServerSideFieldValidation=true|false (BETA - default=true)
ServiceIPStaticSubrange=true|false (BETA - default=true)
ServiceInternalTrafficPolicy=true|false (BETA - default=true)
SizeMemoryBackedVolumes=true|false (BETA - default=true)
StatefulSetAutoDeletePVC=true|false (ALPHA - default=false)
StorageVersionAPI=true|false (ALPHA - default=false)
StorageVersionHash=true|false (BETA - default=true)
TopologyAwareHints=true|false (BETA - default=true)
TopologyManager=true|false (BETA - default=true)
UserNamespacesStatelessPodsSupport=true|false (ALPHA - default=false)
VolumeCapacityPriority=true|false (ALPHA - default=false)
WinDSR=true|false (ALPHA - default=false)
WinOverlay=true|false (BETA - default=true)
WindowsHostProcessContainers=true|false (BETA - default=true)

--config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

--healthz-bind-address ipport     ๊ธฐ๋ณธ๊ฐ’: 0.0.0.0:10256

ํ—ฌ์Šค ์ฒดํฌ ์„œ๋ฒ„๊ฐ€ ์„œ๋น„์Šคํ•  ํฌํŠธ๊ฐ€ ์žˆ๋Š” IP ์ฃผ์†Œ(๋ชจ๋“  IPv4์˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ '0.0.0.0:10256', ๋ชจ๋“  IPv6์˜ ์ธํ„ฐํŽ˜์ด์Šค์ธ ๊ฒฝ์šฐ '[::]:10256'๋กœ ์„ค์ •)์ด๋ฉฐ, ์‚ฌ์šฉ ์•ˆ ํ•  ๊ฒฝ์šฐ ๋นˆ์นธ์œผ๋กœ ๋‘”๋‹ค. --config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

-h, --help

kube-proxy์— ๋Œ€ํ•œ ๋„์›€๋ง.

--hostname-override string

๋ฌธ์ž์—ด ๊ฐ’์ด ์žˆ์œผ๋ฉด, ์ด ๊ฐ’์„ ์‹ค์ œ ํ˜ธ์ŠคํŠธ๋„ค์ž„ ๋Œ€์‹ ์— ID๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

--iptables-masquerade-bit int32     ๊ธฐ๋ณธ๊ฐ’: 14

์ˆœ์ˆ˜ iptable ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ SNAT๊ฐ€ ํ•„์š”ํ•œ ํŒจํ‚ท์„ ํ‘œ์‹œํ•˜๋Š” fwmark ์ŠคํŽ˜์ด์Šค ๋น„ํŠธ. [0, 31] ๋ฒ”์œ„ ์•ˆ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.

--iptables-min-sync-period duration     ๊ธฐ๋ณธ๊ฐ’: 1s

์—”๋“œํฌ์ธํŠธ ๋ฐ ์„œ๋น„์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ iptable ๊ทœ์น™์„ ์ƒˆ๋กœ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ๋นˆ๋„์˜ ์ตœ์†Œ ๊ฐ„๊ฒฉ(์˜ˆ: '5s', '1m', '2h22m').

--iptables-sync-period duration     ๊ธฐ๋ณธ๊ฐ’: 30s

iptable ๊ทœ์น™์„ ์ƒˆ๋กœ ๊ณ ์น˜๋Š” ๋นˆ๋„์˜ ์ตœ๋Œ€ ๊ฐ„๊ฒฉ(์˜ˆ: '5s', '1m', '2h22m'). 0 ๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค.

--ipvs-exclude-cidrs stringSlice

IPVS ๊ทœ์น™์„ ์ •๋ฆฌํ•  ๋•Œ ipvs ํ”„๋ก์‹œ๊ฐ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ CIDR ๋ชฉ๋ก.

--ipvs-min-sync-period duration

์—”๋“œํฌ์ธํŠธ ๋ฐ ์„œ๋น„์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ipvs ๊ทœ์น™์„ ์ƒˆ๋กœ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ๋นˆ๋„์˜ ์ตœ์†Œ ๊ฐ„๊ฒฉ(์˜ˆ: '5s', '1m', '2h22m').

--ipvs-scheduler string

ํ”„๋ก์‹œ ๋ชจ๋“œ๊ฐ€ ipvs์ธ ๊ฒฝ์šฐ ipvs ์Šค์ผ€์ค„๋Ÿฌ ์œ ํ˜•.

--ipvs-strict-arp

arp_ignore๋ฅผ 1๋กœ ์„ค์ •ํ•˜๊ณ  arp_annotes๋ฅผ 2๋กœ ์„ค์ •ํ•˜์—ฌ ์—„๊ฒฉํ•œ ARP๋ฅผ ์‚ฌ์šฉ.

--ipvs-sync-period duration     ๊ธฐ๋ณธ๊ฐ’: 30s

ipvs ๊ทœ์น™์ด ์ƒˆ๋กœ ๊ฐฑ์‹ ๋˜๋Š” ๋นˆ๋„์˜ ์ตœ๋Œ€ ๊ฐ„๊ฒฉ(์˜ˆ: '5s', '1m', '2h22m'). 0 ๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค.

--ipvs-tcp-timeout duration

์œ ํœด IPVS TCP ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ. 0์ด๋ฉด ๊ทธ๋Œ€๋กœ ์œ ์ง€(์˜ˆ: '5s', '1m', '2h22m').

--ipvs-tcpfin-timeout duration

FIN ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•œ ํ›„ IPVS TCP ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ. 0์ด๋ฉด ๊ทธ๋Œ€๋กœ ์œ ์ง€(์˜ˆ: '5s', '1m', '2h22m').

--ipvs-udp-timeout duration

IPVS UDP ํŒจํ‚ท์— ๋Œ€ํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ. 0์ด๋ฉด ๊ทธ๋Œ€๋กœ ์œ ์ง€(์˜ˆ: '5s', '1m', '2h22m').

--kube-api-burst int32     ๊ธฐ๋ณธ๊ฐ’: 10

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค api ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉํ•  burst.

--kube-api-content-type string     ๊ธฐ๋ณธ๊ฐ’: "application/vnd.kubernetes.protobuf"

api ์„œ๋ฒ„์— ๋ณด๋‚ธ ์š”์ฒญ์˜ ๋‚ด์šฉ ์œ ํ˜•.

--kube-api-qps float32     ๊ธฐ๋ณธ๊ฐ’: 5

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค api ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•  QPS.

--kubeconfig string

์ธ์ฆ ์ •๋ณด๊ฐ€ ์žˆ๋Š” kubeconfig ํŒŒ์ผ์˜ ๊ฒฝ๋กœ(๋งˆ์Šคํ„ฐ ์œ„์น˜๋Š” ๋งˆ์Šคํ„ฐ ํ”Œ๋ž˜๊ทธ๋กœ ์„ค์ •๋จ).

--log_backtrace_at <'file:N' ํ˜•์‹์˜ ๋ฌธ์ž์—ด>     ๊ธฐ๋ณธ๊ฐ’: :0

ํŒŒ์ผ์˜ N๊ฐœ ์ค„๋งŒํผ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ฒŒ ๋˜๋ฉด, ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

--log_dir string

๋กœ๊ทธ ํŒŒ์ผ์„ ์ง€์ •๋œ ๊ฒฝ๋กœ ์•„๋ž˜์— ์“ฐ๋ฉฐ, ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ ๋ฌด์‹œ๋œ๋‹ค.

--log_file string

์ง€์ •๋œ ๋กœ๊ทธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ ๋ฌด์‹œ๋œ๋‹ค.

--log_file_max_size uint     ๊ธฐ๋ณธ๊ฐ’: 1800

๋กœ๊ทธ ํŒŒ์ผ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ MB ๋‹จ์œ„๋กœ ์ง€์ •ํ•˜๋ฉฐ, ๊ฐ’์ด 0์ผ ๊ฒฝ์šฐ๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ์— ์ œํ•œ์ด ์—†๋‹ค.

--logtostderr     ๊ธฐ๋ณธ๊ฐ’: true

๋กœ๊ทธ๋ฅผ ํŒŒ์ผ ๋Œ€์‹  ํ‘œ์ค€ ์—๋Ÿฌ์— ์ถœ๋ ฅํ•œ๋‹ค.

--machine-id-file string     ๊ธฐ๋ณธ๊ฐ’: "/etc/machine-id,/var/lib/dbus/machine-id"

machine-id๋ฅผ ์œ„ํ•ด ํ™•์ธํ•  ํŒŒ์ผ ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๋ถ„๋ฆฌ). ๊ฐ€์žฅ ๋จผ์ € ๋ฐœ๊ฒฌ๋˜๋Š” ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•œ๋‹ค.

--masquerade-all

์ˆœ์ˆ˜ iptables ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์„œ๋น„์Šค ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ํ†ตํ•ด ์ „์†ก๋œ ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ SNATํ•จ(์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Œ).

--master string

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์˜ ์ฃผ์†Œ(kubeconfig์˜ ๋ชจ๋“  ๊ฐ’ ๋ฎ์–ด์“ฐ๊ธฐ).

--metrics-bind-address ipport     ๊ธฐ๋ณธ๊ฐ’: 127.0.0.1:10249

๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„๊ฐ€ ์„œ๋น„์Šคํ•  ํฌํŠธ๊ฐ€ ์žˆ๋Š” IP ์ฃผ์†Œ(๋ชจ๋“  IPv4 ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ '0.0.0.0:10249', ๋ชจ๋“  IPv6 ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ '[::]:10249'๋กœ ์„ค์ •๋จ)๋กœ, ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋น„์›Œ๋‘”๋‹ค. --config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

--nodeport-addresses stringSlice

NodePort์— ์‚ฌ์šฉํ•  ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฐ’์˜ ๋ฌธ์ž์—ด ์กฐ๊ฐ. ๊ฐ’์€ ์œ ํšจํ•œ IP ๋ธ”๋ก(์˜ˆ: 1.2.3.0/24, 1.2.3.4/32). ๊ธฐ๋ณธ๊ฐ’์ธ ๋นˆ ๋ฌธ์ž์—ด ์กฐ๊ฐ๊ฐ’์€([]) ๋ชจ๋“  ๋กœ์ปฌ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

--one_output

true์ผ ๊ฒฝ์šฐ, ์‹ฌ๊ฐ๋„ ๊ธฐ๋ณธ ๋ ˆ๋ฒจ์—์„œ๋งŒ ๋กœ๊ทธ๋ฅผ ์“ด๋‹ค(false์ผ ๊ฒฝ์šฐ ํฌ๊ฒŒ ์‹ฌ๊ฐํ•˜์ง€ ์•Š์€ ๋‹จ๊ณ„์—์„œ๋„ ๋กœ๊ทธ๋ฅผ ์“ด๋‹ค).

--oom-score-adj int32     ๊ธฐ๋ณธ๊ฐ’: -999

kube-proxy ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ oom-score-adj ๊ฐ’. ๊ฐ’์€ [-1000, 1000] ๋ฒ”์œ„ ๋‚ด์— ์žˆ์–ด์•ผ ํ•œ๋‹ค. --config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

--pod-bridge-interface string

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ธŒ๋ฆฌ์ง€ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์œผ๋กœ, kube-proxy๋Š” ์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•œ ํŠธ๋ž˜ํ”ฝ์„ ๋กœ์ปฌ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. DetectLocalMode๊ฐ€ BridgeInterface๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ธ์ž๋„ ๊ฐ™์ด ์„ค์ •๋˜์–ด์•ผ ํ•œ๋‹ค.

--pod-interface-name-prefix string

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ ‘๋‘์‚ฌ๋กœ, kube-proxy๋Š” ์ง€์ •๋œ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•œ ํŠธ๋ž˜ํ”ฝ์„ ๋กœ์ปฌ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. DetectLocalMode๊ฐ€ InterfaceNamePrefix๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ธ์ž๋„ ๊ฐ™์ด ์„ค์ •๋˜์–ด์•ผ ํ•œ๋‹ค.

--profiling

๊ฐ’์ด true์ด๋ฉด /debug/pprof ํ•ธ๋“ค๋Ÿฌ์—์„œ ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. --config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

--proxy-mode ProxyMode

์‚ฌ์šฉํ•  ํ”„๋ก์‹œ ๋ชจ๋“œ: 'iptables' (๋ฆฌ๋ˆ…์Šค), 'ipvs' (๋ฆฌ๋ˆ…์Šค), 'kernelspace' (์œˆ๋„์šฐ), ๋˜๋Š” 'userspace' (๋ฆฌ๋ˆ…์Šค/์œˆ๋„์šฐ, ์ง€์› ์ค‘๋‹จ). ๋ฆฌ๋ˆ…์Šค์—์„œ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 'iptables'์ด๋ฉฐ, ์œˆ๋„์šฐ์—์„œ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 'userspace'(์ถ”ํ›„ 'kernelspace'๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •)์ด๋‹ค. --config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

--proxy-port-range port-range

์„œ๋น„์Šค ํŠธ๋ž˜ํ”ฝ์„ ํ”„๋ก์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธ์ŠคํŠธ ํฌํŠธ ๋ฒ”์œ„(beginPort-endPort, single port ๋˜๋Š” beginPort+offset ํฌํ•จ). ๋งŒ์•ฝ ๋ฒ”์œ„๊ฐ€ 0, 0-0, ํ˜น์€ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด, ํฌํŠธ๋Š” ๋ฌด์ž‘์œ„๋กœ ์„ ํƒ๋œ๋‹ค.

--show-hidden-metrics-for-version string

์ˆจ๊ฒจ์ง„ ๋ฉ”ํŠธ๋ฆญ์„ ํ‘œ์‹œํ•˜๋ ค๋Š” ์ด์ „ ๋ฒ„์ „. ์ด์ „ ๋งˆ์ด๋„ˆ ๋ฒ„์ „๋งŒ ์ธ์‹ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ํฌ๋ฉง์€ <๋ฉ”์ด์ €>.<๋งˆ์ด๋„ˆ> ์™€ ๊ฐ™์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด '1.16' ๊ณผ ๊ฐ™๋‹ค. ์ด ํฌ๋ฉง์˜ ๋ชฉ์ ์€, ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ˆจ๊ธธ ์ถ”๊ฐ€์ ์ธ ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต์ง€ํ•˜์—ฌ, ๊ทธ ์ดํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ๋ฉ”ํŠธ๋ฆญ์ด ์˜๊ตฌ์ ์œผ๋กœ ์‚ญ์ œ๋์„ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ๋†€๋ผ์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. --config๋ฅผ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด ๋ช…์‹œ๋  ๊ฒฝ์šฐ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

--skip_headers

true์ผ ๊ฒฝ์šฐ, ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์— ํ—ค๋”๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

--skip_log_headers

true์ผ ๊ฒฝ์šฐ, ๋กœ๊ทธ ํŒŒ์ผ์„ ์—ด ๋•Œ ํ—ค๋”๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

--stderrthreshold int     ๊ธฐ๋ณธ๊ฐ’: 2

ํ•ด๋‹น ์ž„๊ณ„๊ฐ’ ์ด์ƒ์˜ ๋กœ๊ทธ๋ฅผ ํ‘œ์ค€์—๋Ÿฌ๋กœ ๋ณด๋‚ธ๋‹ค.

--udp-timeout duration     ๊ธฐ๋ณธ๊ฐ’: 250ms

์œ ํœด UDP ์—ฐ๊ฒฐ์ด ์—ด๋ฆฐ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ์‹œ๊ฐ„(์˜ˆ: '250ms', '2s'). ๊ฐ’์€ 0๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค. ํ”„๋ก์‹œ ๋ชจ๋“œ userspace์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•จ.

-v, --v int

๋กœ๊ทธ ์ƒ์„ธ ๋ ˆ๋ฒจ(verbosity) ๊ฐ’

--version version[=true]

๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ

--vmodule <์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ 'pattern=N' ์„ค์ •๋“ค>

ํŒŒ์ผ ํ•„ํ„ฐ ๋กœ๊น…์„ ์œ„ํ•œ pattern=N ์„ค์ • ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๋ถ„๋ฆฌ).

--write-config-to string

๊ธฐ๋ณธ ๊ตฌ์„ฑ ๊ฐ’์„ ์ด ํŒŒ์ผ์— ์˜ฎ๊ฒจ์“ฐ๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

12 - ์Šค์ผ€์ค„๋ง

12.1 - ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌ์„ฑ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.25 [stable]

๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ์ปค๋งจ๋“œ ๋ผ์ธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ kube-scheduler ์˜ ๋™์ž‘์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šค์ผ€์ค„๋ง ํ”„๋กœํŒŒ์ผ(Profile)์„ ์‚ฌ์šฉํ•˜๋ฉด kube-scheduler์—์„œ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์Šค์ผ€์ค„๋ง์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„๋Š” ์ต์Šคํ…์…˜ ํฌ์ธํŠธ(extension point)๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋œ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ด๋Ÿฌํ•œ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ๋™์ž‘์„ ์ œ๊ณตํ•œ๋‹ค.

KubeSchedulerConfiguration (v1beta3 ๋˜๋Š” v1) ๊ตฌ์กฐ์— ๋งž๊ฒŒ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ , kube-scheduler --config <filename>์„ ์‹คํ–‰ํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ํ”„๋กœํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ์†Œ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
  kubeconfig: /etc/srv/kubernetes/kube-scheduler/kubeconfig

ํ”„๋กœํŒŒ์ผ

์Šค์ผ€์ค„๋ง ํ”„๋กœํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด kube-scheduler์—์„œ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์Šค์ผ€์ค„๋ง์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„๋Š” ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋…ธ์ถœ๋œ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ด๋Ÿฌํ•œ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ๋™์ž‘์„ ์ œ๊ณตํ•œ๋‹ค.

kube-scheduler ์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ”„๋กœํŒŒ์ผ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ต์Šคํ…์…˜ ํฌ์ธํŠธ

์Šค์ผ€์ค„๋ง์€ ๋‹ค์Œ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋˜๋Š” ์ผ๋ จ์˜ ๋‹จ๊ณ„์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

  1. queueSort: ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์Šค์ผ€์ค„๋ง ๋Œ€๊ธฐ์—ด์—์„œ ๋ณด๋ฅ˜ ์ค‘์ธ ํŒŒ๋“œ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋Œ€๊ธฐ์—ด ์ •๋ ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•œ ๋ฒˆ์— ๋‹จ ํ•˜๋‚˜๋งŒ ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. preFilter: ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์ „์— ํŒŒ๋“œ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์ „ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŒŒ๋“œ๋ฅผ unschedulable๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. filter: ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์˜ ๋‹จ์ •(Predicates)๊ณผ ๋™์ผํ•˜๋ฉฐ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํ•„ํ„ฐ๋Š” ๊ตฌ์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ๋…ธ๋“œ๊ฐ€ ๋ชจ๋“  ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ๋“œ๋Š” unschedulable๋กœ ํ‘œ์‹œ๋œ๋‹ค.
  4. postFilter: ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŒŒ๋“œ์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ, ๊ตฌ์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ๋œ๋‹ค. postFilter ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํŒŒ๋“œ schedulable ์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒฝ์šฐ, ๋‚˜๋จธ์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ˜ธ์ถœ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  5. preScore: ์ด๊ฒƒ์€ ์‚ฌ์ „ ์Šค์ฝ”์–ด๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด์„ฑ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์ด๋‹ค.
  6. score: ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•„ํ„ฐ๋ง ๋‹จ๊ณ„๋ฅผ ํ†ต๊ณผํ•œ ๊ฐ ๋…ธ๋“œ์— ์ ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๊ฐ€์ค‘์น˜ ํ•ฉ๊ณ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
  7. reserve: ์ง€์ •๋œ ํŒŒ๋“œ์— ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜ˆ์•ฝ๋œ ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์•Œ๋ฆฌ๋Š” ์ •๋ณด์„ฑ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์ด๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋˜ํ•œ Reserve ๋„์ค‘ ๋˜๋Š” ์ดํ›„์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ ํ˜ธ์ถœ ๋˜๋Š” Unreserve ํ˜ธ์ถœ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  8. permit: ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŒŒ๋“œ ๋ฐ”์ธ๋”ฉ์„ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  9. preBind: ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŒŒ๋“œ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  10. bind: ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŒŒ๋“œ๋ฅผ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. bind ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ๋˜๋ฉฐ ์ผ๋‹จ ๋ฐ”์ธ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ๋‚˜๋จธ์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฑด๋„ˆ๋›ด๋‹ค. bind ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ ์–ด๋„ ํ•˜๋‚˜ ์ด์ƒ ํ•„์š”ํ•˜๋‹ค.
  11. postBind: ํŒŒ๋“œ๊ฐ€ ๋ฐ”์ธ๋“œ๋œ ํ›„ ํ˜ธ์ถœ๋˜๋Š” ์ •๋ณด์„ฑ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์ด๋‹ค.
  12. multiPoint: ์ด ํ•„๋“œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์˜ ๋ชจ๋“  ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋Œ€ํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ๋™์‹œ์— ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ™˜๊ฒฝ ์„ค์ • ์ „์šฉ ํ•„๋“œ์ด๋‹ค.

๊ฐ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋Œ€ํ•ด ํŠน์ • ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์ž์ฒด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - plugins:
      score:
        disabled:
        - name: PodTopologySpread
        enabled:
        - name: MyCustomPluginA
          weight: 2
        - name: MyCustomPluginB
          weight: 1

๋น„ํ™œ์„ฑํ™”๋œ ๋ฐฐ์—ด์˜ ์ด๋ฆ„์œผ๋กœ * ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ, ํ”Œ๋Ÿฌ๊ทธ์ธ ์ˆœ์„œ๋ฅผ ์žฌ์ •๋ ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์Šค์ผ€์ค„๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ

๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋œ ๋‹ค์Œ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ด๋“ค ์ต์Šคํ…์…˜ ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

  • ImageLocality: ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ ์ด๋ฏธ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: score.
  • TaintToleration: ํ…Œ์ธํŠธ(taint)์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ ๊ตฌํ˜„: filter, preScore, score.
  • NodeName: ํŒŒ๋“œ ๋ช…์„ธ ๋…ธ๋“œ ์ด๋ฆ„์ด ํ˜„์žฌ ๋…ธ๋“œ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.
  • NodePorts: ๋…ธ๋“œ์— ์š”์ฒญ๋œ ํŒŒ๋“œ ํฌํŠธ์— ๋Œ€ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํฌํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: preFilter, filter.
  • NodeAffinity: ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ์™€ ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter, score.
  • PodTopologySpread: ํŒŒ๋“œ ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: preFilter, filter, preScore, score.
  • NodeUnschedulable: .spec.unschedulable ์ด true๋กœ ์„ค์ •๋œ ๋…ธ๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.
  • NodeResourcesFit: ๋…ธ๋“œ์— ํŒŒ๋“œ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ ์ˆ˜๋Š” LeastAllocated(๊ธฐ๋ณธ๊ฐ’), MostAllocated, RequestedToCapacityRatio ๋“ฑ 3๊ฐ€์ง€ ์ „๋žต ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: preFilter, filter, score.
  • NodeResourcesBalancedAllocation: ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋œ ๊ฒฝ์šฐ, ๋ณด๋‹ค ๊ท ํ˜•์žกํžŒ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: score.
  • VolumeBinding: ๋…ธ๋“œ์— ์š”์ฒญ๋œ ๋ณผ๋ฅจ์ด ์žˆ๋Š”์ง€ ๋˜๋Š” ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: preFilter, filter, reserve, preBind, score.
  • VolumeRestrictions: ๋…ธ๋“œ์— ๋งˆ์šดํŠธ๋œ ๋ณผ๋ฅจ์ด ๋ณผ๋ฅจ ์ œ๊ณต์ž์— ํŠน์ •ํ•œ ์ œํ•œ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.
  • VolumeZone: ์š”์ฒญ๋œ ๋ณผ๋ฅจ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์˜์—ญ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.
  • NodeVolumeLimits: ๋…ธ๋“œ์— ๋Œ€ํ•ด CSI ๋ณผ๋ฅจ ์ œํ•œ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.
  • EBSLimits: ๋…ธ๋“œ์— ๋Œ€ํ•ด AWS EBS ๋ณผ๋ฅจ ์ œํ•œ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.
  • GCEPDLimits: ๋…ธ๋“œ์— ๋Œ€ํ•ด GCP-PD ๋ณผ๋ฅจ ์ œํ•œ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.
  • AzureDiskLimits: ๋…ธ๋“œ์— ๋Œ€ํ•ด Azure ๋””์Šคํฌ ๋ณผ๋ฅจ ์ œํ•œ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.
  • InterPodAffinity: ํŒŒ๋“œ ๊ฐ„ ์–ดํ”ผ๋‹ˆํ‹ฐ ๋ฐ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: preFilter, filter, preScore, score.
  • PrioritySort: ๊ธฐ๋ณธ ์šฐ์„  ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ์ •๋ ฌ์„ ์ œ๊ณตํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: queueSort.
  • DefaultBinder: ๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: bind.
  • DefaultPreemption: ๊ธฐ๋ณธ ์„ ์  ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: postFilter.

๊ธฐ๋ณธ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š๋Š” ๋‹ค์Œ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ API๋ฅผ ํ†ตํ•ด ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • CinderLimits: ๋…ธ๋“œ์— ๋Œ€ํ•ด OpenStack Cinder ๋ณผ๋ฅจ ์ œํ•œ์ด ์ถฉ์กฑ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์ต์Šคํ…์…˜ ํฌ์ธํŠธ: filter.

์—ฌ๋Ÿฌ ํ”„๋กœํŒŒ์ผ

๋‘˜ ์ด์ƒ์˜ ํ”„๋กœํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋„๋ก kube-scheduler ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ํ”„๋กœํŒŒ์ผ์—๋Š” ์—ฐ๊ด€๋œ ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์ด ์žˆ์œผ๋ฉฐ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๊ตฌ์„ฑ๋œ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ธํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์˜ ์ƒ˜ํ”Œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋Š” ํ”„๋กœํŒŒ์ผ๊ณผ ๋ชจ๋“  ์Šค์ฝ”์–ด๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋น„ํ™œ์„ฑํ™”๋œ ํ”„๋กœํŒŒ์ผ์˜ ๋‘ ๊ฐ€์ง€ ํ”„๋กœํŒŒ์ผ๋กœ ์‹คํ–‰๋œ๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: default-scheduler
  - schedulerName: no-scoring-scheduler
    plugins:
      preScore:
        disabled:
        - name: '*'
      score:
        disabled:
        - name: '*'

ํŠน์ • ํ”„๋กœํŒŒ์ผ์— ๋”ฐ๋ผ ์Šค์ผ€์ค„ํ•˜๋ ค๋Š” ํŒŒ๋“œ๋Š” .spec.schedulerName ์— ํ•ด๋‹น ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ, ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„ default-scheduler ๋ฅผ ๊ฐ€์ง„ ํ•˜๋‚˜์˜ ํ”„๋กœํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด ํ”„๋กœํŒŒ์ผ์—๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ๋‘˜ ์ด์ƒ์˜ ํ”„๋กœํŒŒ์ผ์„ ์„ ์–ธํ•  ๋•Œ, ๊ฐ๊ฐ์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค.

ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, kube-apiserver๋Š” ์ด๋ฅผ default-scheduler ๋กœ ์„ค์ •ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„ํ•˜๋ ค๋ฉด ์ด ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ”„๋กœํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋‹ค์ˆ˜์˜ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ํ”Œ๋Ÿฌ๊ทธ์ธ ์ ์šฉํ•˜๊ธฐ

kubescheduler.config.k8s.io/v1beta3 ๋ถ€ํ„ฐ, ๋‹ค์ˆ˜์˜ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋Œ€ํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‰ฝ๊ฒŒ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ”„๋กœํŒŒ์ผ ํ™˜๊ฒฝ ์„ค์ • multiPoint ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์™€ ๊ด€๋ฆฌ์ž๊ฐ€ ์ปค์Šคํ…€ ํ”„๋กœํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ๋•Œ ํ™˜๊ฒฝ ์„ค์ •์„ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

preScore, score, preFilter, filter ์ต์Šคํ…์…˜ ํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” MyPlugin ์ด๋ผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๋ชจ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋Œ€ํ•ด MyPlugin ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœํŒŒ์ผ ํ™˜๊ฒฝ ์„ค์ •์„ ์‚ฌ์šฉํ•œ๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: multipoint-scheduler
    plugins:
      multiPoint:
        enabled:
        - name: MyPlugin

์œ„์˜ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ชจ๋“  ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋Œ€ํ•ด MyPlugin ์„ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๊ฐ–๋Š”๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: non-multipoint-scheduler
    plugins:
      preScore:
        enabled:
        - name: MyPlugin
      score:
        enabled:
        - name: MyPlugin
      preFilter:
        enabled:
        - name: MyPlugin
      filter:
        enabled:
        - name: MyPlugin

์—ฌ๊ธฐ์„œ multiPoint ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์ด์ ์€, ์ถ”ํ›„ MyPlugin ์ด ๋‹ค๋ฅธ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ, ์ƒˆ๋กœ์šด ์ต์Šคํ…์…˜์— ๋Œ€ํ•ด์„œ๋„ multiPoint ํ™˜๊ฒฝ ์„ค์ •์ด ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”๋  ๊ฒƒ์ด๋ผ๋Š” ์ ์ด๋‹ค.

disabled ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, MultiPoint ํ™•์žฅ์œผ๋กœ๋ถ€ํ„ฐ ํŠน์ • ์ต์Šคํ…์…˜ ํฌ์ธํŠธ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜, ๊ธฐ๋ณธ์ด ์•„๋‹Œ(non-default) ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜, ์™€์ผ๋“œ์นด๋“œ('*')๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ Score ์™€ PreScore ์— ๋Œ€ํ•ด ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: non-multipoint-scheduler
    plugins:
      multiPoint:
        enabled:
        - name: 'MyPlugin'
      preScore:
        disabled:
        - name: '*'
      score:
        disabled:
        - name: '*'

kubescheduler.config.k8s.io/v1beta3 ๋ถ€ํ„ฐ, MultiPoint ํ•„๋“œ๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“  ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ™œ์„ฑํ™”๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๊ฐœ๋ณ„ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ๊ฐ’(์˜ˆ: ์ˆœ์„œ, Score ๊ฐ€์ค‘์น˜)์„ ์œ ์—ฐํ•˜๊ฒŒ ์žฌ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋„ ์—ฌ์ „ํžˆ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2๊ฐœ์˜ Score ํ”Œ๋Ÿฌ๊ทธ์ธ DefaultScore1 ๊ณผ DefaultScore2 ๊ฐ€ ์žˆ๊ณ  ๊ฐ๊ฐ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ 1 ์ด๋ผ๊ณ  ํ•˜์ž. ์ด ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ค‘์น˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: multipoint-scheduler
    plugins:
      score:
        enabled:
        - name: 'DefaultScore2'
          weight: 5

์ด ์˜ˆ์ œ์—์„œ, ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ MultiPoint ์— ๋ช…์‹œํ•  ํ•„์š”๋Š” ์—†๋Š”๋ฐ, ์ด๋Š” ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  Score ์—๋Š” DefaultScore2 ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ๋ช…์‹œ๋˜์—ˆ๋‹ค. ์ด๋Š” ์ต์Šคํ…์…˜ ํฌ์ธํŠธ๋ฅผ ๋ช…์‹œํ•˜์—ฌ ์„ค์ •๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์–ธ์ œ๋‚˜ MultiPoint ํ”Œ๋Ÿฌ๊ทธ์ธ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ, ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ๋‘ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ชจ๋‘ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ ๋„ ๋‘ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•˜์˜€๋‹ค.

MultiPoint ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์ •ํ•  ๋•Œ, ์ผ๋ฐ˜์ ์ธ ์šฐ์„  ์ˆœ์œ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋ช…์‹œ๋œ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๋ฉฐ, ์—ฌ๊ธฐ์— ๋ช…์‹œ๋œ ํ™˜๊ฒฝ ์„ค์ •์€ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ณณ์— ์„ค์ •๋œ ๋‚ด์šฉ๋ณด๋‹ค ์šฐ์„ ํ•œ๋‹ค.
  2. MultiPoint ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •์„ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ
  3. ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ๋ณธ ์„ค์ •

์œ„์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์‹œ๋ฅผ ๊ฐ€์ •ํ•œ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์ต์Šคํ…์…˜ ํฌ์ธํŠธ
DefaultQueueSortQueueSort
CustomQueueSortQueueSort
DefaultPlugin1Score, Filter
DefaultPlugin2Score
CustomPlugin1Score, Filter
CustomPlugin2Score, Filter

์ด๋“ค ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ์œ ํšจํ•œ ์˜ˆ์‹œ ํ™˜๊ฒฝ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: multipoint-scheduler
    plugins:
      multiPoint:
        enabled:
        - name: 'CustomQueueSort'
        - name: 'CustomPlugin1'
          weight: 3
        - name: 'CustomPlugin2'
        disabled:
        - name: 'DefaultQueueSort'
      filter:
        disabled:
        - name: 'DefaultPlugin1'
      score:
        enabled:
        - name: 'DefaultPlugin2'

๋ช…์‹œํ•œ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ ๋‚ด์— MultiPoint ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์žฌ์ •์˜ํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ์— ์œ ์˜ํ•œ๋‹ค. ๋ช…์‹œํ•œ ์ต์Šคํ…์…˜ ํฌ์ธํŠธ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋” ๋†’์œผ๋ฏ€๋กœ, ์ด ์žฌ์ •์˜๋Š” ๋ฌด์‹œ๋˜๊ณ  ๋กœ๊ทธ์—๋งŒ ๊ธฐ๋ก๋œ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ ์„ค์ •์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ๋ง๊ณ ๋„, ์ด ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ํฌํ•จํ•œ๋‹ค.

  • ์ปค์Šคํ…€ queueSort ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ธฐ์กด์˜ ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค
  • CustomPlugin1 ๊ณผ CustomPlugin2 ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉฐ, ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ต์Šคํ…์…˜ ํฌ์ธํŠธ๋ฅผ ์œ„ํ•ด ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ๋จผ์ € ์‹คํ–‰๋œ๋‹ค
  • filter ์— ๋Œ€ํ•ด์„œ๋งŒ DefaultPlugin1 ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค
  • score ์— ๋Œ€ํ•ด, DefaultPlugin2 ํ”Œ๋Ÿฌ๊ทธ์ธ์ด (์‹ฌ์ง€์–ด ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ๋ณด๋‹ค๋„) ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋„๋ก ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•œ๋‹ค

multiPoint ํ•„๋“œ๊ฐ€ ์—†๋Š” v1beta3 ์ด์ „ ๋ฒ„์ „์˜ ํ™˜๊ฒฝ ์„ค์ •์—์„œ๋Š”, ์œ„์˜ ์Šค๋‹ˆํŽซ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: multipoint-scheduler
    plugins:

      # ๊ธฐ๋ณธ QueueSort ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค
      queueSort:
        enabled:
        - name: 'CustomQueueSort'
        disabled:
        - name: 'DefaultQueueSort'

      # ์ปค์Šคํ…€ Filter ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค
      filter:
        enabled:
        - name: 'CustomPlugin1'
        - name: 'CustomPlugin2'
        - name: 'DefaultPlugin2'
        disabled:
        - name: 'DefaultPlugin1'

      # ์ปค์Šคํ…€ score ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•œ๋‹ค
      score:
        enabled:
        - name: 'DefaultPlugin2'
          weight: 1
        - name: 'DefaultPlugin1'
          weight: 3

๋‹ค์†Œ ๋ณต์žกํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด, ์ต์Šคํ…์…˜ ํฌ์ธํŠธ๋ฅผ ์„ค์ •ํ•จ์— ์žˆ์–ด์„œ MultiPoint ํ™˜๊ฒฝ ์„ค์ •์˜ ์œ ์—ฐ์„ฑ๊ณผ ๊ธฐ์กด ๋ฐฉ๋ฒ•๊ณผ์˜ ๋Š๊น€์—†๋Š” ํ†ตํ•ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ ์„ค์ • ์ „ํ™˜

  • ์„ค์ • ๋ฒ„์ „ v1beta2 ์—์„œ๋Š”, NodeResourcesFit ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์Šค์ฝ”์–ด๋ง ํ™•์žฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒˆ ํ™•์žฅ์€ NodeResourcesLeastAllocated, NodeResourcesMostAllocated, RequestedToCapacityRatio ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜์—ฌ ์ œ๊ณตํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „์— NodeResourcesMostAllocated ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, ๋Œ€์‹  NodeResourcesFit(๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ)์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด scoreStrategy๋ฅผ ํฌํ•จํ•˜๋Š” pluginConfig๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    apiVersion: kubescheduler.config.k8s.io/v1beta2
    kind: KubeSchedulerConfiguration
    profiles:
    - pluginConfig:
      - args:
          scoringStrategy:
            resources:
            - name: cpu
              weight: 1
            type: MostAllocated
        name: NodeResourcesFit
    
  • ์Šค์ผ€์ค„๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ NodeLabel์€ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ๋Œ€์‹ , ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด NodeAffinity ํ”Œ๋Ÿฌ๊ทธ์ธ(๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ)์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์Šค์ผ€์ค„๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ServiceAffinity์€ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ๋Œ€์‹ , ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด InterPodAffinity ํ”Œ๋Ÿฌ๊ทธ์ธ(๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ)์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์Šค์ผ€์ค„๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ NodePreferAvoidPods์€ ์‚ฌ์šฉ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ๋Œ€์‹ , ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ ํ…Œ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • v1beta2 ์„ค์ • ํŒŒ์ผ์—์„œ ํ™œ์„ฑํ™”๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ๋ณธ ์„ค์ •๊ฐ’๋ณด๋‹ค v1beta2 ์„ค์ • ํŒŒ์ผ์˜ ๊ฐ’์ด ์šฐ์„  ์ ์šฉ๋œ๋‹ค.

  • ์Šค์ผ€์ค„๋Ÿฌ healthz์™€ metrics ๋ฐ”์ธ๋“œ ์ฃผ์†Œ์— ๋Œ€ํ•ด host ๋˜๋Š” port ๊ฐ€ ์ž˜๋ชป ์„ค์ •๋˜๋ฉด ๊ฒ€์ฆ ์‹คํŒจ๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

  • ์„ธ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฐ€์ค‘์น˜ ๊ธฐ๋ณธ๊ฐ’์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
    • InterPodAffinity: 1 ์—์„œ 2 ๋กœ
    • NodeAffinity: 1 ์—์„œ 2 ๋กœ
    • TaintToleration: 1 ์—์„œ 3 ์œผ๋กœ

  • ์Šค์ผ€์ค„๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ SelectorSpread๋Š” ์ œ๊ฑฐ๋˜์—ˆ๋‹ค. ๋Œ€์‹ , ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด PodTopologySpread ํ”Œ๋Ÿฌ๊ทธ์ธ(๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ)์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

12.2 - ์Šค์ผ€์ค„๋ง ์ •์ฑ…

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.23 ์ด์ „ ๋ฒ„์ „์—์„œ๋Š”, ๋‹จ์ •(predicates) ๋ฐ ์šฐ์„ ์ˆœ์œ„(priorities) ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์ผ€์ค„๋ง ์ •์ฑ…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, kube-scheduler --policy-config-file <filename> ๋˜๋Š” kube-scheduler --policy-configmap <ConfigMap> ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค v1.23 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ด€๋ จ๋œ ํ”Œ๋ž˜๊ทธ์ธ policy-config-file, policy-configmap, policy-configmap-namespace, use-legacy-policy-config ํ”Œ๋ž˜๊ทธ๋„ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹ , ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

13 - ๋„๊ตฌ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•œ๋‹ค.

crictl

crictl์€ CRI-ํ˜ธํ™˜ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์˜ ์กฐ์‚ฌ ๋ฐ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

๋Œ€์‹œ๋ณด๋“œ

๋Œ€์‹œ๋ณด๋“œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์›น๊ธฐ๋ฐ˜ ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ฐฐํฌํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ž์›์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.

Helm

Helm์€ ์‚ฌ์ „ ๊ตฌ์„ฑ๋œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค ํŒจํ‚ค์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋‹ค. ์ด ํŒจํ‚ค์ง€๋Š” Helm charts ๋ผ๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

Helm์˜ ์šฉ๋„

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ฐจํŠธ๋กœ ๋ฐฐํฌ๋œ ์ธ๊ธฐ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‚ฌ์šฉ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ฐจํŠธ๋กœ ๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ณต์œ 
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜๋ณต๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ ๋ฐ ์ƒ์„ฑ
  • ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์˜ ์ง€๋Šฅํ™”๋œ ๊ด€๋ฆฌ
  • Helm ํŒจํ‚ค์ง€์˜ ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ

Kompose

Kompose๋Š” ๋„์ปค ์ปดํฌ์ฆˆ(Compose) ์œ ์ €๋“ค์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋กœ ์ด๋™ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๋Š” ๋„๊ตฌ์ด๋‹ค.

Kompose์˜ ์šฉ๋„

  • ๋„์ปค ์ปดํฌ์ฆˆ ํŒŒ์ผ์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€ํ™˜
  • ๋กœ์ปฌ ๋„์ปค ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋„๋ก ์ด์ „
  • V1 ๋˜๋Š” V2 ๋„์ปค ์ปดํฌ์ฆˆ yaml ํŒŒ์ผ ๋˜๋Š” ๋ถ„์‚ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒˆ๋“ค์„ ๋ณ€ํ™˜

Kui

Kui๋Š” ์ž…๋ ฅ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ kubectl ์ปค๋งจ๋“œ ๋ผ์ธ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ถœ๋ ฅ์œผ๋กœ ๊ทธ๋ž˜ํ”ฝ์ ์ธ ์‘๋‹ต์„ ์ œ๊ณตํ•˜๋Š” GUI ๋„๊ตฌ์ด๋‹ค.

Kui๋Š” ์ž…๋ ฅ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ kubectl ์ปค๋งจ๋“œ ๋ผ์ธ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ถœ๋ ฅ์œผ๋กœ ๊ทธ๋ž˜ํ”ฝ์ ์ธ ์‘๋‹ต์„ ์ œ๊ณตํ•œ๋‹ค. Kui๋Š” ASCII ํ‘œ ๋Œ€์‹  ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ํ‘œ๋ฅผ GUI๋กœ ์ œ๊ณตํ•œ๋‹ค.

Kui๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ๊ธธ์ด๊ฐ€ ๊ธด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ํด๋ฆญํ•˜์—ฌ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • kubectl ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ์‹คํ–‰๋˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, kubectl ๋ณด๋‹ค ๋” ๋น ๋ฅธ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.
  • ์žก์„ ์กฐํšŒํ•˜์—ฌ ์‹คํ–‰ ํ˜•์ƒ์„ ์›Œํ„ฐํด ๊ทธ๋ฆผ์œผ๋กœ ํ™•์ธํ•œ๋‹ค.
  • ํƒญ์ด ์žˆ๋Š” UI๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ž์›์„ ํด๋ฆญ ๋™์ž‘์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Minikube

minikube๋Š” ๊ฐœ๋ฐœ๊ณผ ํ…Œ์ŠคํŒ… ๋ชฉ์ ์œผ๋กœ ๋‹จ์ผ ๋…ธ๋“œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋กœ์ปฌ ์›Œํฌ์Šคํ…Œ์ด์…˜์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.