๊ฒ€์ƒ‰

๋…ธ๋“œ

download PDF
OpenShift Container Platform 4.10

OpenShift Container Platform์—์„œ ๋…ธ๋“œ ๊ตฌ์„ฑ ๋ฐ ๊ด€๋ฆฌ

Red Hat OpenShift Documentation Team

์ดˆ๋ก

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

1์žฅ. ๋…ธ๋“œ ๊ฐœ์š”

1.1. ๋…ธ๋“œ ์ •๋ณด

๋…ธ๋“œ๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ€์ƒ ๋˜๋Š” ๋ฒ ์–ด ๋ฉ”ํƒˆ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ž ๋…ธ๋“œ๋Š” Pod๋กœ ๊ทธ๋ฃนํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์—๋Š” OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Kubernetes ์„œ๋น„์Šค ์ด์ƒ์˜ ์„œ๋น„์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์— ์•ˆ์ •์ ์ด๊ณ  ์ •์ƒ์ ์ธ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ํ˜ธ์ŠคํŒ…๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์›ํ™œํ•œ ๊ธฐ๋Šฅ์— ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ๋Š” ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Node ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ์— ์•ก์„ธ์Šค, ๊ด€๋ฆฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenShift CLI(oc) ๋˜๋Š” ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์—์„œ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” Pod ์‹คํ–‰์„ ์œ ์ง€ํ•˜๊ณ  Kubernetes ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„:: ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์€ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. Kubernetes๋Š” containerd, cri-o, rktlet, Docker์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋Ÿฐํƒ€์ž„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • kubelet:: Kubelet์€ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ ์ปจํ…Œ์ด๋„ˆ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ •์˜๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. kubelet ํ”„๋กœ์„ธ์Šค๋Š” ์ž‘์—… ์ƒํƒœ์™€ ๋…ธ๋“œ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. kubelet์€ ๋„คํŠธ์›Œํฌ ๊ทœ์น™ ๋ฐ ํฌํŠธ ์ „๋‹ฌ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. kubelet์€ Kubernetes์—์„œ ์ƒ์„ฑํ•œ ์ปจํ…Œ์ด๋„ˆ๋งŒ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • kube-proxy:: Kube-proxy๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ Kubernetes ๋ฆฌ์†Œ์Šค ๊ฐ„ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Kube-proxy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํ‚น ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • DNS:: ํด๋Ÿฌ์Šคํ„ฐ DNS๋Š” Kubernetes ์„œ๋น„์Šค์— ๋Œ€ํ•œ DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” DNS ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. Kubernetes์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” DNS ๊ฒ€์ƒ‰์— ์ด DNS ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋ฐ ์ž‘์—…์ž ๋…ธ๋“œ ๊ฐœ์š”
์ฝ๊ธฐ ์ž‘์—…

์ฝ๊ธฐ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ด€๋ฆฌ์ž ๋˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌ ์ž‘์—…

๊ด€๋ฆฌ์ž๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ†ตํ•ด OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ๊ฐœ์„  ์ž‘์—…

OpenShift Container Platform์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ˆœํžˆ ๋…ธ๋“œ์— ์•ก์„ธ์Šคํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋Š” ๋…ธ๋“œ์—์„œ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํšจ์œจ์„ฑ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์นœํ™”์„ฑ์„ ๋งŒ๋“ค๊ณ , ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ๋‚˜์€ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.2. Pod ์ •๋ณด

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

์ฝ๊ธฐ ์ž‘์—…

๊ด€๋ฆฌ์ž๋Š” ๋‹ค์Œ ์ž‘์—…์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์˜ Pod์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌ ์ž‘์—…

๋‹ค์Œ ์ž‘์—… ๋ชฉ๋ก์€ ๊ด€๋ฆฌ์ž๊ฐ€ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Pod๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ๊ฐœ์„  ์ž‘์—…

OpenShift Container Platform์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํˆด ๋ฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ž‘์—…์—๋Š” Pod๋ฅผ ๋” ์ž˜ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํˆด๊ณผ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ž‘์—…์‚ฌ์šฉ์ž๋” ๋งŽ์€ ์ •๋ณด

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ Pod ์ˆ˜์™€ Pod์—์„œ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” CPU ์‚ฌ์šฉ๋ฅ  ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Pod ๋ฅผ ์ž๋™์œผ๋กœ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ:: ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ฐฐํฌ, ์ƒํƒœ ์ €์žฅ ์„ธํŠธ, ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ๋˜๋Š” ์ž‘์—…์˜ Pod ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ Operator ๊ฐœ์š” ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ˆ˜์ง Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž ๋ฐ ๊ฐœ๋ฐœ์ž

๊ด€๋ฆฌ์ž๋Š” ์ˆ˜์ง Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๋ฐ ์›Œํฌ๋กœ๋“œ์˜ ๋ฆฌ์†Œ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ์ˆ˜์ง Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ Pod์— ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•˜์—ฌ ์ˆ˜์š”๊ฐ€ ๋งŽ์€ ๊ธฐ๊ฐ„์— Pod๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž

์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์€ ํŠน์ • ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋…ธ๋“œ( kubelet ์™ธ๋ถ€)์—์„œ ์‹คํ–‰๋˜๋Š” gRPC ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ฐฐํฌํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ํ•˜๋“œ์›จ์–ด ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ผ๊ด€๋˜๊ณ  ์ด์‹ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod์— ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž

์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ์•”ํ˜ธ ๋ฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Pod์— ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.3. ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด

์ปจํ…Œ์ด๋„ˆ๋Š” ์ข…์† ํ•ญ๋ชฉ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ํ•จ๊ป˜ ํŒจํ‚ค์ง€๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋œ OpenShift Container Platform ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” ๋ฌผ๋ฆฌ ์„œ๋ฒ„, ๊ฐ€์ƒ ๋จธ์‹ (VM) ๋ฐ ํ”„๋ผ์ด๋น— ๋˜๋Š” ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ์™€ ๊ฐ™์€ ํ™˜๊ฒฝ ๋ฐ ์—ฌ๋Ÿฌ ๋ฐฐ์น˜ ๋Œ€์ƒ ์‚ฌ์ด์— ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Linux ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์€ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค๋กœ๋งŒ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Linux ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenShift Container Platform์€ Init ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ํŠน์ˆ˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Init ์ปจํ…Œ์ด๋„ˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€์— ์—†๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋˜๋Š” ์„ค์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Init ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋จธ์ง€ Pod๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ, Pod ๋ฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์ „์ฒด OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ•จ๊ป˜ ์ž‘์—…ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํšจ์œจ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Pod๋ฅผ ๊ณ ๊ฐ€์šฉ์„ฑ์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2์žฅ. ๋…ธ๋“œ ์ž‘์—…

2.1. Pod ์‚ฌ์šฉ

Pod๋Š” ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ์— ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ์ด์ž ์ •์˜, ๋ฐฐํฌ, ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์ปดํ“จํŒ… ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.

2.1.1. Pod ์ดํ•ด

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

Pod์—๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด์ด ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ• ๋‹น๋œ ๋‹ค์Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ๊ธฐํƒ€ ์ด์œ ๋กœ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Pod๋Š” ์ •์ฑ… ๋ฐ ์ข…๋ฃŒ ์ฝ”๋“œ์— ๋”ฐ๋ผ ์ข…๋ฃŒ ํ›„ ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenShift Container Platform์—์„œ๋Š” ๋Œ€์ฒด๋กœ Pod๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์—๋Š” Pod ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. OpenShift Container Platform์€ ๊ธฐ์กด Pod๋ฅผ ์ข…๋ฃŒํ•œ ํ›„ ์ˆ˜์ •๋œ ๊ตฌ์„ฑ์ด๋‚˜ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ๋˜๋Š” ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Pod๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋ฉด ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋˜๊ณ  ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ Pod๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹  ์ƒ์œ„ ์ˆ˜์ค€์˜ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

OpenShift Container Platform ๋…ธ๋“œ ํ˜ธ์ŠคํŠธ๋‹น ์ตœ๋Œ€ Pod ์ˆ˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ œํ•œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฃผ์˜

๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋ฒ ์–ด Pod๋Š” ๋…ธ๋“œ ์ค‘๋‹จ ์‹œ ๋‹ค์‹œ ์˜ˆ์•ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2.1.2. Pod ๊ตฌ์„ฑ์˜ ์˜ˆ

OpenShift Container Platform์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ์— ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ์ด์ž ์ •์˜, ๋ฐฐํฌ, ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์ปดํ“จํŒ… ๋‹จ์œ„์ธ Pod์˜ Kubernetes ๊ฐœ๋…์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Rails ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํฌ๋“œ ์ •์˜์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” Pod์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ๋‹ค๋ฅธ ์ฃผ์ œ์—์„œ ์„ค๋ช…ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐ„๋‹จํžˆ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

Pod ์˜ค๋ธŒ์ ํŠธ ์ •์˜(YAML)

kind: Pod
apiVersion: v1
metadata:
  name: example
  namespace: default
  selfLink: /api/v1/namespaces/default/pods/example
  uid: 5cc30063-0265780783bc
  resourceVersion: '165032'
  creationTimestamp: '2019-02-13T20:31:37Z'
  labels:
    app: hello-openshift 1
  annotations:
    openshift.io/scc: anyuid
spec:
  restartPolicy: Always 2
  serviceAccountName: default
  imagePullSecrets:
    - name: default-dockercfg-5zrhb
  priority: 0
  schedulerName: default-scheduler
  terminationGracePeriodSeconds: 30
  nodeName: ip-10-0-140-16.us-east-2.compute.internal
  securityContext: 3
    seLinuxOptions:
      level: 's0:c11,c10'
  containers: 4
    - resources: {}
      terminationMessagePath: /dev/termination-log
      name: hello-openshift
      securityContext:
        capabilities:
          drop:
            - MKNOD
        procMount: Default
      ports:
        - containerPort: 8080
          protocol: TCP
      imagePullPolicy: Always
      volumeMounts: 5
        - name: default-token-wbqsl
          readOnly: true
          mountPath: /var/run/secrets/kubernetes.io/serviceaccount 6
      terminationMessagePolicy: File
      image: registry.redhat.io/openshift4/ose-ogging-eventrouter:v4.3 7
  serviceAccount: default 8
  volumes: 9
    - name: default-token-wbqsl
      secret:
        secretName: default-token-wbqsl
        defaultMode: 420
  dnsPolicy: ClusterFirst
status:
  phase: Pending
  conditions:
    - type: Initialized
      status: 'True'
      lastProbeTime: null
      lastTransitionTime: '2019-02-13T20:31:37Z'
    - type: Ready
      status: 'False'
      lastProbeTime: null
      lastTransitionTime: '2019-02-13T20:31:37Z'
      reason: ContainersNotReady
      message: 'containers with unready status: [hello-openshift]'
    - type: ContainersReady
      status: 'False'
      lastProbeTime: null
      lastTransitionTime: '2019-02-13T20:31:37Z'
      reason: ContainersNotReady
      message: 'containers with unready status: [hello-openshift]'
    - type: PodScheduled
      status: 'True'
      lastProbeTime: null
      lastTransitionTime: '2019-02-13T20:31:37Z'
  hostIP: 10.0.140.16
  startTime: '2019-02-13T20:31:37Z'
  containerStatuses:
    - name: hello-openshift
      state:
        waiting:
          reason: ContainerCreating
      lastState: {}
      ready: false
      restartCount: 0
      image: openshift/hello-openshift
      imageID: ''
  qosClass: BestEffort

1
Pod๋Š” ๋‹จ์ผ ์ž‘์—…์—์„œ Pod ๊ทธ๋ฃน์„ ์„ ํƒํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ๋ฒจ์„ ํ•˜๋‚˜ ์ด์ƒ ์‚ฌ์šฉํ•˜์—ฌ "ํƒœ๊ทธ๋ฅผ ์ง€์ •"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ๋ฒจ์€ metadata ํ•ด์‹œ์˜ ํ‚ค/๊ฐ’ ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
2
Pod๋Š” ๊ฐ€๋Šฅํ•œ ๊ฐ’ Always, OnFailure, Never๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ฑ…์„ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Always์ž…๋‹ˆ๋‹ค.
3
OpenShift Container Platform์€ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ๋Š” ๊ถŒํ•œ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์„ ํƒํ•œ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€ ๋“ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ปจํ…์ŠคํŠธ๋Š” ๋งค์šฐ ์ œํ•œ์ ์ด์ง€๋งŒ ํ•„์š”์— ๋”ฐ๋ผ ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4
containers๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ ์ •์˜๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
5
์ด ์ปจํ…Œ์ด๋„ˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€ ๋ณผ๋ฅจ์ด ๋งˆ์šดํŠธ๋˜๋Š” ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ OpenShift Container Platform API์— ๋Œ€ํ•ด ์š”์ฒญํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž๊ฒฉ ์ฆ๋ช… ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ €์žฅํ•˜๋Š” ๋ณผ๋ฅจ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
6
Pod์— ์ œ๊ณตํ•  ๋ณผ๋ฅจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ๊ฒฝ๋กœ์—์„œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฃจํŠธ, / ๋˜๋Š” ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋™์ผํ•œ ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜ธ์ŠคํŠธ /dev/pts ํŒŒ์ผ๊ณผ ๊ฐ™์ด ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /host๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ๋ฅผ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
7
Pod์˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž์ฒด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋ฉ๋‹ˆ๋‹ค.
8
OpenShift Container Platform API์— ๋Œ€ํ•ด ์š”์ฒญํ•˜๋Š” Pod๋Š” ์š”์ฒญ ์‹œ Pod์—์„œ ์ธ์ฆํ•ด์•ผ ํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ • ์‚ฌ์šฉ์ž๋ฅผ ์ง€์ •ํ•˜๋Š” serviceAccount ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์„ธ๋ถ€์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
9
Pod๋Š” ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ† ๋ฆฌ์ง€ ๋ณผ๋ฅจ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์ด ํฌํ•จ๋œ ๋ณด์•ˆ ๋ณผ๋ฅจ์— ๋Œ€ํ•œ ์ž„์‹œ ๋ณผ๋ฅจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์ด ๋งŽ์€ ์˜๊ตฌ ๋ณผ๋ฅจ์„ Pod์— ์—ฐ๊ฒฐํ•˜๋ฉด ํ•ด๋‹น Pod๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ OpenShift์—์„œ ํŒŒ์ผ ์ˆ˜๊ฐ€ ๋งŽ์€ ์˜๊ตฌ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๊ณผ๋„ํ•œ ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•˜์—ฌ "Ready" ์ƒํƒœ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ฐธ๊ณ 

์ด Pod ์ •์˜์—๋Š” Pod๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ•ด๋‹น ๋ผ์ดํ”„์‚ฌ์ดํด์ด ์‹œ์ž‘๋œ ํ›„ OpenShift Container Platform์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๋Š” ํŠน์„ฑ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Kubernetes Pod ์„ค๋ช…์„œ์—๋Š” Pod์˜ ๊ธฐ๋Šฅ ๋ฐ ์šฉ๋„์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2.1.3. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

2.2. Pod ๋ณด๊ธฐ

๊ด€๋ฆฌ์ž๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ Pod๋ฅผ ๋ณด๊ณ  ํ•ด๋‹น Pod ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.2.1. Pod ์ •๋ณด

OpenShift Container Platform์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ์— ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ์ด์ž ์ •์˜, ๋ฐฐํฌ, ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์ปดํ“จํŒ… ๋‹จ์œ„์ธ Pod์˜ Kubernetes ๊ฐœ๋…์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. Pod๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋จธ์‹  ์ธ์Šคํ„ด์Šค(์‹ค์ œ ๋˜๋Š” ๊ฐ€์ƒ)์™€ ๋Œ€๋žต์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ํ”„๋กœ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ Pod ๊ด€๋ จ ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.2.2. ํ”„๋กœ์ ํŠธ์˜ Pod ๋ณด๊ธฐ

Pod์˜ ๋ณต์ œ๋ณธ ์ˆ˜, ํ˜„์žฌ ์ƒํƒœ, ์žฌ์‹œ์ž‘ ํšŸ์ˆ˜, ์ˆ˜๋ช… ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ๋œ Pod ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

ํ”„๋กœ์ ํŠธ์˜ Pod๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ”„๋กœ์ ํŠธ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    $ oc project <project-name>
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc get pods

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc get pods

    ์ถœ๋ ฅ ์˜ˆ

    NAME                       READY   STATUS    RESTARTS   AGE
    console-698d866b78-bnshf   1/1     Running   2          165m
    console-698d866b78-m87pm   1/1     Running   2          165m

    Pod IP ์ฃผ์†Œ์™€ Pod๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ณด๋ ค๋ฉด -o wide ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc get pods -o wide

    ์ถœ๋ ฅ ์˜ˆ

    NAME                       READY   STATUS    RESTARTS   AGE    IP            NODE                           NOMINATED NODE
    console-698d866b78-bnshf   1/1     Running   2          166m   10.128.0.24   ip-10-0-152-71.ec2.internal    <none>
    console-698d866b78-m87pm   1/1     Running   2          166m   10.129.0.23   ip-10-0-173-237.ec2.internal   <none>

2.2.3. Pod ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„ ๋ณด๊ธฐ

์ปจํ…Œ์ด๋„ˆ์˜ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” Pod์— ๋Œ€ํ•œ ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„์—๋Š” CPU, ๋ฉ”๋ชจ๋ฆฌ, ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๋ณด๋ ค๋ฉด cluster-reader ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๋ณด๋ ค๋ฉด ๋ฉ”ํŠธ๋ฆญ์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm top pods

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc adm top pods -n openshift-console

    ์ถœ๋ ฅ ์˜ˆ

    NAME                         CPU(cores)   MEMORY(bytes)
    console-7f58c69899-q8c8k     0m           22Mi
    console-7f58c69899-xhbgg     0m           25Mi
    downloads-594fcccf94-bcxk8   3m           18Mi
    downloads-594fcccf94-kv4p6   2m           15Mi

  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋ผ๋ฒจ์ด ์žˆ๋Š” Pod์˜ ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm top pod --selector=''

    ํ•„ํ„ฐ๋งํ•  ์„ ํƒ๊ธฐ(๋ผ๋ฒจ ์ฟผ๋ฆฌ)๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. =, ==, !=๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc adm top pod --selector='name=my-pod'

2.2.4. ๋ฆฌ์†Œ์Šค ๋กœ๊ทธ ๋ณด๊ธฐ

OpenShift CLI(oc) ๋ฐ ์›น ์ฝ˜์†”์—์„œ ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค์˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋Š” ๋กœ๊ทธ์˜ ๋ง๋ฏธ ๋˜๋Š” ๋์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift CLI(oc)์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค(UI)

  1. OpenShift Container Platform ์ฝ˜์†”์—์„œ ์›Œํฌ๋กœ๋“œ โ†’ Pod๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์กฐ์‚ฌํ•˜๋ ค๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ํ†ตํ•ด Pod๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ๋นŒ๋“œ์™€ ๊ฐ™์€ ์ผ๋ถ€ ๋ฆฌ์†Œ์Šค์—๋Š” ์ง์ ‘ ์ฟผ๋ฆฌํ•  Pod๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธ์Šคํ„ด์Šค์—์„œ ๋ฆฌ์†Œ์Šค์˜ ์„ธ๋ถ€ ์ •๋ณด ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ ๋งํฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ์กฐ์‚ฌํ•  Pod ์ด๋ฆ„์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ๋กœ๊ทธ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค(CLI)

  • ํŠน์ • Pod์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc logs -f <pod_name> -c <container_name>

    ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    -f
    ์„ ํƒ ์‚ฌํ•ญ: ์ถœ๋ ฅ์—์„œ ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๋Š” ๋‚ด์šฉ์„ ๋”ฐ๋ฅด๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    <pod_name>
    pod ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    <container_name>
    ์„ ํƒ ์‚ฌํ•ญ: ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Pod์— ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc logs ruby-58cd97df55-mww7r
    $ oc logs -f ruby-57f7f4855b-znl92 -c ruby

    ๋กœ๊ทธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

  • ํŠน์ • ๋ฆฌ์†Œ์Šค์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc logs <object_type>/<resource_name> 1
    1
    ๋ฆฌ์†Œ์Šค ์œ ํ˜• ๋ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc logs deployment/ruby

    ๋กœ๊ทธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

2.3. Pod์— ๋Œ€ํ•œ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

๊ด€๋ฆฌ์ž๋Š” Pod์— ํšจ์œจ์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

2.3.1. ์žฌ์‹œ์ž‘ ํ›„ Pod ์ž‘๋™ ๋ฐฉ์‹ ๊ตฌ์„ฑ

Pod ์žฌ์‹œ์ž‘ ์ •์ฑ…์— ๋”ฐ๋ผ ํ•ด๋‹น Pod์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ OpenShift Container Platform์—์„œ ์‘๋‹ตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ •์ฑ…์€ ํ•ด๋‹น Pod์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Always - ๊ธ‰๊ฒฉํ•œ ๋ฐฑ์˜คํ”„ ์ง€์—ฐ(10์ดˆ, 20์ดˆ, 40์ดˆ)์„ 5๋ถ„์œผ๋กœ ์ œํ•œํ•˜์—ฌ Pod์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์†์ ์œผ๋กœ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Always์ž…๋‹ˆ๋‹ค.
  • OnFailure - ๊ธ‰๊ฒฉํ•œ ๋ฐฑ์˜คํ”„ ์ง€์—ฐ(10์ดˆ, 20์ดˆ, 40์ดˆ)์„ 5๋ถ„์œผ๋กœ ์ œํ•œํ•˜์—ฌ Pod์—์„œ ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • Never - Pod์—์„œ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pod๊ฐ€ ์ฆ‰์‹œ ์‹คํŒจํ•˜๊ณ  ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Pod๊ฐ€ ํŠน์ • ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ๋œ ํ›„์—๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋…ธ๋“œ ์žฅ์•  ์‹œ Pod๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ์ปจํŠธ๋กค๋Ÿฌ ์œ ํ˜•์žฌ์‹œ์ž‘ ์ •์ฑ…

์ข…๋ฃŒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” Pod(์˜ˆ: ์ผ๊ด„ ๊ณ„์‚ฐ)

Job

OnFailure ๋˜๋Š” Never

์ข…๋ฃŒ๋˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” Pod(์˜ˆ: ์›น ์„œ๋ฒ„)

๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ

Always

๋จธ์‹ ๋‹น ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” Pod

๋ฐ๋ชฌ ์„ธํŠธ

Any

Pod์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์žฌ์‹œ์ž‘ ์ •์ฑ…์ด OnFailure๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ Pod๊ฐ€ ๋…ธ๋“œ์— ๋‚จ์•„ ์žˆ๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์žฌ์‹œ์ž‘ ์ •์ฑ… Never๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ „์ฒด Pod๊ฐ€ ์‹คํŒจํ•˜๋ฉด OpenShift Container Platform์—์„œ ์ƒˆ Pod๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒˆ Pod์—์„œ ์žฌ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ด์ „ ์‹คํ–‰์œผ๋กœ ๋ฐœ์ƒํ•œ ์ž„์‹œ ํŒŒ์ผ, ์ž ๊ธˆ, ๋ถˆ์™„์ „ํ•œ ์ถœ๋ ฅ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Kubernetes ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์˜ ๋์ ์ด ์•ˆ์ •์ ์ธ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ์ค‘๋‹จ๋˜๋ฉด kubelet์—์„œ OpenShift Container Platform์ด ์žฌ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ๋์ ์ด ์•ˆ์ •์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํด๋ผ์šฐ๋“œ๊ฐ€ ์•„๋‹Œ ํ™˜๊ฒฝ์—์„œ์ฒ˜๋Ÿผ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ํ†ตํ•ฉ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

OpenShift Container Platform์—์„œ ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ์— ์žฌ์‹œ์ž‘ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubernetes ์„ค๋ช…์„œ์˜ ์˜ˆ์ œ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2.3.2. Pod์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์—ญํญ ์ œํ•œ

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

ํ”„๋กœ์„ธ์Šค

Pod์˜ ๋Œ€์—ญํญ์„ ์ œํ•œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์˜ค๋ธŒ์ ํŠธ ์ •์˜ JSON ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  kubernetes.io/ingress-bandwidth ๋ฐ kubernetes.io/egress-bandwidth ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํŠธ๋ž˜ํ”ฝ ์†๋„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Pod ์†ก์‹  ๋ฐ ์ˆ˜์‹  ๋Œ€์—ญํญ์„ ๋‘˜ ๋‹ค 10M/s๋กœ ์ œํ•œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ์ œํ•œ๋œ Pod ์˜ค๋ธŒ์ ํŠธ ์ •์˜

    {
        "kind": "Pod",
        "spec": {
            "containers": [
                {
                    "image": "openshift/hello-openshift",
                    "name": "hello-openshift"
                }
            ]
        },
        "apiVersion": "v1",
        "metadata": {
            "name": "iperf-slow",
            "annotations": {
                "kubernetes.io/ingress-bandwidth": "10M",
                "kubernetes.io/egress-bandwidth": "10M"
            }
        }
    }

  2. ์˜ค๋ธŒ์ ํŠธ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file_or_dir_path>

2.3.3. Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ pod ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ๋…ธ๋“œ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•˜๋Š” ๋“ฑ ์ž‘์—… ์ค‘์— Pod์— ๋Œ€ํ•œ ๋ณด์•ˆ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

PodDisruptionBudget ์˜ค๋ธŒ์ ํŠธ์˜ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ผ๋ จ์˜ pod์— ๋Œ€ํ•œ ๋ผ๋ฒจ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์ธ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค.
  • ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ตœ์†Œ pod ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฐ€์šฉ์„ฑ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

    • minAvailable์€ ์ค‘๋‹จ ์ค‘์—๋„ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋Š” pod ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • maxUnavailable์€ ์ค‘๋‹จ ์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” pod ์ˆ˜์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ 

Available ์€ condition Ready=True ๊ฐ€ ์žˆ๋Š” Pod ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ready=True ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Pod๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค์˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

maxUnavailable 0 % ๋˜๋Š” 0์ด๋‚˜ minAvailable์˜ 100 % ํ˜น์€ ๋ณต์ œ๋ณธ ์ˆ˜์™€ ๋™์ผํ•œ ๊ฐ’์€ ํ—ˆ์šฉ๋˜์ง€๋งŒ ์ด๋กœ ์ธํ•ด ๋…ธ๋“œ๊ฐ€ ๋“œ๋ ˆ์ธ๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc get poddisruptionbudget --all-namespaces

์ถœ๋ ฅ ์˜ˆ

NAMESPACE                              NAME                                    MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
openshift-apiserver                    openshift-apiserver-pdb                 N/A             1                 1                     121m
openshift-cloud-controller-manager     aws-cloud-controller-manager            1               N/A               1                     125m
openshift-cloud-credential-operator    pod-identity-webhook                    1               N/A               1                     117m
openshift-cluster-csi-drivers          aws-ebs-csi-driver-controller-pdb       N/A             1                 1                     121m
openshift-cluster-storage-operator     csi-snapshot-controller-pdb             N/A             1                 1                     122m
openshift-cluster-storage-operator     csi-snapshot-webhook-pdb                N/A             1                 1                     122m
openshift-console                      console                                 N/A             1                 1                     116m
#...

PodDisruptionBudget์€ ์‹œ์Šคํ…œ์—์„œ ์ตœ์†Œ minAvailable pod๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ ์ •์ƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ด ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋Š” ๋ชจ๋“  pod๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Pod ์šฐ์„  ์ˆœ์œ„ ๋ฐ ์„ ์  ์„ค์ •์— ๋”ฐ๋ผ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ pod๋Š” pod ์ค‘๋‹จ ์˜ˆ์‚ฐ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ฌด์‹œํ•˜๊ณ  ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.3.3.1. Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•ด์•ผ ํ•  pod ์ˆ˜ ์ง€์ •

PodDisruptionBudget ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ์— ๊ฐ€๋™๋˜์–ด์•ผ ํ•˜๋Š” ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜ ๋˜๋Š” ๋ฐฑ๋ถ„์œจ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    apiVersion: policy/v1 1
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      minAvailable: 2  2
      selector:  3
        matchLabels:
          name: my-pod
    1
    PodDisruptionBudget ์€ policy/v1 API ๊ทธ๋ฃน์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.
    2
    ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ํ•„์š”๊ฐ€ ์žˆ๋Š” ์ตœ์†Œ pod ์ˆ˜ ์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋˜๋Š” ๋ฐฑ๋ถ„์œจ (์˜ˆ: 20 %)์„ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3
    ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋ผ๋ฒจ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. matchLabels ๋ฐ matchExpressions์˜ ๊ฒฐ๊ณผ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜(์˜ˆ: selector {} )๋ฅผ ๋น„์›Œ ๋‘๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  Pod๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: policy/v1 1
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      maxUnavailable: 25% 2
      selector: 3
        matchLabels:
          name: my-pod
    1
    PodDisruptionBudget ์€ policy/v1 API ๊ทธ๋ฃน์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.
    2
    ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์ตœ๋Œ€ pod ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋˜๋Š” ๋ฐฑ๋ถ„์œจ (์˜ˆ: 20 %)์„ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3
    ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋ผ๋ฒจ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. matchLabels ๋ฐ matchExpressions์˜ ๊ฒฐ๊ณผ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜(์˜ˆ: selector {} )๋ฅผ ๋น„์›Œ ๋‘๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  Pod๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f </path/to/file> -n <project_name>

2.3.4. ์ค‘์š” Pod๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์ œ๊ฑฐ ๋ฐฉ์ง€

์™„์ „ํžˆ ์ž‘๋™ํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ค‘์š”ํ•˜์ง€๋งŒ ๋งˆ์Šคํ„ฐ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ๋˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”๋กœ ํ‘œ์‹œ๋œ Pod๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

Pod๋ฅผ ์ค‘์š”๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. Pod ์‚ฌ์–‘์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ system-cluster-critical ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๋„๋ก ๊ธฐ์กด Pod๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pdb
    spec:
      template:
        metadata:
          name: critical-pod
        priorityClassName: system-cluster-critical 1
    1
    ๋…ธ๋“œ์—์„œ ์ œ๊ฑฐํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” Pod์˜ ๊ธฐ๋ณธ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

    ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ค‘์š”ํ•œ Pod์— ๋Œ€ํ•ด system-node-critical์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>.yaml

2.3.5. ํŒŒ์ผ ์ˆ˜๊ฐ€ ๋งŽ์€ ์˜๊ตฌ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•  ๋•Œ Pod ํƒ€์ž„์•„์›ƒ ๊ฐ์†Œ

์Šคํ† ๋ฆฌ์ง€ ๋ณผ๋ฅจ์— ๋งŽ์€ ํŒŒ์ผ(~1,000,000๊ฐœ ์ด์ƒ)์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ Pod ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋ณผ๋ฅจ์ด ๋งˆ์šดํŠธ๋  ๋•Œ Pod์˜ securityContext ์— ์ง€์ •๋œ fsGroup ๊ณผ ์ผ์น˜ํ•˜๋„๋ก OpenShift Container Platform์—์„œ ๊ฐ ๋ณผ๋ฅจ์˜ ์ปจํ…์ธ ์˜ ์†Œ์œ ๊ถŒ ๋ฐ ๊ถŒํ•œ์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ๋ณผ๋ฅจ์˜ ๊ฒฝ์šฐ ์†Œ์œ ๊ถŒ ๋ฐ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ Pod ์‹œ์ž‘ ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์ด ์ง€์—ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • SCC(๋ณด์•ˆ ์ปจํ…์ŠคํŠธ ์ œ์•ฝ ์กฐ๊ฑด)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์˜ SELinux ์žฌ๋ ˆ์ด๋ธ”์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
  • SCC ๋‚ด์—์„œ fsGroupChangePolicy ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform์—์„œ ๋ณผ๋ฅจ์˜ ์†Œ์œ ๊ถŒ ๋ฐ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์˜ SELinux ์žฌ๋ ˆ์ด๋ธ”์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ OpenShift์—์„œ ํŒŒ์ผ ์ˆ˜๊ฐ€ ๋งŽ์€ ์˜๊ตฌ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•  ๋•Œ Pod๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š๊ฑฐ๋‚˜ "Ready" ์ƒํƒœ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ๊ณผ๋„ํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

2.4. ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์ž๋™ ์Šค์ผ€์ผ๋ง

๊ฐœ๋ฐœ์ž๋Š” HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ ๋˜๋Š” ๋ฐฐํฌ ๊ตฌ์„ฑ์— ์†ํ•˜๋Š” Pod์—์„œ ์ˆ˜์ง‘ํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ OpenShift Container Platform์—์„œ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ ๋˜๋Š” ๋ฐฐํฌ ๊ตฌ์„ฑ์˜ ๊ทœ๋ชจ๋ฅผ ์ž๋™์œผ๋กœ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐฐํฌ, ๋ฐฐํฌ ๊ตฌ์„ฑ, ๋ณต์ œ๋ณธ ์„ธํŠธ, ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ ๋˜๋Š” ์ƒํƒœ ์ €์žฅ ์„ธํŠธ์— ๋Œ€ํ•œ HPA๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Pod ์Šค์ผ€์ผ๋ง์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Pod ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ 

๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠน์ • ๊ธฐ๋Šฅ ๋˜๋Š” ๋™์ž‘์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ํ•œ Deployment ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ReplicaSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Deployment ๋ฐ DeploymentConfig ์˜ค๋ธŒ์ ํŠธ ์ดํ•ด๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2.4.1. ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ดํ•ด

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ ค๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ Pod ์ˆ˜์™€ Pod์—์„œ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” CPU ์‚ฌ์šฉ๋ฅ  ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด OpenShift Container Platform์—์„œ Pod์˜ CPU ๋ฐ/๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค ๋ฉ”ํŠธ๋ฆญ์„ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์—์„œ ํ˜„์žฌ ๋ฉ”ํŠธ๋ฆญ ์‚ฌ์šฉ๋ฅ ๊ณผ ์›ํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ์‚ฌ์šฉ๋ฅ ์˜ ๋น„์œจ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ํ™•์žฅ ๋˜๋Š” ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋ฐ ์Šค์ผ€์ผ๋ง์€ ์ •๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€๋งŒ ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ 1~2๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์Šค์ผ€์ผ๋ง์€ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ณต์ œ๋ณธ๊ณผ ์ง์ ‘์ ์œผ๋กœ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ ๊ตฌ์„ฑ์˜ ๊ฒฝ์šฐ ์Šค์ผ€์ผ๋ง์€ ๋ฐฐํฌ ๊ตฌ์„ฑ์˜ ๋ณต์ œ๋ณธ ์ˆ˜์™€ ์ง์ ‘์ ์œผ๋กœ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์Šค์ผ€์ผ๋ง์€ Complete ๋‹จ๊ณ„์—์„œ ์ตœ์‹  ๋ฐฐํฌ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ฐจ์ง€ํ•˜์—ฌ ์‹œ์ž‘ํ•˜๋Š” ๋™์•ˆ๊ณผ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ๊ธ‰์ฆํ•˜๋Š” ๋™์•ˆ ๋ถˆํ•„์š”ํ•œ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. unready ์ƒํƒœ์˜ Pod๋Š” ํ™•์žฅ ์‹œ CPU ์‚ฌ์šฉ๋Ÿ‰์ด 0์ด๊ณ , ์ถ•์†Œ ์‹œ์—๋Š” ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์—์„œ Pod๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ๋ฉ”ํŠธ๋ฆญ์ด ์—†๋Š” Pod๋Š” ํ™•์žฅ ์‹œ CPU ์‚ฌ์šฉ๋Ÿ‰์ด 0%์ด๊ณ , ์ถ•์†Œ ์‹œ์—๋Š” 100%์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด HPA๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋™์•ˆ ์•ˆ์ •์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ค€๋น„ ์ƒํƒœ ์ ๊ฒ€์„ ๊ตฌ์„ฑํ•˜์—ฌ ์ƒˆ Pod๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํŠธ๋ฆญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.4.1.1. ์ง€์›๋˜๋Š” ๋ฉ”ํŠธ๋ฆญ

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์—์„œ๋Š” ๋‹ค์Œ ๋ฉ”ํŠธ๋ฆญ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ 2.1. ๋ฉ”ํŠธ๋ฆญ
๋ฉ”ํŠธ๋ฆญ์„ค๋ช…API ๋ฒ„์ „

CPU ์‚ฌ์šฉ

์‚ฌ์šฉ๋˜๋Š” CPU ์ฝ”์–ด์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. Pod์—์„œ ์š”์ฒญํ•˜๋Š” CPU์˜ ๋ฐฑ๋ถ„์œจ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

autoscaling/v1, autoscaling/v2

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ 

์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์ž…๋‹ˆ๋‹ค. Pod์—์„œ ์š”์ฒญํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐฑ๋ถ„์œจ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

autoscaling/v2

์ค‘์š”

๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ์ž๋™ ์Šค์ผ€์ผ๋ง์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ณต์ œ๋ณธ ์ˆ˜์— ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ ๋ฐ ๊ฐ์†Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ท ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ณต์ œ๋ณธ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด Pod๋‹น ๋ฉ”๋ชจ๋ฆฌ(์ž‘์—… ์ง‘ํ•ฉ) ์‚ฌ์šฉ๋Ÿ‰์ด ์ „๋ฐ˜์ ์œผ๋กœ ๊ฐ์†Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์ œ๋ณธ ์ˆ˜๊ฐ€ ๊ฐ์†Œํ•˜๋ฉด Pod๋ณ„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ „๋ฐ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘์„ ํ™•์ธํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•ด๋‹น ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” image-registry Deployment ์˜ค๋ธŒ์ ํŠธ์˜ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋ฐฐํฌ์—๋Š” Pod 3๊ฐœ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. HPA ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ตœ์†Œ 5๊ฐœ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Pod์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์ด 75%์— ๋„๋‹ฌํ•˜๋ฉด Pod๊ฐ€ 7๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

$ oc autoscale deployment/image-registry --min=5 --max=7 --cpu-percent=75

์ถœ๋ ฅ ์˜ˆ

horizontalpodautoscaler.autoscaling/image-registry autoscaled

minReplicas ๊ฐ€ 3์œผ๋กœ ์„ค์ •๋œ image-registry Deployment ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒ˜ํ”Œ HPA

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: image-registry
  namespace: default
spec:
  maxReplicas: 7
  minReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: image-registry
  targetCPUUtilizationPercentage: 75
status:
  currentReplicas: 5
  desiredReplicas: 0

  1. ๋ฐฐํฌ์˜ ์ƒˆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get deployment image-registry

    ์ด์ œ ๋ฐฐํฌ์— Pod 5๊ฐœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    NAME             REVISION   DESIRED   CURRENT   TRIGGERED BY
    image-registry   1          5         5         config

2.4.2. HPA๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

HPA(Horizontal Pod Autoscaler)๋Š” Pod ์ž๋™ ํ™•์žฅ์˜ ๊ฐœ๋…์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. HPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋…ธ๋“œ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HPA๋Š” ์ง€์ •๋œ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด Pod ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 2.1. HPA์˜ ์ƒ์œ„ ์ˆ˜์ค€ ์›Œํฌํ”Œ๋กœ

workflow

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

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

์ฐธ๊ณ 

HPA๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋ชจ๋“  ๋Œ€์ƒ Pod์— ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.4.3. ์š”์ฒญ ๋ฐ ์ œํ•œ ์ •๋ณด

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

๋ฆฌ์†Œ์Šค ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Pod ์‚ฌ์–‘์—์„œ๋Š” CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. HPA๋Š” ์ด ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋ฅ ์„ ํ™•์ธํ•œ ๋‹ค์Œ ๋Œ€์ƒ์„ ํ™•์žฅ ๋˜๋Š” ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด HPA ์˜ค๋ธŒ์ ํŠธ๋Š” ๋‹ค์Œ ์ง€ํ‘œ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

type: Resource
resource:
  name: cpu
  target:
    type: Utilization
    averageUtilization: 60

์ด ์˜ˆ์—์„œ HPA๋Š” ์Šค์ผ€์ผ๋ง ๋Œ€์ƒ์˜ Pod์˜ ํ‰๊ท  ์‚ฌ์šฉ๋ฅ ์„ 60%๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. utilization์€ ํ˜„์žฌ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์š”์ฒญ๋œ Pod ๋ฆฌ์†Œ์Šค ๊ฐ„ ๋น„์œจ์ž…๋‹ˆ๋‹ค.

2.4.4. ๋ชจ๋ฒ” ์‚ฌ๋ก€

๋ชจ๋“  Pod์— ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HPA๋Š” OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ด€์ฐฐ๋œ Pod CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ  ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค์ผ€์ผ๋ง ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฅ  ๊ฐ’์€ ๊ฐ Pod์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์˜ ๋ฐฑ๋ถ„์œจ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๊ฐ’์ด ๋ˆ„๋ฝ๋˜๋ฉด HPA์˜ ์ตœ์  ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟจํ•œ ๋‹ค์šด ๊ธฐ๊ฐ„ ๊ตฌ์„ฑ

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

์˜ˆ๋ฅผ ๋“ค์–ด, stabilization ์ฐฝ์€ scaleDown ํ•„๋“œ์— ๋Œ€ํ•ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300

์œ„์˜ ์˜ˆ์—์„œ๋Š” ์ง€๋‚œ 5๋ถ„ ๋™์•ˆ ์›ํ•˜๋Š” ๋ชจ๋“  ์ƒํƒœ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กค๋ง ์ตœ๋Œ€๊ฐ’๊ณผ ๋™์ผํ•˜๋ฉฐ ์Šค์ผ€์ผ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‚˜์ค‘์— ๋™๋“ฑํ•œ Pod๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ Pod๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

2.4.4.1. ์Šค์ผ€์ผ๋ง ์ •์ฑ…

autoscaling/v2 API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์— ์Šค์ผ€์ผ๋ง ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค์ผ€์ผ๋ง ์ •์ฑ…์€ OpenShift Container Platform HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)์—์„œ Pod๋ฅผ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์Šค์ผ€์ผ๋ง ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์ •๋œ ๊ธฐ๊ฐ„์— ์Šค์ผ€์ผ๋งํ•  ํŠน์ • ์ˆ˜ ๋˜๋Š” ํŠน์ • ๋ฐฑ๋ถ„์œจ์„ ์„ค์ •ํ•˜์—ฌ HPA์—์„œ Pod๋ฅผ ํ™•์žฅ ๋˜๋Š” ์ถ•์†Œํ•˜๋Š” ๋น„์œจ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฉ”ํŠธ๋ฆญ์ด ๊ณ„์† ๋ณ€๋™ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ „์— ๊ณ„์‚ฐํ•œ ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์ผ๋ง์„ ์ œ์–ดํ•˜๋Š” ์•ˆ์ •ํ™” ๊ธฐ๊ฐ„์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์Šค์ผ€์ผ๋ง ๋ฐฉํ–ฅ(ํ™•์žฅ ๋˜๋Š” ์ถ•์†Œ)์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์ •์ฑ…์„ ์ƒ์„ฑํ•˜์—ฌ ๋ณ€๊ฒฝ ์ •๋„์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ •์ฑ…์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜์—ฌ ์Šค์ผ€์ผ๋ง์„ ์ œํ•œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. HPA๋Š” ๋ฐ˜๋ณต ์ค‘ Pod๋ฅผ ์Šค์ผ€์ผ๋งํ•œ ๋‹ค์Œ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ๋ฐ˜๋ณต์—์„œ ์Šค์ผ€์ผ๋ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์Šค์ผ€์ผ๋ง ์ •์ฑ…์ด ํฌํ•จ๋œ HPA ์˜ค๋ธŒ์ ํŠธ ์ƒ˜ํ”Œ

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory
  namespace: default
spec:
  behavior:
    scaleDown: 1
      policies: 2
      - type: Pods 3
        value: 4 4
        periodSeconds: 60 5
      - type: Percent
        value: 10 6
        periodSeconds: 60
      selectPolicy: Min 7
      stabilizationWindowSeconds: 300 8
    scaleUp: 9
      policies:
      - type: Pods
        value: 5 10
        periodSeconds: 70
      - type: Percent
        value: 12 11
        periodSeconds: 80
      selectPolicy: Max
      stabilizationWindowSeconds: 0
...

1
์Šค์ผ€์ผ๋ง ์ •์ฑ…์˜ ๋ฐฉํ–ฅ, ์ฆ‰ scaleDown ๋˜๋Š” scaleUp์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ์ถ•์†Œ ์ •์ฑ…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
2
์Šค์ผ€์ผ๋ง ์ •์ฑ…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
3
์ •์ฑ…์ด ๊ฐ ๋ฐ˜๋ณต์—์„œ ํŠน์ • Pod ์ˆ˜ ๋˜๋Š” Pod ๋ฐฑ๋ถ„์œจ๋กœ ์Šค์ผ€์ผ๋งํ•˜๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ pods์ž…๋‹ˆ๋‹ค.
4
๊ฐ ๋ฐ˜๋ณต ์ค‘์— Pod ์ˆ˜ ๋˜๋Š” Pod ๋ฐฑ๋ถ„์œจ ์ค‘ ํ•˜๋‚˜์˜ ์Šค์ผ€์ผ๋ง ์–‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. Pod ์ˆ˜์— ๋”ฐ๋ผ ์ถ•์†Œํ•  ๊ธฐ๋ณธ๊ฐ’์€ ์—†์Šต๋‹ˆ๋‹ค.
5
์Šค์ผ€์ผ๋ง ๋ฐ˜๋ณต์˜ ๊ธธ์ด๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 15์ดˆ์ž…๋‹ˆ๋‹ค.
6
๋ฐฑ๋ถ„์œจ๋กœ ๋œ ์ถ•์†Œ ๊ธฐ๋ณธ๊ฐ’์€ 100%์ž…๋‹ˆ๋‹ค.
7
์—ฌ๋Ÿฌ ์ •์ฑ…์ด ์ •์˜๋œ ๊ฒฝ์šฐ ๋จผ์ € ์‚ฌ์šฉํ•  ์ •์ฑ…์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŽ์€ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Max๋ฅผ ์ง€์ •ํ•˜๊ณ , ์ตœ์†Œ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Min์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. HPA์—์„œ ํ•ด๋‹น ์ •์ฑ… ๋ฐฉํ–ฅ์œผ๋กœ ์Šค์ผ€์ผ๋งํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด Disabled๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Max์ž…๋‹ˆ๋‹ค.
8
HPA์—์„œ ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ๊ฒ€ํ† ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๊ฐ„์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.
9
์ด ์˜ˆ์ œ์—์„œ๋Š” ํ™•์žฅ ์ •์ฑ…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
10
Pod ์ˆ˜์— ๋”ฐ๋ผ ํ™•์žฅ๋˜๋Š” ์–‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. Pod ์ˆ˜ ํ™•์žฅ ๊ธฐ๋ณธ๊ฐ’์€ 4%์ž…๋‹ˆ๋‹ค.
11
Pod ๋ฐฑ๋ถ„์œจ์— ๋”ฐ๋ผ ํ™•์žฅ๋˜๋Š” ์–‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๋ถ„์œจ๋กœ ๋œ ํ™•์žฅ ๊ธฐ๋ณธ๊ฐ’์€ 100%์ž…๋‹ˆ๋‹ค.

์ถ•์†Œ ์ •์ฑ…์˜ ์˜ˆ

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory
  namespace: default
spec:
...
  minReplicas: 20
...
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 4
        periodSeconds: 30
      - type: Percent
        value: 10
        periodSeconds: 60
      selectPolicy: Max
    scaleUp:
      selectPolicy: Disabled

์ด ์˜ˆ์ œ์—์„œ Pod ์ˆ˜๊ฐ€ 40๊ฐœ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด selectPolicy์—์„œ ์š”๊ตฌํ•˜๋Š” ๋Œ€๋กœ ํ•ด๋‹น ์ •์ฑ…์œผ๋กœ ์ธํ•ด ์ƒ๋‹นํ•œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ถ•์†Œ์— ๋ฐฑ๋ถ„์œจ ๊ธฐ๋ฐ˜ ์ •์ฑ…์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Pod ๋ณต์ œ๋ณธ์ด 80๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ HPA๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต์—์„œ 1๋ถ„(periodSeconds: 60)์— ๊ฑธ์ณ (type: Percent ๋ฐ value: 10 ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ) Pod 80๊ฐœ ์ค‘ 10%์— ํ•ด๋‹นํ•˜๋Š” 8๊ฐœ์˜ Pod๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ๋Š” Pod๊ฐ€ 72๊ฐœ์ž…๋‹ˆ๋‹ค. HPA๋Š” ๋‚˜๋จธ์ง€ Pod์˜ 10%๋ฅผ ๊ณ„์‚ฐํ•œ 7.2๊ฐœ๋ฅผ 8๊ฐœ๋กœ ์˜ฌ๋ฆผํ•˜์—ฌ Pod 8๊ฐœ๋ฅผ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ๋‚˜๋จธ์ง€ Pod ์ˆ˜์— ๋”ฐ๋ผ ์Šค์ผ€์ผ๋งํ•  Pod ์ˆ˜๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. Pod ์ˆ˜๊ฐ€ 40๊ฐœ ๋ฏธ๋งŒ์œผ๋กœ ์ค„์–ด๋“ค๋ฉด Pod ๊ธฐ๋ฐ˜ ์ˆซ์ž๊ฐ€ ๋ฐฑ๋ถ„์œจ ๊ธฐ๋ฐ˜ ์ˆซ์ž๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— Pod ๊ธฐ๋ฐ˜ ์ •์ฑ…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. HPA๋Š” 20๊ฐœ์˜ ๋ณต์ œ๋ณธ(minReplicas)์ด ๋‚จ์•„ ์žˆ์„ ๋•Œ๊นŒ์ง€ 30์ดˆ(periodSeconds: 30)์— ๊ฑธ์ณ ํ•œ ๋ฒˆ์— Pod๋ฅผ 4๊ฐœ์”ฉ ์ค„์ž…๋‹ˆ๋‹ค(type: Pods ๋ฐ value: 4).

selectPolicy: Disabled ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HPA์—์„œ Pod๋ฅผ ํ™•์žฅํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋˜๋Š” ๋ฐฐํฌ ์„ธํŠธ์˜ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ oc edit ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์ผ๋ง ์ •์ฑ…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc edit hpa hpa-resource-metrics-memory

์ถœ๋ ฅ ์˜ˆ

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/behavior:\
'{"ScaleUp":{"StabilizationWindowSeconds":0,"SelectPolicy":"Max","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":15},{"Type":"Percent","Value":100,"PeriodSeconds":15}]},\
"ScaleDown":{"StabilizationWindowSeconds":300,"SelectPolicy":"Min","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":60},{"Type":"Percent","Value":10,"PeriodSeconds":60}]}}'
...

2.4.5. ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ƒ์„ฑ

์›น ์ฝ˜์†”์—์„œ Deployment ๋˜๋Š” DeploymentConfig ์˜ค๋ธŒ์ ํŠธ์—์„œ ์‹คํ–‰ํ•  ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ Pod ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod์—์„œ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

HPA๋Š” Operator ์ง€์› ์„œ๋น„์Šค, Knative ์„œ๋น„์Šค ๋˜๋Š” Helm ์ฐจํŠธ์˜ ์ผ๋ถ€์ธ ๋ฐฐํฌ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

์›น ์ฝ˜์†”์—์„œ HPA๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ† ํด๋กœ์ง€ ๋ณด๊ธฐ์—์„œ ๋…ธ๋“œ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ธก๋ฉด ์ฐฝ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž‘์—… ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ HorizontalPodAutoscaler ์ถ”๊ฐ€ ๋ฅผ ์„ ํƒํ•˜์—ฌ HorizontalPodAutoscaler ์ถ”๊ฐ€ ์–‘์‹์„ ์—ฝ๋‹ˆ๋‹ค.

    ๊ทธ๋ฆผ 2.2. Add HorizontalPodAutoscaler

    HorizontalPodAutoscaler ์ถ”๊ฐ€ ์–‘์‹
  3. HorizontalPodAutoscaler ์ถ”๊ฐ€ ์–‘์‹์—์„œ ์ด๋ฆ„, ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ Pod ์ œํ•œ, CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ •์˜ํ•˜๊ณ  ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์›น ์ฝ˜์†”์—์„œ HPA๋ฅผ ํŽธ์ง‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ† ํด๋กœ์ง€ ๋ณด๊ธฐ์—์„œ ๋…ธ๋“œ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ธก๋ฉด ์ฐฝ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž‘์—… ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ HorizontalPodAutoscaler ํŽธ์ง‘์„ ์„ ํƒํ•˜์—ฌ Horizontal Pod Autoscaler ํŽธ์ง‘ ์–‘์‹์„ ์—ฝ๋‹ˆ๋‹ค.
  3. Horizontal Pod Autoscaler ํŽธ์ง‘ ์–‘์‹์—์„œ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ Pod ์ œํ•œ๊ณผ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํŽธ์ง‘ํ•œ ๋‹ค์Œ ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ 

์›น ์ฝ˜์†”์—์„œ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํŽธ์ง‘ํ•˜๋Š” ๋™์•ˆ ์–‘์‹ ๋ณด๊ธฐ์—์„œ YAML ๋ณด๊ธฐ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น ์ฝ˜์†”์—์„œ HPA๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ† ํด๋กœ์ง€ ๋ณด๊ธฐ์—์„œ ๋…ธ๋“œ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ธก๋ฉด ์ฐฝ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž‘์—… ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ HorizontalPodAutoscaler ์ œ๊ฑฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ํ™•์ธ ํŒ์—… ์ฐฝ์—์„œ ์ œ๊ฑฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ HPA๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

2.4.6. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CPU ์‚ฌ์šฉ๋ฅ ์— ๋Œ€ํ•œ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ƒ์„ฑ

OpenShift Container Platform CLI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ธฐ์กด Deployment,DeploymentConfig,ReplicaSet,ReplicationController ๋˜๋Š” StatefulSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ž๋™์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HPA๋Š” ์ง€์ •ํ•œ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์œ ์ง€ํ•˜๋„๋ก ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod๋ฅผ ์Šค์ผ€์ผ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠน์ • ๊ธฐ๋Šฅ ๋˜๋Š” ๋™์ž‘์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ํ•œ Deployment ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ReplicaSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

HPA๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๊ฐœ์ˆ˜ ์‚ฌ์ด์—์„œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์—ฌ ์ „์ฒด Pod์—์„œ ์ง€์ •๋œ CPU ์‚ฌ์šฉ๋ฅ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

CPU ์‚ฌ์šฉ๋ฅ ์„ ์ž๋™ ์Šค์ผ€์ผ๋งํ•  ๋•Œ๋Š” oc autoscale ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ธ์ œ๋“ ์ง€ ์‹คํ–‰ํ•˜๋ ค๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ Pod ์ˆ˜์™€ Pod์—์„œ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ํ‰๊ท  CPU ์‚ฌ์šฉ๋ฅ ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Ÿ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Pod์— OpenShift Container Platform ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

ํŠน์ • CPU ๊ฐ’์„ ์ž๋™ ์Šค์ผ€์ผ๋งํ•˜๋ ค๋ฉด ๋Œ€์ƒ CPU ๋ฐ Pod ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ HorizontalPodAutoscaler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํŠธ๋ฆญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. oc describe PodMetrics <pod-name> ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์ด ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์ถœ๋ ฅ์ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๊ณ  Usage์— Cpu ๋ฐ Memory๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal

์ถœ๋ ฅ ์˜ˆ

Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2019-05-23T18:47:56Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp:             2019-05-23T18:47:56Z
Window:                1m0s
Events:                <none>

ํ”„๋กœ์„ธ์Šค

CPU ์‚ฌ์šฉ๋ฅ ์— ๋Œ€ํ•œ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • CPU ์‚ฌ์šฉ๋ฅ ์˜ ๋ฐฑ๋ถ„์œจ์— ๋”ฐ๋ผ ์Šค์ผ€์ผ๋งํ•˜๋ ค๋ฉด ๊ธฐ์กด ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ HorizontalPodAutoscaler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc autoscale <object_type>/<name> \1
        --min <number> \2
        --max <number> \3
        --cpu-percent=<percent> 4
      1
      ์ž๋™ ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ์œ ํ˜• ๋ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๊ณ  Deployment,DeploymentConfig/dc,ReplicaSet/rs,ReplicationController/rc ๋˜๋Š” StatefulSet ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      2
      ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ•์†Œ ์‹œ ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      3
      ํ™•์žฅ ์‹œ ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      4
      ์š”์ฒญ๋œ CPU์˜ ๋ฐฑ๋ถ„์œจ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“  Pod์˜ ๋ชฉํ‘œ ํ‰๊ท  CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์ž๋™ ์Šค์ผ€์ผ๋ง ์ •์ฑ…์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

      ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์€ image-registry Deployment ์˜ค๋ธŒ์ ํŠธ์˜ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋ฐฐํฌ์—๋Š” Pod 3๊ฐœ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. HPA ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ตœ์†Œ 5๊ฐœ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Pod์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์ด 75%์— ๋„๋‹ฌํ•˜๋ฉด Pod๊ฐ€ 7๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      $ oc autoscale deployment/image-registry --min=5 --max=7 --cpu-percent=75
    • ํŠน์ • CPU ๊ฐ’์„ ์Šค์ผ€์ผ๋งํ•˜๋ ค๋ฉด ๊ธฐ์กด ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

        apiVersion: autoscaling/v2 1
        kind: HorizontalPodAutoscaler
        metadata:
          name: cpu-autoscale 2
          namespace: default
        spec:
          scaleTargetRef:
            apiVersion: apps/v1 3
            kind: Deployment 4
            name: example 5
          minReplicas: 1 6
          maxReplicas: 10 7
          metrics: 8
          - type: Resource
            resource:
              name: cpu 9
              target:
                type: AverageValue 10
                averageValue: 500m 11
        1
        autoscaling/v2 API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
        2
        ์ด ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        3
        ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ API ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • Deployment,ReplicaSet,Statefulset ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฒฝ์šฐ apps/v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
        • ReplicationController ์˜ ๊ฒฝ์šฐ v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
        • DeploymentConfig ์˜ ๊ฒฝ์šฐ apps.openshift.io/v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
        4
        ์˜ค๋ธŒ์ ํŠธ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋Š” Deployment,DeploymentConfig/dc,ReplicaSet/rs,ReplicationController/rc ๋˜๋Š” StatefulSet ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
        5
        ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
        6
        ์ถ•์†Œ ์‹œ ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        7
        ํ™•์žฅ ์‹œ ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        8
        ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— metrics ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
        9
        CPU ์‚ฌ์šฉ๋ฅ ์— cpu๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        10
        AverageValue๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
        11
        ๋Œ€์ƒ CPU ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ averageValue๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      2. ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

        $ oc create -f <file-name>.yaml
  2. ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get hpa cpu-autoscale

    ์ถœ๋ ฅ ์˜ˆ

    NAME            REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    cpu-autoscale   Deployment/example   173m/500m       1         10        1          20m

2.4.7. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ๋Œ€ํ•œ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ

OpenShift Container Platform CLI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ธฐ์กด Deployment,DeploymentConfig,ReplicaSet,ReplicationController ๋˜๋Š” StatefulSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ž๋™์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HPA๋Š” ์ง€์ •ํ•œ ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ (์ง์ ‘ ๊ฐ’ ๋˜๋Š” ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐฑ๋ถ„์œจ)์„ ์œ ์ง€ํ•˜๋„๋ก ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod๋ฅผ ์Šค์ผ€์ผ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠน์ • ๊ธฐ๋Šฅ ๋˜๋Š” ๋™์ž‘์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ํ•œ Deployment ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ReplicaSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

HPA๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๊ฐœ์ˆ˜ ์‚ฌ์ด์—์„œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์—ฌ ์ „์ฒด Pod์—์„œ ์ง€์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์˜ ๊ฒฝ์šฐ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ Pod ์ˆ˜์™€ Pod์—์„œ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•˜๋Š” ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Ÿ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Pod์— OpenShift Container Platform ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํŠธ๋ฆญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. oc describe PodMetrics <pod-name> ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์ด ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์ถœ๋ ฅ์ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๊ณ  Usage์— Cpu ๋ฐ Memory๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-129-223.compute.internal -n openshift-kube-scheduler

์ถœ๋ ฅ ์˜ˆ

Name:         openshift-kube-scheduler-ip-10-0-129-223.compute.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Cpu:     0
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2020-02-14T22:21:14Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-129-223.compute.internal
Timestamp:             2020-02-14T22:21:14Z
Window:                5m0s
Events:                <none>

ํ”„๋กœ์„ธ์Šค

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ๋Œ€ํ•œ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ์Šค์ผ€์ผ๋งํ•˜๋ ค๋ฉด ๊ธฐ์กด ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ HorizontalPodAutoscaler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: autoscaling/v2 1
      kind: HorizontalPodAutoscaler
      metadata:
        name: hpa-resource-metrics-memory 2
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1 3
          kind: Deployment 4
          name: example 5
        minReplicas: 1 6
        maxReplicas: 10 7
        metrics: 8
        - type: Resource
          resource:
            name: memory 9
            target:
              type: AverageValue 10
              averageValue: 500Mi 11
        behavior: 12
          scaleDown:
            stabilizationWindowSeconds: 300
            policies:
            - type: Pods
              value: 4
              periodSeconds: 60
            - type: Percent
              value: 10
              periodSeconds: 60
            selectPolicy: Max
      1
      autoscaling/v2 API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      2
      ์ด ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      3
      ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ API ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • Deployment,ReplicaSet ๋˜๋Š” Statefulset ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฒฝ์šฐ apps/v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • ReplicationController ์˜ ๊ฒฝ์šฐ v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • DeploymentConfig ์˜ ๊ฒฝ์šฐ apps.openshift.io/v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      4
      ์˜ค๋ธŒ์ ํŠธ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋Š” Deployment, DeploymentConfig, ReplicaSet,ReplicationController ๋˜๋Š” StatefulSet ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      5
      ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      6
      ์ถ•์†Œ ์‹œ ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      7
      ํ™•์žฅ ์‹œ ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      8
      ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— metrics ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      9
      ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      10
      ์œ ํ˜•์„ AverageValue๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      11
      averageValue ๋ฐ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      12
      ์„ ํƒ ์‚ฌํ•ญ: ์Šค์ผ€์ผ๋ง ์ •์ฑ…์„ ์ง€์ •ํ•˜์—ฌ ํ™•์žฅ ๋˜๋Š” ์ถ•์†Œ๋น„์œจ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฑ๋ถ„์œจ๋กœ ์Šค์ผ€์ผ๋งํ•˜๋ ค๋ฉด ๊ธฐ์กด ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ HorizontalPodAutoscaler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: autoscaling/v2 1
      kind: HorizontalPodAutoscaler
      metadata:
        name: memory-autoscale 2
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1 3
          kind: Deployment 4
          name: example 5
        minReplicas: 1 6
        maxReplicas: 10 7
        metrics: 8
        - type: Resource
          resource:
            name: memory 9
            target:
              type: Utilization 10
              averageUtilization: 50 11
        behavior: 12
          scaleUp:
            stabilizationWindowSeconds: 180
            policies:
            - type: Pods
              value: 6
              periodSeconds: 120
            - type: Percent
              value: 10
              periodSeconds: 120
            selectPolicy: Max
      1
      autoscaling/v2 API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      2
      ์ด ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      3
      ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ API ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ReplicationController์˜ ๊ฒฝ์šฐ v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • DeploymentConfig์˜ ๊ฒฝ์šฐ apps.openshift.io/v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • Deployment, ReplicaSet, Statefulset ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฒฝ์šฐ apps/v1 ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      4
      ์˜ค๋ธŒ์ ํŠธ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋Š” Deployment, DeploymentConfig, ReplicaSet,ReplicationController ๋˜๋Š” StatefulSet ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      5
      ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      6
      ์ถ•์†Œ ์‹œ ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      7
      ํ™•์žฅ ์‹œ ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      8
      ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— metrics ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      9
      ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      10
      Utilization์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      11
      averageUtilization ๋ฐ ์ „์ฒด Pod์— ๋Œ€ํ•œ ๋Œ€์ƒ ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ (์š”์ฒญ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐฑ๋ถ„์œจ๋กœ ํ‘œ์‹œ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ Pod์— ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      12
      ์„ ํƒ ์‚ฌํ•ญ: ์Šค์ผ€์ผ๋ง ์ •์ฑ…์„ ์ง€์ •ํ•˜์—ฌ ํ™•์žฅ ๋˜๋Š” ์ถ•์†Œ๋น„์œจ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  2. ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>.yaml

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc create -f hpa.yaml

    ์ถœ๋ ฅ ์˜ˆ

    horizontalpodautoscaler.autoscaling/hpa-resource-metrics-memory created

  3. ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get hpa hpa-resource-metrics-memory

    ์ถœ๋ ฅ ์˜ˆ

    NAME                          REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    hpa-resource-metrics-memory   Deployment/example   2441216/500Mi   1         10        1          20m

    $ oc describe hpa hpa-resource-metrics-memory

    ์ถœ๋ ฅ ์˜ˆ

    Name:                        hpa-resource-metrics-memory
    Namespace:                   default
    Labels:                      <none>
    Annotations:                 <none>
    CreationTimestamp:           Wed, 04 Mar 2020 16:31:37 +0530
    Reference:                   Deployment/example
    Metrics:                     ( current / target )
      resource memory on pods:   2441216 / 500Mi
    Min replicas:                1
    Max replicas:                10
    ReplicationController pods:  1 current / 1 desired
    Conditions:
      Type            Status  Reason              Message
      ----            ------  ------              -------
      AbleToScale     True    ReadyForNewScale    recommended size matches current size
      ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
      ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
    Events:
      Type     Reason                   Age                 From                       Message
      ----     ------                   ----                ----                       -------
      Normal   SuccessfulRescale        6m34s               horizontal-pod-autoscaler  New size: 1; reason: All metrics below target

2.4.8. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ƒํƒœ ์กฐ๊ฑด ์ดํ•ด

์ผ๋ จ์˜ ์ƒํƒœ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)์—์„œ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  HPA๊ฐ€ ํ˜„์žฌ ์ œํ•œ๋˜์–ด ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HPA ์ƒํƒœ ์กฐ๊ฑด์€ Autoscaling API์˜ v2 ๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HPA๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ ์กฐ๊ฑด์„ ํ†ตํ•ด ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

  • AbleToScale ์ƒํƒœ๋Š” HPA์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€ ๋ฐ ๋ฐฑ์˜คํ”„ ๊ด€๋ จ ์ƒํƒœ๋กœ ์Šค์ผ€์ผ๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    • True ์กฐ๊ฑด์€ ์Šค์ผ€์ผ๋ง์ด ํ—ˆ์šฉ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • False ์กฐ๊ฑด์€ ์ง€์ •๋œ ์ด์œ ๋กœ ์Šค์ผ€์ผ๋ง์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ScalingActive ์กฐ๊ฑด์€ HPA๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ (์˜ˆ: ๋Œ€์ƒ์˜ ๋ณต์ œ๋ณธ ์ˆ˜๊ฐ€ 0์ด ์•„๋‹˜) ์›ํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    • True ์กฐ๊ฑด์€ ๋ฉ”ํŠธ๋ฆญ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • False ์กฐ๊ฑด์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ScalingLimited ์กฐ๊ฑด์€ ์›ํ•˜๋Š” ์Šค์ผ€์ผ๋ง์ด ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์˜ ์ตœ๋Œ“๊ฐ’ ๋˜๋Š” ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์ œํ•œ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    • True ์กฐ๊ฑด์€ ์Šค์ผ€์ผ๋ง์„ ์œ„ํ•ด ์ตœ์†Œ ๋˜๋Š” ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์—ฌ์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • False ์กฐ๊ฑด์€ ์š”์ฒญ๋œ ์Šค์ผ€์ผ๋ง์ด ํ—ˆ์šฉ๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

      $ oc describe hpa cm-test

      ์ถœ๋ ฅ ์˜ˆ

      Name:                           cm-test
      Namespace:                      prom
      Labels:                         <none>
      Annotations:                    <none>
      CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
      Reference:                      ReplicationController/cm-test
      Metrics:                        ( current / target )
        "http_requests" on pods:      66m / 500m
      Min replicas:                   1
      Max replicas:                   4
      ReplicationController pods:     1 current / 1 desired
      Conditions: 1
        Type              Status    Reason              Message
        ----              ------    ------              -------
        AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
        ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
        ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range
      Events:

      1
      ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์˜ ์ƒํƒœ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์—†๋Š” Pod์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์˜ˆ

Conditions:
  Type         Status  Reason          Message
  ----         ------  ------          -------
  AbleToScale  False   FailedGetScale  the HPA controller was unable to get the target's current scale: no matches for kind "ReplicationController" in group "apps"
Events:
  Type     Reason          Age               From                       Message
  ----     ------          ----              ----                       -------
  Warning  FailedGetScale  6s (x3 over 36s)  horizontal-pod-autoscaler  no matches for kind "ReplicationController" in group "apps"

๋‹ค์Œ์€ ์Šค์ผ€์ผ๋ง์— ํ•„์š”ํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋Š” Pod์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์˜ˆ

Conditions:
  Type                  Status    Reason                    Message
  ----                  ------    ------                    -------
  AbleToScale           True     SucceededGetScale          the HPA controller was able to get the target's current scale
  ScalingActive         False    FailedGetResourceMetric    the HPA was unable to compute the replica count: failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API

๋‹ค์Œ์€ ์š”์ฒญ๋œ ์ž๋™ ์Šค์ผ€์ผ๋ง์ด ํ•„์š”ํ•œ ์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ์ ์€ Pod์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์˜ˆ

Conditions:
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range

2.4.8.1. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ƒํƒœ ์กฐ๊ฑด ๋ณด๊ธฐ

HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋ฅผ ํ†ตํ•ด Pod์— ์„ค์ •๋œ ์ƒํƒœ ์กฐ๊ฑด์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ƒํƒœ ์กฐ๊ฑด์€ v2 ๋ฒ„์ „์˜ autoscaling API์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํŠธ๋ฆญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. oc describe PodMetrics <pod-name> ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์ด ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์ถœ๋ ฅ์ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๊ณ  Usage์— Cpu ๋ฐ Memory๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal

์ถœ๋ ฅ ์˜ˆ

Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2019-05-23T18:47:56Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp:             2019-05-23T18:47:56Z
Window:                1m0s
Events:                <none>

ํ”„๋กœ์„ธ์Šค

Pod์˜ ์ƒํƒœ ์กฐ๊ฑด์„ ๋ณด๋ ค๋ฉด Pod ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ oc describe hpa <pod-name>

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ oc describe hpa cm-test

์ƒํƒœ๊ฐ€ ์ถœ๋ ฅ์˜ Conditions ํ•„๋“œ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์˜ˆ

Name:                           cm-test
Namespace:                      prom
Labels:                         <none>
Annotations:                    <none>
CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
Reference:                      ReplicationController/cm-test
Metrics:                        ( current / target )
  "http_requests" on pods:      66m / 500m
Min replicas:                   1
Max replicas:                   4
ReplicationController pods:     1 current / 1 desired
Conditions: 1
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range

2.4.9. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

2.5. ์ˆ˜์ง Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฆฌ์†Œ์Šค ์ˆ˜์ค€ ์ž๋™ ์กฐ์ •

OpenShift Container Platform VPA(Vertical Pod Autoscaler Operator)๋Š” Pod์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ณผ๊ฑฐ ๋ฐ ํ˜„์žฌ์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€ํ† ํ•œ ํ›„ ํ™•์ธํ•œ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ’์— ๋”ฐ๋ผ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฐ ์š”์ฒญ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VPA๋Š” ๊ฐœ๋ณ„ CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์‚ฌ์šฉํ•˜์—ฌ Deployment, Deployment Config, StatefulSet, Job, DaemonSet, ReplicaSet ๋˜๋Š” ReplicationController์™€ ๊ฐ™์€ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  Pod๋ฅผ ํ”„๋กœ์ ํŠธ์—์„œ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

VPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Pod์˜ ์ตœ์  CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ดํ•ดํ•˜๊ณ  Pod์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋‚ด๋‚ด Pod ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.5.1. Vertical Pod Autoscaler Operator ์ •๋ณด

VPA(Vertical Pod Autoscaler Operator)๋Š” API ๋ฆฌ์†Œ์Šค ๋ฐ CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. CR์— ๋”ฐ๋ผ Vertical Pod Autoscaler Operator์—์„œ ๋ฐ๋ชฌ ์„ธํŠธ, ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ ๋“ฑ๊ณผ ๊ฐ™์€ ํŠน์ • ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์™€ ๊ด€๋ จ๋œ Pod์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด ํ”„๋กœ์ ํŠธ์—์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

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

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

์ฐธ๊ณ 

๊ธฐ๋ณธ์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋Š” VPA์—์„œ Pod๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋ ค๋ฉด ์ตœ์†Œ ๋‘ ๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ตœ์†Œ๋ณด๋‹ค ์ ์€ ๋ณต์ œ๋ณธ์„ ์ง€์ •ํ•˜๋Š” ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Pod๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜๋ฉด ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ Pod๋ฅผ ์žฌ๋ฐฐํฌํ•˜๋ฉด VPA์—์„œ ์ƒˆ Pod๋ฅผ ๊ถŒ์žฅ ์‚ฌํ•ญ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. VPA ์ตœ์†Œ ๊ฐ’ ๋ณ€๊ฒฝ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ VerticalPodAutoscalerController ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ด ์ตœ์†Œ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด CPU์˜ 50%๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ 10%๋งŒ ์š”์ฒญํ•˜๋Š” Pod๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, VPA๋Š” ์š”์ฒญํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ CPU๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  Pod๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ ์„ธํŠธ์™€ ๊ฐ™์€ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋Š” Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ณ  VPA๋Š” ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋กœ ์ƒˆ Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž์˜ ๊ฒฝ์šฐ VPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ Pod์— ์ ์ ˆํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•˜์—ฌ ์ˆ˜์š”๊ฐ€ ๋งŽ์€ ๊ธฐ๊ฐ„์—๋„ Pod๊ฐ€ ์œ ์ง€๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฐธ๊ณ 

VPA ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํŠน์ • VPA CR์„ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ VPA์—์„œ ์ด๋ฏธ ์ˆ˜์ •ํ•œ Pod์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ Pod์—์„œ๋Š” ๋ชจ๋‘ VPA์—์„œ ์„ค์ •ํ•œ ์ด์ „์˜ ๊ถŒ์žฅ ์‚ฌํ•ญ ๋Œ€์‹  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ์ •์˜๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

2.5.2. Vertical Pod Autoscaler Operator ์„ค์น˜

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ VPA(Vertical Pod Autoscaler Operator)๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Operator โ†’ OperatorHub๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Operator ๋ชฉ๋ก์—์„œ VerticalPodAutoscaler๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. Operator ์„ค์น˜ ํŽ˜์ด์ง€์—์„œ Operator ๊ถŒ์žฅ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜ต์…˜์ด ์„ ํƒ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•„์ˆ˜ openshift-vertical-pod-autoscaler ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Operator๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  4. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  5. VPA Operator ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ์„ค์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    1. ์›Œํฌ๋กœ๋“œ โ†’ Pod๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ openshift-vertical-pod-autoscaler ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  Pod 4๊ฐœ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    3. ์›Œํฌ๋กœ๋“œ โ†’ ๋ฐฐํฌ๋กœ ์ด๋™ํ•˜์—ฌ ๋ฐฐํฌ 4๊ฐœ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  6. ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform CLI์—์„œ ์„ค์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get all -n openshift-vertical-pod-autoscaler

    ์ถœ๋ ฅ์—๋Š” Pod 4๊ฐœ์™€ ๋ฐ ๋ฐฐํฌ 4๊ฐœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    NAME                                                    READY   STATUS    RESTARTS   AGE
    pod/vertical-pod-autoscaler-operator-85b4569c47-2gmhc   1/1     Running   0          3m13s
    pod/vpa-admission-plugin-default-67644fc87f-xq7k9       1/1     Running   0          2m56s
    pod/vpa-recommender-default-7c54764b59-8gckt            1/1     Running   0          2m56s
    pod/vpa-updater-default-7f6cc87858-47vw9                1/1     Running   0          2m56s
    
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    service/vpa-webhook   ClusterIP   172.30.53.206   <none>        443/TCP   2m56s
    
    NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/vertical-pod-autoscaler-operator   1/1     1            1           3m13s
    deployment.apps/vpa-admission-plugin-default       1/1     1            1           2m56s
    deployment.apps/vpa-recommender-default            1/1     1            1           2m56s
    deployment.apps/vpa-updater-default                1/1     1            1           2m56s
    
    NAME                                                          DESIRED   CURRENT   READY   AGE
    replicaset.apps/vertical-pod-autoscaler-operator-85b4569c47   1         1         1       3m13s
    replicaset.apps/vpa-admission-plugin-default-67644fc87f       1         1         1       2m56s
    replicaset.apps/vpa-recommender-default-7c54764b59            1         1         1       2m56s
    replicaset.apps/vpa-updater-default-7f6cc87858                1         1         1       2m56s

2.5.3. Vertical Pod Autoscaler Operator ์‚ฌ์šฉ ์ •๋ณด

VPA(Vertical Pod Autoscaler Operator)๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ VPA CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. VPA๋Š” ํ•ด๋‹น ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•์ธํ•˜๊ณ  ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ, ์ƒํƒœ ์ €์žฅ ์„ธํŠธ, ์ž‘์—…, ๋ฐ๋ชฌ ์„ธํŠธ, ๋ณต์ œ๋ณธ ์„ธํŠธ ๋˜๋Š” ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— VPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VPA CR์€ ๋ชจ๋‹ˆํ„ฐ๋งํ•  Pod์™€ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

VPA CR์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  VPA๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ชจ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • Auto ๋ฐ Recreate ๋ชจ๋“œ๋Š” Pod ์ˆ˜๋ช… ๋™์•ˆ VPA CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. VPA๋Š” ๊ถŒ์žฅ ์‚ฌํ•ญ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  Pod๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์—์„œ ์žฌ๋ฐฐํฌํ•˜๋ฉด VPA๋Š” ์ƒˆ Pod๋ฅผ ๊ถŒ์žฅ ์‚ฌํ•ญ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • Initial ๋ชจ๋“œ๋Š” Pod ์ƒ์„ฑ ์‹œ์—๋งŒ VPA ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Off ๋ชจ๋“œ๋Š” ๊ถŒ์žฅ๋˜๋Š” ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฐ ์š”์ฒญ๋งŒ ์ œ๊ณตํ•˜๋ฉฐ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ˆ˜๋™์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. off ๋ชจ๋“œ์—์„œ๋Š” Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CR์„ ์‚ฌ์šฉํ•˜์—ฌ VPA ํ‰๊ฐ€ ๋ฐ ์—…๋ฐ์ดํŠธ์—์„œ ํŠน์ • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ตํŠธ์•„์›ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Pod์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œํ•œ ๋ฐ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

resources:
  limits:
    cpu: 1
    memory: 500Mi
  requests:
    cpu: 500m
    memory: 100Mi

auto๋กœ ์„ค์ •๋œ VPA๋ฅผ ์ƒ์„ฑํ•˜๋ฉด VPA์—์„œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๊ณ  Pod๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์žฌ๋ฐฐํฌ๋˜๋ฉด Pod๋Š” ์ƒˆ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฐ ์š”์ฒญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

resources:
  limits:
    cpu: 50m
    memory: 1250Mi
  requests:
    cpu: 25m
    memory: 262144k

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ VPA ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc get vpa <vpa-name> --output yaml

๋ช‡ ๋ถ„ ํ›„ ์ถœ๋ ฅ์—๋Š” CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ํ‘œ์‹œ๋˜๋ฉฐ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์˜ˆ

...
status:
...
  recommendation:
    containerRecommendations:
    - containerName: frontend
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      uncappedTarget:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 262m
        memory: "274357142"
    - containerName: backend
      lowerBound:
        cpu: 12m
        memory: 131072k
      target:
        cpu: 12m
        memory: 131072k
      uncappedTarget:
        cpu: 12m
        memory: 131072k
      upperBound:
        cpu: 476m
        memory: "498558823"
...

์ถœ๋ ฅ์—๋Š” ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค(target), ์ตœ์†Œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค(lowerBound), ์ตœ๊ณ  ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค(upperBound), ์ตœ์‹  ๋ฆฌ์†Œ์Šค ๊ถŒ์žฅ ์‚ฌํ•ญ(uncappedTarget)์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

VPA๋Š” lowerBound ๋ฐ upperBound ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Pod์— lowerBound ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ upperBound ๊ฐ’์„ ์ดˆ๊ณผํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ VPA๋Š” Pod๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  target ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2.5.3.1. VPA ์ตœ์†Œ ๊ฐ’ ๋ณ€๊ฒฝ

๊ธฐ๋ณธ์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋Š” VPA์—์„œ Pod๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์ตœ์†Œ ๋‘ ๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‘ ๊ฐœ ๋ฏธ๋งŒ์˜ ๋ณต์ œ๋ณธ์„ ์ง€์ •ํ•˜๋Š” ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋Š” VPA์—์„œ ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. VPA๋Š” VPA ์™ธ๋ถ€์˜ ์ผ๋ถ€ ํ”„๋กœ์„ธ์Šค์—์„œ Pod๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ƒˆ Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. VerticalPodAutoscalerController ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค(CR)์—์„œ minReplicas ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด ์ตœ์†Œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด minReplicas ๋ฅผ 3 ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด VPA๋Š” ์„ธ ๊ฐœ ๋ฏธ๋งŒ์˜ ๋ณต์ œ๋ณธ์„ ์ง€์ •ํ•˜๋Š” ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ Pod๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

minReplicas ๋ฅผ 1 ๋กœ ์„ค์ •ํ•˜๋ฉด VPA๋Š” ํ•˜๋‚˜์˜ ๋ณต์ œ๋ณธ๋งŒ ์ง€์ •ํ•˜๋Š” ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์œ ์ผํ•œ Pod๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ์›Œํฌ๋กœ๋“œ๊ฐ€ VPA์—์„œ Pod๋ฅผ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ์ •ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์šดํƒ€์ž„์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ์„ค์ •์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ณต์ œ ์˜ค๋ธŒ์ ํŠธ์—์„œ ์›ํ•˜์ง€ ์•Š๋Š” ๋‹ค์šด ํƒ€์ž„์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด podUpdatePolicy ๊ฐ€ Initial ๋กœ ์„ค์ •๋œ VPA CR์„ ๊ตฌ์„ฑํ•˜์—ฌ VPA ์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค์—์„œ Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•  ๋•Œ๋งŒ Pod๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ์ ˆํ•œ ์‹œ๊ฐ„์— Pod๋ฅผ ์ˆ˜๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

VerticalPodAutoscalerController ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
  creationTimestamp: "2021-04-21T19:29:49Z"
  generation: 2
  name: default
  namespace: openshift-vertical-pod-autoscaler
  resourceVersion: "142172"
  uid: 180e17e9-03cc-427f-9955-3b4d7aeb2d59
spec:
  minReplicas: 3 1
  podMinCPUMillicores: 25
  podMinMemoryMb: 250
  recommendationOnly: false
  safetyMarginFraction: 0.15

1 1
VPA์—์„œ ์ž‘์—…ํ•  ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œ๋ณด๋‹ค ์ ์€ ๋ณต์ œ๋ณธ์ด ์žˆ๋Š” ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋Š” VPA์—์„œ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
2.5.3.2. VPA ๊ถŒ์žฅ ์‚ฌํ•ญ ์ž๋™ ์ ์šฉ

VPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด updateMode๋ฅผ Auto ๋˜๋Š” Recreate๋กœ ์„ค์ •ํ•˜์—ฌ ํŠน์ • ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ VPA CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ Pod๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด VPA์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. VPA๋Š” CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ VPA ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  Pod๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์žฌ๋ฐฐํฌ๋˜๋ฉด Pod๋Š” VPA ๊ถŒ์žฅ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ƒˆ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฐ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ์„ค์ •๋œ ๋ชจ๋“  Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด VPA CR์˜ status ํ•„๋“œ์— ์ถ”๊ฐ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๊ธฐ๋ณธ์ ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋Š” VPA์—์„œ Pod๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋ ค๋ฉด ์ตœ์†Œ ๋‘ ๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ตœ์†Œ๋ณด๋‹ค ์ ์€ ๋ณต์ œ๋ณธ์„ ์ง€์ •ํ•˜๋Š” ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Pod๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜๋ฉด ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ Pod๋ฅผ ์žฌ๋ฐฐํฌํ•˜๋ฉด VPA์—์„œ ์ƒˆ Pod๋ฅผ ๊ถŒ์žฅ ์‚ฌํ•ญ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. VPA ์ตœ์†Œ ๊ฐ’ ๋ณ€๊ฒฝ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ VerticalPodAutoscalerController ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ด ์ตœ์†Œ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Auto ๋ชจ๋“œ VPA CR์˜ ์˜ˆ

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Auto" 3

1
์ด VPA CR์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
2
์ด VPA CR์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
3
๋ชจ๋“œ๋ฅผ Auto ๋˜๋Š” Recreate๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Auto. VPA๋Š” Pod ์ƒ์„ฑ ์‹œ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ํ• ๋‹นํ•˜๊ณ  ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒˆ ๊ถŒ์žฅ ์‚ฌํ•ญ๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ๊ธฐ์กด Pod๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • Recreate. VPA๋Š” Pod ์ƒ์„ฑ ์‹œ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ํ• ๋‹นํ•˜๊ณ  ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒˆ ๊ถŒ์žฅ ์‚ฌํ•ญ๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ๊ธฐ์กด Pod๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ 

VPA์—์„œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ƒˆ Pod์— ์ ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์— ์ž‘๋™ ์ค‘์ธ Pod๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.5.3.3. Pod ์ƒ์„ฑ์— VPA ๊ถŒ์žฅ ์‚ฌํ•ญ ์ž๋™ ์ ์šฉ

VPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ฒ˜์Œ ๋ฐฐํฌํ•  ๋•Œ๋งŒ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด updateMode๋ฅผ Initial๋กœ ์„ค์ •ํ•˜์—ฌ ํŠน์ • ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ VPA CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

Initial ๋ชจ๋“œ VPA CR์˜ ์˜ˆ

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Initial" 3

1
์ด VPA CR์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
2
์ด VPA CR์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
3
๋ชจ๋“œ๋ฅผ Initial๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Pod๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด VPA์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•˜๊ณ  Pod ์ˆ˜๋ช… ๋™์•ˆ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ 

VPA์—์„œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ƒˆ Pod์— ์ ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์— ์ž‘๋™ ์ค‘์ธ Pod๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.5.3.4. VPA ๊ถŒ์žฅ ์‚ฌํ•ญ ์ˆ˜๋™ ์ ์šฉ

VPA๋ฅผ ๊ถŒ์žฅ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๋ฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด updateMode๋ฅผ off๋กœ ์„ค์ •ํ•˜์—ฌ ํŠน์ • ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ VPA CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ Pod๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด VPA๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜๊ณ  VPA CR์˜ status ํ•„๋“œ์— ํ•ด๋‹น ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. VPA๋Š” ์ƒˆ ๋ฆฌ์†Œ์Šค ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ํ™•์ธํ•  ๋•Œ Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Off ๋ชจ๋“œ VPA CR์˜ ์˜ˆ

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Off" 3

1
์ด VPA CR์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
2
์ด VPA CR์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
3
๋ชจ๋“œ๋ฅผ Off๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc get vpa <vpa-name> --output yaml

๊ถŒ์žฅ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žฌ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

VPA์—์„œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์— ์ž‘๋™ ์ค‘์ธ Pod๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.5.3.5. VPA ๊ถŒ์žฅ ์‚ฌํ•ญ ์ ์šฉ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ œ์™ธ

์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๊ณ  VPA์—์„œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ํŠน์ • ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ VPA CR์„ ์ƒ์„ฑํ•˜๊ณ  resourcePolicy๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠน์ • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ตํŠธ์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.

VPA์—์„œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด resourcePolicy๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์œผ๋ฉฐ VPA๋Š” Pod์˜ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Auto" 3
  resourcePolicy: 4
    containerPolicies:
    - containerName: my-opt-sidecar
      mode: "Off"
1
์ด VPA CR์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
2
์ด VPA CR์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
3
๋ชจ๋“œ๋ฅผ Auto, Recreate ๋˜๋Š” Off๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Recreate ๋ชจ๋“œ๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
4
์˜ตํŠธ์•„์›ƒํ•  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์ •ํ•˜๊ณ  mode๋ฅผ Off๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด Pod์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฐ ์ œํ•œ์ด ๋™์ผํ•œ ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

# ...
spec:
  containers:
  - name: frontend
    resources:
      limits:
        cpu: 1
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
  - name: backend
    resources:
      limits:
        cpu: "1"
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
# ...

backend ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ตํŠธ์•„์›ƒ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ VPA CR์„ ์‹œ์ž‘ํ•˜๋ฉด VPA์—์„œ Pod๋ฅผ ์ข…๋ฃŒํ•œ ํ›„ frontend ์ปจํ…Œ์ด๋„ˆ์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

...
spec:
  containers:
    name: frontend
    resources:
      limits:
        cpu: 50m
        memory: 1250Mi
      requests:
        cpu: 25m
        memory: 262144k
...
    name: backend
    resources:
      limits:
        cpu: "1"
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
...

2.5.4. Vertical Pod Autoscaler Operator ์‚ฌ์šฉ

VPA(Vertical Pod Autoscaler Operator) CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•˜์—ฌ VPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CR์€ VPA์—์„œ ํ•ด๋‹น Pod์— ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ๋ถ„์„ํ•˜๊ณ  ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๋Š” Pod๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

ํŠน์ • ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ VPA CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์Šค์ผ€์ผ๋งํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    1. VPA CR YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: autoscaling.k8s.io/v1
      kind: VerticalPodAutoscaler
      metadata:
        name: vpa-recommender
      spec:
        targetRef:
          apiVersion: "apps/v1"
          kind:       Deployment 1
          name:       frontend 2
        updatePolicy:
          updateMode: "Auto" 3
        resourcePolicy: 4
          containerPolicies:
          - containerName: my-opt-sidecar
            mode: "Off"
      1
      ์ด VPA์—์„œ ๊ด€๋ฆฌํ•  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ ์œ ํ˜•(Deployment, StatefulSet, Job, DaemonSet, ReplicaSet ๋˜๋Š” ReplicationController)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      2
      ์ด VPA์—์„œ ๊ด€๋ฆฌํ•  ๊ธฐ์กด ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      3
      ๋‹ค์Œ๊ณผ ๊ฐ™์ด VPA ๋ชจ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • auto: ์ปจํŠธ๋กค๋Ÿฌ์™€ ์—ฐ๊ฒฐ๋œ Pod์— ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. VPA๋Š” ๊ธฐ์กด Pod๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฐ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • recreate: ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod์— ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. VPA๋Š” ๊ธฐ์กด Pod๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฐ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. recreate ๋ชจ๋“œ๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      • initial: ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. VPA๋Š” ์ƒˆ ๋ฆฌ์†Œ์Šค ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ํ™•์ธํ•  ๋•Œ Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • off: ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod์˜ ๋ฆฌ์†Œ์Šค ๊ถŒ์žฅ ์‚ฌํ•ญ๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. VPA๋Š” ์ƒˆ ๋ฆฌ์†Œ์Šค ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ํ™•์ธํ•  ๋•Œ Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ƒˆ Pod์— ์ ์šฉํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
      4
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์˜ตํŠธ์•„์›ƒํ•  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์ •ํ•˜๊ณ  ๋ชจ๋“œ๋ฅผ Off๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. VPA CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

      ์ž ์‹œ ํ›„ VPA๋Š” ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod์—์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ VPA ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      $ oc get vpa <vpa-name> --output yaml

      ์ถœ๋ ฅ์—๋Š” CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ํ‘œ์‹œ๋˜๋ฉฐ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

      ์ถœ๋ ฅ ์˜ˆ

      ...
      status:
      
      ...
      
        recommendation:
          containerRecommendations:
          - containerName: frontend
            lowerBound: 1
              cpu: 25m
              memory: 262144k
            target: 2
              cpu: 25m
              memory: 262144k
            uncappedTarget: 3
              cpu: 25m
              memory: 262144k
            upperBound: 4
              cpu: 262m
              memory: "274357142"
          - containerName: backend
            lowerBound:
              cpu: 12m
              memory: 131072k
            target:
              cpu: 12m
              memory: 131072k
            uncappedTarget:
              cpu: 12m
              memory: 131072k
            upperBound:
              cpu: 476m
              memory: "498558823"
      
      ...

      1
      lowerBound๋Š” ์ตœ์†Œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค ์ˆ˜์ค€์€ ์ž…๋‹ˆ๋‹ค.
      2
      target์€ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.
      3
      upperBound๋Š” ๊ถŒ์žฅ๋˜๋Š” ์ตœ๊ณ  ๋ฆฌ์†Œ์Šค ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.
      4
      uncappedTarget์€ ์ตœ์‹  ๋ฆฌ์†Œ์Šค ๊ถŒ์žฅ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

2.5.5. Vertical Pod Autoscaler Operator ์„ค์น˜ ์ œ๊ฑฐ

OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ VPA(Vertical Pod Autoscaler Operator)๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ์ œ๊ฑฐํ•ด๋„ ๊ธฐ์กด VPA CR์— ์˜ํ•ด ์ด๋ฏธ ์ˆ˜์ •๋œ Pod์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ Pod์—์„œ๋Š” ๋ชจ๋‘ Vertical Pod Autoscaler Operator์—์„œ ์„ค์ •ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ ๋Œ€์‹  ์›Œํฌ๋กœ๋“œ ์˜ค๋ธŒ์ ํŠธ์— ์ •์˜๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

oc delete vpa <vpa-name > ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • VPA CR์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์š”์ฒญ์—๋Š” ์ˆ˜์ง Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์„ค์น˜ ์ œ๊ฑฐํ•  ๋•Œ์™€ ๋™์ผํ•œ ์ž‘์—…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

VPA Operator๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด Operator์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • Vertical Pod Autoscaler Operator๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Operator โ†’ ์„ค์น˜๋œ Operator๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. openshift-vertical-pod-autoscaler ํ”„๋กœ์ ํŠธ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. VerticalPodAutoscaler Operator์˜ ๊ฒฝ์šฐ ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  Operator ์„ค์น˜ ์ œ๊ฑฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ ํƒ ์‚ฌํ•ญ: Operator์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋Œ€ํ™” ์ƒ์ž์—์„œ ์ด Operator์˜ ๋ชจ๋“  ํ”ผ์—ฐ์‚ฐ์ž ์ธ์Šคํ„ด์Šค ์‚ญ์ œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  5. ์ œ๊ฑฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  6. ์„ ํƒ ์‚ฌํ•ญ: OpenShift CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VPA ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    1. VPA ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

      $ oc delete namespace openshift-vertical-pod-autoscaler
    2. VPA CRD(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ •์˜) ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

      $ oc delete crd verticalpodautoscalercheckpoints.autoscaling.k8s.io
      $ oc delete crd verticalpodautoscalercontrollers.autoscaling.openshift.io
      $ oc delete crd verticalpodautoscalers.autoscaling.k8s.io

      CRD๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๊ด€๋ จ ์—ญํ• , ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• , ์—ญํ•  ๋ฐ”์ธ๋”ฉ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

      ์ฐธ๊ณ 

      ์ด ์ž‘์—…์€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑํ•œ VPA CR์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. VPA๋ฅผ ๋‹ค์‹œ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    3. VPA Operator๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

      $ oc delete operator/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler

2.6. Pod์— ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ œ๊ณต

์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ธธ ์›ํ•˜์ง€ ์•Š๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด(์•”ํ˜ธ ๋ฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋“ฑ)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž๋Š” Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•œ ํ…์ŠคํŠธ๋กœ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ ๋„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.6.1. ๋ณด์•ˆ ์ดํ•ด

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

์ฃผ์š” ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ ๋ฐ์ดํ„ฐ๋Š” ์ •์˜์™€๋Š” ๋ณ„๋„๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์€ ์ž„์‹œ ํŒŒ์ผ ์ €์žฅ ๊ธฐ๋Šฅ(tmpfs)์— ์˜ํ•ด ์ง€์›๋˜๋ฉฐ ๋…ธ๋“œ์— ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ๋ฐ์ดํ„ฐ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

YAML Secret ์˜ค๋ธŒ์ ํŠธ ์ •์˜

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
  namespace: my-namespace
type: Opaque 1
data: 2
  username: <username> 3
  password: <password>
stringData: 4
  hostname: myapp.mydomain.com 5

1
๋ณด์•ˆ์˜ ํ‚ค ์ด๋ฆ„๊ณผ ๊ฐ’์˜ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
2
data ํ•„๋“œ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ํ‚ค ํ˜•์‹์€ Kubernetes ๊ตฌ๋ถ„์ž ์šฉ์–ด์ง‘์˜ DNS_SUBDOMAIN ๊ฐ’์— ์žˆ๋Š” ์ง€์นจ์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
3
data ๋งต์˜ ํ‚ค์™€ ๊ด€๋ จ๋œ ๊ฐ’์€ base64๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
4
stringData ๋งต์˜ ํ•ญ๋ชฉ์ด base64๋กœ ๋ณ€ํ™˜๋œ ํ›„ ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์ž๋™์œผ๋กœ data ๋งต์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” ์“ฐ๊ธฐ ์ „์šฉ์ด๋ฉฐ ๊ฐ’์€ data ํ•„๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
5
stringData ๋งต์˜ ํ‚ค์™€ ๊ด€๋ จ๋œ ๊ฐ’์€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๋ณด์•ˆ์„ ์ƒ์„ฑํ•œ ํ›„ ํ•ด๋‹น ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ์ƒ์„ฑ ์‹œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Pod ์„œ๋น„์Šค ๊ณ„์ •์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ secret ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
2.6.1.1. ๋ณด์•ˆ ์œ ํ˜•

type ํ•„๋“œ์˜ ๊ฐ’์€ ๋ณด์•ˆ์˜ ํ‚ค ์ด๋ฆ„๊ณผ ๊ฐ’์˜ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ์— ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ํ‚ค๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์ธ opaque ์œ ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋ฐ์ดํ„ฐ์— ํŠน์ • ํ‚ค ์ด๋ฆ„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์ธก ์ตœ์†Œ ๊ฒ€์ฆ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • kubernetes.io/service-account-token. ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • kubernetes.io/basic-auth. ๊ธฐ๋ณธ ์ธ์ฆ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • kubernetes.io/ssh-auth. SSH ํ‚ค ์ธ์ฆ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • kubernetes.io/tls. TLS ์ธ์ฆ ๊ธฐ๊ด€์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด typ: Opaque๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ณด์•ˆ์—์„œ ํ‚ค ์ด๋ฆ„ ๋˜๋Š” ๊ฐ’์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋„๋ก ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. opaque ๋ณด์•ˆ์—๋Š” ์ž„์˜์˜ ๊ฐ’์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์ •ํ˜• key:value ์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

example.com/my-secret-type๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž„์˜์˜ ์œ ํ˜•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์€ ์„œ๋ฒ„ ์ธก์— ์ ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ๋ณด์•ˆ ์ƒ์„ฑ์ž๊ฐ€ ํ•ด๋‹น ์œ ํ˜•์˜ ํ‚ค/๊ฐ’ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜๋„๋ก ์˜๋„ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์‹œํฌ๋ฆฟ ์œ ํ˜•์˜ ์˜ˆ๋Š” ๋ณด์•ˆ ์‚ฌ์šฉ์˜ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2.6.1.2. ๋ณด์•ˆ ๋ฐ์ดํ„ฐ ํ‚ค

๋ณด์•ˆํ‚ค๋Š” DNS ํ•˜์œ„ ๋„๋ฉ”์ธ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.6.2. ๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ดํ•ด

๊ด€๋ฆฌ์ž๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ๋ณด์•ˆ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ์ƒ์„ฑ ์‹œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์‹œํฌ๋ฆฟ ์œ ํ˜•์— ํ•„์š”ํ•œ ํŠน์ • ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ ์„น์…˜์—์„œ ์—ญ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค.

    ๋ถˆํˆฌ๋ช… ๋ณด์•ˆ์„ ์ƒ์„ฑํ•˜๋Š” YAML ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

    apiVersion: v1
    kind: Secret
    metadata:
      name: test-secret
    type: Opaque 1
    data: 2
      username: <username>
      password: <password>
    stringData: 3
      hostname: myapp.mydomain.com
      secret.properties: |
        property1=valueA
        property2=valueB

    1
    ๋ณด์•ˆ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    ๋””์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋‘˜ ๋‹ค ์•„๋‹Œ data ๋˜๋Š” stringdata ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  2. ๋ณด์•ˆ์„ ์ฐธ์กฐํ•˜๋„๋ก Pod ์„œ๋น„์Šค ๊ณ„์ •์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์˜ YAML

    apiVersion: v1
    kind: ServiceAccount
     ...
    secrets:
    - name: test-secret

  3. ๋ณด์•ˆ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ secret ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ๋ณด์•ˆ ๋ฐ์ดํ„ฐ๋กœ ๋ณผ๋ฅจ์˜ ํŒŒ์ผ์„ ์ฑ„์šฐ๋Š” Pod์˜ YAML

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-example-pod
    spec:
      containers:
        - name: secret-test-container
          image: busybox
          command: [ "/bin/sh", "-c", "cat /etc/secret-volume/*" ]
          volumeMounts: 1
              - name: secret-volume
                mountPath: /etc/secret-volume 2
                readOnly: true 3
      volumes:
        - name: secret-volume
          secret:
            secretName: test-secret 4
      restartPolicy: Never

    1
    ๋ณด์•ˆ์ด ํ•„์š”ํ•œ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— volumeMounts ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    2
    ๋ณด์•ˆ์ด ํ‘œ์‹œ๋˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ฏธ์‚ฌ์šฉ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋ฐ์ดํ„ฐ ๋งต์˜ ๊ฐ ํ‚ค๋Š” mountPath ์•„๋ž˜์˜ ํŒŒ์ผ ์ด๋ฆ„์ด ๋ฉ๋‹ˆ๋‹ค.
    3
    true ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. true์ธ ๊ฒฝ์šฐ ๋“œ๋ผ์ด๋ฒ„์—์„œ ์ฝ๊ธฐ ์ „์šฉ ๋ณผ๋ฅจ์„ ์ œ๊ณตํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.
    4
    ์‹œํฌ๋ฆฟ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋ณด์•ˆ ๋ฐ์ดํ„ฐ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฑ„์šฐ๋Š” Pod์˜ YAML

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-example-pod
    spec:
      containers:
        - name: secret-test-container
          image: busybox
          command: [ "/bin/sh", "-c", "export" ]
          env:
            - name: TEST_SECRET_USERNAME_ENV_VAR
              valueFrom:
                secretKeyRef: 1
                  name: test-secret
                  key: username
      restartPolicy: Never

    1
    ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋ณด์•ˆ ๋ฐ์ดํ„ฐ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฑ„์šฐ๋Š” ๋นŒ๋“œ ๊ตฌ์„ฑ์˜ YAML

    apiVersion: build.openshift.io/v1
    kind: BuildConfig
    metadata:
      name: secret-example-bc
    spec:
      strategy:
        sourceStrategy:
          env:
          - name: TEST_SECRET_USERNAME_ENV_VAR
            valueFrom:
              secretKeyRef: 1
                name: test-secret
                key: username
          from:
            kind: ImageStreamTag
            namespace: openshift
            name: 'cli:latest'

    1
    ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2.6.2.1. ๋ณด์•ˆ ์ƒ์„ฑ ์ œํ•œ ์‚ฌํ•ญ

๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Pod์—์„œ ๋ณด์•ˆ์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ Pod์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ.
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธ๋œ ๋ณผ๋ฅจ์—์„œ ํŒŒ์ผ๋กœ ์‚ฌ์šฉ.
  • Pod์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ kubelet์œผ๋กœ ์‚ฌ์šฉ.

๋ณผ๋ฅจ ์œ ํ˜• ๋ณด์•ˆ์€ ๋ณผ๋ฅจ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ณด์•ˆ์€ ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  Pod์— ๋ณด์•ˆ์„ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์— ๋ณด์•ˆ ์ •์˜๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ…œํ”Œ๋ฆฟ์— ์ œ๊ณต๋œ ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ณด์•ˆ ๋ณผ๋ฅจ ์†Œ์Šค๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ์ง€์ •๋œ ์˜ค๋ธŒ์ ํŠธ ์ฐธ์กฐ๊ฐ€ Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹ค์ œ๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด์•ˆ์„ ์ƒ์„ฑํ•œ ํ›„ ํ•ด๋‹น ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์€ ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์‚ฝ์ž…๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Secret API ์˜ค๋ธŒ์ ํŠธ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” Pod๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ๋ณด์•ˆ์€ 1MB๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๊ทœ๋ชจ ๋ณด์•ˆ์ด ์ƒ์„ฑ๋˜์–ด apiserver ๋ฐ kubelet ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ๋ชจ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž‘์€ ๋ณด์•ˆ์„ ๋งŽ์ด ์ƒ์„ฑํ•ด๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ๋ชจ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.6.2.2. ๋ถˆํˆฌ๋ช… ๋ณด์•ˆ ์ƒ์„ฑ

๊ด€๋ฆฌ์ž๋Š” ์ž„์˜์˜ ๊ฐ’์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์ •ํ˜• key:value ์Œ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ถˆํˆฌ๋ช… ๋ณด์•ˆ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์˜ YAML ํŒŒ์ผ์— Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque 1
    data:
      username: <username>
      password: <password>
    1
    ๋ถˆํˆฌ๋ช… ๋ณด์•ˆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <filename>.yaml
  3. Pod์—์„œ ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ Pod ์„œ๋น„์Šค ๊ณ„์ •์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    2. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ๋ณด์•ˆ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜( ๋ณด์•ˆ ๋ณผ๋ฅจ ์‚ฌ์šฉ) ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

2.6.2.3. ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ์‹œํฌ๋ฆฟ ์ƒ์„ฑ

๊ด€๋ฆฌ์ž๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•˜์—ฌ API์— ์ธ์ฆํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  TokenRequest API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ธ๋”ฉ๋œ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์–ป๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. TokenRequest API์—์„œ ์–ป์€ ํ† ํฐ์€ ๋ฐ”์ธ๋”ฉ๋œ ์ˆ˜๋ช…์ด ์žˆ๊ณ  ๋‹ค๋ฅธ API ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ์ €์žฅ๋œ ํ† ํฐ๋ณด๋‹ค ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

TokenRequest API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด API ์˜ค๋ธŒ์ ํŠธ์—์„œ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ ํ† ํฐ์˜ ๋ณด์•ˆ ๋…ธ์ถœ์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ ˆ์ฐจ

  1. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์˜ YAML ํŒŒ์ผ์— Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ:

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-sa-sample
      annotations:
        kubernetes.io/service-account.name: "sa-name" 1
    type: kubernetes.io/service-account-token 2

    1
    ๊ธฐ์กด ์„œ๋น„์Šค ๊ณ„์ • ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ServiceAccount ๋ฐ Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ServiceAccount ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    2
    ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <filename>.yaml
  3. Pod์—์„œ ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ Pod ์„œ๋น„์Šค ๊ณ„์ •์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    2. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ๋ณด์•ˆ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜( ๋ณด์•ˆ ๋ณผ๋ฅจ ์‚ฌ์šฉ) ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

2.6.2.4. ๊ธฐ๋ณธ ์ธ์ฆ ๋ณด์•ˆ ์ƒ์„ฑ

๊ด€๋ฆฌ์ž๋Š” ๊ธฐ๋ณธ ์ธ์ฆ ๋ณด์•ˆ์— ํ•„์š”ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์ธ์ฆ ๋ณด์•ˆ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณด์•ˆ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Secret ์˜ค๋ธŒ์ ํŠธ์˜ data ๋งค๊ฐœ๋ณ€์ˆ˜์— base64 ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋‹ค์Œ ํ‚ค๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ด๋ฆ„: ์ธ์ฆ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„
  • password: ์ธ์ฆ์— ๋Œ€ํ•œ ์•”ํ˜ธ ๋˜๋Š” ํ† ํฐ
์ฐธ๊ณ 

stringData ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์˜ YAML ํŒŒ์ผ์— Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    secret ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-basic-auth
    type: kubernetes.io/basic-auth 1
    data:
    stringData: 2
      username: admin
      password: <password>

    1
    ๊ธฐ๋ณธ ์ธ์ฆ ๋ณด์•ˆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ ์ธ์ฆ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <filename>.yaml
  3. Pod์—์„œ ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ Pod ์„œ๋น„์Šค ๊ณ„์ •์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    2. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ๋ณด์•ˆ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜( ๋ณด์•ˆ ๋ณผ๋ฅจ ์‚ฌ์šฉ) ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

2.6.2.5. SSH ์ธ์ฆ ๋ณด์•ˆ ์ƒ์„ฑ

๊ด€๋ฆฌ์ž๋Š” SSH ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” SSH ์ธ์ฆ ๋ณด์•ˆ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณด์•ˆ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Secret ์˜ค๋ธŒ์ ํŠธ์˜ data ๋งค๊ฐœ๋ณ€์ˆ˜์— ์‚ฌ์šฉํ•  SSH ์ธ์ฆ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์˜ YAML ํŒŒ์ผ์— Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ:

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-ssh-auth
    type: kubernetes.io/ssh-auth 1
    data:
      ssh-privatekey: | 2
              MIIEpQIBAAKCAQEAulqb/Y ...

    1
    SSH ์ธ์ฆ ๋ณด์•ˆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์‚ฌ์šฉํ•  SSH ํ‚ค/๊ฐ’ ์Œ์„ SSH ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <filename>.yaml
  3. Pod์—์„œ ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ Pod ์„œ๋น„์Šค ๊ณ„์ •์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    2. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ๋ณด์•ˆ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜( ๋ณด์•ˆ ๋ณผ๋ฅจ ์‚ฌ์šฉ) ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
2.6.2.6. Docker ๊ตฌ์„ฑ ๋ณด์•ˆ ์ƒ์„ฑ

๊ด€๋ฆฌ์ž๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” Docker ๊ตฌ์„ฑ ๋ณด์•ˆ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • kubernetes.io/dockercfg. ์ด ์‹œํฌ๋ฆฟ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ Docker ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. secret ์˜ค๋ธŒ์ ํŠธ์˜ data ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” base64 ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ .dockercfg ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • kubernetes.io/dockerconfigjson. ์ด ์‹œํฌ๋ฆฟ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ Docker ๊ตฌ์„ฑ JSON ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. secret ์˜ค๋ธŒ์ ํŠธ์˜ data ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” base64 ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ .docker/config.json ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์˜ YAML ํŒŒ์ผ์— Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    Docker ๊ตฌ์„ฑ ๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-docker-cfg
      namespace: my-project
    type: kubernetes.io/dockerconfig 1
    data:
      .dockerconfig:bm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== 2

    1
    ๋ณด์•ˆ์ด Docker ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    base64๋กœ ์ธ์ฝ”๋”ฉ๋œ Docker ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์ถœ๋ ฅ

    Docker ๊ตฌ์„ฑ JSON ์‹œํฌ๋ฆฟ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-docker-json
      namespace: my-project
    type: kubernetes.io/dockerconfig 1
    data:
      .dockerconfigjson:bm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== 2

    1
    ๋ณด์•ˆ์ด Docker ๊ตฌ์„ฑ JSON ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    base64๋กœ ์ธ์ฝ”๋”ฉ๋œ Docker ๊ตฌ์„ฑ JSON ํŒŒ์ผ์˜ ์ถœ๋ ฅ
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <filename>.yaml
  3. Pod์—์„œ ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ Pod ์„œ๋น„์Šค ๊ณ„์ •์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    2. "๋ณด์•ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•" ์„น์…˜์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ๋ณด์•ˆ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜( ๋ณด์•ˆ ๋ณผ๋ฅจ ์‚ฌ์šฉ) ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

2.6.3. ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ• ์ดํ•ด

๋ณด์•ˆ ๊ฐ’์„ ์ˆ˜์ •ํ•ด๋„ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ Pod์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์€ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์›๋ž˜ Pod๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋Œ€๊ฐœ ๋™์ผํ•œ PodSpec ์‚ฌ์šฉ).

๋ณด์•ˆ ์—…๋ฐ์ดํŠธ ์ž‘์—…์—์„œ๋Š” ์ƒˆ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์›Œํฌํ”Œ๋กœ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. kubectl rolling-update ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ์˜ resourceVersion ๊ฐ’์€ ์ฐธ์กฐ ์‹œ ์ง€์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Pod๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๋™์‹œ์— ๋ณด์•ˆ์ด ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒฝ์šฐ Pod์— ์‚ฌ์šฉ๋˜๋Š” ๋ณด์•ˆ์˜ ๋ฒ„์ „์ด ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

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

2.6.4. ๋ณด์•ˆ ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ

๊ด€๋ฆฌ์ž๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด API์— ์ธ์ฆํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„œ๋น„์Šค ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create sa <service_account_name> -n <your_namespace>
  2. ๋‹ค์Œ YAML ์˜ˆ์ œ๋ฅผ service-account-token-secret.yaml ์ด๋ผ๋Š” ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์—๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Secret ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Secret
    metadata:
      name: <secret_name> 1
      annotations:
        kubernetes.io/service-account.name: "sa-name" 2
    type: kubernetes.io/service-account-token 3
    1
    & lt;secret_name >์„ ์„œ๋น„์Šค ํ† ํฐ ์‹œํฌ๋ฆฟ ์ด๋ฆ„์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
    2
    ๊ธฐ์กด ์„œ๋น„์Šค ๊ณ„์ • ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ServiceAccount ๋ฐ Secret ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ServiceAccount ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    3
    ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ์‹œํฌ๋ฆฟ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ํŒŒ์ผ์„ ์ ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc apply -f service-account-token-secret.yaml
  4. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์‹œํฌ๋ฆฟ์—์„œ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ oc get secret <sa_token_secret> -o jsonpath='{.data.token}' | base64 --decode) 1

    ์ถœ๋ ฅ ์˜ˆ

    ayJhbGciOiJSUzI1NiIsImtpZCI6IklOb2dtck1qZ3hCSWpoNnh5YnZhSE9QMkk3YnRZMVZoclFfQTZfRFp1YlUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImJ1aWxkZXItdG9rZW4tdHZrbnIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYnVpbGRlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjNmZGU2MGZmLTA1NGYtNDkyZi04YzhjLTNlZjE0NDk3MmFmNyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmJ1aWxkZXIifQ.OmqFTDuMHC_lYvvEUrjr1x453hlEEHYcxS9VKSzmRkP1SiVZWPNPkTWlfNRp6bIUZD3U6aN3N7dMSN0eI5hu36xPgpKTdvuckKLTCnelMx6cxOdAbrcw1mCmOClNscwjS1KO1kzMtYnnq8rXHiMJELsNlhnRyyIXRTtNBsy4t64T3283s3SLsancyx0gy0ujx-Ch3uKAKdZi5iT-I8jnnQ-ds5THDs2h65RJhgglQEmSxpHrLGZFmyHAQI-_SjvmHZPXEc482x3SkaQHNLqpmrpJorNqh1M8ZHKzlujhZgVooMvJmWPXTb2vnvi3DGn2XI-hZxl1yD2yGH1RBpYUHA

    1
    <sa_token_secret>์„ ์„œ๋น„์Šค ํ† ํฐ ์‹œํฌ๋ฆฟ ์ด๋ฆ„์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
  5. ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ API๋กœ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

    $ curl -X GET <openshift_cluster_api> --header "Authorization: Bearer <token>" 1 2
    1
    &lt ;openshift_cluster_api&gt;๋ฅผ OpenShift ํด๋Ÿฌ์Šคํ„ฐ API๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    2
    & lt;token >์„ ์ด์ „ ๋ช…๋ น์—์„œ ์ถœ๋ ฅ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

2.6.5. ๋ณด์•ˆ์ด ํฌํ•จ๋œ ์„œ๋ช…๋œ ์ธ์ฆ์„œ ์‚ฌ์šฉ ์ •๋ณด

์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ†ต์‹ ์„ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ณด์•ˆ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ช…๋œ ์ œ๊ณต ์ธ์ฆ์„œ/ํ‚ค ์Œ์„ ์ƒ์„ฑํ•˜๋„๋ก OpenShift Container Platform์„ ๊ตฌ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

์„œ๋น„์Šค Pod ์‚ฌ์–‘์€ ์„œ๋น„์Šค ์ œ๊ณต ์ธ์ฆ์„œ ๋ณด์•ˆ์— ๋Œ€ํ•ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: registry
  annotations:
    service.beta.openshift.io/serving-cert-secret-name: registry-cert1
# ...

1
์ธ์ฆ์„œ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ Pod๋Š” ํ•ด๋‹น Pod์— ์ž๋™์œผ๋กœ ๋งˆ์šดํŠธ๋˜๋Š” /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt ํŒŒ์ผ์˜ CA ๋ฒˆ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€ DNS ์ด๋ฆ„์—๋งŒ ์„œ๋ช…๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์˜ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ x509.SHA256WithRSA์ž…๋‹ˆ๋‹ค. ์ง์ ‘ ๊ต๋Œ€ํ•˜๋ ค๋ฉด ์ƒ์„ฑ๋œ ๋ณด์•ˆ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์ธ์ฆ์„œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

2.6.5.1. ๋ณด์•ˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์„œ๋ช…๋œ ์ธ์ฆ์„œ ์ƒ์„ฑ

Pod์™€ ํ•จ๊ป˜ ์„œ๋ช…๋œ ์ œ๊ณต ์ธ์ฆ์„œ/ํ‚ค ์Œ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํŽธ์ง‘ํ•˜์—ฌ service.beta.openshift.io/serving-cert-secret-name ์ฃผ์„์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ Pod์— ๋ณด์•ˆ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

์„œ๋น„์Šค ์ œ๊ณต ์ธ์ฆ์„œ ๋ณด์•ˆ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์„œ๋น„์Šค์— ๋Œ€ํ•œ Pod ์‚ฌ์–‘์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ณด์•ˆ์— ์‚ฌ์šฉํ•  ์ด๋ฆ„์œผ๋กœ service.beta.openshift.io/serving-cert-secret-name ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
      annotations:
          service.beta.openshift.io/serving-cert-secret-name: my-cert 1
    spec:
      selector:
        app: MyApp
      ports:
      - protocol: TCP
        port: 80
        targetPort: 9376

    ์ธ์ฆ์„œ ๋ฐ ํ‚ค๋Š” PEM ํ˜•์‹์ด๋ฉฐ ๊ฐ๊ฐ tls.crt ๋ฐ tls.key์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  3. ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>.yaml
  4. ๋ณด์•ˆ์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    1. ๋ชจ๋“  ๋ณด์•ˆ ๋ชฉ๋ก์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc get secrets

      ์ถœ๋ ฅ ์˜ˆ

      NAME                     TYPE                                  DATA      AGE
      my-cert                  kubernetes.io/tls                     2         9m

    2. ๋ณด์•ˆ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc describe secret my-cert

      ์ถœ๋ ฅ ์˜ˆ

      Name:         my-cert
      Namespace:    openshift-console
      Labels:       <none>
      Annotations:  service.beta.openshift.io/expiry: 2023-03-08T23:22:40Z
                    service.beta.openshift.io/originating-service-name: my-service
                    service.beta.openshift.io/originating-service-uid: 640f0ec3-afc2-4380-bf31-a8c784846a11
                    service.beta.openshift.io/expiry: 2023-03-08T23:22:40Z
      
      Type:  kubernetes.io/tls
      
      Data
      ====
      tls.key:  1679 bytes
      tls.crt:  2595 bytes

  5. ํ•ด๋‹น ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod ์‚ฌ์–‘์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-service-pod
    spec:
      containers:
      - name: mypod
        image: redis
        volumeMounts:
        - name: my-container
          mountPath: "/etc/my-path"
      volumes:
      - name: my-volume
        secret:
          secretName: my-cert
          items:
          - key: username
            path: my-group/my-username
            mode: 511

    ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ Pod๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์„œ๋Š” ๋‚ด๋ถ€ ์„œ๋น„์Šค DNS ์ด๋ฆ„์ธ <service.name>.<service.namespace>.svc์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

    ์ธ์ฆ์„œ/ํ‚ค ์Œ์€ ๋งŒ๋ฃŒ ์‹œ๊ธฐ๊ฐ€ ๋‹ค๊ฐ€์˜ค๋ฉด ์ž๋™์œผ๋กœ ๊ต์ฒด๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ์˜ service.beta.openshift.io/expiry ์ฃผ์„์—์„œ RFC3339 ํ˜•์‹์˜ ๋งŒ๋ฃŒ ๋‚ ์งœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์„œ๋น„์Šค DNS ์ด๋ฆ„ <service.name>.<service.namespace>.svc๋Š” ์™ธ๋ถ€์—์„œ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. <service.name>.<service.namespace>.svc๋Š” ์ฃผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋˜๋Š” ์„œ๋น„์Šค ๋‚ด ํ†ต์‹ ๊ณผ ๊ฒฝ๋กœ ์žฌ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2.6.6. ๋ณด์•ˆ ๋ฌธ์ œ ํ•ด๊ฒฐ

๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ์ธ์ฆ์„œ ์ƒ์„ฑ์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ (์„œ๋น„์Šค์˜ service.beta.openshift.io/serving-cert-generation-error ์ฃผ์„์— ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค).

secret/ssl-key references serviceUID 62ad25ca-d703-11e6-9d6f-0e9c0057b608, which does not match 77b6dd80-d716-11e6-9d6f-0e9c0057b60

์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•œ ์„œ๋น„์Šค๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ serviceUID๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด์ „ ๋ณด์•ˆ์„ ์ œ๊ฑฐํ•˜๊ณ  service.beta.openshift.io/serving-cert-generation-error , service.beta.openshift.io/serving-cert-generation-error -num ์ฃผ์„์„ ์ง€์›Œ ์ธ์ฆ์„œ๋ฅผ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ณด์•ˆ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    $ oc delete secret <secret_name>
  2. ์ฃผ์„์„ ์ง€์›๋‹ˆ๋‹ค.

    $ oc annotate service <service_name> service.beta.openshift.io/serving-cert-generation-error-
    $ oc annotate service <service_name> service.beta.openshift.io/serving-cert-generation-error-num-
์ฐธ๊ณ 

์ฃผ์„์„ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น์—๋Š” ์ œ๊ฑฐํ•  ์ฃผ์„ ์ด๋ฆ„ ๋’ค์— -๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2.7. ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๊ตฌ์„ฑ ๋งต๊ณผ ์ด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

2.7.1. ๊ตฌ์„ฑ ๋งต ์ดํ•ด

๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ, ๋ช…๋ น์ค„ ์ธ์ˆ˜ ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ด์‹ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์•„ํ‹ฐํŒฉํŠธ๋Š” ์ด๋ฏธ์ง€ ์ฝ˜ํ…์ธ ์™€ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

ConfigMap ์˜ค๋ธŒ์ ํŠธ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ OpenShift Container Platform๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋งต์€ ๊ฐœ๋ณ„ ์†์„ฑ ๋˜๋Š” ์ „์ฒด ๊ตฌ์„ฑ ํŒŒ์ผ ๋˜๋Š” JSON Blob๊ณผ ๊ฐ™์€ ์„ธ๋ถ„ํ™”๋œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ConfigMap ์˜ค๋ธŒ์ ํŠธ์—๋Š” Pod์—์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ์˜ ํ‚ค-๊ฐ’ ์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ConfigMap ์˜ค๋ธŒ์ ํŠธ ์ •์˜

kind: ConfigMap
apiVersion: v1
metadata:
  creationTimestamp: 2016-02-18T19:14:38Z
  name: example-config
  namespace: my-namespace
data: 1
  example.property.1: hello
  example.property.2: world
  example.property.file: |-
    property.1=value-1
    property.2=value-2
    property.3=value-3
binaryData:
  bar: L3Jvb3QvMTAw 2

1 1
๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
2
UTF8์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค(์˜ˆ: ๋ฐ”์ด๋„ˆ๋ฆฌ Java ํ‚ค ์ €์žฅ์†Œ ํŒŒ์ผ). Base 64์— ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ 

์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•  ๋•Œ binaryData ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Pod์—์„œ ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋งต์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’ ์ฑ„์šฐ๊ธฐ
  • ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ช…๋ น์ค„ ์ธ์ˆ˜ ์„ค์ •
  • ๋ณผ๋ฅจ์— ๊ตฌ์„ฑ ํŒŒ์ผ ์ฑ„์šฐ๊ธฐ

์‚ฌ์šฉ์ž ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑ ๋งต์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๋งต์€ ๋ณด์•ˆ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๋ฌธ์ž์—ด ์ž‘์—…์„ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ง€์›ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๋งต ์ œํ•œ ์‚ฌํ•ญ

Pod์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ˆ„๋ฝ๋œ ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋œ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ConfigMap ์˜ค๋ธŒ์ ํŠธ๋Š” ํ”„๋กœ์ ํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์˜ Pod์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubelet์€ API ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” Pod์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ๋งต๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” CLI๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ฐ„์ ‘์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  Pod๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. OpenShift Container Platform ๋…ธ๋“œ์˜ --manifest-url ํ”Œ๋ž˜๊ทธ, --config ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ํ•ด๋‹น REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ Pod๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋Š” Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2.7.2. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ

OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋กœ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. ๊ด€๋ฆฌ์ž ๊ด€์ ์—์„œ Workloads โ†’ Config Maps์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    2. ํŽ˜์ด์ง€ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์—์„œ ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. ๊ตฌ์„ฑ ๋งต์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    4. ์ƒ์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋กœ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. ๊ฐœ๋ฐœ์ž ๊ด€์ ์—์„œ Config Maps์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    2. ํŽ˜์ด์ง€ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์—์„œ ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. ๊ตฌ์„ฑ ๋งต์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    4. ์ƒ์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

2.7.3. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ ‰ํ† ๋ฆฌ, ํŠน์ • ํŒŒ์ผ ๋˜๋Š” ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์—์„œ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  • ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ:

    $ oc create configmap <configmap_name> [options]
2.7.3.1. ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ

--from-file ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฐ ํŒŒ์ผ์€ ๊ตฌ์„ฑ ๋งต์—์„œ ํ‚ค๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ‚ค ์ด๋ฆ„์€ ํŒŒ์ผ ์ด๋ฆ„์ด๋ฉฐ ํ‚ค ๊ฐ’์€ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์€ example-files ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

$ oc create configmap game-config --from-file=example-files/

๊ตฌ์„ฑ ๋งต์—์„œ ํ‚ค๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

$ oc describe configmaps game-config

์ถœ๋ ฅ ์˜ˆ

Name:           game-config
Namespace:      default
Labels:         <none>
Annotations:    <none>

Data

game.properties:        158 bytes
ui.properties:          83 bytes

๋งต์˜ ๋‘ ํ‚ค๊ฐ€ ๋ช…๋ น์— ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ ์ด๋ฆ„์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ‚ค์˜ ๋‚ด์šฉ์€ ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ oc describe ์˜ ์ถœ๋ ฅ์€ ํ‚ค์™€ ํฌ๊ธฐ์˜ ์ด๋ฆ„๋งŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๊ตฌ์„ฑ ๋งต์„ ์ฑ„์šฐ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ ์ ˆ์ฐจ์—์„œ๋Š” ๋‹ค์Œ ์˜ˆ์ œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. game.properties ๋ฐ ui.properties:

    $ cat example-files/game.properties

    ์ถœ๋ ฅ ์˜ˆ

    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30

    $ cat example-files/ui.properties

    ์ถœ๋ ฅ ์˜ˆ

    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice

ํ”„๋กœ์„ธ์Šค

  • ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฐ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ณด์œ ํ•œ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create configmap game-config \
        --from-file=example-files/

๊ฒ€์ฆ

  • ํ‚ค ๊ฐ’์„ ๋ณด๋ ค๋ฉด -o ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ oc get ๋ช…๋ น์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    $ oc get configmaps game-config -o yaml

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: v1
    data:
      game.properties: |-
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
      ui.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
        how.nice.to.look=fairlyNice
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:34:05Z
      name: game-config
      namespace: default
      resourceVersion: "407"
      selflink: /api/v1/namespaces/default/configmaps/game-config
      uid: 30944725-d66e-11e5-8cd0-68f728db1985

2.7.3.2. ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ

--from-file ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --from-file ์˜ต์…˜์„ CLI์— ์—ฌ๋Ÿฌ ๋ฒˆ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

key=value ํ‘œํ˜„์‹์„ --from-file ์˜ต์…˜์— ์ „๋‹ฌํ•˜์—ฌ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ˜ํ…์ธ ์˜ ๊ตฌ์„ฑ ๋งต์— ์„ค์ •ํ•  ํ‚ค๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ oc create configmap game-config-3 --from-file=game-special-key=example-files/game.properties
์ฐธ๊ณ 

ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ UTF8์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ด ํ•„๋“œ์— ๋ฐฐ์น˜๋œ UTF8์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๊ฐ์ง€ํ•˜๊ณ  ํŒŒ์ผ์„ MIME๋กœ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ MIME ํŽ˜์ด๋กœ๋“œ๋Š” ๋ฐ์ดํ„ฐ ์†์ƒ ์—†์ด ๋””์ฝ”๋”ฉ๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๊ตฌ์„ฑ ๋งต์„ ์ฑ„์šฐ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ ์ ˆ์ฐจ์—์„œ๋Š” ๋‹ค์Œ ์˜ˆ์ œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. game.properties ๋ฐ ui.properties:

    $ cat example-files/game.properties

    ์ถœ๋ ฅ ์˜ˆ

    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30

    $ cat example-files/ui.properties

    ์ถœ๋ ฅ ์˜ˆ

    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice

ํ”„๋กœ์„ธ์Šค

  • ํŠน์ • ํŒŒ์ผ์„ ์ง€์ •ํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create configmap game-config-2 \
        --from-file=example-files/game.properties \
        --from-file=example-files/ui.properties
  • ํ‚ค-๊ฐ’ ์Œ์„ ์ง€์ •ํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create configmap game-config-3 \
        --from-file=game-special-key=example-files/game.properties

๊ฒ€์ฆ

  • ํŒŒ์ผ์—์„œ ํ‚ค ๊ฐ’์„ ํ™•์ธํ•˜๋ ค๋ฉด -o ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ oc get ๋ช…๋ น์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    $ oc get configmaps game-config-2 -o yaml

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: v1
    data:
      game.properties: |-
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
      ui.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
        how.nice.to.look=fairlyNice
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:52:05Z
      name: game-config-2
      namespace: default
      resourceVersion: "516"
      selflink: /api/v1/namespaces/default/configmaps/game-config-2
      uid: b4952dc3-d670-11e5-8cd0-68f728db1985

  • ํ‚ค-๊ฐ’ ์Œ์˜ ํ‚ค ๊ฐ’์„ ํ™•์ธํ•˜๋ ค๋ฉด -o ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ oc get ๋ช…๋ น์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    $ oc get configmaps game-config-3 -o yaml

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: v1
    data:
      game-special-key: |- 1
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:54:22Z
      name: game-config-3
      namespace: default
      resourceVersion: "530"
      selflink: /api/v1/namespaces/default/configmaps/game-config-3
      uid: 05f8da22-d671-11e5-8cd0-68f728db1985

    1
    ์ด์ „ ๋‹จ๊ณ„์—์„œ ์„ค์ •ํ•œ ํ‚ค์ž…๋‹ˆ๋‹ค.
2.7.3.3. ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์—์„œ ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ

๊ตฌ์„ฑ ๋งต์— ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

--from-literal ์˜ต์…˜์€ key=value ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ช…๋ น์ค„์—์„œ ์ง์ ‘ ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  • ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create configmap special-config \
        --from-literal=special.how=very \
        --from-literal=special.type=charm

๊ฒ€์ฆ

  • ํ‚ค ๊ฐ’์„ ๋ณด๋ ค๋ฉด -o ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ oc get ๋ช…๋ น์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    $ oc get configmaps special-config -o yaml

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: v1
    data:
      special.how: very
      special.type: charm
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T19:14:38Z
      name: special-config
      namespace: default
      resourceVersion: "651"
      selflink: /api/v1/namespaces/default/configmaps/special-config
      uid: dadce046-d673-11e5-8cd0-68f728db1985

2.7.4. ์‚ฌ์šฉ ์‚ฌ๋ก€: Pod์—์„œ ๊ตฌ์„ฑ ๋งต ์‚ฌ์šฉ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Pod์—์„œ ConfigMap ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

2.7.4.1. ๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฑ„์šฐ๊ธฐ

๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐœ๋ณ„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฑ„์šฐ๊ฑฐ๋‚˜ ์œ ํšจํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ํ˜•์„ฑํ•˜๋Š” ๋ชจ๋“  ํ‚ค์—์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๊ตฌ์„ฑ ๋งต์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋‘ ๊ฐœ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config 1
  namespace: default 2
data:
  special.how: very 3
  special.type: charm 4

1
๊ตฌ์„ฑ ๋งต์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2
๊ตฌ์„ฑ ๋งต์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋งต์€ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์˜ Pod์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3 4
์‚ฝ์ž…ํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config 1
  namespace: default
data:
  log_level: INFO 2

1
๊ตฌ์„ฑ ๋งต์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2
์‚ฝ์ž…ํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  • configMapKeyRef ์„น์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Pod์—์„œ ์ด ConfigMap์˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํŠน์ • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ์ƒ˜ํ”Œ Pod ์‚ฌ์–‘

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "env" ]
          env: 1
            - name: SPECIAL_LEVEL_KEY 2
              valueFrom:
                configMapKeyRef:
                  name: special-config 3
                  key: special.how 4
            - name: SPECIAL_TYPE_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config 5
                  key: special.type 6
                  optional: true 7
          envFrom: 8
            - configMapRef:
                name: env-config 9
      restartPolicy: Never

    1
    ConfigMap์—์„œ ์ง€์ •๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์Šคํƒ ์ž์ž…๋‹ˆ๋‹ค.
    2
    ํ‚ค ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๋Š” pod ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    3 5
    ํŠน์ • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋Œ์–ด์˜ฌ ConfigMap์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    4 6
    ConfigMap์—์„œ ๊ฐ€์ ธ์˜ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
    7
    ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ์ง€์ •๋œ ConfigMap ๋ฐ ํ‚ค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ Pod๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
    8
    ConfigMap์—์„œ ๋ชจ๋“  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์Šคํƒ ์ž์ž…๋‹ˆ๋‹ค.
    9
    ๋ชจ๋“  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ConfigMap์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ์ด Pod๊ฐ€ ์‹คํ–‰๋˜๋ฉด Pod ๋กœ๊ทธ์— ๋‹ค์Œ ์ถœ๋ ฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    SPECIAL_LEVEL_KEY=very
    log_level=INFO
์ฐธ๊ณ 

SPECIAL_TYPE_KEY=charm์€ ์˜ˆ์ œ ์ถœ๋ ฅ์— ๋‚˜์—ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. optional: true๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2.7.4.2. ๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ช…๋ น์— ๋Œ€ํ•œ ๋ช…๋ น์ค„ ์ธ์ˆ˜ ์„ค์ •

๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ๋Œ€์ฒด ๊ตฌ๋ฌธ $(VAR_NAME) ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ช…๋ น ๋˜๋Š” ์ธ์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๊ตฌ์„ฑ ๋งต์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

ํ”„๋กœ์„ธ์Šค

  • ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น์— ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๋ ค๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ $(VAR_NAME) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํŠน์ • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ์ƒ˜ํ”Œ Pod ์‚ฌ์–‘

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] 1
          env:
            - name: SPECIAL_LEVEL_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config
                  key: special.how
            - name: SPECIAL_TYPE_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config
                  key: special.type
      restartPolicy: Never

    1
    ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น์— ๊ฐ’์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

    ์ด Pod๊ฐ€ ์‹คํ–‰๋˜๋ฉด test-container ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” echo ๋ช…๋ น์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    very charm
2.7.4.3. ๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์— ์ฝ˜ํ…์ธ  ์‚ฝ์ž…

๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์— ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ConfigMap CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์˜ ์˜ˆ

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

ํ”„๋กœ์„ธ์Šค

๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์— ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ๋ฅจ์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ ํ‚ค๊ฐ€ ํŒŒ์ผ ์ด๋ฆ„์ด๊ณ  ํŒŒ์ผ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ํ‚ค์˜ ๊ฐ’์ธ ํŒŒ์ผ๋กœ ๋ณผ๋ฅจ์„ ์ฑ„์šฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "cat", "/etc/config/special.how" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: special-config 1
      restartPolicy: Never
    1
    ํ‚ค๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

    ์ด Pod๊ฐ€ ์‹คํ–‰๋˜๋ฉด cat ๋ช…๋ น์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    very
  • ๊ตฌ์„ฑ ๋งต ํ‚ค๊ฐ€ ์˜ˆ์ƒ๋œ ๋ณผ๋ฅจ ๋‚ด์˜ ๊ฒฝ๋กœ๋ฅผ ์ œ์–ดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "cat", "/etc/config/path/to/special-key" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: special-config
            items:
            - key: special.how
              path: path/to/special-key 1
      restartPolicy: Never
    1
    ๊ตฌ์„ฑ ๋งต ํ‚ค์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

    ์ด Pod๊ฐ€ ์‹คํ–‰๋˜๋ฉด cat ๋ช…๋ น์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    very

2.8. ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๊ฐ€ ์žˆ๋Š” ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค

์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ OpenShift Container Platform Pod์—์„œ ํŠน์ • ์žฅ์น˜ ์œ ํ˜•(GPU, InfiniBand ๋˜๋Š” ๋ฒค๋”๋ณ„ ์ดˆ๊ธฐํ™” ๋ฐ ์„ค์ •์ด ํ•„์š”ํ•œ ๊ธฐํƒ€ ์œ ์‚ฌํ•œ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.8.1. ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ดํ•ด

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

์ค‘์š”

OpenShift Container Platform์€ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ API๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐœ๋ณ„ ๊ณต๊ธ‰ ์—…์ฒด์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŠน์ • ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋…ธ๋“œ( kubelet์™ธ๋ถ€)์—์„œ ์‹คํ–‰๋˜๋Š” gRPC ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค์Œ ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ (RPC)์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

service DevicePlugin {
      // GetDevicePluginOptions returns options to be communicated with Device
      // Manager
      rpc GetDevicePluginOptions(Empty) returns (DevicePluginOptions) {}

      // ListAndWatch returns a stream of List of Devices
      // Whenever a Device state change or a Device disappears, ListAndWatch
      // returns the new list
      rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {}

      // Allocate is called during container creation so that the Device
      // Plug-in can run device specific operations and instruct Kubelet
      // of the steps to make the Device available in the container
      rpc Allocate(AllocateRequest) returns (AllocateResponse) {}

      // PreStartcontainer is called, if indicated by Device Plug-in during
      // registration phase, before each container start. Device plug-in
      // can run device specific operations such as reseting the device
      // before making devices available to the container
      rpc PreStartcontainer(PreStartcontainerRequest) returns (PreStartcontainerResponse) {}
}
์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜ˆ
์ฐธ๊ณ 

๊ฐ„ํŽธํ•œ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ฐธ์กฐ ๊ตฌํ˜„์„ ์œ„ํ•ด ์žฅ์น˜ ๊ด€๋ฆฌ์ž ์ฝ”๋“œ์— vendor/k8s.io/kubernetes/pkg/kubelet/cm/deviceplugin/device_plugin_stub.go ์˜ ์Šคํ… ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2.8.1.1. ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐฐํฌ์—๋Š” ๋ฐ๋ชฌ ์„ธํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์‹œ์ž‘ ์‹œ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋…ธ๋“œ์˜ /var/lib/kubelet/device-plugin/ ์— UNIX ๋„๋ฉ”์ธ ์†Œ์ผ“์„ ๋งŒ๋“ค์–ด ์žฅ์น˜ ๊ด€๋ฆฌ์ž์˜ RPC๋ฅผ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค, ํ˜ธ์ŠคํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋ฐ ์†Œ์ผ“ ์ƒ์„ฑ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ถŒํ•œ ์žˆ๋Š” ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐํฌ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์„ธ๋ถ€ ์ •๋ณด๋Š” ๊ฐ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌํ˜„์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.8.2. ์žฅ์น˜ ๊ด€๋ฆฌ์ž ์ดํ•ด

์žฅ์น˜ ๊ด€๋ฆฌ์ž๋Š” ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋ผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ๋…ธ๋“œ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์—…์ŠคํŠธ๋ฆผ ์ฝ”๋“œ ๋ณ€๊ฒฝ์—†์ด ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๋ฅผ ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

OpenShift Container Platform์€ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ API๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐœ๋ณ„ ๊ณต๊ธ‰ ์—…์ฒด์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์น˜ ๊ด€๋ฆฌ์ž๋Š” ์žฅ์น˜๋ฅผ ํ™•์žฅ ๋ฆฌ์†Œ์Šค(Extended Resources)์œผ๋กœ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž pod๋Š” ๋‹ค๋ฅธ ํ™•์žฅ ๋ฆฌ์†Œ์Šค ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋™์ผํ•œ ์ œํ•œ/์š”์ฒญ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ์น˜ ๊ด€๋ฆฌ์ž์— ์˜ํ•ด ๊ณต๊ฐœ๋œ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘์‹œ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ /var/lib/kubelet/device-plugins/kubelet.sock ์—์„œ Register ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์žฅ์น˜ ๊ด€๋ฆฌ์ž์— ์ง์ ‘ ๋“ฑ๋กํ•˜๊ณ  ์žฅ์น˜ ๊ด€๋ฆฌ์ž ์š”์ฒญ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด /var/lib/kubelet/device-plugins/<plugin>.sock ์—์„œ gRPC ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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

์ƒˆ๋กœ์šด pod ์Šน์ธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ Kubelet์€ ์žฅ์น˜ ํ• ๋‹น์„ ์œ„ํ•ด ์š”์ฒญ๋œ Extended Resources๋ฅผ ์žฅ์น˜ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์žฅ์น˜ ๊ด€๋ฆฌ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์กด์žฌํ•˜๊ณ  ๋กœ์ปฌ ์บ์‹œ๋ณ„๋กœ ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ์žฅ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Allocate RPC๊ฐ€ ํŠน์ • ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋“œ๋ผ์ด๋ฒ„ ์„ค์น˜, ์žฅ์น˜ ์ดˆ๊ธฐํ™” ๋ฐ ์žฅ์น˜ ์žฌ์„ค์ •๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์žฅ์น˜ ๊ด€๋ จ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๊ตฌํ˜„๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

2.8.3. ์žฅ์น˜ ๊ด€๋ฆฌ์ž ํ™œ์„ฑํ™”

์žฅ์น˜ ๊ด€๋ฆฌ์ž๋Š” ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์—…์ŠคํŠธ๋ฆผ ์ฝ”๋“œ ๋ณ€๊ฒฝ์—†์ด ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์น˜ ๊ด€๋ฆฌ์ž๋Š” ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋ผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ๋…ธ๋“œ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๊ตฌ์„ฑํ•  ๋…ธ๋“œ ์œ ํ˜•์˜ ์ •์  MachineConfigPool CRD์™€ ์—ฐ๊ด€๋œ ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. Machine config๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค:

      # oc describe machineconfig <name>

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      # oc describe machineconfig 00-worker

      ์ถœ๋ ฅ ์˜ˆ

      Name:         00-worker
      Namespace:
      Labels:       machineconfiguration.openshift.io/role=worker 1

      1
      ์žฅ์น˜ ๊ด€๋ฆฌ์ž์— ํ•„์š”ํ•œ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค (CR)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ์žฅ์น˜ ๊ด€๋ฆฌ์ž CR์˜ ์„ค์ • ์˜ˆ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: devicemgr 1
    spec:
      machineConfigPoolSelector:
        matchLabels:
           machineconfiguration.openshift.io: devicemgr 2
      kubeletConfig:
        feature-gates:
          - DevicePlugins=true 3

    1
    CR์— ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    Machine Config Pool์—์„œ ๋ผ๋ฒจ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    3
    DevicePlugins๋ฅผ 'true'๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ์žฅ์น˜ ๊ด€๋ฆฌ์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    $ oc create -f devicemgr.yaml

    ์ถœ๋ ฅ ์˜ˆ

    kubeletconfig.machineconfiguration.openshift.io/devicemgr created

  3. ๋…ธ๋“œ์—์„œ /var/lib/kubelet/device-plugins/kubelet.sock์ด ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์žฅ์น˜ ๊ด€๋ฆฌ์ž๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์žฅ์น˜ ๊ด€๋ฆฌ์ž์˜ gRPC ์„œ๋ฒ„๊ฐ€ ์ƒˆ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก์„ ์ˆ˜์‹ ํ•˜๋Š” UNIX ๋„๋ฉ”์ธ ์†Œ์ผ“์ž…๋‹ˆ๋‹ค. ์ด ์†Œ์ผ“ ํŒŒ์ผ์€ ์žฅ์น˜ ๊ด€๋ฆฌ์ž๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋งŒ Kubelet์„ ์‹œ์ž‘ํ•  ๋•Œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

2.9. Pod ์˜ˆ์•ฝ ๊ฒฐ์ •์— Pod ์šฐ์„ ์ˆœ์œ„ ํฌํ•จ

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

์šฐ์„ ์ˆœ์œ„ ๋ฐ ์„ ์  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Pod์˜ ์ƒ๋Œ€์  ๊ฐ€์ค‘์น˜๋ฅผ ์ •์˜ํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Pod ์‚ฌ์–‘์˜ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์˜ˆ์•ฝ์— ํ•ด๋‹น ๊ฐ’์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

2.9.1. Pod ์šฐ์„ ์ˆœ์œ„ ์ดํ•ด

Pod ์šฐ์„ ์ˆœ์œ„ ๋ฐ ์„ ์  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ๋ณด๋ฅ˜ ์ค‘์ธ Pod๋ฅผ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ •๋ ฌํ•˜๊ณ , ๋ณด๋ฅ˜ ์ค‘์ธ Pod๋Š” ์˜ˆ์•ฝ ํ์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋‚ฎ์€ ๋‹ค๋ฅธ ๋Œ€๊ธฐ ์ค‘์ธ Pod๋ณด๋‹ค ์•ž์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์˜ˆ์•ฝ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ Pod๊ฐ€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ์˜ˆ์•ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ๋‹ค๋ฅธ Pod๋ฅผ ๊ณ„์† ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

2.9.1.1. Pod ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค

๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์˜ค๋ธŒ์ ํŠธ๋กœ์„œ ์ด๋ฆ„์—์„œ ์šฐ์„ ์ˆœ์œ„ ์ •์ˆ˜ ๊ฐ’์œผ๋กœ์˜ ๋งคํ•‘์„ ์ •์˜ํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ Pod์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’์ด ํด์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ์—๋Š” 1000000000(10์–ต)๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ 32๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์ ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์ค‘์š”ํ•œ Pod์˜ ๊ฒฝ์šฐ 10์–ต๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ OpenShift Container Platform์—๋Š” ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ Pod์˜ ์˜ˆ์•ฝ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ 2๊ฐœ ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc get priorityclasses

์ถœ๋ ฅ ์˜ˆ

NAME                      VALUE        GLOBAL-DEFAULT   AGE
system-node-critical      2000001000   false            72m
system-cluster-critical   2000000000   false            72m
openshift-user-critical   1000000000   false            3d13h
cluster-logging           1000000      false            29s

  • system-node-critical - ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค์˜ ๊ฐ’์€ 2000001000์ด๋ฉฐ ๋…ธ๋“œ์—์„œ ์ œ๊ฑฐํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๋ชจ๋“  Pod์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” Pod์˜ ์˜ˆ๋กœ๋Š” sdn-ovs, sdn ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋‹ค์ˆ˜์˜ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ system-node-critical ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • master-api
    • master-controller
    • master-etcd
    • sdn
    • sdn-ovs
    • sync
  • system-cluster-critical - ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค์˜ ๊ฐ’์€ 2000000000(10์–ต)์ด๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ์— ์ค‘์š”ํ•œ Pod์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” Pod๋Š” ํŠน์ • ์ƒํ™ฉ์—์„œ ๋…ธ๋“œ์—์„œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด system-node-critical ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•œ Pod๊ฐ€ ์šฐ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋Š” ์˜ˆ์•ฝ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Pod์˜ ์˜ˆ๋กœ๋Š” fluentd, Descheduler์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌ์„ฑ ์š”์†Œ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋‹ค์ˆ˜์˜ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ system-cluster-critical ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • fluentd
    • metrics-server
    • Descheduler
  • OpenShift-user-critical - ๋ฆฌ์†Œ์Šค ์†Œ๋น„๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์—†๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ๋™์ž‘์ด ์—†๋Š” ์ค‘์š”ํ•œ Pod์™€ ํ•จ๊ป˜ priorityClassName ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. openshift-monitoring ๋ฐ openshift-user-workload-monitoring ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ Prometheus Pod๋Š” openshift-user-critical priorityClassName ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์›Œํฌ๋กœ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์ฒซ ๋ฒˆ์งธ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋กœ ์‹œ์Šคํ…œ์ด ์ค‘์š”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ชจ๋‹ˆํ„ฐ๋ง์—์„œ ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋…ธ๋“œ๊ฐ€ ์ด๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ์šธ ์šฐ์„  ์ˆœ์œ„๋กœ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ์ค‘์š”ํ•œ ๋…ธ๋“œ๊ฐ€ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์›Œํฌ๋กœ๋“œ๋ฅผ ๋งŽ์ด ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • cluster-logging - ์ด ์šฐ์„ ์ˆœ์œ„๋Š” Fluentd์—์„œ Fluentd Pod๊ฐ€ ๋‹ค๋ฅธ ์•ฑ๋ณด๋‹ค ๋จผ์ € ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋˜๋„๋ก ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
2.9.1.2. Pod ์šฐ์„ ์ˆœ์œ„ ์ด๋ฆ„

์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ํ•œ ๊ฐœ ์ด์ƒ ์žˆ์œผ๋ฉด Pod ์‚ฌ์–‘์—์„œ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ์Šน์ธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค ์ด๋ฆ„ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ˆ˜ ๊ฐ’์œผ๋กœ ๋œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์ง€์ •๋œ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Pod๊ฐ€ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

2.9.2. Pod ์„ ์  ์ดํ•ด

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

์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋…ธ๋“œ์—์„œ Pod๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ์„ ์ ํ•˜๋ฉด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ Pod ์‚ฌ์–‘์˜ nominatedNodeName ํ•„๋“œ๊ฐ€ nodename ํ•„๋“œ์™€ ํ•จ๊ป˜ ๋…ธ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” nominatedNodeName ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod์šฉ์œผ๋กœ ์˜ˆ์•ฝ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ„์† ์ถ”์ ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„ ์ ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod๋ฅผ ์„ ์ ํ•œ ํ›„์—๋Š” Pod์˜ ์ •์ƒ ์ข…๋ฃŒ ๊ธฐ๊ฐ„์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Pod ์‚ฌ์–‘์˜ nominatedNodeName ํ•„๋“œ ๋ฐ nodeName ํ•„๋“œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์„ ์ ์„ ์ˆ˜ํ–‰ํ•ด๋„ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod๊ฐ€ ๋…ธ๋“œ์—์„œ ๋ชจ๋‘ ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod์˜ ์ผ๋ถ€๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋ณด๋ฅ˜ ์ค‘์ธ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋…ธ๋“œ์—์„œ ๋ณด๋ฅ˜ ์ค‘์ธ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ๋…ธ๋“œ์—์„œ Pod ์„ ์ ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

2.9.2.1. ๋น„ ์„ ์  ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค(๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ)

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

๋น„ ์„ ์  Pod๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋‹ค๋ฅธ Pod์—์„œ ๊ณ„์† ์„ ์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.9.2.2. Pod ์„ ์  ๋ฐ ๊ธฐํƒ€ ์Šค์ผ€์ค„๋Ÿฌ ์„ค์ •

Pod ์šฐ์„ ์ˆœ์œ„ ๋ฐ ์„ ์  ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์Šค์ผ€์ค„๋Ÿฌ ์„ค์ •์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

Pod ์šฐ์„ ์ˆœ์œ„ ๋ฐ Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ
Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์€ ๋™์‹œ์— ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜ ๋˜๋Š” ๋ฐฑ๋ถ„์œจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์ง€์ •ํ•˜๋ฉด Pod๋ฅผ ์ตœ์ ์˜ ๋…ธ๋ ฅ ์ˆ˜์ค€์—์„œ ์„ ์ ํ•  ๋•Œ OpenShift Container Platform์—์„œ ํ•ด๋‹น ์˜ˆ์‚ฐ์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๊ณ  Pod๋ฅผ ์„ ์ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Pod๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๊ด€๊ณ„์—†์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod๋ฅผ ์„ ์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Pod ์šฐ์„ ์ˆœ์œ„ ๋ฐ Pod ์œ ์‚ฌ์„ฑ
Pod ์œ ์‚ฌ์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ๋™์ผํ•œ ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋‹ค๋ฅธ Pod์™€ ๊ฐ™์€ ๋…ธ๋“œ์—์„œ ์ƒˆ Pod๋ฅผ ์˜ˆ์•ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ Pod์™€ ๋ณด๋ฅ˜ ์ค‘์ธ Pod์— Pod ๊ฐ„ ์œ ์‚ฌ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์„ ํ˜ธ๋„ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๊ณ  ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod๋ฅผ ์„ ์ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋ณด๋ฅ˜ ์ค‘์ธ Pod๋ฅผ ์˜ˆ์•ฝํ•  ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์ ์ ˆํ•œ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๊ณ  ๋ณด๋ฅ˜ ์ค‘์ธ Pod๊ฐ€ ์˜ˆ์•ฝ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™์€ Pod๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์œ ์‚ฌ์„ฑ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2.9.2.3. ์„ ์ ๋œ Pod์˜ ์ •์ƒ ์ข…๋ฃŒ

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

์ด ๊ฐ„๊ฒฉ์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋ฉด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod์˜ ์ •์ƒ ์ข…๋ฃŒ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค.

2.9.3. ์šฐ์„ ์ˆœ์œ„ ๋ฐ ์„ ์  ๊ตฌ์„ฑ

Pod ์‚ฌ์–‘์— priorityClassName ์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Pod๋ฅผ ์šฐ์„ ์ˆœ์œ„์— ์—ฐ๊ฒฐํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ๋ฐ ์„ ์ ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ์•ฝ๋œ ๊ธฐ์กด Pod์— ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

์šฐ์„ ์ˆœ์œ„ ๋ฐ ์„ ์ ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ํ•œ ๊ฐœ ์ด์ƒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: scheduling.k8s.io/v1
      kind: PriorityClass
      metadata:
        name: high-priority 1
      value: 1000000 2
      preemptionPolicy: PreemptLowerPriority 3
      globalDefault: false 4
      description: "This priority class should be used for XYZ service pods only." 5
      1
      ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      2
      ์˜ค๋ธŒ์ ํŠธ์˜ ์šฐ์„ ์ˆœ์œ„ ๊ฐ’์ž…๋‹ˆ๋‹ค.
      3
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ์„ ์ ์ธ์ง€ ๋˜๋Š” ์„ ์ ๋˜์ง€ ์•Š๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ ์  ์ •์ฑ…์˜ ๊ธฐ๋ณธ๊ฐ’์€ PreemptLowerPriority๋กœ, ํ•ด๋‹น ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค์˜ Pod์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ Pod๋ฅผ ์„ ์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์  ์ •์ฑ…์ด Never๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค์˜ Pod๋Š” ์„ ์ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      4
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ Pod์— ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ false์ž…๋‹ˆ๋‹ค. globalDefault๊ฐ€ true๋กœ ์„ค์ •๋œ ํ•˜๋‚˜์˜ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋งŒ ํด๋Ÿฌ์Šคํ„ฐ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. globalDefault:true๊ฐ€ ์„ค์ •๋œ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค ์ด๋ฆ„์ด ์—†๋Š” Pod์˜ ์šฐ์„ ์ˆœ์œ„๋Š” 0์ž…๋‹ˆ๋‹ค. globalDefault:true๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ์ƒ์„ฑ๋œ Pod์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๊ธฐ์กด Pod์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      5
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” Pod๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    2. ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml
  2. ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํฌํ•จํ•  Pod ์‚ฌ์–‘์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
        labels:
          env: test
      spec:
        containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
        priorityClassName: high-priority 1
      1
      ์ด Pod์— ์‚ฌ์šฉํ•  ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

      Pod ๊ตฌ์„ฑ ๋˜๋Š” Pod ํ…œํ”Œ๋ฆฟ์— ์šฐ์„ ์ˆœ์œ„ ์ด๋ฆ„์„ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.10. ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์— Pod ๋ฐฐ์น˜

๋…ธ๋“œ ์„ ํƒ๊ธฐ๋Š” ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋งต์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทœ์น™์€ ๋…ธ๋“œ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ๋ฒจ๊ณผ Pod์— ์ง€์ •๋œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Pod๋ฅผ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด Pod์— ๋…ธ๋“œ์˜ ๋ผ๋ฒจ๋กœ ํ‘œ์‹œ๋œ ํ‚ค-๊ฐ’ ์Œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ Pod ๊ตฌ์„ฑ์—์„œ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๋ฐ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์˜ ์ค‘์š” ๊ณ ๋ ค ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2.10.1. ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฐฐ์น˜ ์ œ์–ด

Pod์˜ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ๋…ธ๋“œ์˜ ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๊ฐ€ ์˜ˆ์•ฝ๋˜๋Š” ์œ„์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด OpenShift Container Platform์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ํฌํ•จ๋œ ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ, ๋จธ์‹  ์„ธํŠธ ๋˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ์„ธํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹ ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹ ์ด ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์— ์ถ”๊ฐ€๋œ ๋ผ๋ฒจ์ด ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ReplicaSet ์˜ค๋ธŒ์ ํŠธ, DaemonSet ์˜ค๋ธŒ์ ํŠธ, StatefulSet ์˜ค๋ธŒ์ ํŠธ, Deployment ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” DeploymentConfig ์˜ค๋ธŒ์ ํŠธ์™€ ๊ฐ™์ด ํ•ด๋‹น Pod์˜ ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ ์•„๋ž˜์˜ ๊ธฐ์กด Pod๋Š” ๋ผ๋ฒจ์ด ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ์—์„œ ์žฌ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ Pod ์‚ฌ์–‘์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod์— ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ์‚ญ์ œํ•˜๊ณ  Pod ์‚ฌ์–‘์„ ํŽธ์ง‘ํ•˜๊ณ  Pod๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ์•ฝ๋œ ๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํ•ด๋‹น Pod์˜ ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด router-default-66d5cf9464-m2g75 Pod๋Š” router-default-66d5cf9464 ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

$ oc describe pod router-default-66d5cf9464-7pwkc

์ถœ๋ ฅ ์˜ˆ

kind: Pod
apiVersion: v1
metadata:
#...
Name:               router-default-66d5cf9464-7pwkc
Namespace:          openshift-ingress
# ...
Controlled By:      ReplicaSet/router-default-66d5cf9464
# ...

์›น ์ฝ˜์†”์—์„œ Pod YAML์˜ ownerReferences ์•„๋ž˜์— ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: router-default-66d5cf9464-7pwkc
# ...
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: router-default-66d5cf9464
      uid: d81dd094-da26-11e9-a48a-128e7edf0312
      controller: true
      blockOwnerDeletion: true
# ...

ํ”„๋กœ์„ธ์Šค

  1. ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ํŽธ์ง‘ํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋จธ์‹  ์„ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด MachineSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      1. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ MachineSet ์˜ค๋ธŒ์ ํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc patch MachineSet abc612-msrtw-worker-us-east-1c  --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        ์ž‘์€ ์ •๋ณด

        ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋จธ์‹  ์„ธํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: xf2bd-infra-us-east-2a
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
        #...
      2. oc edit ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ๋ฒจ์ด MachineSet ์˜ค๋ธŒ์ ํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc edit MachineSet abc612-msrtw-worker-us-east-1c -n openshift-machine-api

        MachineSet ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        
        # ...
        
        spec:
        # ...
          template:
            metadata:
        # ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node
        # ...

    • ๋ผ๋ฒจ์„ ๋…ธ๋“œ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      1. ๋…ธ๋“œ์˜ Node ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

        $ oc label nodes <name> <key>=<value>

        ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

        $ oc label nodes ip-10-0-142-25.ec2.internal type=user-node region=east
        ์ž‘์€ ์ •๋ณด

        ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

        kind: Node
        apiVersion: v1
        metadata:
          name: hello-node-6fbccf8d9
          labels:
            type: "user-node"
            region: "east"
        #...
      2. ๋ผ๋ฒจ์ด ๋…ธ๋“œ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        $ oc get nodes -l type=user-node,region=east

        ์ถœ๋ ฅ ์˜ˆ

        NAME                          STATUS   ROLES    AGE   VERSION
        ip-10-0-142-25.ec2.internal   Ready    worker   17m   v1.23.0

  2. Pod์— ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ธฐ์กด ๋ฐ ํ–ฅํ›„ Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Pod์˜ ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      ๋ผ๋ฒจ์ด ์žˆ๋Š” ReplicaSet ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

      kind: ReplicaSet
      apiVersion: apps/v1
      metadata:
        name: hello-node-6fbccf8d9
      # ...
      spec:
      # ...
        template:
          metadata:
            creationTimestamp: null
            labels:
              ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
              pod-template-hash: 66d5cf9464
          spec:
            nodeSelector:
              kubernetes.io/os: linux
              node-role.kubernetes.io/worker: ''
              type: user-node 1
      #...

      1
      ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ํŠน์ • ์ƒˆ Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์„ ํƒ๊ธฐ๋ฅผ Pod ์˜ค๋ธŒ์ ํŠธ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” Pod ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

      apiVersion: v1
      kind: Pod
      metadata:
        name: hello-node-6fbccf8d9
      #...
      spec:
        nodeSelector:
          region: east
          type: user-node
      #...

      ์ฐธ๊ณ 

      ์˜ˆ์•ฝ๋œ ๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

3์žฅ. Custom Metrics Autoscaler Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์ž๋™ ์Šค์ผ€์ผ๋ง

3.1. ์‚ฌ์šฉ์ž ์ •์˜ Metrics Autoscaler Operator ๊ฐœ์š”

๊ฐœ๋ฐœ์ž๋Š” Red Hat OpenShift์— Custom Metrics Autoscaler Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform์—์„œ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ, ์ƒํƒœ ์ €์žฅ ์„ธํŠธ, ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ๋˜๋Š” ์ž‘์—…์˜ Pod ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Custom Metrics Autoscaler Operator๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ(KEDA)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์„ ํƒ์  Operator๋กœ, Pod ๋ฉ”ํŠธ๋ฆญ ์ด์™ธ์˜ ์ถ”๊ฐ€ ๋ฉ”ํŠธ๋ฆญ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ํ˜„์žฌ Prometheus, CPU, ๋ฉ”๋ชจ๋ฆฌ ๋ฐ Apache Kafka ๋ฉ”ํŠธ๋ฆญ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Custom Metrics Autoscaler Operator๋Š” ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์™ธ๋ถ€ ์ง€ํ‘œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Pod๋ฅผ ํ™•์žฅ ๋ฐ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋‹ค๋ฅธ ํ™•์žฅ ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฐ ๋ฉ”ํŠธ๋ฆญ์˜ ์†Œ์Šค์ธ scalers๋ผ๊ณ ๋„ ํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ๋ฉ”ํŠธ๋ฆญ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ๋ฉ”ํŠธ๋ฆญ์„ OpenShift Container Platform์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์–‘์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์‹ค์ œ ์Šค์ผ€์ผ๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์Šค์ผ€์ผ๋ง ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค(CR)์ธ ScaledObject ๋˜๋Š” ScaledJob ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅํ•  ๋ฐฐํฌ ๋˜๋Š” ์ž‘์—…, ์Šค์ผ€์ผ๋งํ•  ์ง€ํ‘œ์˜ ์†Œ์Šค(trigger) ๋ฐ ํ—ˆ์šฉ๋œ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜์™€ ๊ฐ™์€ ๊ธฐํƒ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์Šค์ผ€์ผ๋งํ•  ๊ฐ ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•ด ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ์Šค์ผ€์ผ๋ง๋œ ์ž‘์—…์„ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™์ผํ•œ ์›Œํฌ๋กœ๋“œ์—์„œ ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ์Šค์ผ€์ผ๋ง๋œ ์ž‘์—… ๋ฐ HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

HPA์™€ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” 0์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ CR์—์„œ minReplicaCount ๊ฐ’์„ 0 ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ณต์ œ๋ณธ์ด 0๊ฐœ์—์„œ ๋ณต์ œ๋ณธ ์ˆ˜๋กœ ๋˜๋Š” ์ตœ๋Œ€ 0๊ฐœ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์„ฑํ™” ๋‹จ๊ณ„๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ 1๊ฐœ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ํ™•์žฅํ•œ ํ›„ HPA๋Š” ์Šค์ผ€์ผ๋ง์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์Šค์ผ€์ผ๋ง ๋‹จ๊ณ„๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

ํ™œ์„ฑํ™” ๊ฐ’์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ์ •์— ๋”ฐ๋ผ ์Šค์ผ€์ผ๋ง ๊ฐ’๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž„๊ณ„๊ฐ’ ์ด 10 ์œผ๋กœ ์„ค์ •๋˜๊ณ  ํ™œ์„ฑํ™”Threshold ๊ฐ€ 50 ๊ฐœ์ด๋ฉด ๋ฉ”ํŠธ๋ฆญ์—์„œ 40 ๊ฐœ๋ฅผ ๋ณด๊ณ ํ•˜๋ฉด scaler๊ฐ€ ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ HPA์— 4๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„ Pod๊ฐ€ 0์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์˜ Pod ์ˆ˜๋ฅผ ๊ฒ€ํ† ํ•˜๊ฑฐ๋‚˜ Custom Metrics Autoscaler Operator ๋กœ๊ทธ์—์„œ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์ž๋™ ์Šค์ผ€์ผ๋ง์ด ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Successfully set ScaleTarget replica count
Successfully updated ScaleTarget

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

3.2. ์‚ฌ์šฉ์ž ์ •์˜ Metrics Autoscaler Operator ๋ฆด๋ฆฌ์Šค ์ •๋ณด

Custom Metrics Autoscaler Operator for Red Hat OpenShift์˜ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ, ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ ๋ฐ ์•Œ๋ ค์ง„ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Custom Metrics Autoscaler Operator๋Š” Kubernetes ๊ธฐ๋ฐ˜ Event driven Autoscaler(KEDA)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ OpenShift Container Platform HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ) ์ƒ๋‹จ์— ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Custom Metrics Autoscaler Operator for Red Hat OpenShift๋Š” ํ•ต์‹ฌ OpenShift Container Platform๊ณผ ๋ณ„๋„์˜ ๋ฆด๋ฆฌ์Šค ์‚ฌ์ดํด๋กœ ์„ค์น˜ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Red Hat OpenShift Container Platform ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ •์ฑ…์€ ๋ฆด๋ฆฌ์Šค ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

3.2.1. ์ง€์›๋˜๋Š” ๋ฒ„์ „

๋‹ค์Œ ํ‘œ๋Š” ๊ฐ OpenShift Container Platform ๋ฒ„์ „์— ๋Œ€ํ•œ Custom Metrics Autoscaler Operator ๋ฒ„์ „์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „OpenShift Container Platform ๋ฒ„์ „์ •์‹ ์ถœ์‹œ์ผ (GA)

2.10.1-267

4.13

์ •์‹ ์ถœ์‹œ์ผ (GA)

2.10.1-267

4.12

์ •์‹ ์ถœ์‹œ์ผ (GA)

2.10.1-267

4.11

์ •์‹ ์ถœ์‹œ์ผ (GA)

2.10.1-267

4.10

์ •์‹ ์ถœ์‹œ์ผ (GA)

3.2.2. ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ Autoscaler Operator 2.10.1-267 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

์ด๋ฒˆ Custom Metrics Autoscaler Operator 2.10.1-267 ๋ฆด๋ฆฌ์Šค๋Š” OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Operator๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Custom Metrics Autoscaler Operator 2.10.1-267์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” RHBA-2023:4089 ์—์„œ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

์ด ๋ฒ„์ „์˜ Custom Metrics Autoscaler Operator๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์ „์— ์ด์ „์— ์„ค์น˜ํ•œ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๋ฒ„์ „ ๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์› KEDA ๋ฒ„์ „์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

3.2.2.1. ๋ฒ„๊ทธ ์ˆ˜์ •
  • ์ด์ „์—๋Š” custom-metrics-autoscaler ๋ฐ custom-metrics-autoscaler-adapter ์ด๋ฏธ์ง€์— ์‹œ๊ฐ„๋Œ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‹œ๊ฐ„๋Œ€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— cron ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ ๊ฐœ์ฒด๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ˆ˜์ •์œผ๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œ์— ์‹œ๊ฐ„๋Œ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ cron ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํฌํ•จํ•˜๋Š” ํ™•์žฅ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (OCPBUGS-15264)
  • ์ด์ „์—๋Š” Custom Metrics Autoscaler Operator์—์„œ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋ฒ”์œ„ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ๊ด€๋ฆฌ ์˜ค๋ธŒ์ ํŠธ์˜ ์†Œ์œ ๊ถŒ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Custom Metrics Autoscaler Operator์—์„œ API ์„œ๋ฒ„๊ฐ€ ๋˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด kube-system ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ˆ˜์ •์„ ํ†ตํ•ด Custom Metrics Autoscaler Operator๋Š” ownerReference ํ•„๋“œ๋ฅผ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋ฒ”์œ„ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ค๋ธŒ์ ํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด์ œ ์˜ค๋ฅ˜ ์—†์ด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. (OCPBUGS-15038)
  • ์ด์ „์—๋Š” Custom Metrics Autoscaler Operator์—์„œ ownerReferences ํ•„๋“œ๋ฅผ openshift-keda ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ธฐ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ˜ผ๋™์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ˆ˜์ •์œผ๋กœ Custom Metrics Autoscaler Operator๋Š” ownerReference ํ•„๋“œ๋ฅผ openshift-keda ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ openshift-keda ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋” ์ด์ƒ ๋ถˆํ•„์š”ํ•œ ownerReference ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (OCPBUGS-15293)
  • ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” Pod ID ์ด์™ธ์˜ ์ธ์ฆ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑ๋œ Prometheus ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•œ ํ›„ podIdentity ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ none ์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์Šค์ผ€์ผ๋งํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ˆ˜์ •์œผ๋กœ OpenShift์˜ Custom Metrics Autoscaler์—์„œ ์ด์ œ none Pod ID ๊ณต๊ธ‰์ž ์œ ํ˜•์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ Prometheus ํŠธ๋ฆฌ๊ฑฐ๋Š” Pod ID ์ด์™ธ์˜ ์ธ์ฆ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ณ  podIdentity ๋งค๊ฐœ๋ณ€์ˆ˜ sset์„ none ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์Šค์ผ€์ผ๋งํ•ฉ๋‹ˆ๋‹ค. (OCPBUGS-15274)

3.2.3. ์‚ฌ์šฉ์ž ์ •์˜ Metrics Autoscaler Operator 2.10.1 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

์ด๋ฒˆ Custom Metrics Autoscaler Operator 2.10.1 ๋ฆด๋ฆฌ์Šค๋Š” OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Operator๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Custom Metrics Autoscaler Operator 2.10.1์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” RHEA-2023:3199 ์—์„œ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

์ด ๋ฒ„์ „์˜ Custom Metrics Autoscaler Operator๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์ „์— ์ด์ „์— ์„ค์น˜ํ•œ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๋ฒ„์ „ ๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์› KEDA ๋ฒ„์ „์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

3.2.3.1. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ
3.2.3.1.1. ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ Autoscaler Operator ์ผ๋ฐ˜ ๊ฐ€์šฉ์„ฑ

Custom Metrics Autoscaler Operator๋Š” ์ด์ œ ์ผ๋ฐ˜์ ์œผ๋กœ Custom Metrics Autoscaler Operator ๋ฒ„์ „ 2.10.1์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

ํ™•์žฅ๋œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์€ Red Hat ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค ์ˆ˜์ค€ ๊ณ„์•ฝ(SLA)์—์„œ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์™„์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ–ฅํ›„ ์ œํ’ˆ ๊ธฐ๋Šฅ์„ ์กฐ๊ธฐ์— ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๊ณ ๊ฐ์ด ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Red Hat ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์˜ ์ง€์› ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์ง€์› ๋ฒ”์œ„๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

3.2.3.1.2. ์„ฑ๋Šฅ ์ง€ํ‘œ

์ด์ œ PromQL(Prometheus Query Language)์„ ์‚ฌ์šฉํ•˜์—ฌ Custom Metrics Autoscaler Operator์—์„œ ์ง€ํ‘œ๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.3.1.3. ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋ง ์ผ์‹œ ์ค‘์ง€

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

3.2.3.1.4. ํ™•์žฅ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ณต์ œ๋ณธ ๋Œ€์ฒด

์ด์ œ ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์†Œ์Šค์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ๋Œ€์ฒดํ•  ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.3.1.5. ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ HPA ์ด๋ฆ„ ์ง€์ •

ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.3.1.6. ํ™œ์„ฑํ™” ๋ฐ ์Šค์ผ€์ผ๋ง ์ž„๊ณ„๊ฐ’

HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋Š” ๋ณต์ œ๋ณธ 0๊ฐœ๋กœ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Custom Metrics Autoscaler Operator๋Š” ํ•ด๋‹น ์Šค์ผ€์ผ๋ง์„ ์ˆ˜ํ–‰ํ•˜์—ฌ HPA์—์„œ ์Šค์ผ€์ผ๋ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ HPA์—์„œ ๋ณต์ œ๋ณธ ์ˆ˜์— ๋”ฐ๋ผ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์ธ์ˆ˜ํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ™•์žฅ ์ •์ฑ…์„ ํ†ตํ•ด ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.4. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ Operator 2.8.2-174 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

์ด๋ฒˆ Custom Metrics Autoscaler Operator 2.8.2-174 ๋ฆด๋ฆฌ์Šค๋Š” OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Operator๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Custom Metrics Autoscaler Operator 2.8.2-174์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” RHEA-2023:1683 ์—์„œ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

Custom Metrics Autoscaler Operator ๋ฒ„์ „ 2.8.2-174๋Š” ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

3.2.4.1. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ
3.2.4.1.1. Operator ์—…๊ทธ๋ ˆ์ด๋“œ ์ง€์›

์ด์ œ ์ด์ „ ๋ฒ„์ „์˜ Custom Metrics Autoscaler Operator์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Operator ์—…๊ทธ๋ ˆ์ด๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ "ECDHE ๋ฆฌ์†Œ์Šค"์˜ "Operator ์—…๋ฐ์ดํŠธ ์ฑ„๋„ ๋ณ€๊ฒฝ"์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

3.2.4.1.2. must-gather ์ง€์›

OpenShift Container Platform must-gather ํˆด์„ ์‚ฌ์šฉํ•˜์—ฌ Custom Metrics Autoscaler Operator ๋ฐ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์™€ ํ•จ๊ป˜ must-gather ํˆด์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ Operator์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ "ECDHE ๋ฆฌ์†Œ์Šค"์˜ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

3.2.5. ์‚ฌ์šฉ์ž ์ •์˜ Metrics Autoscaler Operator 2.8.2 ๋ฆด๋ฆฌ์Šค ์ •๋ณด

์ด๋ฒˆ Custom Metrics Autoscaler Operator 2.8.2 ๋ฆด๋ฆฌ์Šค๋Š” OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Operator๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Custom Metrics Autoscaler Operator 2.8.2์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” RHSA-2023:1042 ์—์„œ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

Custom Metrics Autoscaler Operator ๋ฒ„์ „ 2.8.2๋Š” ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

3.2.5.1. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ
3.2.5.1.1. ๊ฐ์‚ฌ ๋กœ๊น…

Custom Metrics Autoscaler Operator ๋ฐ ๊ด€๋ จ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ๋กœ๊ทธ๋Š” ์‹œ์Šคํ…œ์˜ ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž, ๊ด€๋ฆฌ์ž ๋˜๋Š” ๊ธฐํƒ€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‹œ์Šคํ…œ์— ์˜ํ–ฅ์„ ์ค€ ํ™œ๋™ ์ˆœ์„œ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ณด์•ˆ ๊ด€๋ จ ๋ ˆ์ฝ”๋“œ ์„ธํŠธ์ž…๋‹ˆ๋‹ค.

3.2.5.1.2. Apache Kafka ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์žฅ

์ด์ œ KEDA Apache kafka ํŠธ๋ฆฌ๊ฑฐ/scaler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Apache Kafka ์ฃผ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.5.1.3. CPU ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ผ€์ผ๋ง

์ด์ œ KEDA CPU ํŠธ๋ฆฌ๊ฑฐ/scaler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CPU ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.5.1.4. ๋ฉ”๋ชจ๋ฆฌ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ผ€์ผ๋ง

์ด์ œ KEDA ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ฆฌ๊ฑฐ/scaler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ฉ”ํŠธ๋ฆญ์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.3. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์„ค์น˜

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Custom Metrics Autoscaler Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ ์‹œ ๋‹ค์Œ 5๊ฐœ์˜ CRD๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ClusterTriggerAuthentication
  • KedaController
  • scaledJob
  • ScaledObject
  • TriggerAuthentication

3.3.1. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์„ค์น˜

๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Custom Metrics Autoscaler Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • Cluster Metrics Autoscaler Operator์˜ ์ด์ „์— ์„ค์น˜ํ•œ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๋ฒ„์ „์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋ฐ˜ KEDA ๋ฒ„์ „์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๋˜ํ•œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ KEDA 1.x ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค ์ •์˜๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    $ oc delete crd scaledobjects.keda.k8s.io
    $ oc delete crd triggerauthentications.keda.k8s.io

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Operator โ†’ OperatorHub๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Operator ๋ชฉ๋ก์—์„œ Custom Metrics Autoscaler ๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. Operator ์„ค์น˜ ํŽ˜์ด์ง€์—์„œ ์„ค์น˜ ๋ชจ๋“œ์— ๋Œ€ํ•ด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค(๊ธฐ๋ณธ๊ฐ’) ์˜ต์…˜์ด ์„ ํƒ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Operator๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
  4. ์„ค์น˜๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด openshift-keda ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์„ ํƒ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์€ ํด๋Ÿฌ์Šคํ„ฐ์— ์—†๋Š” ๊ฒฝ์šฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  6. Custom Metrics Autoscaler Operator ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ์„ค์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    1. ์›Œํฌ๋กœ๋“œ โ†’ Pod๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ openshift-keda ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  custom-metrics-autoscaler-operator-* Pod๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    3. ์›Œํฌ๋กœ๋“œ โ†’ ๋ฐฐํฌ ๋กœ ์ด๋™ํ•˜์—ฌ custom-metrics-autoscaler-operator ๋ฐฐํฌ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  7. ์„ ํƒ ์‚ฌํ•ญ: ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ OpenShift CLI์—์„œ ์„ค์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get all -n openshift-keda

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    NAME                                                      READY   STATUS    RESTARTS   AGE
    pod/custom-metrics-autoscaler-operator-5fd8d9ffd8-xt4xp   1/1     Running   0          18m
    
    NAME                                                 READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/custom-metrics-autoscaler-operator   1/1     1            1           18m
    
    NAME                                                            DESIRED   CURRENT   READY   AGE
    replicaset.apps/custom-metrics-autoscaler-operator-5fd8d9ffd8   1         1         1       18m

  8. ํ•„์š”ํ•œ CRD๋ฅผ ์ƒ์„ฑํ•˜๋Š”ECDHEda Controller ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Operator โ†’ ์„ค์น˜๋œ Operator๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. Custom Metrics Autoscaler ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    3. Operator ์„ธ๋ถ€ ์ •๋ณด ํŽ˜์ด์ง€์—์„œ DestinationRuleda Controller ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    4. > :<daController ํƒญ์—์„œ CreateECDHEdaController ๋ฅผ ํด๋ฆญํ•˜๊ณ  ํŒŒ์ผ์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

      kind: KedaController
      apiVersion: keda.sh/v1alpha1
      metadata:
        name: keda
        namespace: openshift-keda
      spec:
        watchNamespace: '' 1
        operator:
          logLevel: info 2
          logEncoder: console 3
        metricsServer:
          logLevel: '0' 4
          auditConfig: 5
            logFormat: "json"
            logOutputVolumeClaim: "persistentVolumeClaimName"
            policy:
              rules:
              - level: Metadata
              omitStages: "RequestReceived"
              omitManagedFields: false
            lifetime:
              maxAge: "2"
              maxBackup: "1"
              maxSize: "50"
        serviceAccount: {}
      1
      ์‚ฌ์šฉ์ž ์ •์˜ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ๊ฐ์‹œํ•ด์•ผ ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์— ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์กฐ์‚ฌํ•˜๋ ค๋ฉด ๋น„์–ด ์žˆ๋Š” ์ƒ๋žต ๋˜๋Š” ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
      2
      Custom Metrics Autoscaler Operator ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ ์ƒ์„ธ ์ˆ˜์ค€์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ debug,info,error ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ info ์ž…๋‹ˆ๋‹ค.
      3
      Custom Metrics Autoscaler Operator ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ ๋กœ๊น… ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ console ๋˜๋Š” json ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ console ์ž…๋‹ˆ๋‹ค.
      4
      Custom Metrics Autoscaler Metrics Server์˜ ๋กœ๊น… ์ˆ˜์ค€์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ info ๋ฐ 4 ๋˜๋Š” debug ์— ๋Œ€ํ•ด 0 ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.
      5
      Custom Metrics Autoscaler Operator์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊น…์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  "๊ฐ์‚ฌ ๋กœ๊น… ๊ตฌ์„ฑ" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์‚ฌ์šฉํ•  ๊ฐ์‚ฌ ์ •์ฑ…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    5. ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ KEDAController๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

3.4. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด

scalers๋ผ๊ณ ๋„ ํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ๋Š” Custom Metrics Autoscaler Operator์—์„œ Pod๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ํ˜„์žฌ Prometheus, CPU, ๋ฉ”๋ชจ๋ฆฌ ๋ฐ Apache Kafka ํŠธ๋ฆฌ๊ฑฐ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ scaledObject ๋˜๋Š” scaled Job ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

3.4.1. Prometheus ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด

์„ค์น˜๋œ OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ Prometheus ์„œ๋ฒ„๋ฅผ ๋ฉ”ํŠธ๋ฆญ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Prometheus ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Pod๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์˜ ์†Œ์Šค๋กœ OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ "์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค"๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ 

Prometheus๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์Šค์ผ€์ผ๋งํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง€ํ‘œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์—์„œ ์ตœ์†Œ ๋ณต์ œ๋ณธ์„ 0 ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Pod๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์— ์Šค์ผ€์ผ๋งํ•  ๋ฉ”ํŠธ๋ฆญ์ด ์—†์Šต๋‹ˆ๋‹ค.

Prometheus ๋Œ€์ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์ผ๋ง ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: prom-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: prometheus 1
    metadata:
      serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092 2
      namespace: kedatest 3
      metricName: http_requests_total 4
      threshold: '5' 5
      query: sum(rate(http_requests_total{job="test-app"}[1m])) 6
      authModes: basic 7
      cortexOrgID: my-org 8
      ignoreNullValues: false 9
      unsafeSsl: false 10

1
Prometheus๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ์œ ํ˜•์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
Prometheus ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
3
์„ ํƒ ์‚ฌํ•ญ: ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๋ฉ”ํŠธ๋ฆญ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
4
external.metrics.k8s.io API์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ์‹๋ณ„ํ•˜๋Š” ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ์ด์ƒ์˜ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
5
์Šค์ผ€์ผ๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์€ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
6
์‚ฌ์šฉํ•  Prometheus ์ฟผ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
7
์‚ฌ์šฉํ•  ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Prometheus ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์ „๋‹ฌ์ž ์ธ์ฆ( ๋ฒ ์–ด๋Ÿฌ ์ธ์ฆ), ๊ธฐ๋ณธ ์ธ์ฆ(๊ธฐ๋ณธ์ธ์ฆ) ๋˜๋Š” TLS ์ธ์ฆ(tls)์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ ์„ค๋ช…ํ•˜๋Š” ๋Œ€๋กœ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์— ํŠน์ • ์ธ์ฆ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ์‹œํฌ๋ฆฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
8
์„ ํƒ ์‚ฌํ•ญ: Prometheus์˜ X-Scope-OrgID ํ—ค๋”๋ฅผ ๋‹ค์ค‘ ํ…Œ๋„ŒํŠธ Cortex ๋˜๋Š” Mimir ์Šคํ† ๋ฆฌ์ง€๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋‹ค์ค‘ ํ…Œ๋„ŒํŠธ Prometheus ์Šคํ† ๋ฆฌ์ง€์—์„œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
9
์„ ํƒ ์‚ฌํ•ญ: Prometheus ๋Œ€์ƒ์ด ์†์‹ค๋˜๋Š” ๊ฒฝ์šฐ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • true ์ธ ๊ฒฝ์šฐ Prometheus ๋Œ€์ƒ์ด ์†์‹ค๋˜๋ฉด ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
  • false ์ธ ๊ฒฝ์šฐ Prometheus ๋Œ€์ƒ์ด ์†์‹ค๋˜๋ฉด ํŠธ๋ฆฌ๊ฑฐ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
10
์„ ํƒ ์‚ฌํ•ญ: ์ธ์ฆ์„œ ๊ฒ€์‚ฌ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Prometheus ๋์ ์—์„œ ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒ€์‚ฌ๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • true ์ธ ๊ฒฝ์šฐ ์ธ์ฆ์„œ ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • false ์ธ ๊ฒฝ์šฐ ์ธ์ฆ์„œ ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
3.4.1.1. OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๋„๋ก ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ๊ตฌ์„ฑ

์„ค์น˜๋œ OpenShift Container Platform Prometheus ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ์˜ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋Š” ์™ธ๋ถ€ Prometheus ์†Œ์Šค์— ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ† ํฐ์„ ๊ฐ€์ ธ์˜ฌ ์„œ๋น„์Šค ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ์—ญํ• ์„ ์„œ๋น„์Šค ๊ณ„์ •์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • Prometheus์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์˜ค๋ธŒ์ ํŠธ์—์„œ ํ† ํฐ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ์›Œํฌ๋กœ๋“œ ์ƒ์„ฑ ๊ตฌ์„ฑ ๋งต ์ƒ์„ฑ ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์›Œํฌ๋กœ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Custom Metrics Autoscaler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    $ oc project my-project
  2. ํด๋Ÿฌ์Šคํ„ฐ์— ์„œ๋น„์Šค ๊ณ„์ •์ด ์—†๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create serviceaccount <service_account>

    ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    <service_account>
    ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ณ„์ •์— ํ• ๋‹น๋œ ํ† ํฐ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

    $ oc describe serviceaccount <service_account>

    ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    <service_account>
    ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    Name:                thanos
    Namespace:           my-project
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  thanos-dockercfg-nnwgj
    Mountable secrets:   thanos-dockercfg-nnwgj
    Tokens:              thanos-token-9g4n5 1
    Events:              <none>

    1
    ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์— ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: keda.sh/v1alpha1
      kind: TriggerAuthentication
      metadata:
        name: keda-trigger-auth-prometheus
      spec:
        secretTargetRef: 1
        - parameter: bearerToken 2
          name: thanos-token-9g4n5 3
          key: token 4
        - parameter: ca
          name: thanos-token-9g4n5
          key: ca.crt
      1
      ์ด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ถŒํ•œ ๋ถ€์—ฌ์— ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      2
      ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณตํ•  ์ธ์ฆ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      3
      ์‚ฌ์šฉํ•  ํ† ํฐ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      4
      ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ํ† ํฐ์˜ ํ‚ค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. CR ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml
  5. Thanos ์ง€ํ‘œ๋ฅผ ์ฝ๋Š” ์—ญํ• ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: thanos-metrics-reader
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        verbs:
        - get
      - apiGroups:
        - metrics.k8s.io
        resources:
        - pods
        - nodes
        verbs:
        - get
        - list
        - watch
    2. CR ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml
  6. Thanos ์ง€ํ‘œ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•œ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: thanos-metrics-reader 1
        namespace: my-project 2
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: thanos-metrics-reader
      subjects:
      - kind: ServiceAccount
        name: thanos 3
        namespace: my-project 4
      1
      ์ƒ์„ฑํ•œ ์—ญํ• ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      2
      ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      3
      ์—ญํ• ์— ๋ฐ”์ธ๋”ฉํ•  ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      4
      ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. CR ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

"์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด"์— ์„ค๋ช…๋œ ๋Œ€๋กœ ํ™•์žฅ ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ํ™•์žฅ ์ž‘์—…์„ ๋ฐฐํฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์†Œ์Šค, ํŠธ๋ฆฌ๊ฑฐ ๋˜๋Š” scaler๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • triggers.type ์€ prometheus์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • triggers.metadata.serverAddress ๋Š” https://thanos-querier.openshift-monitoring.svc.cluster.local:9092์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • triggers.metadata.authModes ๋Š” ๋ฒ ์–ด๋Ÿฌ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Trigger.metadata.namespace ๋Š” ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • triggers.authenticationRef ๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ง€์ •๋œ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3.4.2. CPU ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด

CPU ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Pod๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠธ๋ฆฌ๊ฑฐ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ง€ํ‘œ๋ฅผ ๋ฉ”ํŠธ๋ฆญ์˜ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์ง€์ •ํ•œ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์œ ์ง€ํ•˜๋„๋ก ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod๋ฅผ ์Šค์ผ€์ผ๋งํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๊ฐœ์ˆ˜ ์‚ฌ์ด์—์„œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์—ฌ ๋ชจ๋“  Pod์—์„œ ์ง€์ •๋œ CPU ์‚ฌ์šฉ๋ฅ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ฆฌ๊ฑฐ๋Š” ์ „์ฒด Pod์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. Pod์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ฆฌ๊ฑฐ๋Š” Pod์— ์žˆ๋Š” ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์˜ ์ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 
  • ์ด ํŠธ๋ฆฌ๊ฑฐ๋Š” ScaledJob ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์Šค์ผ€์ผ๋งํ•  ๋•Œ ์—ฌ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐœ์ฒด๋Š” 0 ์œผ๋กœ ์Šค์ผ€์ผ๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CPU ๋Œ€์ƒ์ด ์žˆ๋Š” ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cpu-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: cpu 1
    metricType: Utilization 2
    metadata:
      value: '60' 3
      containerName: api 4

1
CPU๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ์œ ํ˜•์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
์‚ฌ์šฉํ•  ๋ฉ”ํŠธ๋ฆญ์˜ ์œ ํ˜•( Utilization ๋˜๋Š” AverageValue )์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
์Šค์ผ€์ผ๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์€ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Utilization ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ target ๊ฐ’์€ Pod์— ๋Œ€ํ•ด ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค์˜ ๋ฐฑ๋ถ„์œจ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“  ๊ด€๋ จ Pod์—์„œ ๋ฆฌ์†Œ์Šค ์ง€ํ‘œ์˜ ํ‰๊ท ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • AverageValue ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ target ๊ฐ’์€ ๋ชจ๋“  ๊ด€๋ จ Pod์˜ ํ‰๊ท  ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.
4
์„ ํƒ ์‚ฌํ•ญ: ์ „์ฒด Pod๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ๋”ฐ๋ผ ์Šค์ผ€์ผ๋งํ•  ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” api ๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๋งŒ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.4.3. ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด

๋ฉ”๋ชจ๋ฆฌ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Pod๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠธ๋ฆฌ๊ฑฐ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ง€ํ‘œ๋ฅผ ๋ฉ”ํŠธ๋ฆญ์˜ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod๋ฅผ ์Šค์ผ€์ผ๋งํ•˜์—ฌ ์ง€์ •ํ•œ ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๊ฐœ์ˆ˜ ์‚ฌ์ด์—์„œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์—ฌ ๋ชจ๋“  Pod์—์„œ ์ง€์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ฆฌ๊ฑฐ๋Š” ์ „์ฒด Pod์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. Pod์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์€ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์˜ ํ•ฉ๊ณ„์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ 
  • ์ด ํŠธ๋ฆฌ๊ฑฐ๋Š” ScaledJob ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์Šค์ผ€์ผ๋งํ•  ๋•Œ ์—ฌ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐœ์ฒด๋Š” 0 ์œผ๋กœ ์Šค์ผ€์ผ๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋Œ€์ƒ์ด ์žˆ๋Š” ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: memory-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: memory 1
    metricType: Utilization 2
    metadata:
      value: '60' 3
      containerName: api 4

1
memory๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ์œ ํ˜•์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
์‚ฌ์šฉํ•  ๋ฉ”ํŠธ๋ฆญ์˜ ์œ ํ˜•( Utilization ๋˜๋Š” AverageValue )์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
์Šค์ผ€์ผ๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์€ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Utilization ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ target ๊ฐ’์€ Pod์— ๋Œ€ํ•ด ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค์˜ ๋ฐฑ๋ถ„์œจ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“  ๊ด€๋ จ Pod์—์„œ ๋ฆฌ์†Œ์Šค ์ง€ํ‘œ์˜ ํ‰๊ท ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • AverageValue ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ target ๊ฐ’์€ ๋ชจ๋“  ๊ด€๋ จ Pod์˜ ํ‰๊ท  ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.
4
์„ ํƒ ์‚ฌํ•ญ: ์ „์ฒด Pod๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ๋”ฐ๋ผ ์Šค์ผ€์ผ๋งํ•  ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” api ๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๋งŒ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.4.4. Kafka ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด

Apache Kafka ์ฃผ์ œ ๋˜๋Š” Kafka ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋Š” ๊ธฐํƒ€ ์„œ๋น„์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Pod๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ์Šค์ผ€์ผ๋ง ์ž‘์—…์—์„œ allowIdleConsumers ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ true ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ Kafka ํŒŒํ‹ฐ์…˜ ์ˆ˜๋ณด๋‹ค ํฌ๊ฒŒ ํ™•์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์†Œ๋น„์ž ๊ทธ๋ฃน์˜ ์ˆ˜๊ฐ€ ์ฃผ์ œ์˜ ํŒŒํ‹ฐ์…˜ ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ถ”๊ฐ€ ์†Œ๋น„์ž ๊ทธ๋ฃน์€ ์œ ํœด ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณต์ œ๋ณธ ์ˆ˜๋Š” ๋‹ค์Œ์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ฃผ์ œ๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ ์ฃผ์ œ์˜ ํŒŒํ‹ฐ์…˜ ์ˆ˜
  • ์ฃผ์ œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์†Œ๋น„์ž ๊ทธ๋ฃน์— ์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์˜ ํŒŒํ‹ฐ์…˜ ์ˆ˜
  • ํ™•์žฅ ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” ํ™•์žฅ ์ž‘์—… CR์— ์ง€์ •๋œ maxReplicaCount

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

Kafka ๋Œ€์ƒ์ด ์žˆ๋Š” ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: kafka 1
    metadata:
      topic: my-topic 2
      bootstrapServers: my-cluster-kafka-bootstrap.openshift-operators.svc:9092 3
      consumerGroup: my-group 4
      lagThreshold: '10' 5
      activationLagThreshold: '5' 6
      offsetResetPolicy: latest 7
      allowIdleConsumers: true 8
      scaleToZeroOnInvalidOffset: false 9
      excludePersistentLag: false 10
      version: '1.0.0' 11
      partitionLimitation: '1,2,10-20,31' 12

1
Kafka๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ์œ ํ˜•์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
Kafka๊ฐ€ ์˜คํ”„์…‹ ์ง€์—ฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Kafka ํ•ญ๋ชฉ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
์—ฐ๊ฒฐํ•  Kafka ๋ธŒ๋กœ์ปค์˜ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
4
์ฃผ์ œ์—์„œ ์˜คํ”„์…‹์„ ํ™•์ธํ•˜๊ณ  ๊ด€๋ จ ์ง€์—ฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” Kafka ์†Œ๋น„์ž ๊ทธ๋ฃน์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
5
์„ ํƒ ์‚ฌํ•ญ: ์Šค์ผ€์ผ๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ํ‰๊ท  ๋Œ€์ƒ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์€ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 5 ์ž…๋‹ˆ๋‹ค.
6
์„ ํƒ ์‚ฌํ•ญ: ํ™œ์„ฑํ™” ๋‹จ๊ณ„์˜ ๋Œ€์ƒ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์€ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
7
์„ ํƒ ์‚ฌํ•ญ: Kafka ์†Œ๋น„์ž์— ๋Œ€ํ•œ Kafka ์˜คํ”„์…‹ ์žฌ์„ค์ • ์ •์ฑ…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ latest ๋ฐ earliest ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ latest ์ž…๋‹ˆ๋‹ค.
8
์„ ํƒ ์‚ฌํ•ญ: Kafka ๋ณต์ œ๋ณธ ์ˆ˜๊ฐ€ ์ฃผ์ œ์˜ ํŒŒํ‹ฐ์…˜ ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • true ์ธ ๊ฒฝ์šฐ Kafka ๋ณต์ œ๋ณธ ์ˆ˜๋Š” ์ฃผ์ œ์˜ ํŒŒํ‹ฐ์…˜ ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ ํœด ์ƒํƒœ์˜ Kafka ์†Œ๋น„์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • false ์ธ ๊ฒฝ์šฐ Kafka ๋ณต์ œ๋ณธ ์ˆ˜๋Š” ์ฃผ์ œ์˜ ํŒŒํ‹ฐ์…˜ ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.
9
Kafka ํŒŒํ‹ฐ์…˜์— ์œ ํšจํ•œ ์˜คํ”„์…‹์ด ์—†์„ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • true ์ธ ๊ฒฝ์šฐ ์†Œ๋น„์ž๋Š” ํ•ด๋‹น ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•ด 0์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.
  • false ์ธ ๊ฒฝ์šฐ scaler๋Š” ํ•ด๋‹น ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•œ ๋‹จ์ผ ์†Œ๋น„์ž๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.
10
์„ ํƒ ์‚ฌํ•ญ: ํ˜„์žฌ ์˜คํ”„์…‹์ด ์ด์ „ ํด๋ง ์‚ฌ์ดํด์˜ ํ˜„์žฌ ์˜คํ”„์…‹๊ณผ ๋™์ผํ•œ ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๊ฑฐ์— ํŒŒํ‹ฐ์…˜ ์ง€์—ฐ์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ์™ธํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • true ์ธ ๊ฒฝ์šฐ scaler๋Š” ์ด๋Ÿฌํ•œ ํŒŒํ‹ฐ์…˜์—์„œ ํŒŒํ‹ฐ์…˜ ์ง€์—ฐ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
  • false ์ธ ๊ฒฝ์šฐ ํŠธ๋ฆฌ๊ฑฐ๋Š” ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์— ๋ชจ๋“  ์†Œ๋น„์ž ์ง€์—ฐ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.
11
์„ ํƒ ์‚ฌํ•ญ: Kafka ๋ธŒ๋กœ์ปค์˜ ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์€ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1.0.0 ์ž…๋‹ˆ๋‹ค.
12
์„ ํƒ ์‚ฌํ•ญ: ์Šค์ผ€์ผ๋ง ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒํ‹ฐ์…˜ ID ๋ชฉ๋ก์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •๋œ ๊ฒฝ์šฐ ์ง€์—ฐ์„ ๊ณ„์‚ฐํ•  ๋•Œ ๋‚˜์—ด๋œ ID๋งŒ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์€ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3.5. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์ดํ•ด

ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šค์ผ€์ผ๋ง ์ž‘์—…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform ์‹œํฌ๋ฆฟ, ํ”Œ๋žซํผ ๋„ค์ดํ‹ฐ๋ธŒ Pod ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์™€ ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— TriggerAuthentication ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์€ ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์˜ค๋ธŒ์ ํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์—ฌ๋Ÿฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์˜ค๋ธŒ์ ํŠธ ๊ฐ„์— ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ณต์œ ํ•˜๋ ค๋ฉด ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ClusterTriggerAuthentication ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ ํŠธ๋ฆฌ๊ฑฐ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์€ ๋™์ผํ•œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์—๋Š” ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ์ธ์ฆ ์ฐธ์กฐ์— ์ถ”๊ฐ€ kind ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‹œํฌ๋ฆฟ์„ ์‚ฌ์šฉํ•œ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์˜ ์˜ˆ

kind: TriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata:
  name: secret-triggerauthentication
  namespace: my-namespace 1
spec:
  secretTargetRef: 2
  - parameter: user-name 3
    name: my-secret 4
    key: USER_NAME 5
  - parameter: password
    name: my-secret
    key: USER_PASSWORD

1
์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
์ด ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์ด ๊ถŒํ•œ ๋ถ€์—ฌ์— ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณตํ•  ์ธ์ฆ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
4
์‚ฌ์šฉํ•  ๋ณด์•ˆ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
5
์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์‹œํฌ๋ฆฟ์˜ ํ‚ค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์‹œํฌ๋ฆฟ์„ ์‚ฌ์šฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์˜ ์˜ˆ

kind: ClusterTriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata: 1
  name: secret-cluster-triggerauthentication
spec:
  secretTargetRef: 2
  - parameter: user-name 3
    name: secret-name 4
    key: USER_NAME 5
  - parameter: user-password
    name: secret-name
    key: USER_PASSWORD

1
ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์—†์Šต๋‹ˆ๋‹ค.
2
์ด ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์ด ๊ถŒํ•œ ๋ถ€์—ฌ์— ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณตํ•  ์ธ์ฆ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
4
์‚ฌ์šฉํ•  ๋ณด์•ˆ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
5
์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์‹œํฌ๋ฆฟ์˜ ํ‚ค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ† ํฐ์„ ์‚ฌ์šฉํ•œ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์˜ˆ

kind: TriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata:
  name: token-triggerauthentication
  namespace: my-namespace 1
spec:
  secretTargetRef: 2
  - parameter: bearerToken 3
    name: my-token-2vzfq 4
    key: token 5
  - parameter: ca
    name: my-token-2vzfq
    key: ca.crt

1
์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
์ด ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์ด ๊ถŒํ•œ ๋ถ€์—ฌ์— ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณตํ•  ์ธ์ฆ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
4
์‚ฌ์šฉํ•  ํ† ํฐ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
5
์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ํ† ํฐ์˜ ํ‚ค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์˜ˆ

kind: TriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata:
  name: env-var-triggerauthentication
  namespace: my-namespace 1
spec:
  env: 2
  - parameter: access_key 3
    name: ACCESS_KEY 4
    containerName: my-container 5

1
์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
์ด ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์ด ๊ถŒํ•œ ๋ถ€์—ฌ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
์ด ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
4
ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
5
์„ ํƒ ์‚ฌํ•ญ: ์ธ์ฆ์ด ํ•„์š”ํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ์˜ scaleTargetRef ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Pod ์ธ์ฆ ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•œ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์˜ ์˜ˆ

kind: TriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata:
  name: pod-id-triggerauthentication
  namespace: my-namespace 1
spec:
  podIdentity: 2
    provider: aws-eks 3

1
์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
์ด ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์—์„œ ๊ถŒํ•œ ๋ถ€์—ฌ์— ํ”Œ๋žซํผ ๋„ค์ดํ‹ฐ๋ธŒ Pod ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
Pod ID๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ฐ’์€ none,azure,aws-eks, ๋˜๋Š” aws-kiam ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ none ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

3.5.1. ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์‚ฌ์šฉ

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

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • Custom Metrics Autoscaler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Secret ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ์‹œํฌ๋ฆฟ ์˜ˆ

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    data:
      user-name: <base64_USER_NAME>
      password: <base64_USER_PASSWORD>

ํ”„๋กœ์„ธ์Šค

  1. TriggerAuthentication ๋˜๋Š” ClusterTriggerAuthentication ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      ์‹œํฌ๋ฆฟ์„ ์‚ฌ์šฉํ•œ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์˜ ์˜ˆ

      kind: TriggerAuthentication
      apiVersion: keda.sh/v1alpha1
      metadata:
        name: prom-triggerauthentication
        namespace: my-namespace
      spec:
        secretTargetRef:
        - parameter: user-name
          name: my-secret
          key: USER_NAME
        - parameter: password
          name: my-secret
          key: USER_PASSWORD

    2. TriggerAuthentication ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml
  2. scaled Object YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    ์Šค์ผ€์ผ๋ง ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: scaledobject
      namespace: my-namespace
    spec:
      scaleTargetRef:
        name: example-deployment
      maxReplicaCount: 100
      minReplicaCount: 0
      pollingInterval: 30
      triggers:
      - authenticationRef:
        type: prometheus
        metadata:
          serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092
          namespace: kedatest # replace <NAMESPACE>
          metricName: http_requests_total
          threshold: '5'
          query: sum(rate(http_requests_total{job="test-app"}[1m]))
          authModes: "basic"
        - authenticationRef: 1
            name: prom-triggerauthentication
          metadata:
            name: prom-triggerauthentication
          type: object
        - authenticationRef: 2
            name: prom-cluster-triggerauthentication
            kind: ClusterTriggerAuthentication
          metadata:
            name: prom-cluster-triggerauthentication
          type: object

    1
    ์„ ํƒ ์‚ฌํ•ญ: ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์„ ํƒ ์‚ฌํ•ญ: ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. kind: ClusterTriggerAuthentication ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์ฐธ๊ณ 

    ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ๊ณผ ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ๋ชจ๋‘ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  3. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc apply -f <file-name>

3.6. ํ™•์žฅ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ผ์‹œ ์ค‘์ง€

ํ•„์š”์— ๋”ฐ๋ผ ์›Œํฌ๋กœ๋“œ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํด๋Ÿฌ์Šคํ„ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋˜์ง€ ์•Š์€ ์›Œํฌ๋กœ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.6.1. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ผ์‹œ ์ค‘์ง€

ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์— autoscaling.keda.sh/paused-replicas ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™•์žฅ ์˜ค๋ธŒ์ ํŠธ์˜ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ์›Œํฌ๋กœ๋“œ์˜ ๋ณต์ œ๋ณธ์„ ์ง€์ •๋œ ๊ฐ’์œผ๋กœ ์Šค์ผ€์ผ๋งํ•˜๊ณ  ์ฃผ์„์ด ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  annotations:
    autoscaling.keda.sh/paused-replicas: "4"
# ...

ํ”„๋กœ์„ธ์Šค

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ scaledObject CR์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit ScaledObject scaledobject
  2. ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ autoscaling.keda.sh/paused-replicas ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      annotations:
        autoscaling.keda.sh/paused-replicas: "4" 1
      creationTimestamp: "2023-02-08T14:41:01Z"
      generation: 1
      name: scaledobject
      namespace: my-project
      resourceVersion: '65729'
      uid: f5aec682-acdf-4232-a783-58b5b82f5dd0
    1
    Custom Metrics Autoscaler Operator๊ฐ€ ๋ณต์ œ๋ณธ์„ ์ง€์ •๋œ ๊ฐ’์œผ๋กœ ์Šค์ผ€์ผ๋งํ•˜๊ณ  ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์ค‘์ง€ํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

3.6.2. ํ™•์žฅ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘

ํ•ด๋‹น scaled Object์— ๋Œ€ํ•œ autoscaling.keda.sh/paused-replicas ์ฃผ์„์„ ์ œ๊ฑฐํ•˜์—ฌ ์ผ์‹œ ์ค‘์ง€๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  annotations:
    autoscaling.keda.sh/paused-replicas: "4"
# ...

ํ”„๋กœ์„ธ์Šค

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ scaledObject CR์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit ScaledObject scaledobject
  2. autoscaling.keda.sh/paused-replicas ์ฃผ์„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      annotations:
        autoscaling.keda.sh/paused-replicas: "4" 1
      creationTimestamp: "2023-02-08T14:41:01Z"
      generation: 1
      name: scaledobject
      namespace: my-project
      resourceVersion: '65729'
      uid: f5aec682-acdf-4232-a783-58b5b82f5dd0
    1
    ์ผ์‹œ ์ค‘์ง€๋œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ด ์ฃผ์„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

3.7. ๊ฐ์‚ฌ ๋กœ๊ทธ ์ˆ˜์ง‘

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

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

3.7.1. ๊ฐ์‚ฌ ๋กœ๊น… ๊ตฌ์„ฑ

CloudEventda Controller ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ Custom Metrics Autoscaler Operator์— ๋Œ€ํ•œ ๊ฐ์‚ฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋Š” CloudEventda Controller CR์˜ ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ๋˜๋Š” ๋ณผ๋ฅจ์˜ ๊ฐ์‚ฌ ๋กœ๊ทธ ํŒŒ์ผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • Custom Metrics Autoscaler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. CloudEventda Controller ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ auditConfig ์Šคํƒ ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    kind: KedaController
    apiVersion: keda.sh/v1alpha1
    metadata:
      name: keda
      namespace: openshift-keda
    spec:
    # ...
      metricsServer:
    # ...
        auditConfig:
          logFormat: "json" 1
          logOutputVolumeClaim: "pvc-audit-log" 2
          policy:
            rules: 3
            - level: Metadata
            omitStages: "RequestReceived" 4
            omitManagedFields: false 5
          lifetime: 6
            maxAge: "2"
            maxBackup: "1"
            maxSize: "50"
    1
    audit ๋กœ๊ทธ์˜ ์ถœ๋ ฅ ํ˜•์‹( legacy ๋˜๋Š” json )์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์กด ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. API ์„œ๋ฒ„์— ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์€ ์ด ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋ฅผ ๋น„์›Œ ๋‘๋ฉด ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ stdout์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
    3
    ๊ธฐ๋กํ•ด์•ผ ํ•˜๋Š” ์ด๋ฒคํŠธ์™€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๋Š”์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • none: ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • metadata: ์‚ฌ์šฉ์ž, ํƒ€์ž„์Šคํƒฌํ”„ ๋“ฑ๊ณผ ๊ฐ™์€ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ํ…์ŠคํŠธ์™€ ์‘๋‹ต ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋กํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.
    • request: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์š”์ฒญ ํ…์ŠคํŠธ๋งŒ ๊ธฐ๋กํ•˜์ง€๋งŒ ์‘๋‹ต ํ…์ŠคํŠธ๋Š” ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์š”์ฒญ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • RequestResponse: ์ด๋ฒคํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์š”์ฒญ ํ…์ŠคํŠธ ๋ฐ ์‘๋‹ต ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์š”์ฒญ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    4
    ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ๋‹จ๊ณ„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    5
    ์š”์ฒญ ๋ฐ ์‘๋‹ต ๋ณธ๋ฌธ์˜ ๊ด€๋ฆฌ ํ•„๋“œ๋ฅผ API ๊ฐ์‚ฌ ๋กœ๊ทธ์— ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋ ค๋ฉด true ๋กœ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ• ์ง€ ์•„๋‹ˆ๋ฉด ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•  false ๋ฅผ ์ƒ๋žตํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    6
    ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ ํฌ๊ธฐ ๋ฐ ์ˆ˜๋ช…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • maxAge: ํŒŒ์ผ ์ด๋ฆ„์— ์ธ์ฝ”๋”ฉ๋œ ํƒ€์ž„์Šคํƒฌํ”„์— ๋”ฐ๋ผ ๊ฐ์‚ฌ ๋กœ๊ทธ ํŒŒ์ผ์„ ์œ ์ง€ํ•˜๋Š” ์ตœ๋Œ€ ์ผ ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • maxBackup: ์œ ์ง€ํ•  ๊ฐ์‚ฌ ๋กœ๊ทธ ํŒŒ์ผ์˜ ์ตœ๋Œ€ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ์‚ฌ ๋กœ๊ทธ ํŒŒ์ผ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด 0 ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • maxSize: ๊ฐ์‚ฌ ๋กœ๊ทธ ํŒŒ์ผ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ(MB)๊ฐ€ ์ˆœํ™˜๋˜๊ธฐ ์ „์— ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๊ฒ€์ฆ

  1. ๊ฐ์‚ฌ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ง์ ‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    1. keda-metrics-apiserver-* Pod ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

      oc get pod -n openshift-keda

      ์ถœ๋ ฅ ์˜ˆ

      NAME                                                  READY   STATUS    RESTARTS   AGE
      custom-metrics-autoscaler-operator-5cb44cd75d-9v4lv   1/1     Running   0          8m20s
      keda-metrics-apiserver-65c7cc44fd-rrl4r               1/1     Running   0          2m55s
      keda-operator-776cbb6768-zpj5b                        1/1     Running   0          2m55s

    2. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc logs keda-metrics-apiserver-<hash>|grep -i metadata 1
      1
      ์„ ํƒ ์‚ฌํ•ญ: grep ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์‹œํ•  ๋กœ๊ทธ ์ˆ˜์ค€์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์š”์ฒญ ,Request Response.

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc logs keda-metrics-apiserver-65c7cc44fd-rrl4r|grep -i metadata

      ์ถœ๋ ฅ ์˜ˆ

       ...
      {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"4c81d41b-3dab-4675-90ce-20b87ce24013","stage":"ResponseComplete","requestURI":"/healthz","verb":"get","user":{"username":"system:anonymous","groups":["system:unauthenticated"]},"sourceIPs":["10.131.0.1"],"userAgent":"kube-probe/1.26","responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2023-02-16T13:00:03.554567Z","stageTimestamp":"2023-02-16T13:00:03.555032Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":""}}
       ...

  2. ๋˜๋Š” ํŠน์ • ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    1. keda-metrics-apiserver-* Pod์— ๋กœ๊ทธ์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      $ oc rsh pod/keda-metrics-apiserver-<hash> -n openshift-keda

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc rsh pod/keda-metrics-apiserver-65c7cc44fd-rrl4r -n openshift-keda
    2. /var/audit-policy/ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

      sh-4.4$ cd /var/audit-policy/
    3. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ๊ทธ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

      sh-4.4$ ls

      ์ถœ๋ ฅ ์˜ˆ

      log-2023.02.17-14:50  policy.yaml

    4. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      sh-4.4$ cat <log_name>/<pvc_name>|grep -i <log_level> 1
      1
      ์„ ํƒ ์‚ฌํ•ญ: grep ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์‹œํ•  ๋กœ๊ทธ ์ˆ˜์ค€์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์š”์ฒญ ,Request Response.

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      sh-4.4$ cat log-2023.02.17-14:50/pvc-audit-log|grep -i Request

      ์ถœ๋ ฅ ์˜ˆ

       ...
      {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Request","auditID":"63e7f68c-04ec-4f4d-8749-bf1656572a41","stage":"ResponseComplete","requestURI":"/openapi/v2","verb":"get","user":{"username":"system:aggregator","groups":["system:authenticated"]},"sourceIPs":["10.128.0.1"],"responseStatus":{"metadata":{},"code":304},"requestReceivedTimestamp":"2023-02-17T13:12:55.035478Z","stageTimestamp":"2023-02-17T13:12:55.038346Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"system:discovery\" of ClusterRole \"system:discovery\" to Group \"system:authenticated\""}}
       ...

3.8. ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

์ง€์› ์‚ฌ๋ก€๋ฅผ ์—ฌ๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ Red Hat ์ง€์›์— ์ œ๊ณตํ•˜๋ฉด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  • must-gather ํˆด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
  • ๊ณ ์œ ํ•œ ํด๋Ÿฌ์Šคํ„ฐ ID์ž…๋‹ˆ๋‹ค.

must-gather ํˆด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ Custom Metrics Autoscaler Operator ๋ฐ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • openshift-keda ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ํ•ด๋‹น ํ•˜์œ„ ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค.
  • Custom Metric Autoscaler Operator ์„ค์น˜ ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค.
  • Custom Metric Autoscaler Operator CRD ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค.

3.8.1. ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

๋‹ค์Œ ๋ช…๋ น์€ Custom Metrics Autoscaler Operator์— ๋Œ€ํ•œ must-gather ํˆด์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ oc adm must-gather --image="$(oc get packagemanifests openshift-custom-metrics-autoscaler-operator \
-n openshift-marketplace \
-o jsonpath='{.status.channels[?(@.name=="stable")].currentCSVDesc.annotations.containerImage}')"
์ฐธ๊ณ 

ํ‘œ์ค€ OpenShift Container Platform must-gather ๋ช…๋ น oc adm must-gather, Custom Metrics Autoscaler Operator ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ์—ญํ• ์˜ ์‚ฌ์šฉ์ž๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • OpenShift Container Platform CLI(oc)๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. must-gather ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ œํ•œ๋œ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋Ÿฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” CA๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋จผ์ € ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” CA๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ๋œ ๋„คํŠธ์›Œํฌ์˜ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๊ธฐ๋ณธ must-gather ์ด๋ฏธ์ง€๋ฅผ ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    $ oc import-image is/must-gather -n openshift
  2. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • Custom Metrics Autoscaler Operator must-gather ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      $ oc adm must-gather --image="$(oc get packagemanifests openshift-custom-metrics-autoscaler-operator \
      -n openshift-marketplace \
      -o jsonpath='{.status.channels[?(@.name=="stable")].currentCSVDesc.annotations.containerImage}')"

      must-gather ๋ช…๋ น์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฏธ์ง€๋Š” Operator ํŒจํ‚ค์ง€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์™€์„œ Custom Metric Autoscaler Operator๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    • Custom Metric Autoscaler Operator ์ •๋ณด ์™ธ์— ๊ธฐ๋ณธ must-gather ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      1. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Custom Metrics Autoscaler Operator ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        $ IMAGE="$(oc get packagemanifests openshift-custom-metrics-autoscaler-operator \
          -n openshift-marketplace \
          -o jsonpath='{.status.channels[?(@.name=="stable")].currentCSVDesc.annotations.containerImage}')"
      2. ์‚ฌ์šฉ์ž ์ •์˜ Metrics Autoscaler Operator ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ oc adm must-gather ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

        $ oc adm must-gather --image-stream=openshift/must-gather --image=${IMAGE}

    ์˜ˆ 3.1. Custom Metric Autoscaler์˜ must-gather ์ถœ๋ ฅ ์˜ˆ:

    โ””โ”€โ”€ openshift-keda
        โ”œโ”€โ”€ apps
        โ”‚   โ”œโ”€โ”€ daemonsets.yaml
        โ”‚   โ”œโ”€โ”€ deployments.yaml
        โ”‚   โ”œโ”€โ”€ replicasets.yaml
        โ”‚   โ””โ”€โ”€ statefulsets.yaml
        โ”œโ”€โ”€ apps.openshift.io
        โ”‚   โ””โ”€โ”€ deploymentconfigs.yaml
        โ”œโ”€โ”€ autoscaling
        โ”‚   โ””โ”€โ”€ horizontalpodautoscalers.yaml
        โ”œโ”€โ”€ batch
        โ”‚   โ”œโ”€โ”€ cronjobs.yaml
        โ”‚   โ””โ”€โ”€ jobs.yaml
        โ”œโ”€โ”€ build.openshift.io
        โ”‚   โ”œโ”€โ”€ buildconfigs.yaml
        โ”‚   โ””โ”€โ”€ builds.yaml
        โ”œโ”€โ”€ core
        โ”‚   โ”œโ”€โ”€ configmaps.yaml
        โ”‚   โ”œโ”€โ”€ endpoints.yaml
        โ”‚   โ”œโ”€โ”€ events.yaml
        โ”‚   โ”œโ”€โ”€ persistentvolumeclaims.yaml
        โ”‚   โ”œโ”€โ”€ pods.yaml
        โ”‚   โ”œโ”€โ”€ replicationcontrollers.yaml
        โ”‚   โ”œโ”€โ”€ secrets.yaml
        โ”‚   โ””โ”€โ”€ services.yaml
        โ”œโ”€โ”€ discovery.k8s.io
        โ”‚   โ””โ”€โ”€ endpointslices.yaml
        โ”œโ”€โ”€ image.openshift.io
        โ”‚   โ””โ”€โ”€ imagestreams.yaml
        โ”œโ”€โ”€ k8s.ovn.org
        โ”‚   โ”œโ”€โ”€ egressfirewalls.yaml
        โ”‚   โ””โ”€โ”€ egressqoses.yaml
        โ”œโ”€โ”€ keda.sh
        โ”‚   โ”œโ”€โ”€ kedacontrollers
        โ”‚   โ”‚   โ””โ”€โ”€ keda.yaml
        โ”‚   โ”œโ”€โ”€ scaledobjects
        โ”‚   โ”‚   โ””โ”€โ”€ example-scaledobject.yaml
        โ”‚   โ””โ”€โ”€ triggerauthentications
        โ”‚       โ””โ”€โ”€ example-triggerauthentication.yaml
        โ”œโ”€โ”€ monitoring.coreos.com
        โ”‚   โ””โ”€โ”€ servicemonitors.yaml
        โ”œโ”€โ”€ networking.k8s.io
        โ”‚   โ””โ”€โ”€ networkpolicies.yaml
        โ”œโ”€โ”€ openshift-keda.yaml
        โ”œโ”€โ”€ pods
        โ”‚   โ”œโ”€โ”€ custom-metrics-autoscaler-operator-58bd9f458-ptgwx
        โ”‚   โ”‚   โ”œโ”€โ”€ custom-metrics-autoscaler-operator
        โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ custom-metrics-autoscaler-operator
        โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ logs
        โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ current.log
        โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ previous.insecure.log
        โ”‚   โ”‚   โ”‚           โ””โ”€โ”€ previous.log
        โ”‚   โ”‚   โ””โ”€โ”€ custom-metrics-autoscaler-operator-58bd9f458-ptgwx.yaml
        โ”‚   โ”œโ”€โ”€ custom-metrics-autoscaler-operator-58bd9f458-thbsh
        โ”‚   โ”‚   โ””โ”€โ”€ custom-metrics-autoscaler-operator
        โ”‚   โ”‚       โ””โ”€โ”€ custom-metrics-autoscaler-operator
        โ”‚   โ”‚           โ””โ”€โ”€ logs
        โ”‚   โ”œโ”€โ”€ keda-metrics-apiserver-65c7cc44fd-6wq4g
        โ”‚   โ”‚   โ”œโ”€โ”€ keda-metrics-apiserver
        โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ keda-metrics-apiserver
        โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ logs
        โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ current.log
        โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ previous.insecure.log
        โ”‚   โ”‚   โ”‚           โ””โ”€โ”€ previous.log
        โ”‚   โ”‚   โ””โ”€โ”€ keda-metrics-apiserver-65c7cc44fd-6wq4g.yaml
        โ”‚   โ””โ”€โ”€ keda-operator-776cbb6768-fb6m5
        โ”‚       โ”œโ”€โ”€ keda-operator
        โ”‚       โ”‚   โ””โ”€โ”€ keda-operator
        โ”‚       โ”‚       โ””โ”€โ”€ logs
        โ”‚       โ”‚           โ”œโ”€โ”€ current.log
        โ”‚       โ”‚           โ”œโ”€โ”€ previous.insecure.log
        โ”‚       โ”‚           โ””โ”€โ”€ previous.log
        โ”‚       โ””โ”€โ”€ keda-operator-776cbb6768-fb6m5.yaml
        โ”œโ”€โ”€ policy
        โ”‚   โ””โ”€โ”€ poddisruptionbudgets.yaml
        โ””โ”€โ”€ route.openshift.io
            โ””โ”€โ”€ routes.yaml
  3. ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ์„ฑ๋œ must-gather ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์••์ถ• ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Linux ์šด์˜ ์ฒด์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ 1
    1
    must-gather-local.5421342344627712289/๋ฅผ ์‹ค์ œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  4. Red Hat Customer Portal์—์„œ ํ•ด๋‹น ์ง€์› ์‚ฌ๋ก€์— ์••์ถ• ํŒŒ์ผ์„ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

3.9. Operator ๋ฉ”ํŠธ๋ฆญ ๋ณด๊ธฐ

Custom Metrics Autoscaler Operator๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€ํ‘œ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. PromQL(Prometheus Query Language)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ์„ ์ฟผ๋ฆฌํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ง„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ Pod๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๋ฉด ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ์ด ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

3.9.1. ์„ฑ๋Šฅ ์ง€ํ‘œ ์•ก์„ธ์Šค

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ์— ์•ก์„ธ์Šคํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ ๊ด€๋ฆฌ์ž ํ™”๋ฉด์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. Observe โ†’ Metrics ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด Expression ํ•„๋“œ์— PromQL ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  4. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ ์ถ”๊ฐ€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
3.9.1.1. ์ œ๊ณต๋œ Operator ์ง€ํ‘œ

Custom Metrics Autoscaler Operator๋Š” OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ๋ฉ”ํŠธ๋ฆญ์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ 3.1. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ Operator ๋ฉ”ํŠธ๋ฆญ
๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„์„ค๋ช…

keda_scaler_activity

ํŠน์ • ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ํ™œ์„ฑ ์ƒํƒœ์ธ์ง€ ์•„๋‹ˆ๋ฉด ๋น„ํ™œ์„ฑ์ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ฐ’ 1 ์€ scaler๊ฐ€ ํ™œ์„ฑ ์ƒํƒœ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฐ’ 0 ์€ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ๋น„ํ™œ์„ฑ ์ƒํƒœ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

keda_scaler_metrics_value

๋Œ€์ƒ ํ‰๊ท ์„ ๊ณ„์‚ฐํ•˜๋Š” HPA(Horizontal Pod Autoscaler)์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ์Šค์ผ€์ผ๋Ÿฌ์˜ ๋ฉ”ํŠธ๋ฆญ์˜ ํ˜„์žฌ ๊ฐ’์ž…๋‹ˆ๋‹ค.

keda_scaler_metrics_latency

๊ฐ ์Šค์ผ€์ผ๋Ÿฌ์—์„œ ํ˜„์žฌ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

keda_scaler_errors

๊ฐ ํ™•์žฅ๊ธฐ์— ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

keda_scaler_errors_total

๋ชจ๋“  scalers์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•œ ์ด ์˜ค๋ฅ˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

keda_scaled_object_errors

์Šค์ผ€์ผ๋ง๋œ ๊ฐ obejct์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

keda_resource_totals

๊ฐ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์˜ ๊ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ์ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

keda_trigger_totals

ํŠธ๋ฆฌ๊ฑฐ ์œ ํ˜•๋ณ„ ์ด ํŠธ๋ฆฌ๊ฑฐ ์ˆ˜์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ Admission Webhook ๋ฉ”ํŠธ๋ฆญ

์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ Admission Webhook์—์„œ๋Š” ๋‹ค์Œ Prometheus ๋ฉ”ํŠธ๋ฆญ๋„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„์„ค๋ช…

keda_scaled_object_validation_total

์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ ๊ฒ€์ฆ ์ˆ˜์ž…๋‹ˆ๋‹ค.

keda_scaled_object_validation_errors

๊ฒ€์ฆ ์˜ค๋ฅ˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

3.10. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ• ์ดํ•ด

์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋ฐฐํฌ, ์ƒํƒœ ์ €์žฅ ์„ธํŠธ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ scaledObject ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์— ๋Œ€ํ•œ scaledJob ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์Šค์ผ€์ผ๋งํ•  ๊ฐ ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ํ™•์žฅ ์˜ค๋ธŒ์ ํŠธ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™์ผํ•œ ์›Œํฌ๋กœ๋“œ์—์„œ ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ์™€ HPA(์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

3.10.1. ์›Œํฌ๋กœ๋“œ์— ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ถ”๊ฐ€

Deployment,StatefulSet ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋กœ ์ƒ์„ฑ๋œ ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • Custom Metrics Autoscaler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค์ผ€์ผ๋ง์— ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

    • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํŠธ๋ฆญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. oc describe PodMetrics <pod-name> ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์ด ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์ถœ๋ ฅ์ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๊ณ  Usage์— CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

      $ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal

      ์ถœ๋ ฅ ์˜ˆ

      Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
      Namespace:    openshift-kube-scheduler
      Labels:       <none>
      Annotations:  <none>
      API Version:  metrics.k8s.io/v1beta1
      Containers:
        Name:  wait-for-host-port
        Usage:
          Memory:  0
        Name:      scheduler
        Usage:
          Cpu:     8m
          Memory:  45440Ki
      Kind:        PodMetrics
      Metadata:
        Creation Timestamp:  2019-05-23T18:47:56Z
        Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
      Timestamp:             2019-05-23T18:47:56Z
      Window:                1m0s
      Events:                <none>

    • ์Šค์ผ€์ผ๋งํ•˜๋ ค๋Š” ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod์—๋Š” ์ง€์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ์ œํ•œ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      Pod ์‚ฌ์–‘์˜ ์˜ˆ

      apiVersion: v1
      kind: Pod
      # ...
      spec:
        containers:
        - name: app
          image: images.my-company.example/app:v4
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
      # ...

ํ”„๋กœ์„ธ์Šค

  1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. &lt ;2> ์ด๋ฆ„, ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„ &lt ;4& gt; ๋ฐ ์˜ค๋ธŒ์ ํŠธ ์ข…๋ฅ˜ &lt ;5> ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    ์Šค์ผ€์ผ๋ง ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      annotations:
        autoscaling.keda.sh/paused-replicas: "0" 1
      name: scaledobject 2
      namespace: my-namespace
    spec:
      scaleTargetRef:
        apiVersion: apps/v1 3
        name: example-deployment 4
        kind: Deployment 5
        envSourceContainerName: .spec.template.spec.containers[0] 6
      cooldownPeriod:  200 7
      maxReplicaCount: 100 8
      minReplicaCount: 0 9
      metricsServer: 10
        auditConfig:
          logFormat: "json"
          logOutputVolumeClaim: "persistentVolumeClaimName"
          policy:
            rules:
            - level: Metadata
            omitStages: "RequestReceived"
            omitManagedFields: false
          lifetime:
            maxAge: "2"
            maxBackup: "1"
            maxSize: "50"
      fallback: 11
        failureThreshold: 3
        replicas: 6
      pollingInterval: 30 12
      advanced:
        restoreToOriginalReplicaCount: false 13
        horizontalPodAutoscalerConfig:
          name: keda-hpa-scale-down 14
          behavior: 15
            scaleDown:
              stabilizationWindowSeconds: 300
              policies:
              - type: Percent
                value: 100
                periodSeconds: 15
      triggers:
      - type: prometheus 16
        metadata:
          serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092
          namespace: kedatest
          metricName: http_requests_total
          threshold: '5'
          query: sum(rate(http_requests_total{job="test-app"}[1m]))
          authModes: basic
      - authenticationRef: 17
          name: prom-triggerauthentication
        metadata:
          name: prom-triggerauthentication
        type: object
      - authenticationRef: 18
          name: prom-cluster-triggerauthentication
        metadata:
          name: prom-cluster-triggerauthentication
        type: object

    1
    ์„ ํƒ ์‚ฌํ•ญ: Custom Metrics Autoscaler Operator๊ฐ€ "์ž‘์—…์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์‚ฌ์šฉ" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๋ณต์ œ๋ณธ์„ ์ง€์ •๋œ ๊ฐ’์œผ๋กœ ์Šค์ผ€์ผ๋งํ•˜๊ณ  ์ž๋™ ์Šค์ผ€์ผ๋ง์„ ์ค‘์ง€ํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    ์„ ํƒ ์‚ฌํ•ญ: ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์˜ API ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ apps/v1 ์ž…๋‹ˆ๋‹ค.
    4
    ์Šค์ผ€์ผ๋งํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    5
    ์œ ํ˜•์„ Deployment,StatefulSet ๋˜๋Š” CustomResource ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    6
    ์„ ํƒ ์‚ฌํ•ญ: ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์‹œํฌ๋ฆฟ์„ ๋ณด์œ ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ .spec.template.spec.containers[0] ์ž…๋‹ˆ๋‹ค.
    7
    ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. minReplicaCount ๋ฅผ 0 ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฐฐํฌ๋ฅผ ๋‹ค์‹œ ์Šค์ผ€์ผ๋งํ•˜๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋ณด๊ณ ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ๊ธฐ๊ฐ„(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 300 ์ž…๋‹ˆ๋‹ค.
    8
    ์„ ํƒ ์‚ฌํ•ญ: ํ™•์žฅ ์‹œ ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 100์ž…๋‹ˆ๋‹ค.
    9
    ์„ ํƒ ์‚ฌํ•ญ: ์ถ•์†Œ ์‹œ ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    10
    ์„ ํƒ ์‚ฌํ•ญ: "๊ฐ์‚ฌ ๋กœ๊น… ๊ตฌ์„ฑ" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    11
    ์„ ํƒ ์‚ฌํ•ญ: ์Šค์ผ€์ผ๋ง๊ธฐ๊ฐ€ failureThreshold ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ •์˜๋œ ํšŸ์ˆ˜์— ๋Œ€ํ•œ ์†Œ์Šค์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€์ฒดํ•  ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ฒด ๋™์ž‘์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ KEDA ์„ค๋ช…์„œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
    12
    ์„ ํƒ ์‚ฌํ•ญ: ๊ฐ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๊ฒฉ(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 30 ์ž…๋‹ˆ๋‹ค.
    13
    ์„ ํƒ ์‚ฌํ•ญ: ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์‚ญ์ œ๋œ ํ›„ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๋ฅผ ์›๋ž˜ ๋ณต์ œ๋ณธ ์ˆ˜๋กœ ํ™•์žฅํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false ์ด๋ฉฐ ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์‚ญ์ œ๋  ๋•Œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    14
    ์„ ํƒ ์‚ฌํ•ญ: ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ keda-hpa-{scaled-object-name} ์ž…๋‹ˆ๋‹ค.
    15
    ์„ ํƒ ์‚ฌํ•ญ: "์Šค์ผ€์ด๋”ฉ ์ •์ฑ…" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ Pod๋ฅผ ํ™•์žฅ ๋˜๋Š” ํ™•์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์Šค์ผ€์ผ๋ง ์ •์ฑ…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    16
    "์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์Šค์ผ€์ผ๋ง ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•  ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” OpenShift Container Platform ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    17
    ์„ ํƒ ์‚ฌํ•ญ: "์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์ƒ์„ฑ" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    18
    ์„ ํƒ ์‚ฌํ•ญ: "์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์ƒ์„ฑ" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์ฐธ๊ณ 

    ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ๊ณผ ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ๋ชจ๋‘ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  2. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>.yaml

๊ฒ€์ฆ

  • ๋ช…๋ น ์ถœ๋ ฅ์„ ๋ณด๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get scaledobject <scaled_object_name>

    ์ถœ๋ ฅ ์˜ˆ

    NAME            SCALETARGETKIND      SCALETARGETNAME        MIN   MAX   TRIGGERS     AUTHENTICATION               READY   ACTIVE   FALLBACK   AGE
    scaledobject    apps/v1.Deployment   example-deployment     0     50    prometheus   prom-triggerauthentication   True    True     True       17s

    ์ถœ๋ ฅ์—์„œ ๋‹ค์Œ ํ•„๋“œ๋ฅผ ๊ธฐ๋กํ•ด ๋‘ก๋‹ˆ๋‹ค.

    • lg GERS: ์‚ฌ์šฉ ์ค‘์ธ ํŠธ๋ฆฌ๊ฑฐ ๋˜๋Š” scaler๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • AUTHENTICATION: ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • READY: ์Šค์ผ€์ผ๋ง์„ ์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

      • True ์ธ ๊ฒฝ์šฐ ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ค€๋น„๋ฉ๋‹ˆ๋‹ค.
      • False ์ธ ๊ฒฝ์šฐ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ์žˆ๋Š” ๋ฌธ์ œ๋กœ ์ธํ•ด ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • : ์Šค์ผ€์ผ๋ง์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

      • True ์ธ ๊ฒฝ์šฐ ํ™•์žฅ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
      • False ์ธ ๊ฒฝ์šฐ ๋ฉ”ํŠธ๋ฆญ์ด ์—†๊ฑฐ๋‚˜ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šค์ผ€์ผ๋ง์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • FALLBACK: ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์†Œ์Šค์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

      • False ์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ์—์„œ ์ง€ํ‘œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
      • True ์ธ ๊ฒฝ์šฐ ๋ฉ”ํŠธ๋ฆญ์ด ์—†๊ฑฐ๋‚˜ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์ง€ํ‘œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

3.10.2. ์ž‘์—…์— ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ถ”๊ฐ€

๋ชจ๋“  Job ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

ํ™•์žฅ๋œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์€ Red Hat ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค ์ˆ˜์ค€ ๊ณ„์•ฝ(SLA)์—์„œ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์™„์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ–ฅํ›„ ์ œํ’ˆ ๊ธฐ๋Šฅ์„ ์กฐ๊ธฐ์— ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๊ณ ๊ฐ์ด ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Red Hat ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์˜ ์ง€์› ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์ง€์› ๋ฒ”์œ„๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • Custom Metrics Autoscaler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    kind: ScaledJob
    apiVersion: keda.sh/v1alpha1
    metadata:
      name: scaledjob
      namespace: my-namespace
    spec:
      failedJobsHistoryLimit: 5
      jobTargetRef:
        activeDeadlineSeconds: 600 1
        backoffLimit: 6 2
        parallelism: 1 3
        completions: 1 4
        template:  5
          metadata:
            name: pi
          spec:
            containers:
            - name: pi
              image: perl
              command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      maxReplicaCount: 100 6
      pollingInterval: 30 7
      successfulJobsHistoryLimit: 5 8
      failedJobsHistoryLimit: 5 9
      envSourceContainerName: 10
      rolloutStrategy: gradual 11
      scalingStrategy: 12
        strategy: "custom"
        customScalingQueueLengthDeduction: 1
        customScalingRunningJobPercentage: "0.5"
        pendingPodConditions:
          - "Ready"
          - "PodScheduled"
          - "AnyOtherCustomPodCondition"
        multipleScalersCalculation : "max"
      triggers:
      - type: prometheus 13
        metadata:
          serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092
          namespace: kedatest
          metricName: http_requests_total
          threshold: '5'
          query: sum(rate(http_requests_total{job="test-app"}[1m]))
          authModes: "bearer"
      - authenticationRef: 14
          name: prom-triggerauthentication
        metadata:
          name: prom-triggerauthentication
         type: object
      - authenticationRef: 15
          name: prom-cluster-triggerauthentication
        metadata:
          name: prom-cluster-triggerauthentication
        type: object
    1
    ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์ž‘์—… ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 6 ์ž…๋‹ˆ๋‹ค.
    3
    ์„ ํƒ ์‚ฌํ•ญ: ์ž‘์—…์ด ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” Pod ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1 ์ž…๋‹ˆ๋‹ค.
    • ๋น„๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ 1 ์ž…๋‹ˆ๋‹ค.
    4
    ์„ ํƒ ์‚ฌํ•ญ: ์ž‘์—…์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„ฑ๊ณต์ ์ธ Pod ์™„๋ฃŒ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๋น„๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ 1 ์ž…๋‹ˆ๋‹ค.
    • ์™„๋ฃŒ ํšŸ์ˆ˜๊ฐ€ ๊ณ ์ •๋œ ๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์™„๋ฃŒ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ž‘์—… ํ๊ฐ€ ์žˆ๋Š” ๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด parallelism ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.
    5
    ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑํ•˜๋Š” Pod์˜ ํ…œํ”Œ๋ฆฟ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    6
    ์„ ํƒ ์‚ฌํ•ญ: ํ™•์žฅ ์‹œ ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 100์ž…๋‹ˆ๋‹ค.
    7
    ์„ ํƒ ์‚ฌํ•ญ: ๊ฐ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๊ฒฉ(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 30 ์ž…๋‹ˆ๋‹ค.
    8
    ์„ ํƒ ์‚ฌํ•ญ: ์„ฑ๊ณตํ•œ ์ž‘์—… ์ˆ˜๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 100์ž…๋‹ˆ๋‹ค.
    9
    ์„ ํƒ ์‚ฌํ•ญ: ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‹คํŒจํ•œ ์ž‘์—… ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 100์ž…๋‹ˆ๋‹ค.
    10
    ์„ ํƒ ์‚ฌํ•ญ: ์‚ฌ์šฉ์ž ์ •์˜ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์‹œํฌ๋ฆฟ์„ ๋ณด์œ ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ .spec.template.spec.containers[0] ์ž…๋‹ˆ๋‹ค.
    11
    ์„ ํƒ ์‚ฌํ•ญ: ํ™•์žฅ๋œ ์ž‘์—…์ด ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ์ž‘์—…์ด ์ข…๋ฃŒ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’: ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์—ฐ๊ฒฐ๋œ ํ™•์žฅ ์ž‘์—…์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ๊ธฐ์กด ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์ตœ์‹  ์‚ฌ์–‘์œผ๋กœ ์ž‘์—…์„ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ๊ด€๋ จ๋œ ์Šค์ผ€์ผ๋ง ์ž‘์—…์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ๊ธฐ์กด ์ž‘์—…์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋Š” ์ตœ์‹  ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    12
    ์„ ํƒ ์‚ฌํ•ญ: ์Šค์ผ€์ผ๋ง ์ „๋žต์„ ๊ธฐ๋ณธ,์‚ฌ์šฉ์ž ์ง€์ • ๋˜๋Š” ์ •ํ™•ํ•œ. ๊ธฐ๋ณธ๊ฐ’์€ default ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ "๋ฆฌ์†Œ์Šค" ์„น์…˜์˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
    13
    "์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์Šค์ผ€์ผ๋ง ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•  ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    14
    ์„ ํƒ ์‚ฌํ•ญ: "์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์ƒ์„ฑ" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    15
    ์„ ํƒ ์‚ฌํ•ญ: "์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ ์ƒ์„ฑ" ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์ฐธ๊ณ 

    ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ๊ณผ ํด๋Ÿฌ์Šคํ„ฐ ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์„ ๋ชจ๋‘ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  2. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>.yaml

๊ฒ€์ฆ

  • ๋ช…๋ น ์ถœ๋ ฅ์„ ๋ณด๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get scaledjob <scaled_job_name>

    ์ถœ๋ ฅ ์˜ˆ

    NAME        MAX   TRIGGERS     AUTHENTICATION              READY   ACTIVE    AGE
    scaledjob   100   prometheus   prom-triggerauthentication  True    True      8s

    ์ถœ๋ ฅ์—์„œ ๋‹ค์Œ ํ•„๋“œ๋ฅผ ๊ธฐ๋กํ•ด ๋‘ก๋‹ˆ๋‹ค.

    • lg GERS: ์‚ฌ์šฉ ์ค‘์ธ ํŠธ๋ฆฌ๊ฑฐ ๋˜๋Š” scaler๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • AUTHENTICATION: ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ์ธ์ฆ์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • READY: ์Šค์ผ€์ผ๋ง์„ ์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

      • True ์ธ ๊ฒฝ์šฐ ์Šค์ผ€์ผ๋ง๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ค€๋น„๋ฉ๋‹ˆ๋‹ค.
      • False ์ธ ๊ฒฝ์šฐ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ์žˆ๋Š” ๋ฌธ์ œ๋กœ ์ธํ•ด ํ™•์žฅ๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • : ์Šค์ผ€์ผ๋ง์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

      • True ์ธ ๊ฒฝ์šฐ ํ™•์žฅ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
      • False ์ธ ๊ฒฝ์šฐ ๋ฉ”ํŠธ๋ฆญ์ด ์—†๊ฑฐ๋‚˜ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šค์ผ€์ผ๋ง์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3.11. Custom Metrics Autoscaler Operator ์ œ๊ฑฐ

OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Custom Metrics Autoscaler Operator๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ Operator์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

KedaController CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ๋จผ์ € ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. KedaController CR์„ ์‚ญ์ œํ•˜์ง€ ์•Š์œผ๋ฉด openshift-keda ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•  ๋•Œ OpenShift Container Platform์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CR์„ ์‚ญ์ œํ•˜๊ธฐ ์ „์— Custom Metrics Autoscaler Operator๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ CR์„ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

3.11.1. Custom Metrics Autoscaler Operator ์„ค์น˜ ์ œ๊ฑฐ

๋‹ค์Œ ์ ˆ์ฐจ์— ๋”ฐ๋ผ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • Custom Metrics Autoscaler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Operator โ†’ ์„ค์น˜๋œ Operator๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. openshift-keda ํ”„๋กœ์ ํŠธ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ECDHEda Controller ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    1. CustomMetricsAutoscaler Operator๋ฅผ ์ฐพ์•„ECDHEda Controller ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์€ ๋‹ค์Œ DeleteECDHEdaController๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    3. ์ œ๊ฑฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. Custom Metrics Autoscaler Operator๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    1. Operators โ†’ ์„ค์น˜๋œ Operators๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. CustomMetricsAutoscaler Operator๋ฅผ ์ฐพ์•„ ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  Operator ์„ค์น˜ ์ œ๊ฑฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. ์ œ๊ฑฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  5. ์„ ํƒ ์‚ฌํ•ญ: OpenShift CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    1. ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ CRD๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

      • clustertriggerauthentications.keda.sh
      • kedacontrollers.keda.sh
      • scaledjobs.keda.sh
      • scaledobjects.keda.sh
      • triggerauthentications.keda.sh
      $ oc delete crd clustertriggerauthentications.keda.sh kedacontrollers.keda.sh scaledjobs.keda.sh scaledobjects.keda.sh triggerauthentications.keda.sh

      CRD๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๊ด€๋ จ ์—ญํ• , ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• , ์—ญํ•  ๋ฐ”์ธ๋”ฉ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    2. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

      $ oc get clusterrole | grep keda.sh
    3. ๋‚˜์—ด๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc delete clusterrole.keda.sh-v1alpha1-admin
    4. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

      $ oc get clusterrolebinding | grep keda.sh
    5. ๋‚˜์—ด๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€ํ‘œ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc delete clusterrolebinding.keda.sh-v1alpha1-admin
  6. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”ํŠธ๋ฆญ ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    $ oc delete project openshift-keda
  7. Cluster Metric Autoscaler Operator๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    $ oc delete operator/openshift-custom-metrics-autoscaler-operator.openshift-keda

4์žฅ. ๋…ธ๋“œ์— ๋Œ€ํ•œ Pod ๋ฐฐ์น˜ ์ œ์–ด(์˜ˆ์•ฝ)

4.1. ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฐฐ์น˜ ์ œ์–ด

Pod ์˜ˆ์•ฝ์€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ƒˆ Pod ๋ฐฐ์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋‚ด๋ถ€ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค.

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

๊ธฐ๋ณธ Pod ์˜ˆ์•ฝ
OpenShift Container Platform์—๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๊ณ ์œ  ํˆด๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ํˆด์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ Pod์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ•ญ๋ชฉ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ณ ๊ธ‰ Pod ์˜ˆ์•ฝ

์ƒˆ Pod๊ฐ€ ๋ฐฐ์น˜๋˜๋Š” ์œ„์น˜๋ฅผ ๋” ๋งŽ์ด ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ OpenShift Container Platform ๊ณ ๊ธ‰ ์˜ˆ์•ฝ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด Pod๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๋…ธ๋“œ์—์„œ ๋˜๋Š” ํŠน์ • Pod์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋ณธ ์„ค์ •์ด ์žˆ๋„๋ก Pod๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์Šค์ผ€์ค„๋ง ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฐฐ์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.1.1. ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ ์ •๋ณด

๊ธฐ๋ณธ OpenShift Container Platform Pod ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ƒˆ Pod ๋ฐฐ์น˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. Pod์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๊ตฌ์„ฑ๋œ ํ”„๋กœํ•„์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด๋ฉฐ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์†”๋ฃจ์…˜์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. Pod๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pod๋ฅผ ํŠน์ • ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•˜๋Š” Pod์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

4.1.1.1. ๊ธฐ๋ณธ ์˜ˆ์•ฝ ์ดํ•ด

๊ธฐ์กด ์ผ๋ฐ˜ ์Šค์ผ€์ค„๋Ÿฌ๋Š” 3๋‹จ๊ณ„ ์ž‘์—…์—์„œ Pod๋ฅผ ํ˜ธ์ŠคํŒ…ํ•  ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ธฐ๋ณธ ํ”Œ๋žซํผ ์ œ๊ณต ์Šค์ผ€์ค„๋Ÿฌ ์—”์ง„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

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

4.1.2. ์Šค์ผ€์ค„๋Ÿฌ ์‚ฌ์šฉ ์‚ฌ๋ก€

OpenShift Container Platform ๋‚ด์—์„œ ์˜ˆ์•ฝํ•˜๋Š” ์ค‘์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” ์œ ์—ฐํ•œ ์œ ์‚ฌ์„ฑ ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ์ •์ฑ…์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4.1.2.1. ์ธํ”„๋ผ ํ† ํด๋กœ์ง€ ์ˆ˜์ค€

๊ด€๋ฆฌ์ž๋Š” ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•˜์—ฌ ์ธํ”„๋ผ(๋…ธ๋“œ)์— ๋‹ค์–‘ํ•œ ํ† ํด๋กœ์ง€ ์ˆ˜์ค€์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด region=r1, zone=z1, rack=s1๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ผ๋ฒจ ์ด๋ฆ„์—๋Š” ํŠน๋ณ„ํ•œ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ ๊ด€๋ฆฌ์ž๋Š” ๋„์‹œ/๋นŒ๋”ฉ/๋ฐฉ๊ณผ ๊ฐ™์€ ์ธํ”„๋ผ ์ˆ˜์ค€์˜ ์ด๋ฆ„์„ ์ž์œ ๋กญ๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ด€๋ฆฌ์ž๋Š” ์ธํ”„๋ผ ํ† ํด๋กœ์ง€์— ์›ํ•˜๋Š” ์ˆ˜์˜ ์ˆ˜์ค€์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€ ์ˆ˜์ค€์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: region โ†’ zones โ†’ racks). ๊ด€๋ฆฌ์ž๋Š” ๋ชจ๋“  ์กฐํ•ฉ์— ์œ ์‚ฌ์„ฑ ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.1.2.2. ์œ ์‚ฌ์„ฑ

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

Pod๋ฅผ ์˜ˆ์•ฝํ•  ์œ„์น˜๋ฅผ ๋” ์ž˜ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋Œ€ํ•œ Pod ๋ฐฐ์น˜ ์ œ์–ด ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐํƒ€ Pod์™€ ๊ด€๋ จ๋œ Pod ๋ฐฐ์น˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ด€๋ฆฌ์ž๋Š” ์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ์˜ˆ์•ฝ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ธฐํƒ€ Pod์™€ ๊ด€๋ จ๋œ ์˜ˆ์•ฝ์„ ๊ฐ•์ œ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.1.2.3. ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€

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

Pod๋ฅผ ์˜ˆ์•ฝํ•  ์œ„์น˜๋ฅผ ๋” ์ž˜ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋Œ€ํ•œ Pod ๋ฐฐ์น˜ ์ œ์–ด ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐํƒ€ Pod์™€ ๊ด€๋ จ๋œ Pod ๋ฐฐ์น˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ด€๋ฆฌ์ž๋Š” ์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ์˜ˆ์•ฝ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ธฐํƒ€ Pod์™€ ๊ด€๋ จ๋œ ์˜ˆ์•ฝ์„ ๊ฐ•์ œ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.2. ์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ Pod ์˜ˆ์•ฝ

์˜ˆ์•ฝ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋„๋ก OpenShift Container Platform์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.2.1. ์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœํ•„ ์ •๋ณด

์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœํ•„์„ ์ง€์ •ํ•˜์—ฌ ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

4.2.2. ์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœํ•„ ๊ตฌ์„ฑ

์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜๋„๋ก ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ์—ญํ• ์˜ ์‚ฌ์šฉ์ž๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. Scheduler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit scheduler cluster
  2. spec.profile ํ•„๋“œ์— ์‚ฌ์šฉํ•  ํ”„๋กœํ•„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: config.openshift.io/v1
    kind: Scheduler
    metadata:
      name: cluster
    #...
    spec:
      mastersSchedulable: false
      profile: HighNodeUtilization 1
    #...
    1
    LowNodeUtilization, HighNodeUtilization ๋˜๋Š” NoScoring์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

4.3. ์œ ์‚ฌ์„ฑ ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ Pod์— ์ƒ๋Œ€์ ์ธ Pod ๋ฐฐ์น˜

์œ ์‚ฌ์„ฑ์€ ์˜ˆ์•ฝํ•  ๋…ธ๋“œ๋ฅผ ์ œ์–ดํ•˜๋Š” Pod์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋Š” Pod๊ฐ€ ๋…ธ๋“œ์—์„œ ์˜ˆ์•ฝ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” Pod์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

OpenShift Container Platform์—์„œ Pod ์œ ์‚ฌ์„ฑ ๋ฐ Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ Pod์˜ ํ‚ค/๊ฐ’ ๋ผ๋ฒจ์— ๋”ฐ๋ผ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.3.1. Pod ์œ ์‚ฌ์„ฑ ์ดํ•ด

Pod ์œ ์‚ฌ์„ฑ ๋ฐ Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ Pod์˜ ํ‚ค/๊ฐ’ ๋ผ๋ฒจ์— ๋”ฐ๋ผ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Pod ์œ ์‚ฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ Pod์˜ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ๊ฐ€ ํ˜„์žฌ Pod์˜ ๋ผ๋ฒจ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ Pod์™€ ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ์ƒˆ Pod๋ฅผ ์ฐพ๋„๋ก ์Šค์ผ€์ค„๋Ÿฌ์— ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ Pod์˜ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ๊ฐ€ ํ˜„์žฌ Pod์˜ ๋ผ๋ฒจ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ๋™์ผํ•œ ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod์™€ ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ์ƒˆ Pod๋ฅผ ์ฐพ์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฐธ๊ณ 

๋ผ๋ฒจ ์„ ํƒ๊ธฐ๋Š” ์—ฌ๋Ÿฌ Pod ๋ฐฐํฌ๊ฐ€ ์žˆ๋Š” Pod์™€ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” Pod๋ฅผ ๋ฐฉ์ง€ํ•˜๋„๋ก ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™์„ ๊ตฌ์„ฑํ•  ๋•Œ ๋ผ๋ฒจ์˜ ๊ณ ์œ ํ•œ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Pod ์œ ์‚ฌ์„ฑ ๊ทœ์น™์—๋Š” ํ•„์ˆ˜ ๋ฐ ๊ธฐ๋ณธ ๋‘ ๊ฐ€์ง€์˜ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฐธ๊ณ 

Pod ์šฐ์„ ์ˆœ์œ„ ๋ฐ ์„ ์  ์„ค์ •์— ๋”ฐ๋ผ ์œ ์‚ฌ์„ฑ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์Šค์ผ€์ค„๋Ÿฌ์—์„œ Pod์— ์ ์ ˆํ•œ ๋…ธ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Pod๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™์€ Pod๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์œ ์‚ฌ์„ฑ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” Pod ์œ ์‚ฌ์„ฑ ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๊ตฌ์„ฑ๋œ Pod ์‚ฌ์–‘์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ Pod ์œ ์‚ฌ์„ฑ ๊ทœ์น™์€ ๋…ธ๋“œ์— ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ Pod๊ฐ€ ํ•œ ๊ฐœ ์ด์ƒ ์žˆ๊ณ  ํ‚ค๊ฐ€ security์ด๊ณ  ๊ฐ’์ด S1์ธ ๋ผ๋ฒจ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™์€ ๋…ธ๋“œ์—์„œ ์ด๋ฏธ Pod๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ณ  ํ‚ค๊ฐ€ security์ด๊ณ  ๊ฐ’์ด S2์ธ ๋ผ๋ฒจ์ด ์žˆ๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Pod ์œ ์‚ฌ์„ฑ์ด ํฌํ•จ๋œ ์ƒ˜ํ”Œ Pod ๊ตฌ์„ฑ ํŒŒ์ผ

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity: 1
      requiredDuringSchedulingIgnoredDuringExecution: 2
      - labelSelector:
          matchExpressions:
          - key: security 3
            operator: In 4
            values:
            - S1 5
        topologyKey: failure-domain.beta.kubernetes.io/zone
  containers:
  - name: with-pod-affinity
    image: docker.io/ocpqe/hello-pod

1
Pod ์œ ์‚ฌ์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ์Šคํƒ ์ž์ž…๋‹ˆ๋‹ค.
2
ํ•„์š”ํ•œ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
3 5
๊ทœ์น™์„ ์ ์šฉํ•˜๋ ค๋ฉด ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ํ‚ค ๋ฐ ๊ฐ’(๋ผ๋ฒจ)์ž…๋‹ˆ๋‹ค.
4
์ด ์—ฐ์‚ฐ์ž๋Š” ๊ธฐ์กด Pod์˜ ๋ผ๋ฒจ๊ณผ ์ƒˆ Pod ์‚ฌ์–‘์— ์žˆ๋Š” matchExpression ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ง‘ํ•ฉ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. In, NotIn, Exists ๋˜๋Š” DoesNotExist์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๊ฐ€ ํฌํ•จ๋œ ์ƒ˜ํ”Œ Pod ๊ตฌ์„ฑ ํŒŒ์ผ

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-antiaffinity
spec:
  affinity:
    podAntiAffinity: 1
      preferredDuringSchedulingIgnoredDuringExecution: 2
      - weight: 100  3
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security 4
              operator: In 5
              values:
              - S2
          topologyKey: kubernetes.io/hostname
  containers:
  - name: with-pod-affinity
    image: docker.io/ocpqe/hello-pod

1
Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์Šคํƒ ์ž์ž…๋‹ˆ๋‹ค.
2
๊ธฐ๋ณธ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
3
๊ธฐ๋ณธ ๊ทœ์น™์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋…ธ๋“œ๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
4
์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™์ด ์ ์šฉ๋˜๋Š” ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” Pod ๋ผ๋ฒจ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ๋ผ๋ฒจ์˜ ํ‚ค์™€ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
5
์ด ์—ฐ์‚ฐ์ž๋Š” ๊ธฐ์กด Pod์˜ ๋ผ๋ฒจ๊ณผ ์ƒˆ Pod ์‚ฌ์–‘์— ์žˆ๋Š” matchExpression ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ง‘ํ•ฉ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. In, NotIn, Exists ๋˜๋Š” DoesNotExist์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ 

๋Ÿฐํƒ€์ž„ ์‹œ ๋…ธ๋“œ์˜ ๋ผ๋ฒจ์ด ๋ณ€๊ฒฝ๋˜์–ด Pod์˜ ์œ ์‚ฌ์„ฑ ๊ทœ์น™์ด ๋” ์ด์ƒ ์ถฉ์กฑ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Pod๊ฐ€ ๋…ธ๋“œ์—์„œ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

4.3.2. Pod ์œ ์‚ฌ์„ฑ ๊ทœ์น™ ๊ตฌ์„ฑ

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ๋ผ๋ฒจ์ด ์žˆ๋Š” Pod ๋ฐ ์œ ์‚ฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น Pod์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ 2-Pod ๊ตฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ์•ฝ๋œ Pod์— ์„ ํ˜ธ๋„๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. Pod ์‚ฌ์–‘์—์„œ ํŠน์ • ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: security-s1
        labels:
          security: S1
      spec:
        containers:
        - name: security-s1
          image: docker.io/ocpqe/hello-pod
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <pod-spec>.yaml
  2. ๋‹ค๋ฅธ Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์œ ์‚ฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: security-s1-east
      #...
      spec
        affinity 1
          podAffinity:
            requiredDuringSchedulingIgnoredDuringExecution: 2
            - labelSelector:
                matchExpressions:
                - key: security 3
                  values:
                  - S1
                  operator: In 4
              topologyKey: topology.kubernetes.io/zone 5
      #...
      1
      Pod ์œ ์‚ฌ์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      2
      requiredDuringSchedulingIgnoredDuringExecution ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” preferredDuringSchedulingIgnoredDuringExecution ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      3
      ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ํ‚ค์™€ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ Pod๋ฅผ ๋‹ค๋ฅธ Pod์™€ ํ•จ๊ป˜ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ Pod์˜ ๋ผ๋ฒจ๊ณผ ๋™์ผํ•œ key ๋ฐ values ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      4
      ์—ฐ์‚ฐ์ž ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž๋Š” In, NotIn, Exists ๋˜๋Š” DoesNotExist์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ž In์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      5
      ์ด๋Ÿฌํ•œ ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ฉฐ ๋ฏธ๋ฆฌ ์ฑ„์›Œ์ ธ ์žˆ๋Š” Kubernetes ๋ผ๋ฒจ์ธ topologyKey๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <pod-spec>.yaml

4.3.3. Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™ ๊ตฌ์„ฑ

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ๋ผ๋ฒจ์ด ์žˆ๋Š” Pod ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ธฐ๋ณธ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น Pod์— ์˜ˆ์•ฝํ•˜์ง€ ์•Š๋Š” Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ 2-Pod ๊ตฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ์•ฝ๋œ Pod์— ์„ ํ˜ธ๋„๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. Pod ์‚ฌ์–‘์—์„œ ํŠน์ • ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: security-s1
        labels:
          security: S1
      spec:
        containers:
        - name: security-s1
          image: docker.io/ocpqe/hello-pod
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <pod-spec>.yaml
  2. ๋‹ค๋ฅธ Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: security-s2-east
      #...
      spec
        affinity 1
          podAntiAffinity:
            preferredDuringSchedulingIgnoredDuringExecution: 2
            - weight: 100 3
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                  - key: security 4
                    values:
                    - S1
                    operator: In 5
                topologyKey: kubernetes.io/hostname 6
      #...
      1
      Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      2
      requiredDuringSchedulingIgnoredDuringExecution ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” preferredDuringSchedulingIgnoredDuringExecution ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      3
      ๊ธฐ๋ณธ ๊ทœ์น™์˜ ๊ฒฝ์šฐ ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜ 1-100์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๊ฐ€ ๋†’์€ ๋…ธ๋“œ๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
      4
      ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ํ‚ค์™€ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ Pod๋ฅผ ๋‹ค๋ฅธ Pod์™€ ํ•จ๊ป˜ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ Pod์˜ ๋ผ๋ฒจ๊ณผ ๋™์ผํ•œ key ๋ฐ values ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      5
      ์—ฐ์‚ฐ์ž ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž๋Š” In, NotIn, Exists ๋˜๋Š” DoesNotExist์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ž In์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      6
      ์ด๋Ÿฌํ•œ ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฏธ๋ฆฌ ์ฑ„์›Œ์ง„ Kubernetes ๋ผ๋ฒจ ์ธ topologyKey ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <pod-spec>.yaml

4.3.4. ์ƒ˜ํ”Œ Pod ์œ ์‚ฌ์„ฑ ๋ฐ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” Pod ์œ ์‚ฌ์„ฑ ๋ฐ Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

4.3.4.1. Pod ์œ ์‚ฌ์„ฑ

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ ๋ฐ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” Pod์˜ Pod ์œ ์‚ฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • Pod team4์—๋Š” ๋ผ๋ฒจ team:4๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: team4
      labels:
         team: "4"
    #...
    spec:
      containers:
      - name: ocp
        image: docker.io/ocpqe/hello-pod
    #...
  • Pod team4a์—๋Š” podAffinity ์•„๋ž˜์— ๋ผ๋ฒจ ์„ ํƒ๊ธฐ team:4๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: team4a
    #...
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: team
                operator: In
                values:
                - "4"
            topologyKey: kubernetes.io/hostname
      containers:
      - name: pod-affinity
        image: docker.io/ocpqe/hello-pod
    #...
  • team4a Pod๋Š” team4 Pod์™€ ๋™์ผํ•œ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.
4.3.4.2. Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ ๋ฐ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” Pod์˜ Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • Pod pod-s1์—๋Š” ๋ผ๋ฒจ security:s1์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
      labels:
        security: s1
    #...
    spec:
      containers:
      - name: ocp
        image: docker.io/ocpqe/hello-pod
    #...
  • Pod pod-s2์—๋Š” podAntiAffinity ์•„๋ž˜์— ๋ผ๋ฒจ ์„ ํƒ๊ธฐ security:s1์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s2
    #...
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: security
                operator: In
                values:
                - s1
            topologyKey: kubernetes.io/hostname
      containers:
      - name: pod-antiaffinity
        image: docker.io/ocpqe/hello-pod
    #...
  • Pod pod-s2๋Š” pod-s1๊ณผ ๋™์ผํ•œ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
4.3.4.3. ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ์—†๋Š” Pod ์œ ์‚ฌ์„ฑ

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ ๋ฐ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ๊ฐ€ ์—†๋Š” Pod์˜ Pod ์œ ์‚ฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • Pod pod-s1์—๋Š” ๋ผ๋ฒจ security:s1์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
      labels:
        security: s1
    #...
    spec:
      containers:
      - name: ocp
        image: docker.io/ocpqe/hello-pod
    #...
  • Pod pod-s2์—๋Š” ๋ผ๋ฒจ ์„ ํƒ๊ธฐ security:s2๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s2
    #...
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: security
                operator: In
                values:
                - s2
            topologyKey: kubernetes.io/hostname
      containers:
      - name: pod-affinity
        image: docker.io/ocpqe/hello-pod
    #...
  • security:s2 ๋ผ๋ฒจ์ด ์žˆ๋Š” Pod๊ฐ€ ํฌํ•จ๋œ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Pod pod-s2๋Š” ์˜ˆ์•ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ผ๋ฒจ์ด ์žˆ๋Š” ๊ธฐํƒ€ Pod๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ƒˆ Pod๋Š” ๋ณด๋ฅ˜ ์ค‘์ธ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    NAME      READY     STATUS    RESTARTS   AGE       IP        NODE
    pod-s2    0/1       Pending   0          32s       <none>

4.4. ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋Œ€ํ•œ Pod ๋ฐฐ์น˜ ์ œ์–ด

์œ ์‚ฌ์„ฑ์€ ์˜ˆ์•ฝํ•  ๋…ธ๋“œ๋ฅผ ์ œ์–ดํ•˜๋Š” Pod์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

OpenShift Container Platform ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์€ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ Pod๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ทœ์น™์€ ๋…ธ๋“œ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ๋ฒจ๊ณผ Pod์— ์ง€์ •๋œ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

4.4.1. ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ์ดํ•ด

๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด Pod์—์„œ Pod๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์œ ์‚ฌ์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” ๋ฐฐ์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • CPU ๋˜๋Š” ํŠน์ • ๊ฐ€์šฉ์„ฑ ์˜์—ญ์ด ์žˆ๋Š” ๋…ธ๋“œ์—์„œ๋งŒ ์‹คํ–‰ํ•˜๋„๋ก Pod๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™์—๋Š” ํ•„์ˆ˜ ๋ฐ ๊ธฐ๋ณธ ๋‘ ๊ฐ€์ง€์˜ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฐธ๊ณ 

๋…ธ๋“œ์˜ ๋ผ๋ฒจ์ด ๋Ÿฐํƒ€์ž„์— ๋ณ€๊ฒฝ๋˜์–ด Pod์— ๋Œ€ํ•œ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™์ด ๋” ์ด์ƒ ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด Pod๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

๋‹ค์Œ ์˜ˆ์ œ๋Š” ํ‚ค๊ฐ€ e2e-az-NorthSouth์ด๊ณ  ๊ฐ’์ด e2e-az-North ๋˜๋Š” e2e-az-South์ธ ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋…ธ๋“œ์— Pod๋ฅผ ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ทœ์น™์ด ์žˆ๋Š” Pod ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ํ•„์ˆ˜ ๊ทœ์น™์ด ์žˆ๋Š” Pod ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์˜ˆ

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity: 1
      requiredDuringSchedulingIgnoredDuringExecution: 2
        nodeSelectorTerms:
        - matchExpressions:
          - key: e2e-az-NorthSouth 3
            operator: In 4
            values:
            - e2e-az-North 5
            - e2e-az-South 6
  containers:
  - name: with-node-affinity
    image: docker.io/ocpqe/hello-pod
#...

1
๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ์Šคํƒ ์ž์ž…๋‹ˆ๋‹ค.
2
ํ•„์š”ํ•œ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
3 5 6
๊ทœ์น™์„ ์ ์šฉํ•˜๋ ค๋ฉด ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ํ‚ค/๊ฐ’(๋ผ๋ฒจ)์ž…๋‹ˆ๋‹ค.
4
์—ฐ์‚ฐ์ž๋Š” ๋…ธ๋“œ์˜ ๋ผ๋ฒจ๊ณผ Pod ์‚ฌ์–‘์— ์žˆ๋Š” matchExpression ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ง‘ํ•ฉ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ In, NotIn, Exists, DoesNotExist, Lt ๋˜๋Š” Gt์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋Š” Pod์— ๋Œ€ํ•ด ํ‚ค๊ฐ€ e2e-az-EastWest์ด๊ณ  ๊ฐ’์ด e2e-az-East ๋˜๋Š” e2e-az-West์ธ ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ธฐ๋ณธ ๊ทœ์น™์ด ์žˆ๋Š” ๋…ธ๋“œ ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ธฐ๋ณธ ๊ทœ์น™์ด ์žˆ๋Š” Pod ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์˜ˆ

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity: 1
      preferredDuringSchedulingIgnoredDuringExecution: 2
      - weight: 1 3
        preference:
          matchExpressions:
          - key: e2e-az-EastWest 4
            operator: In 5
            values:
            - e2e-az-East 6
            - e2e-az-West 7
  containers:
  - name: with-node-affinity
    image: docker.io/ocpqe/hello-pod
#...

1
๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ์Šคํƒ ์ž์ž…๋‹ˆ๋‹ค.
2
๊ธฐ๋ณธ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
3
๊ธฐ๋ณธ ๊ทœ์น™์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๊ฐ€ ๋†’์€ ๋…ธ๋“œ๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
4 6 7
๊ทœ์น™์„ ์ ์šฉํ•˜๋ ค๋ฉด ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ํ‚ค/๊ฐ’(๋ผ๋ฒจ)์ž…๋‹ˆ๋‹ค.
5
์—ฐ์‚ฐ์ž๋Š” ๋…ธ๋“œ์˜ ๋ผ๋ฒจ๊ณผ Pod ์‚ฌ์–‘์— ์žˆ๋Š” matchExpression ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ง‘ํ•ฉ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ In, NotIn, Exists, DoesNotExist, Lt ๋˜๋Š” Gt์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…์‹œ์ ์ธ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ฐœ๋…์€ ์—†์ง€๋งŒ NotIn ๋˜๋Š” DoesNotExist ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋™์ž‘์„ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๋ฐ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ๋™์ผํ•œ Pod ๊ตฌ์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  • nodeSelector์™€ nodeAffinity๋ฅผ ๋‘˜ ๋‹ค ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ํ›„๋ณด ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • nodeAffinity ์œ ํ˜•๊ณผ ์—ฐ๊ฒฐ๋œ nodeSelectorTerms๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ nodeSelectorTerms ์ค‘ ํ•˜๋‚˜๋ฅผ ์ถฉ์กฑํ•˜๋ฉด Pod๋ฅผ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • nodeSelectorTerms์™€ ์—ฐ๊ฒฐ๋œ matchExpressions๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  matchExpressions๋ฅผ ์ถฉ์กฑํ•  ๋•Œ๋งŒ Pod๋ฅผ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.4.2. ํ•„์ˆ˜ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™ ๊ตฌ์„ฑ

๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ๋จผ์ € ํ•„์ˆ˜ ๊ทœ์น™์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋…ธ๋“œ ๋ฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š” ํ•˜๋‚˜์˜ Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  1. oc label node ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label node node1 e2e-az-name=e2e-az1
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    kind: Node
    apiVersion: v1
    metadata:
      name: <node_name>
      labels:
        e2e-az-name: e2e-az1
    #...
  2. Pod ์‚ฌ์–‘์—์„œ ํŠน์ • ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      ์ฐธ๊ณ 

      ์˜ˆ์•ฝ๋œ Pod์— ์„ ํ˜ธ๋„๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

      ์ถœ๋ ฅ ์˜ˆ

      apiVersion: v1
      kind: Pod
      metadata:
        name: s1
      spec:
        affinity: 1
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution: 2
              nodeSelectorTerms:
              - matchExpressions:
                - key: e2e-az-name 3
                  values:
                  - e2e-az1
                  - e2e-az2
                  operator: In 4
      #...

      1
      Pod ์œ ์‚ฌ์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      2
      requiredDuringSchedulingIgnoredDuringExecution ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      3
      ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ํ‚ค์™€ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํŽธ์ง‘ํ•œ ๋…ธ๋“œ์— ์ƒˆ Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ๋…ธ๋“œ์˜ ๋ผ๋ฒจ๊ณผ ๋™์ผํ•œ key ๋ฐ values ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      4
      ์—ฐ์‚ฐ์ž ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž๋Š” In, NotIn, Exists ๋˜๋Š” DoesNotExist์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ž In์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

4.4.3. ๊ธฐ๋ณธ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™ ๊ตฌ์„ฑ

๊ธฐ๋ณธ ๊ทœ์น™์€ ๊ทœ์น™์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ทœ์น™์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์ ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋…ธ๋“œ ๋ฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•˜๋ ค๊ณ  ํ•˜๋Š” ํ•˜๋‚˜์˜ Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  1. oc label node ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label node node1 e2e-az-name=e2e-az3
  2. ํŠน์ • ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      ์ฐธ๊ณ 

      ์˜ˆ์•ฝ๋œ Pod์— ์„ ํ˜ธ๋„๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: s1
      spec:
        affinity: 1
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution: 2
            - weight: 3
              preference:
                matchExpressions:
                - key: e2e-az-name 4
                  values:
                  - e2e-az3
                  operator: In 5
      #...
      1
      Pod ์œ ์‚ฌ์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      2
      preferredDuringSchedulingIgnoredDuringExecution ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      3
      ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ˆซ์ž 1~100์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๊ฐ€ ๋†’์€ ๋…ธ๋“œ๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
      4
      ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ํ‚ค์™€ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํŽธ์ง‘ํ•œ ๋…ธ๋“œ์— ์ƒˆ Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ๋…ธ๋“œ์˜ ๋ผ๋ฒจ๊ณผ ๋™์ผํ•œ key ๋ฐ values ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      5
      ์—ฐ์‚ฐ์ž ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž๋Š” In, NotIn, Exists ๋˜๋Š” DoesNotExist์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ž In์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

4.4.4. ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™ ์ƒ˜ํ”Œ

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

4.4.4.1. ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋…ธ๋“œ ๋ฐ Pod์˜ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • Node1 ๋…ธ๋“œ์—๋Š” ๋ผ๋ฒจ zone:us๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    $ oc label node node1 zone=us
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    kind: Node
    apiVersion: v1
    metadata:
      name: <node_name>
      labels:
        zone: us
    #...
  • pod-s1 Pod์—๋Š” ํ•„์ˆ˜ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™์— ๋”ฐ๋ผ zone ๋ฐ us ํ‚ค/๊ฐ’ ์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    $ cat pod-s1.yaml

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
    spec:
      containers:
        - image: "docker.io/ocpqe/hello-pod"
          name: hello-pod
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: "zone"
                  operator: In
                  values:
                  - us
    #...

  • pod-s1 Pod๋ฅผ Node1์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    $ oc get pod -o wide

    ์ถœ๋ ฅ ์˜ˆ

    NAME     READY     STATUS       RESTARTS   AGE      IP      NODE
    pod-s1   1/1       Running      0          4m       IP1     node1

4.4.4.2. ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ์—†๋Š” ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ์—†๋Š” ๋…ธ๋“œ ๋ฐ Pod์˜ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • Node1 ๋…ธ๋“œ์—๋Š” ๋ผ๋ฒจ zone:emea๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    $ oc label node node1 zone=emea
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    kind: Node
    apiVersion: v1
    metadata:
      name: <node_name>
      labels:
        zone: emea
    #...
  • pod-s1 Pod์—๋Š” ํ•„์ˆ˜ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๊ทœ์น™์— ๋”ฐ๋ผ zone ๋ฐ us ํ‚ค/๊ฐ’ ์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    $ cat pod-s1.yaml

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
    spec:
      containers:
        - image: "docker.io/ocpqe/hello-pod"
          name: hello-pod
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: "zone"
                  operator: In
                  values:
                  - us
    #...

  • pod-s1 Pod๋Š” Node1์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    $ oc describe pod pod-s1

    ์ถœ๋ ฅ ์˜ˆ

    ...
    
    Events:
     FirstSeen LastSeen Count From              SubObjectPath  Type                Reason
     --------- -------- ----- ----              -------------  --------            ------
     1m        33s      8     default-scheduler Warning        FailedScheduling    No nodes are available that match all of the following predicates:: MatchNodeSelector (1).

4.4.5. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

4.5. ๊ณผ๋‹ค ํ• ๋‹น๋œ ๋…ธ๋“œ์— Pod ๋ฐฐ์น˜

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

๊ด€๋ฆฌ์ž๋Š” ์š”์ฒญ ๋ฐ ์ œํ•œ์„ ํ†ตํ•ด ๋…ธ๋“œ์˜ ๋ฆฌ์†Œ์Šค ๊ณผ๋‹ค ํ• ๋‹น์„ ํ—ˆ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ˆ์•ฝํ•˜๊ณ  ์ตœ์†Œ ์„œ๋น„์Šค ๋ณด์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ์€ ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค์˜ ์–‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

4.5.1. ๊ณผ๋‹ค ํ• ๋‹น ์ดํ•ด

๊ด€๋ฆฌ์ž๋Š” ์š”์ฒญ ๋ฐ ์ œํ•œ์„ ํ†ตํ•ด ๋…ธ๋“œ์˜ ๋ฆฌ์†Œ์Šค ๊ณผ๋‹ค ํ• ๋‹น์„ ํ—ˆ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ˆ์•ฝํ•˜๊ณ  ์ตœ์†Œ ์„œ๋น„์Šค ๋ณด์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ์€ ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค์˜ ์–‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform ๊ด€๋ฆฌ์ž๋Š” ๊ฐœ๋ฐœ์ž ์ปจํ…Œ์ด๋„ˆ์— ์„ค์ •๋œ ์š”์ฒญ๊ณผ ์ œํ•œ ์‚ฌ์ด์˜ ๋น„์œจ์„ ๋ฎ์–ด์“ฐ๋„๋ก ๋งˆ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋…ธ๋“œ์—์„œ ๊ณผ๋‹ค ํ• ๋‹น ์ˆ˜์ค€์„ ์ œ์–ดํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋ฐ€๋„๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œํ•œ ๋ฐ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ณ„ LimitRange ์˜ค๋ธŒ์ ํŠธ์™€ ํ•จ๊ป˜ ์ปจํ…Œ์ด๋„ˆ ์ œํ•œ ๋ฐ ์š”์ฒญ์„ ์กฐ์ •ํ•˜์—ฌ ์›ํ•˜๋Š” ์ˆ˜์ค€์˜ ๊ณผ๋‹ค ํ• ๋‹น์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ปจํ…Œ์ด๋„ˆ์— ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ๊ฐœ๋ณ„ ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ๋˜๋Š” ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์— ๊ธฐ๋ณธ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฎ์–ด์“ฐ๊ธฐ ์ดํ›„์—๋„ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  LimitRange ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ œํ•œ ๋ฐ ์š”์ฒญ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ตœ์†Œ ์ œํ•œ์— ๊ฐ€๊นŒ์šด ์ œํ•œ์„ ์ง€์ •ํ•˜๊ณ  ์š”์ฒญ์—์„œ ์ตœ์†Œ ์ œํ•œ ๋ฏธ๋งŒ์„ ๋ฎ์–ด์“ฐ๋„๋ก ํ•˜์—ฌ Pod๋ฅผ ๊ธˆ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ž˜๋ชป๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์€ ํ–ฅํ›„ ์ž‘์—…์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜์ง€๋งŒ ํ˜„์žฌ๋Š” ์ด ๊ธฐ๋Šฅ๊ณผ LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฃผ์˜ํ•ด์„œ ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค.

4.5.2. ๋…ธ๋“œ ๊ณผ๋‹ค ํ• ๋‹น ์ดํ•ด

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

๋…ธ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ปค๋„ ์กฐ์ • ๊ฐ€๋Šฅํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ปค๋„์€ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ์ง„๋˜์ง€ ์•Š๋Š” ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‹คํŒจํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ด ๋™์ž‘์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด OpenShift Container Platform์€ vm.overcommit_memory ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์„ค์ •ํ•˜์—ฌ ๊ธฐ๋ณธ ์šด์˜ ์ฒด์ œ ์„ค์ •์„ ์žฌ์ •์˜ํ•˜์—ฌ ์ปค๋„์ด ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ค๋ฒ„ ์ปค๋ฐ‹ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform์€ vm.panic_on_oom ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์‹œ ์ปค๋„์ด ํŒจ๋‹‰ ์ƒํƒœ๊ฐ€๋˜์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ปค๋„์—์„œ OOM (๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ) ์ƒํƒœ์ผ ๋•Œ oom_killer๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํ˜„์žฌ ์„ค์ •์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ sysctl -a |grep commit

์ถœ๋ ฅ ์˜ˆ

#...
vm.overcommit_memory = 0
#...

$ sysctl -a |grep panic

์ถœ๋ ฅ ์˜ˆ

#...
vm.panic_on_oom = 0
#...

์ฐธ๊ณ 

์œ„์˜ ํ”Œ๋ž˜๊ทธ๋Š” ์ด๋ฏธ ๋…ธ๋“œ์— ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผํ•˜๋ฉฐ ์ถ”๊ฐ€ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋‹ค์Œ ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • CPU CFS ํ• ๋‹น๋Ÿ‰์„ ์‚ฌ์šฉํ•˜์—ฌ CPU ์ œํ•œ ๋น„ํ™œ์„ฑํ™” ๋˜๋Š” ์‹คํ–‰
  • ์‹œ์Šคํ…œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฆฌ์†Œ์Šค ์˜ˆ์•ฝ
  • Quality of Service (QoS) ๊ณ„์ธต์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜ˆ์•ฝ

4.6. ๋…ธ๋“œ ํ…Œ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฐฐ์น˜ ์ œ์–ด

ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋…ธ๋“œ์—์„œ ์˜ˆ์•ฝํ•ด์•ผ ํ•˜๋Š” (๋˜๋Š” ์˜ˆ์•ฝํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š”) Pod๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.6.1. ํ…Œ์ธํŠธ(Taints) ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(Tolerations)์˜ ์ดํ•ด

ํ…Œ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Pod์— ์ผ์น˜ํ•˜๋Š” ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ์—์„œ Pod ์˜ˆ์•ฝ์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node ์‚ฌ์–‘(NodeSpec)์„ ํ†ตํ•ด ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ ์šฉํ•˜๊ณ  Pod ์‚ฌ์–‘(PodSpec)์„ ํ†ตํ•ด Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ ์šฉํ•  ๋•Œ Pod์—์„œ ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ํ•ด๋‹น ๋…ธ๋“œ์— Pod๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ์‚ฌ์–‘์˜ ํ…Œ์ธํŠธ ์˜ˆ

apiVersion: v1
kind: Node
metadata:
  name: my-node
#...
spec:
  taints:
  - effect: NoExecute
    key: key1
    value: value1
#...

Pod ์‚ฌ์–‘์˜ ํ—ˆ์šฉ ์˜ค์ฐจ ์˜ˆ

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoExecute"
    tolerationSeconds: 3600
#...

ํ…Œ์ธํŠธ ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์€ key, value ๋ฐ effect๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 4.1. ํ…Œ์ธํŠธ ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜ ๊ตฌ์„ฑ ์š”์†Œ
๋งค๊ฐœ๋ณ€์ˆ˜์„ค๋ช…

key

key๋Š” ์ตœ๋Œ€ 253 ์ž์˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ํ‚ค๋Š” ๋ฌธ์ž ๋˜๋Š” ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฌธ์ž, ์ˆซ์ž, ํ•˜์ดํ”ˆ, ์ , ๋ฐ‘์ค„์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

value

value๋Š” ์ตœ๋Œ€ 63 ์ž์˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ๊ฐ’์€ ๋ฌธ์ž ๋˜๋Š” ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฌธ์ž, ์ˆซ์ž, ํ•˜์ดํ”ˆ, ์ , ๋ฐ‘์ค„์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

effect

๋‹ค์Œ ๋ช…๋ น ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

NoSchedule [1]

  • ํ…Œ์ธํŠธ์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ƒˆ pod๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋…ธ๋“œ์˜ ๊ธฐ์กด pod๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

PreferNoSchedule

  • ํ…Œ์ธํŠธ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ƒˆ pod๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋…ธ๋“œ์˜ ๊ธฐ์กด pod๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

NoExecute

  • ํ…Œ์ธํŠธ์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ƒˆ pod๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ผ์น˜ํ•˜๋Š” ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์ด ์—†๋Š” ๋…ธ๋“œ์˜ ๊ธฐ์กด pod๋Š” ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

operator

Equal

key/value/effect ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ผ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

Exists

key/effect ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ผ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ๋นˆ value ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‚จ๊ฒจ ๋‘์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  1. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์— NoSchedule ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” node-role.kubernetes.io/master=:NoSchedule ํ…Œ์ธํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Node
    metadata:
      annotations:
        machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0
        machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c
      name: my-node
    #...
    spec:
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    #...

ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์€ ํ…Œ์ธํŠธ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • operator ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Equal๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ:

    • key ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
    • value ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
    • effect ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • operator ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Exists๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ:

    • key ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
    • effect ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ…Œ์ธํŠธ๋Š” OpenShift Container Platform์— ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

  • node.kubernetes.io/not-ready: ๋…ธ๋“œ๊ฐ€ ์ค€๋น„ ์ƒํƒœ์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋…ธ๋“œ ์กฐ๊ฑด Ready=False์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • node.kubernetes.io/unreachable: ๋…ธ๋“œ๊ฐ€ ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋…ธ๋“œ ์กฐ๊ฑด Ready=Unknown์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • node.kubernetes.io/memory-pressure: ๋…ธ๋“œ์— ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋…ธ๋“œ ์กฐ๊ฑด MemoryPressure=True์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • node.kubernetes.io/disk-pressure: ๋…ธ๋“œ์— ๋””์Šคํฌ ๋ถ€์กฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋…ธ๋“œ ์กฐ๊ฑด DiskPressure=True์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • node.kubernetes.io/network-unavailable: ๋…ธ๋“œ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • node.kubernetes.io/unschedulable: ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • node.cloudprovider.kubernetes.io/uninitialized: ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋กœ ์‹œ์ž‘๋˜๋ฉด ์ด ํ…Œ์ธํŠธ ๋…ธ๋“œ์— ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. cloud-controller-manager์˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ด ๋…ธ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด kubelet์ด ์ด ํ…Œ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • node.kubernetes.io/pid-pressure: ๋…ธ๋“œ์— pid ์••๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋…ธ๋“œ ์กฐ๊ฑด PIDPressure=True ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

    ์ค‘์š”

    OpenShift Container Platform์€ ๊ธฐ๋ณธ pid.available evictionHard ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4.6.1.1. tolerationSeconds๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ pod ์ œ๊ฑฐ๋ฅผ ์ง€์—ฐํ•˜๋Š” ๋ฐฉ๋ฒ•

Pod ์‚ฌ์–‘ ๋˜๋Š” MachineSet ์˜ค๋ธŒ์ ํŠธ์— tolerationSeconds ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด Pod๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์ „์— ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ์‹œ๊ฐ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NoExecute ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ํ…Œ์ธํŠธ๊ฐ€ tolerationSeconds ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Pod์ธ ๋…ธ๋“œ์— ์ถ”๊ฐ€๋˜๋ฉด ํ•ด๋‹น ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋  ๋•Œ๊นŒ์ง€ Pod๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์˜ˆ

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoExecute"
    tolerationSeconds: 3600
#...

์—ฌ๊ธฐ์—์„œ ์ด Pod๊ฐ€ ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ ์ผ์น˜ํ•˜๋Š” ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์—†์œผ๋ฉด Pod๋Š” 3,600์ดˆ ๋™์•ˆ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ๋œ ํ›„ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„ ์ด์ „์— ํ…Œ์ธํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด pod๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4.6.1.2. ์—ฌ๋Ÿฌ ํ…Œ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋™์ผํ•œ ๋…ธ๋“œ์— ์—ฌ๋Ÿฌ ํ…Œ์ธํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ๋™์ผํ•œ pod์— ์—ฌ๋Ÿฌ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenShift Container Platform์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ํ…Œ์ธํŠธ ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  1. Pod์— ์ผ์น˜ํ•˜๋Š” ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์ด ์žˆ๋Š” ํ…Œ์ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‚˜๋จธ์ง€ ์ผ์น˜ํ•˜์ง€ ํ…Œ์ธํŠธ๋Š” pod์—์„œ ๋‹ค์Œ effect๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

    • effect๊ฐ€ NoSchedule์ธ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ…Œ์ธํŠธ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์žˆ๋Š” ๊ฒฝ์šฐ OpenShift Container Platform์€ ํ•ด๋‹น ๋…ธ๋“œ์— pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • effect๊ฐ€ NoSchedule์ธ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ…Œ์ธํŠธ๊ฐ€ ์—†์ง€๋งŒ effect๊ฐ€ PreferNoSchedule์ธ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ…Œ์ธํŠธ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์žˆ๋Š” ๊ฒฝ์šฐ, OpenShift ์ปจํ…Œ์ด๋„ˆ ํ”Œ๋žซํผ์€ ๋…ธ๋“œ์— pod๋ฅผ ์˜ˆ์•ฝ ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ํšจ๊ณผ๊ฐ€ NoExecute์ธ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ…Œ์ธํŠธ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ OpenShift Container Platform์€ Pod๊ฐ€ ๋…ธ๋“œ์—์„œ ์ด๋ฏธ ์‹คํ–‰๋˜๊ณ  ์žˆ์œผ๋ฉด ๋…ธ๋“œ์—์„œ Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Pod๊ฐ€ ๋…ธ๋“œ์—์„œ ์•„์ง ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด Pod๊ฐ€ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

      • ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ Pod๋Š” ์ฆ‰์‹œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
      • Pod ์‚ฌ์–‘์— tolerationSeconds๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€ ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Pod๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
      • tolerationSeconds๊ฐ€ ์ง€์ •๋œ ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Pod๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฐ”์ธ๋”ฉ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ์— ๋‹ค์Œ ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm taint nodes node1 key1=value1:NoSchedule
    $ oc adm taint nodes node1 key1=value1:NoExecute
    $ oc adm taint nodes node1 key2=value2:NoSchedule
  • Pod์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key1"
        operator: "Equal"
        value: "value1"
        effect: "NoSchedule"
      - key: "key1"
        operator: "Equal"
        value: "value1"
        effect: "NoExecute"
    #...

์ด ๊ฒฝ์šฐ ์„ธ ๋ฒˆ์งธ ํ…Œ์ธํŠธ์™€ ์ผ์น˜ํ•˜๋Š” ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— pod๋ฅผ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ํ…Œ์ธํŠธ๋Š” pod์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์„ธ ๋ฒˆ์งธ ํ…Œ์ธํŠธ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ธํŠธ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ ๋…ธ๋“œ์—์„œ ์ด๋ฏธ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ pod๊ฐ€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

4.6.1.3. Pod ์˜ˆ์•ฝ ๋ฐ ๋…ธ๋“œ ์ƒํƒœ (taint node by condition)

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

์Šค์ผ€์ค„๋Ÿฌ๋Š” pod๋ฅผ ์˜ˆ์•ฝํ•˜๊ธฐ ์ „์— ๋…ธ๋“œ์—์„œ ์ด๋Ÿฌํ•œ ํ…Œ์ธํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ pod๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์‹ค์ œ ๋…ธ๋“œ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ํ…Œ์ธํŠธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ pod ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋…ธ๋“œ ์ƒํƒœ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ๋ชฌ ์„ธํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋“  ๋ฐ๋ชฌ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • node.kubernetes.io/memory-pressure
  • node.kubernetes.io/disk-pressure
  • node.kubernetes.io/unschedulable (1.10 ์ด์ƒ)
  • node.kubernetes.io/network-unavailable (ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ ๋งŒ)

๋ฐ๋ชฌ ์„ธํŠธ์— ์ž„์˜์˜ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ QoS ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” Pod์— node.kubernetes.io/memory-pressure ํ—ˆ์šฉ ์˜ค์ฐจ๋„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Kubernetes๊ฐ€ Guaranteed ๋˜๋Š” Burstable QoS ํด๋ž˜์Šค์—์„œ Pod๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ƒˆ BestEffort Pod๋Š” ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4.6.1.4. ์ƒํƒœ ๋ณ„ pod ์ œ๊ฑฐ (taint-based evictions)

๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋œ Taint-Based Evictions ๊ธฐ๋Šฅ์€ not-ready ๋ฐ unreachable๊ณผ ๊ฐ™์€ ํŠน์ • ์ƒํƒœ์— ์žˆ๋Š” ๋…ธ๋“œ์—์„œ Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ์ด๋Ÿฌํ•œ ์ƒํƒœ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด OpenShift Container Platform์€ ์ž๋™์œผ๋กœ ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  pod๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋‹ค๋ฅธ ๋„๋“œ์—์„œ ๋‹ค์‹œ ์˜ˆ์•ฝํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Taint Based Evictions์—๋Š” NoExecute ํšจ๊ณผ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” Pod๋Š” ์ฆ‰์‹œ ์ œ๊ฑฐ๋˜๊ณ  ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ชจ๋“  Pod๋Š” tolerationSeconds ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

tolerationSeconds ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋…ธ๋“œ ์กฐ๊ฑด์ด ์„ค์ •๋œ ๋…ธ๋“œ์— Pod๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. tolerationSeconds ๊ธฐ๊ฐ„ ํ›„์—๋„ ์ด ์ƒํƒœ๊ฐ€ ๊ณ„์†๋˜๋ฉด ํ…Œ์ธํŠธ๊ฐ€ ๋…ธ๋“œ์— ๋‚จ์•„ ์žˆ๊ณ  ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์ผ์น˜ํ•˜๋Š” Pod๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. tolerationSeconds ๊ธฐ๊ฐ„ ์ „์— ์ƒํƒœ ์กฐ๊ฑด์ด ์ง€์›Œ์ง€๋ฉด ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์ผ์น˜ํ•˜๋Š” Pod๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ’์ด ์—†๋Š” tolerationSeconds ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ค€๋น„๋˜์ง€ ์•Š๊ณ  ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ ์ƒํƒœ๋กœ ์ธํ•ด Pod๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

OpenShift Container Platform์€ ์†๋„๊ฐ€ ์ œํ•œ๋œ ๋ฐฉ์‹์œผ๋กœ pod๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋…ธ๋“œ์—์„œ ๋ถ„ํ• ๋˜๋Š” ๋“ฑ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋Œ€๊ทœ๋ชจ pod ์ œ๊ฑฐ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์ •๋œ ์˜์—ญ์˜ ๋…ธ๋“œ ์ค‘ 5 % ์ด์ƒ์ด ๋น„์ •์ƒ์ด๋ฉด ๋…ธ๋“œ ๋ผ์ดํ”„์‚ฌ์ดํด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํ•ด๋‹น ์˜์—ญ์˜ ์ƒํƒœ๋ฅผ PartialDisruption ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  Pod ์ œ๊ฑฐ ๋น„์œจ์ด ๊ฐ์†Œ๋ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์˜ ์†Œ๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ(๊ธฐ๋ณธ์ ์œผ๋กœ 50๊ฐœ ๋…ธ๋“œ ์ดํ•˜)์˜ ๊ฒฝ์šฐ ์ด ์˜์—ญ์˜ ๋…ธ๋“œ๋Š” ํ…Œ์ธํŠธ๋˜์ง€ ์•Š๊ณ  ์ œ๊ฑฐ๊ฐ€ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubernetes ์„ค๋ช…์„œ ์˜ ์ œ๊ฑฐ์— ๋Œ€ํ•œ ์†๋„ ์ œํ•œ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Pod ๊ตฌ์„ฑ์—์„œ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ OpenShift Container Platform์€ ์ž๋™์œผ๋กœ node.kubernetes.io/not-ready ๋ฐ node.kubernetes.io/unreachable์˜ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ tolerationSeconds=300์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - key: node.kubernetes.io/not-ready
    operator: Exists
    effect: NoExecute
    tolerationSeconds: 300 1
  - key: node.kubernetes.io/unreachable
    operator: Exists
    effect: NoExecute
    tolerationSeconds: 300
#...
1
์ด๋Ÿฌํ•œ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์€ ์ด๋Ÿฌํ•œ ๋…ธ๋“œ ์ƒํƒœ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ฐ์ง€๋œ ํ›„ ๊ธฐ๋ณธ pod ๋™์ž‘์„ 5 ๋ถ„ ๋™์•ˆ ๋ฐ”์ธ๋”ฉ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‹ค์ˆ˜์˜ ๋กœ์ปฌ ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ๋“ฑ์— ๋”ฐ๋ผ pod๋ฅผ ๋…ธ๋“œ์— ๋” ์˜ค๋ž˜ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ํŒŒํ‹ฐ์…˜์„ ๋ณต๊ตฌํ•˜๊ณ  pod ์ œ๊ฑฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ๋ชฌ ์„ธํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋œ Pod๋Š” tolerationSeconds๊ฐ€ ์—†๋Š” ๋‹ค์Œ ํ…Œ์ธํŠธ์˜ NoExecute ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • node.kubernetes.io/unreachable
  • node.kubernetes.io/not-ready

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋…ธ๋“œ ์ƒํƒœ๋กœ ์ธํ•ด ๋ฐ๋ชฌ ์„ธํŠธ Pod๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4.6.1.5. ๋ชจ๋“  ํ…Œ์ธํŠธ ํ—ˆ์šฉ

key ๋ฐ values ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด operator: "Exists" ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋“  ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก Pod๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์žˆ๋Š” Pod๋Š” ํ…Œ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Pod ์‚ฌ์–‘

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - operator: "Exists"
#...

4.6.2. ํ…Œ์ธํŠธ ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜ ์ถ”๊ฐ€

Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•˜๊ฑฐ๋‚˜ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” Pod๋ฅผ ๋…ธ๋“œ์—์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด Pod ๋ฐ ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ ๋จผ์ € Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๋…ธ๋“œ์—์„œ Pod๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. tolerations ์Šคํƒ ์ž๋ฅผ ํฌํ•จํ•˜๋„๋ก Pod ์‚ฌ์–‘์„ ํŽธ์ง‘ํ•˜์—ฌ Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    Equal ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” Pod ๊ตฌ์„ฑ ํŒŒ์ผ ์ƒ˜ํ”Œ

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key1" 1
        value: "value1"
        operator: "Equal"
        effect: "NoExecute"
        tolerationSeconds: 3600 2
    #...

    1
    ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ ๊ตฌ์„ฑ ์š”์†Œ ํ…Œ์ด๋ธ”์— ์„ค๋ช…๋œ ํ—ˆ์šฉ ์˜ค์ฐจ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
    2
    tolerationSeconds ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์—ฌ pod๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    Exists ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” Pod ๊ตฌ์„ฑ ํŒŒ์ผ ์ƒ˜ํ”Œ

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
       tolerations:
        - key: "key1"
          operator: "Exists" 1
          effect: "NoExecute"
          tolerationSeconds: 3600
    #...

    1
    Exists ์—ฐ์‚ฐ์ž๋Š” value๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์ด ์˜ˆ์—์„œ๋Š” key key1, value value1, ํ…Œ์ธํŠธ effect NoExecute๋ฅผ ๊ฐ–๋Š” node1์— ํ…Œ์ธํŠธ๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ ๊ตฌ์„ฑ ์š”์†Œ ํ…Œ์ด๋ธ”์— ์„ค๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm taint nodes <node_name> <key>=<value>:<effect>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc adm taint nodes node1 key1=value1:NoExecute

    ์ด ๋ช…๋ น์€ ํ‚ค๊ฐ€ key1, ๊ฐ’์ด value1, ํšจ๊ณผ๊ฐ€ NoExecute์ธ node1์— ํ…Œ์ธํŠธ๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์— NoSchedule ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” node-role.kubernetes.io/master=:NoSchedule ํ…Œ์ธํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Node
    metadata:
      annotations:
        machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0
        machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c
      name: my-node
    #...
    spec:
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    #...

    Pod์˜ ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ๋…ธ๋“œ์˜ ํ…Œ์ธํŠธ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ ์˜ค์ฐจ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” Pod๋ฅผ node1์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.6.2.1. ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ ์ถ”๊ฐ€

๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MachineSet ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ํ…Œ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ ์˜ค์ฐจ๋Š” ๋…ธ๋“œ์— ์ง์ ‘ ์ถ”๊ฐ€๋œ ํ…Œ์ธํŠธ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋จธ์‹  ์„ธํŠธ์— ์˜ํ•ด ์ถ”๊ฐ€๋œ ํ…Œ์ธํŠธ์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. tolerations ์Šคํƒ ์ž๋ฅผ ํฌํ•จํ•˜๋„๋ก Pod ์‚ฌ์–‘์„ ํŽธ์ง‘ํ•˜์—ฌ Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    Equal ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” Pod ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์˜ˆ

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key1" 1
        value: "value1"
        operator: "Equal"
        effect: "NoExecute"
        tolerationSeconds: 3600 2
    #...

    1
    ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ ๊ตฌ์„ฑ ์š”์†Œ ํ…Œ์ด๋ธ”์— ์„ค๋ช…๋œ ํ—ˆ์šฉ ์˜ค์ฐจ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
    2
    tolerationSeconds ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Pod๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    Exists ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” pod ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์˜ˆ

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key1"
        operator: "Exists"
        effect: "NoExecute"
        tolerationSeconds: 3600
    #...

  2. MachineSet ์˜ค๋ธŒ์ ํŠธ์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    1. ํ…Œ์ธํŠธํ•  ๋…ธ๋“œ์˜ MachineSet YAML์„ ํŽธ์ง‘ํ•˜๊ฑฐ๋‚˜ ์ƒˆ MachineSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      $ oc edit machineset <machineset>
    2. spec.template.spec ์„น์…˜์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      ๋จธ์‹  ์„ธํŠธ ์‚ฌ์–‘์˜ ํ…Œ์ธํŠธ ์˜ˆ

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        name: my-machineset
      #...
      spec:
      #...
        template:
      #...
          spec:
            taints:
            - effect: NoExecute
              key: key1
              value: value1
      #...

      ์ด ์˜ˆ์ œ์—์„œ๋Š” ํ‚ค๊ฐ€ key1, ๊ฐ’์ด value1, ํ…Œ์ธํŠธ ํšจ๊ณผ๊ฐ€ NoExecute์ธ ํ…Œ์ธํŠธ๋ฅผ ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

    3. ๋จธ์‹  ์„ธํŠธ๋ฅผ 0 ์œผ๋กœ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค.

      $ oc scale --replicas=0 machineset <machineset> -n openshift-machine-api
      ์ž‘์€ ์ •๋ณด

      ๋˜๋Š” ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋จธ์‹  ์„ธํŠธ๋ฅผ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        name: <machineset>
        namespace: openshift-machine-api
      spec:
        replicas: 0

      ๋จธ์‹ ์ด ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

    4. ํ•„์š”์— ๋”ฐ๋ผ ๋จธ์‹  ์„ธํŠธ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

      $ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api

      ๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc edit machineset <machineset> -n openshift-machine-api

      ๋จธ์‹ ์ด ์‹œ์ž‘๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ํ…Œ์ธํŠธ๋Š” MachineSet ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

4.6.2.2. ํ…Œ์ธํŠธ ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ

ํŠน์ • ์‚ฌ์šฉ์ž ์ง‘ํ•ฉ์—์„œ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋…ธ๋“œ ์„ธํŠธ๋ฅผ ์ „์šฉ์œผ๋กœ ์ง€์ •ํ•˜๋ ค๋ฉด ํ•ด๋‹น Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ๋…ธ๋“œ์— ํ•ด๋‹น ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์žˆ๋Š” Pod๋Š” ํ…Œ์ธํŠธ๋œ ๋…ธ๋“œ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ธฐํƒ€ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ…Œ์ธํŠธ๋œ ๋…ธ๋“œ์—๋งŒ Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ๋™์ผํ•œ ๋…ธ๋“œ ์„ธํŠธ์—๋„ ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋…ธ๋“œ์—๋งŒ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋„๋ก Pod์— ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•ด๋‹น ๋…ธ๋“œ์— ํ•ด๋‹น ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc adm taint nodes node1 dedicated=groupName:NoSchedule
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    kind: Node
    apiVersion: v1
    metadata:
      name: my-node
    #...
    spec:
      taints:
        - key: dedicated
          value: groupName
          effect: NoSchedule
    #...
  2. ์‚ฌ์šฉ์ž ์ •์˜ ์Šน์ธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
4.6.2.3. ๋…ธ๋“œ ์„ ํƒ๊ธฐ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๋…ธ๋“œ ์„ ํƒ๊ธฐ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์— Pod ๋ฐฐ์น˜๋ฅผ ์ œ์–ดํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ ์ƒ์„ฑ๋œ ํ›„์† ๋ฆฌ์†Œ์Šค๋Š” ํ—ˆ์šฉ ์˜ค์ฐจ์™€ ์ผ์น˜ํ•˜๋Š” ํ…Œ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ํŽธ์ง‘ํ•˜์—ฌ ๋…ธ๋“œ ์„ ํƒ์˜ ๋ ˆ์ด๋ธ”์ด ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ์— ์ถ”๊ฐ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ํŽธ์ง‘ํ•˜์—ฌ ํ…Œ์ธํŠธ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ์— ์ถ”๊ฐ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. metadata.annotations ์„น์…˜์—์„œ ๋…ธ๋“œ ์„ ํƒ๊ธฐ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ง€์ •ํ•˜์—ฌ Project ๋ฆฌ์†Œ์Šค ์ •์˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    project.yaml ํŒŒ์ผ ์˜ˆ

    kind: Project
    apiVersion: project.openshift.io/v1
    metadata:
      name: <project_name> 1
      annotations:
        openshift.io/node-selector: '<label>' 2
        scheduler.alpha.kubernetes.io/defaultTolerations: >-
          [{"operator": "Exists", "effect": "NoSchedule", "key":
          "<key_name>"} 3
          ]

    1
    ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    2
    ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ ๋ ˆ์ด๋ธ”์ž…๋‹ˆ๋‹ค.
    3
    ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ ๊ตฌ์„ฑ ์š”์†Œ ํ…Œ์ด๋ธ”์— ์„ค๋ช…๋œ ํ—ˆ์šฉ ์˜ค์ฐจ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋…ธ๋“œ์˜ ๊ธฐ์กด pod๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” NoSchedule ํšจ๊ณผ์™€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Exists ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. oc apply ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc apply -f project.yaml

<project_name> ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ƒ์„ฑ๋œ ํ›„์† ๋ฆฌ์†Œ์Šค๋Š” ์ด์ œ ์ง€์ •๋œ ๋…ธ๋“œ์—์„œ ์˜ˆ์•ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4.6.2.4. ํ…Œ์ธํŠธ ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๋กœ ๋…ธ๋“œ ์ œ์–ด

์†Œ๊ทœ๋ชจ ๋…ธ๋“œ ํ•˜์œ„ ์ง‘ํ•ฉ์— ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ Pod๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ํ•„์š”ํ•œ Pod๋ฅผ ์œ„ํ•ด ๋…ธ๋“œ๋ฅผ ๋‚จ๊ฒจ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํŠน์ • ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ํ•„์š”ํ•œ Pod๋ฅผ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์€ ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ํ•„์š”ํ•œ Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํ…Œ์ธํŠธํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํŠน์ • Pod์šฉ์œผ๋กœ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ํ•„์š”ํ•œ Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
        - key: "disktype"
          value: "ssd"
          operator: "Equal"
          effect: "NoSchedule"
          tolerationSeconds: 3600
    #...
  2. ๋‹ค์Œ ๋ช…๋ น ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm taint nodes <node-name> disktype=ssd:NoSchedule

    ๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm taint nodes <node-name> disktype=ssd:PreferNoSchedule
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    kind: Node
    apiVersion: v1
    metadata:
      name: my_node
    #...
    spec:
      taints:
        - key: disktype
          value: ssd
          effect: PreferNoSchedule
    #...

4.6.3. ํ…Œ์ธํŠธ ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜ ์ œ๊ฑฐ

ํ•„์š”์— ๋”ฐ๋ผ ๋…ธ๋“œ์—์„œ ํ…Œ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  Pod์—์„œ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋จผ์ € Pod์— ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๋…ธ๋“œ์—์„œ Pod๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

ํ…Œ์ธํŠธ ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋…ธ๋“œ์—์„œ ํ…Œ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm taint nodes <node-name> <key>-

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc adm taint nodes ip-10-0-132-248.ec2.internal key1-

    ์ถœ๋ ฅ ์˜ˆ

    node/ip-10-0-132-248.ec2.internal untainted

  2. Pod์—์„œ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด Pod ์‚ฌ์–‘์„ ํŽธ์ง‘ํ•˜์—ฌ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key2"
        operator: "Exists"
        effect: "NoExecute"
        tolerationSeconds: 3600
    #...

4.7. ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์— Pod ๋ฐฐ์น˜

๋…ธ๋“œ ์„ ํƒ๊ธฐ๋Š” ๋…ธ๋“œ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ๋ฒจ ๋ฐ Pod์— ์ง€์ •๋œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•œ ํ‚ค/๊ฐ’ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋งต์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์—์„œ Pod๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋…ธ๋“œ์˜ ๋ผ๋ฒจ๊ณผ ๋™์ผํ•œ ํ‚ค/๊ฐ’ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ Pod์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4.7.1. ๋…ธ๋“œ ์„ ํƒ๊ธฐ ์ •๋ณด

Pod์˜ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ๋…ธ๋“œ์˜ ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๊ฐ€ ์˜ˆ์•ฝ๋˜๋Š” ์œ„์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด OpenShift Container Platform์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ํฌํ•จ๋œ ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์— ํŠน์ • Pod๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํŠน์ • ๋…ธ๋“œ์— ์ƒˆ Pod๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ , ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์˜ ํ”„๋กœ์ ํŠธ์— ์ƒˆ Pod๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ง€๋ฆฌ์ ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ์—๋งŒ Pod๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ”„๋ผ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋‘ ์ง€์—ญ์— ๋ถ„๋ฐฐ๋œ ๋ฐ์ดํ„ฐ์„ผํ„ฐ 5๊ฐœ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฏธ๊ตญ์—์„œ๋Š” ๋…ธ๋“œ์˜ ๋ผ๋ฒจ์„ us-east, us-central ๋˜๋Š” us-west๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์•„์‹œ์•„ ํƒœํ‰์–‘ ์ง€์—ญ(APAC)์—์„œ๋Š” ๋…ธ๋“œ์˜ ๋ผ๋ฒจ์„ apac-east ๋˜๋Š” apac-west๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ƒ์„ฑํ•œ Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น ๋…ธ๋“œ์— Pod๊ฐ€ ์˜ˆ์•ฝ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pod ์˜ค๋ธŒ์ ํŠธ์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘์š”

๋™์ผํ•œ Pod ๊ตฌ์„ฑ์˜ ๋…ธ๋“œ ์„ ํƒ๊ธฐ ๋ฐ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ ๋‹ค์Œ ๊ทœ์น™์—์„œ ๋…ธ๋“œ์— ๋Œ€ํ•œ Pod ๋ฐฐ์น˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

  • nodeSelector์™€ nodeAffinity๋ฅผ ๋‘˜ ๋‹ค ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ํ›„๋ณด ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • nodeAffinity ์œ ํ˜•๊ณผ ์—ฐ๊ฒฐ๋œ nodeSelectorTerms๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ nodeSelectorTerms ์ค‘ ํ•˜๋‚˜๋ฅผ ์ถฉ์กฑํ•˜๋ฉด Pod๋ฅผ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • nodeSelectorTerms์™€ ์—ฐ๊ฒฐ๋œ matchExpressions๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  matchExpressions๋ฅผ ์ถฉ์กฑํ•  ๋•Œ๋งŒ Pod๋ฅผ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠน์ • Pod ๋ฐ ๋…ธ๋“œ์˜ ๋…ธ๋“œ ์„ ํƒ๊ธฐ

๋…ธ๋“œ ์„ ํƒ๊ธฐ ๋ฐ ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • Pod๊ฐ€ ์˜ˆ์•ฝ๋œ ๋…ธ๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Pod์˜ ์ผ์ •์ด ์กฐ์ •๋˜์ง€ ์•Š๋„๋ก ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•œ ๋‹ค์Œ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ Pod์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ์•ฝ๋œ ๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ๊ตฌ์„ฑ๊ณผ ๊ฐ™์ด Pod๋ฅผ ์ œ์–ดํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ Node ์˜ค๋ธŒ์ ํŠธ์—๋Š” region: east ๋ผ๋ฒจ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ๋ฒจ์ด ์žˆ๋Š” Node ์˜ค๋ธŒ์ ํŠธ ์ƒ˜ํ”Œ

kind: Node
apiVersion: v1
metadata:
  name: ip-10-0-131-14.ec2.internal
  selfLink: /api/v1/nodes/ip-10-0-131-14.ec2.internal
  uid: 7bc2580a-8b8e-11e9-8e01-021ab4174c74
  resourceVersion: '478704'
  creationTimestamp: '2019-06-10T14:46:08Z'
  labels:
    kubernetes.io/os: linux
    failure-domain.beta.kubernetes.io/zone: us-east-1a
    node.openshift.io/os_version: '4.5'
    node-role.kubernetes.io/worker: ''
    failure-domain.beta.kubernetes.io/region: us-east-1
    node.openshift.io/os_id: rhcos
    beta.kubernetes.io/instance-type: m4.large
    kubernetes.io/hostname: ip-10-0-131-14
    beta.kubernetes.io/arch: amd64
    region: east 1
    type: user-node
#...

1
Pod ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.

Pod์—๋Š” type: user-node,region: east ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” Pod ์˜ค๋ธŒ์ ํŠธ ์ƒ˜ํ”Œ

apiVersion: v1
kind: Pod
metadata:
  name: s1
#...
spec:
  nodeSelector: 1
    region: east
    type: user-node
#...

1
๋…ธ๋“œ ๋ผ๋ฒจ๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ์—๋Š” ๊ฐ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์— ๋Œ€ํ•œ ๋ ˆ์ด๋ธ”์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ Pod ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์˜ˆ์ œ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ

๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ OpenShift Container Platform์—์„œ ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ Pod์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์—์„œ Pod๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ Scheduler ์˜ค๋ธŒ์ ํŠธ์—๋Š” ๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ region=east ๋ฐ type=user-node ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ Operator ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์˜ ์˜ˆ

apiVersion: config.openshift.io/v1
kind: Scheduler
metadata:
  name: cluster
#...
spec:
  defaultNodeSelector: type=user-node,region=east
#...

ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ์—๋Š” type=user-node,region=east ๋ผ๋ฒจ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Node ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: v1
kind: Node
metadata:
  name: ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4
#...
  labels:
    region: east
    type: user-node
#...

๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” Pod ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: v1
kind: Pod
metadata:
  name: s1
#...
spec:
  nodeSelector:
    region: east
#...

์˜ˆ์ œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ˆ์ œ Pod ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Pod๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜์–ด ๋ผ๋ฒจ์ด ์ง€์ •๋œ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.

Pod๊ฐ€ ๋ผ๋ฒจ์ด ์ง€์ •๋œ ๋…ธ๋“œ์— ์žˆ๋Š” Pod ๋ชฉ๋ก์˜ ์˜ˆ

NAME     READY   STATUS    RESTARTS   AGE   IP           NODE                                       NOMINATED NODE   READINESS GATES
pod-s1   1/1     Running   0          20s   10.131.2.6   ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4   <none>           <none>

์ฐธ๊ณ 

Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์„ ํƒ๊ธฐ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. Pod์— ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์—†์œผ๋ฉด Pod๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์˜ˆ์•ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ

ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ํ”„๋กœ์ ํŠธ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ OpenShift Container Platform์—์„œ Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ผ๋ฒจ์ด ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—๋Š” region=east ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Namespace ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: v1
kind: Namespace
metadata:
  name: east-region
  annotations:
    openshift.io/node-selector: "region=east"
#...

๋‹ค์Œ ๋…ธ๋“œ์—๋Š” type=user-node,region=east ๋ผ๋ฒจ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Node ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: v1
kind: Node
metadata:
  name: ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4
#...
  labels:
    region: east
    type: user-node
#...

์ด ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์˜ˆ์ œ Pod ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Pod๊ฐ€ ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜์–ด ๋ผ๋ฒจ์ด ์ง€์ •๋œ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.

Pod ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: v1
kind: Pod
metadata:
  namespace: east-region
#...
spec:
  nodeSelector:
    region: east
    type: user-node
#...

Pod๊ฐ€ ๋ผ๋ฒจ์ด ์ง€์ •๋œ ๋…ธ๋“œ์— ์žˆ๋Š” Pod ๋ชฉ๋ก์˜ ์˜ˆ

NAME     READY   STATUS    RESTARTS   AGE   IP           NODE                                       NOMINATED NODE   READINESS GATES
pod-s1   1/1     Running   0          20s   10.131.2.6   ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4   <none>           <none>

Pod์— ๋‹ค๋ฅธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ์˜ Pod๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์˜ˆ์•ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ Pod๋ฅผ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ์— ๋ฐฐํฌํ•˜๋ฉด Pod๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ Pod ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

apiVersion: v1
kind: Pod
metadata:
  name: west-region
#...
spec:
  nodeSelector:
    region: west
#...

4.7.2. ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฐฐ์น˜ ์ œ์–ด

Pod์˜ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ๋…ธ๋“œ์˜ ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๊ฐ€ ์˜ˆ์•ฝ๋˜๋Š” ์œ„์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด OpenShift Container Platform์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ํฌํ•จ๋œ ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ, ๋จธ์‹  ์„ธํŠธ ๋˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ์„ธํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹ ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹ ์ด ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์— ์ถ”๊ฐ€๋œ ๋ผ๋ฒจ์ด ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ReplicaSet ์˜ค๋ธŒ์ ํŠธ, DaemonSet ์˜ค๋ธŒ์ ํŠธ, StatefulSet ์˜ค๋ธŒ์ ํŠธ, Deployment ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” DeploymentConfig ์˜ค๋ธŒ์ ํŠธ์™€ ๊ฐ™์ด ํ•ด๋‹น Pod์˜ ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ ์•„๋ž˜์˜ ๊ธฐ์กด Pod๋Š” ๋ผ๋ฒจ์ด ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ์—์„œ ์žฌ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ Pod ์‚ฌ์–‘์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod์— ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ์‚ญ์ œํ•˜๊ณ  Pod ์‚ฌ์–‘์„ ํŽธ์ง‘ํ•˜๊ณ  Pod๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ์•ฝ๋œ ๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํ•ด๋‹น Pod์˜ ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด router-default-66d5cf9464-m2g75 Pod๋Š” router-default-66d5cf9464 ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

$ oc describe pod router-default-66d5cf9464-7pwkc

์ถœ๋ ฅ ์˜ˆ

kind: Pod
apiVersion: v1
metadata:
#...
Name:               router-default-66d5cf9464-7pwkc
Namespace:          openshift-ingress
# ...
Controlled By:      ReplicaSet/router-default-66d5cf9464
# ...

์›น ์ฝ˜์†”์—์„œ Pod YAML์˜ ownerReferences ์•„๋ž˜์— ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: router-default-66d5cf9464-7pwkc
# ...
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: router-default-66d5cf9464
      uid: d81dd094-da26-11e9-a48a-128e7edf0312
      controller: true
      blockOwnerDeletion: true
# ...

ํ”„๋กœ์„ธ์Šค

  1. ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ํŽธ์ง‘ํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋จธ์‹  ์„ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด MachineSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      1. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ MachineSet ์˜ค๋ธŒ์ ํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc patch MachineSet abc612-msrtw-worker-us-east-1c  --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        ์ž‘์€ ์ •๋ณด

        ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋จธ์‹  ์„ธํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: xf2bd-infra-us-east-2a
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
        #...
      2. oc edit ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ๋ฒจ์ด MachineSet ์˜ค๋ธŒ์ ํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc edit MachineSet abc612-msrtw-worker-us-east-1c -n openshift-machine-api

        MachineSet ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        
        # ...
        
        spec:
        # ...
          template:
            metadata:
        # ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node
        # ...

    • ๋ผ๋ฒจ์„ ๋…ธ๋“œ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      1. ๋…ธ๋“œ์˜ Node ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

        $ oc label nodes <name> <key>=<value>

        ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

        $ oc label nodes ip-10-0-142-25.ec2.internal type=user-node region=east
        ์ž‘์€ ์ •๋ณด

        ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

        kind: Node
        apiVersion: v1
        metadata:
          name: hello-node-6fbccf8d9
          labels:
            type: "user-node"
            region: "east"
        #...
      2. ๋ผ๋ฒจ์ด ๋…ธ๋“œ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        $ oc get nodes -l type=user-node,region=east

        ์ถœ๋ ฅ ์˜ˆ

        NAME                          STATUS   ROLES    AGE   VERSION
        ip-10-0-142-25.ec2.internal   Ready    worker   17m   v1.23.0

  2. Pod์— ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ธฐ์กด ๋ฐ ํ–ฅํ›„ Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Pod์˜ ์ œ์–ด ์˜ค๋ธŒ์ ํŠธ์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      ๋ผ๋ฒจ์ด ์žˆ๋Š” ReplicaSet ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

      kind: ReplicaSet
      apiVersion: apps/v1
      metadata:
        name: hello-node-6fbccf8d9
      # ...
      spec:
      # ...
        template:
          metadata:
            creationTimestamp: null
            labels:
              ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
              pod-template-hash: 66d5cf9464
          spec:
            nodeSelector:
              kubernetes.io/os: linux
              node-role.kubernetes.io/worker: ''
              type: user-node 1
      #...

      1
      ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ํŠน์ • ์ƒˆ Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์„ ํƒ๊ธฐ๋ฅผ Pod ์˜ค๋ธŒ์ ํŠธ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” Pod ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

      apiVersion: v1
      kind: Pod
      metadata:
        name: hello-node-6fbccf8d9
      #...
      spec:
        nodeSelector:
          region: east
          type: user-node
      #...

      ์ฐธ๊ณ 

      ์˜ˆ์•ฝ๋œ ๊ธฐ์กด Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

4.7.3. ๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ ์ƒ์„ฑ

Pod์˜ ๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ๋…ธ๋“œ์˜ ๋ผ๋ฒจ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  Pod๋ฅผ ํŠน์ • ๋…ธ๋“œ๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•˜๋ฉด OpenShift Container Platform์—์„œ ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ Pod์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋ผ๋ฒจ์ด ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

Scheduler Operator CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ํŽธ์ง‘ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ, ๋จธ์‹  ์„ธํŠธ ๋˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ์„ธํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹ ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹ ์ด ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์— ์ถ”๊ฐ€๋œ ๋ผ๋ฒจ์ด ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Pod์— ํ‚ค/๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ ํ‚ค์—๋Š” ๋‹ค๋ฅธ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. Scheduler Operator CR์„ ํŽธ์ง‘ํ•˜์—ฌ ๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit scheduler cluster

    ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Scheduler Operator CR์˜ ์˜ˆ

    apiVersion: config.openshift.io/v1
    kind: Scheduler
    metadata:
      name: cluster
    ...
    spec:
      defaultNodeSelector: type=user-node,region=east 1
      mastersSchedulable: false

    1
    ์ ์ ˆํ•œ <key>:<value> ์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    ๋ณ€๊ฒฝ ํ›„ openshift-kube-apiserver ํ”„๋กœ์ ํŠธ์˜ pod๊ฐ€ ์žฌ๋ฐฐํฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋Š” Pod๊ฐ€ ์žฌ๋ฐฐํฌ๋œ ํ›„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  2. ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ํŽธ์ง‘ํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋จธ์‹  ์„ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      1. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ MachineSet ์˜ค๋ธŒ์ ํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api 1
        1
        ๊ฐ ๋ผ๋ฒจ์— <key>/<value> ์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc patch MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        ์ž‘์€ ์ •๋ณด

        ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋จธ์‹  ์„ธํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: <machineset>
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
      2. oc edit ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ๋ฒจ์ด MachineSet ์˜ค๋ธŒ์ ํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc edit MachineSet abc612-msrtw-worker-us-east-1c -n openshift-machine-api

        MachineSet ์˜ค๋ธŒ์ ํŠธ์˜ ์˜ˆ

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
          ...
        spec:
          ...
          template:
            metadata:
          ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node
          ...

      3. 0 ์œผ๋กœ ์ถ•์†Œํ•˜๊ณ  ๋…ธ๋“œ๋ฅผ ํ™•์žฅํ•˜์—ฌ ํ•ด๋‹น ๋จธ์‹  ์„ธํŠธ์™€ ๊ด€๋ จ๋œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc scale --replicas=0 MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api
        $ oc scale --replicas=1 MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api
      4. ๋…ธ๋“œ๊ฐ€ ์ค€๋น„๋˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ oc get ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ๋ฒจ์ด ๋…ธ๋“œ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        $ oc get nodes -l <key>=<value>

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc get nodes -l type=user-node

        ์ถœ๋ ฅ ์˜ˆ

        NAME                                       STATUS   ROLES    AGE   VERSION
        ci-ln-l8nry52-f76d1-hl7m7-worker-c-vmqzp   Ready    worker   61s   v1.23.0

    • ๋ผ๋ฒจ์„ ๋…ธ๋“œ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      1. ๋…ธ๋“œ์˜ Node ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

        $ oc label nodes <name> <key>=<value>

        ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

        $ oc label nodes ci-ln-l8nry52-f76d1-hl7m7-worker-b-tgq49 type=user-node region=east
        ์ž‘์€ ์ •๋ณด

        ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

        kind: Node
        apiVersion: v1
        metadata:
          name: <node_name>
          labels:
            type: "user-node"
            region: "east"
      2. oc get ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        $ oc get nodes -l <key>=<value>,<key>=<value>

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc get nodes -l type=user-node,region=east

        ์ถœ๋ ฅ ์˜ˆ

        NAME                                       STATUS   ROLES    AGE   VERSION
        ci-ln-l8nry52-f76d1-hl7m7-worker-b-tgq49   Ready    worker   17m   v1.23.0

4.7.4. ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ ์ƒ์„ฑ

ํ”„๋กœ์ ํŠธ์˜ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ํ•จ๊ป˜ ๋…ธ๋“œ์˜ ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  Pod๋ฅผ ๋ผ๋ฒจ์ด ์ง€์ •๋œ ๋…ธ๋“œ๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•˜๋ฉด OpenShift Container Platform์—์„œ ํ”„๋กœ์ ํŠธ์˜ Pod์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์˜ ๋ผ๋ฒจ์ด ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

openshift.io/node-selector ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก Namespace ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ, ๋จธ์‹  ์„ธํŠธ ๋˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ์„ธํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹ ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ๋…ธ๋“œ์— ๋ผ๋ฒจ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹ ์ด ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์— ์ถ”๊ฐ€๋œ ๋ผ๋ฒจ์ด ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Pod ์˜ค๋ธŒ์ ํŠธ์— ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์‚ฌ์–‘์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋‹ค์Œ ๋ฉ”์‹œ์ง€์™€ ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์˜ˆ

Error from server (Forbidden): error when creating "pod.yaml": pods "pod-4" is forbidden: pod node label selector conflicts with its project node label selector

์ฐธ๊ณ 

Pod์— ํ‚ค/๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์ ํŠธ ํ‚ค์—๋Š” ๋‹ค๋ฅธ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ openshift.io/node-selector ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit namespace <name>

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
        openshift.io/node-selector: "type=user-node,region=east" 1
        openshift.io/description: ""
        openshift.io/display-name: ""
        openshift.io/requester: kube:admin
        openshift.io/sa.scc.mcs: s0:c30,c5
        openshift.io/sa.scc.supplemental-groups: 1000880000/10000
        openshift.io/sa.scc.uid-range: 1000880000/10000
      creationTimestamp: "2021-05-10T12:35:04Z"
      labels:
        kubernetes.io/metadata.name: demo
      name: demo
      resourceVersion: "145537"
      uid: 3f8786e3-1fcb-42e3-a0e3-e2ac54d15001
    spec:
      finalizers:
      - kubernetes

    1
    ์ ์ ˆํ•œ <key>:<value> ์Œ์ด ํฌํ•จ๋œ openshift.io/node-selector๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ํŽธ์ง‘ํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋จธ์‹  ์„ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด MachineSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      1. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ MachineSet ์˜ค๋ธŒ์ ํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc patch MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        ์ž‘์€ ์ •๋ณด

        ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋จธ์‹  ์„ธํŠธ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: <machineset>
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
      2. oc edit ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ๋ฒจ์ด MachineSet ์˜ค๋ธŒ์ ํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc edit MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api

        ์ถœ๋ ฅ ์˜ˆ

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
        ...
        spec:
        ...
          template:
            metadata:
        ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node

      3. ํ•ด๋‹น ๋จธ์‹  ์„ธํŠธ์™€ ๊ด€๋ จ๋œ ๋…ธ๋“œ๋ฅผ ์žฌ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc scale --replicas=0 MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api
        $ oc scale --replicas=1 MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api
      4. ๋…ธ๋“œ๊ฐ€ ์ค€๋น„๋˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ oc get ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ๋ฒจ์ด ๋…ธ๋“œ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        $ oc get nodes -l <key>=<value>

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc get nodes -l type=user-node,region=east

        ์ถœ๋ ฅ ์˜ˆ

        NAME                                       STATUS   ROLES    AGE   VERSION
        ci-ln-l8nry52-f76d1-hl7m7-worker-c-vmqzp   Ready    worker   61s   v1.23.0

    • ๋ผ๋ฒจ์„ ๋…ธ๋“œ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      1. ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  Node ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

        $ oc label <resource> <name> <key>=<value>

        ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

        $ oc label nodes ci-ln-l8nry52-f76d1-hl7m7-worker-c-tgq49 type=user-node region=east
        ์ž‘์€ ์ •๋ณด

        ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

        kind: Node
        apiVersion: v1
        metadata:
          name: <node_name>
          labels:
            type: "user-node"
            region: "east"
      2. oc get ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Node ์˜ค๋ธŒ์ ํŠธ์— ๋ผ๋ฒจ์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

        $ oc get nodes -l <key>=<value>

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        $ oc get nodes -l type=user-node,region=east

        ์ถœ๋ ฅ ์˜ˆ

        NAME                                       STATUS   ROLES    AGE   VERSION
        ci-ln-l8nry52-f76d1-hl7m7-worker-b-tgq49   Ready    worker   17m   v1.23.0

4.8. Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฐฐ์น˜ ์ œ์–ด

Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ, ์˜์—ญ, ์ง€์—ญ ๋˜๋Š” ๊ธฐํƒ€ ์‚ฌ์šฉ์ž ์ •์˜ ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ์—์„œ Pod์˜ ๋ฐฐ์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.8.1. Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด ์ •๋ณด

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

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

ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”ํ•  Pod, Pod๋ฅผ ๋ถ„๋ฐฐํ•  ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ, ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๋ถˆ์ผ์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ๋ถ„๋ฐฐ ์‹œ ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ Pod๋งŒ ์ผ์น˜ํ•˜๊ณ  ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”๋ฉ๋‹ˆ๋‹ค.

4.8.2. Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด ๊ตฌ์„ฑ

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ์˜์—ญ์— ๋”ฐ๋ผ ์ง€์ •๋œ ๋ผ๋ฒจ๊ณผ ์ผ์น˜ํ•˜๋Š” Pod๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Pod๋ฅผ ๋ฐฐ์น˜ํ•˜๋ ค๋ฉด ๋ชจ๋“  Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ๋…ธ๋“œ์— ํ•„์ˆ˜ ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. Pod ์‚ฌ์–‘์„ ์ƒ์„ฑํ•˜๊ณ  Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    pod-spec.yaml ํŒŒ์ผ์˜ ์˜ˆ

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      labels:
        region: us-east
    spec:
      topologySpreadConstraints:
      - maxSkew: 1 1
        topologyKey: topology.kubernetes.io/zone 2
        whenUnsatisfiable: DoNotSchedule 3
        labelSelector: 4
          matchLabels:
            region: us-east 5
      containers:
      - image: "docker.io/ocpqe/hello-pod"
        name: hello-pod

    1
    ๋‘ ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ ๊ฐ„ ์ตœ๋Œ€ Pod ์ˆ˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๊ณ  ๊ฐ’ 0์€ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    2
    ๋…ธ๋“œ ๋ผ๋ฒจ์˜ ํ‚ค์ž…๋‹ˆ๋‹ค. ์ด ํ‚ค ๋ฐ ๋™์ผํ•œ ๊ฐ’์ด ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๋™์ผํ•œ ํ† ํด๋กœ์ง€์— ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
    3
    ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์Šค์ผ€์ค„๋Ÿฌ์— Pod๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹œํ•˜๋Š” DoNotSchedule์ž…๋‹ˆ๋‹ค. Pod๋ฅผ ๊ณ„์† ์˜ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ScheduleAnyway๋กœ ์„ค์ •ํ•˜์ง€๋งŒ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ถˆ๊ท ํ˜•์ด ๋” ์‹ฌํ•ด์ง€์ง€ ์•Š๋„๋ก ๋ถˆ์ผ์น˜์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
    4
    ์ด ๋ผ๋ฒจ ์„ ํƒ๊ธฐ์™€ ์ผ์น˜ํ•˜๋Š” Pod๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๋ฐฐ๋  ๋•Œ ๊ณ„์‚ฐ๋˜๊ณ  ๊ทธ๋ฃน์œผ๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค. ๋ผ๋ฒจ ์„ ํƒ๊ธฐ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด ์ผ์น˜ํ•˜๋Š” Pod๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    5
    ์ด Pod ์‚ฌ์–‘๋„ ๋‚˜์ค‘์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋˜๋„๋ก ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ผ๋ฒจ์„ ์ด ๋ผ๋ฒจ ์„ ํƒ๊ธฐ์™€ ์ผ์น˜ํ•˜๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f pod-spec.yaml

4.8.3. Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์˜ˆ

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด ๊ตฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

4.8.3.1. ๋‹จ์ผ Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์˜ˆ

์ด ์˜ˆ์ œ Pod ์‚ฌ์–‘์—์„œ๋Š” ํ•˜๋‚˜์˜ Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. region ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ Pod์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. us-east ๋Š” ์˜์—ญ์— ๋ฐฐํฌ๋˜๊ณ , 1 ์˜ ์Šคํ๋ฅผ ์ง€์ •ํ•˜๊ณ , ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

kind: Pod
apiVersion: v1
metadata:
  name: my-pod
  labels:
    region: us-east
spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  containers:
  - image: "docker.io/ocpqe/hello-pod"
    name: hello-pod
4.8.3.2. ๋‹ค์ค‘ Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์˜ˆ

์ด ์˜ˆ์ œ Pod ์‚ฌ์–‘์—์„œ๋Š” ๋‘ ๊ฐœ์˜ Pod ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค region: us-east ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ Pod์™€ ์ผ์น˜ํ•˜๊ณ , ๋ถˆ์ผ์น˜๋ฅผ 1 ๋กœ ์ง€์ •ํ•˜๊ณ , ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Pod๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ๋ฒจ node๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Pod๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์ œ์•ฝ ์กฐ๊ฑด์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ๋ฒจ rack์„ ๊ธฐ๋ฐ˜์œผ๋กœ Pod๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ๋‘ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

kind: Pod
apiVersion: v1
metadata:
  name: my-pod-2
  labels:
    region: us-east
spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: node
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  - maxSkew: 1
    topologyKey: rack
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  containers:
  - image: "docker.io/ocpqe/hello-pod"
    name: hello-pod

4.8.4. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

4.9. ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ ์‹คํ–‰

๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ์™€ ํ•จ๊ป˜ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฐ Pod์— ์‚ฌ์šฉํ•  ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

OpenShift Container Platform์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€์›๋˜์ง€๋งŒ Red Hat์€ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์˜ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฐฐ์น˜ ์ œ์–ด๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํŠน์ • ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ํ•ด๋‹น Pod ์‚ฌ์–‘์— ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

4.9.1. ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐํฌ

ํด๋Ÿฌ์Šคํ„ฐ์— ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด ๋ฐฐํฌ์— ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ์—ญํ• ์˜ ์‚ฌ์šฉ์ž๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šค์ผ€์ค„๋Ÿฌ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ์Šค์ผ€์ค„๋Ÿฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Kubernetes ์„ค๋ช…์„œ์—์„œ ๋‹ค์ค‘ ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. Red Hat์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์‹ค์ œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์Šค์ผ€์ค„๋Ÿฌ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋ณด์œ ํ•œ ๊ตฌ์„ฑ ๋งต์ด ํฌํ•จ๋œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    scheduler-config-map.yaml์˜ ์˜ˆ

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: scheduler-config
      namespace: kube-system 1
    data:
      scheduler-config.yaml: | 2
        apiVersion: kubescheduler.config.k8s.io/v1beta2
        kind: KubeSchedulerConfiguration
        profiles:
          - schedulerName: custom-scheduler 3
        leaderElection:
          leaderElect: false

    1
    ์ด ์ ˆ์ฐจ์—์„œ๋Š” kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์„ ํƒํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    2
    ์ด ์ ˆ์ฐจ์˜ ๋’ท๋ถ€๋ถ„์—์„œ Deployment ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ --config ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒŒ์ผ์„ ์Šค์ผ€์ค„๋Ÿฌ ๋ช…๋ น์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    3
    ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœํ•„์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์€ Pod ๊ตฌ์„ฑ์—์„œ schedulerName ์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. config map์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f scheduler-config-map.yaml
  3. ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์— ๋Œ€ํ•œ ๋ฐฐํฌ ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    custom-scheduler.yaml ํŒŒ์ผ์˜ ์˜ˆ

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: custom-scheduler
      namespace: kube-system 1
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: custom-scheduler-as-kube-scheduler
    subjects:
    - kind: ServiceAccount
      name: custom-scheduler
      namespace: kube-system 2
    roleRef:
      kind: ClusterRole
      name: system:kube-scheduler
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: custom-scheduler-as-volume-scheduler
    subjects:
    - kind: ServiceAccount
      name: custom-scheduler
      namespace: kube-system 3
    roleRef:
      kind: ClusterRole
      name: system:volume-scheduler
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        component: scheduler
        tier: control-plane
      name: custom-scheduler
      namespace: kube-system 4
    spec:
      selector:
        matchLabels:
          component: scheduler
          tier: control-plane
      replicas: 1
      template:
        metadata:
          labels:
            component: scheduler
            tier: control-plane
            version: second
        spec:
          serviceAccountName: custom-scheduler
          containers:
          - command:
            - /usr/local/bin/kube-scheduler
            - --config=/etc/config/scheduler-config.yaml 5
            image: "<namespace>/<image_name>:<tag>" 6
            livenessProbe:
              httpGet:
                path: /healthz
                port: 10259
                scheme: HTTPS
              initialDelaySeconds: 15
            name: kube-second-scheduler
            readinessProbe:
              httpGet:
                path: /healthz
                port: 10259
                scheme: HTTPS
            resources:
              requests:
                cpu: '0.1'
            securityContext:
              privileged: false
            volumeMounts:
            - name: config-volume
              mountPath: /etc/config
          hostNetwork: false
          hostPID: false
          volumes:
            - name: config-volume
              configMap:
                name: scheduler-config

    1 2 3 4
    ์ด ์ ˆ์ฐจ์—์„œ๋Š” kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์„ ํƒํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    5
    ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์— ๋Œ€ํ•œ ๋ช…๋ น์—๋Š” ๋‹ค๋ฅธ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    6
    ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์šฉ์œผ๋กœ ์ƒ์„ฑํ•œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f custom-scheduler.yaml

๊ฒ€์ฆ

  • ์Šค์ผ€์ค„๋Ÿฌ Pod๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get pods -n kube-system

    ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ Pod๋Š” ์‹คํ–‰ ์ค‘ ์œผ๋กœ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

    NAME                                                       READY   STATUS    RESTARTS   AGE
    custom-scheduler-6cd7c4b8bc-854zb                          1/1     Running   0          2m

4.9.2. ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ๋ฐฐํฌ

์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ๋œ ํ›„ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ ๋Œ€์‹  ํ•ด๋‹น ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Pod๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๊ฐ ์Šค์ผ€์ค„๋Ÿฌ์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ„๋„๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ž์ฒด ๋…ธ๋“œ ์ง‘ํ•ฉ์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ์—ญํ• ์˜ ์‚ฌ์šฉ์ž๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด(RBAC)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์„ system:kube-scheduler ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    1. system:kube-scheduler ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

      $ oc edit clusterrole system:kube-scheduler
    2. ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ด๋ฆ„์„ ๋ฆฌ์Šค ๋ฐ ๋์  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ resourceNames ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        annotations:
          rbac.authorization.kubernetes.io/autoupdate: "true"
        creationTimestamp: "2021-07-07T10:19:14Z"
        labels:
          kubernetes.io/bootstrapping: rbac-defaults
        name: system:kube-scheduler
        resourceVersion: "125"
        uid: 53896c70-b332-420a-b2a4-f72c822313f2
      rules:
      ...
      - apiGroups:
        - coordination.k8s.io
        resources:
        - leases
        verbs:
        - create
      - apiGroups:
        - coordination.k8s.io
        resourceNames:
        - kube-scheduler
        - custom-scheduler 1
        resources:
        - leases
        verbs:
        - get
        - update
      - apiGroups:
        - ""
        resources:
        - endpoints
        verbs:
        - create
      - apiGroups:
        - ""
        resourceNames:
        - kube-scheduler
        - custom-scheduler 2
        resources:
        - endpoints
        verbs:
        - get
        - update
      ...
      1 2
      ์ด ์˜ˆ์—์„œ๋Š” custom-scheduler ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. Pod ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•˜๊ณ  schedulerName ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    custom-scheduler-example.yaml ํŒŒ์ผ์˜ ์˜ˆ

    apiVersion: v1
    kind: Pod
    metadata:
      name: custom-scheduler-example
      labels:
        name: custom-scheduler-example
    spec:
      schedulerName: custom-scheduler 1
      containers:
      - name: pod-with-second-annotation-container
        image: docker.io/ocpqe/hello-pod

    1
    ์‚ฌ์šฉํ•  ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ด๋ฆ„(์ด ์˜ˆ์—์„œ๋Š” custom-scheduler )์ž…๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฆ„์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด Pod๊ฐ€ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.
  3. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f custom-scheduler-example.yaml

๊ฒ€์ฆ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ Pod๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get pod custom-scheduler-example

    custom-scheduler-example Pod๋Š” ์ถœ๋ ฅ์— ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

    NAME                       READY     STATUS    RESTARTS   AGE
    custom-scheduler-example   1/1       Running   0          4m
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ Pod๋ฅผ ์˜ˆ์•ฝํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc describe pod custom-scheduler-example

    ์Šค์ผ€์ค„๋Ÿฌ, custom-scheduler ๋Š” ๋‹ค์Œ ์ž˜๋ฆฐ ์ถœ๋ ฅ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

    Events:
      Type    Reason          Age        From                                               Message
      ----    ------          ----       ----                                               -------
      Normal  Scheduled       <unknown>  custom-scheduler                                   Successfully assigned default/custom-scheduler-example to <node_name>

4.9.3. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

4.10. Descheduler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์ œ๊ฑฐ

์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ƒˆ Pod๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋…ธ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  Descheduler๋Š” ๋” ์ ํ•ฉํ•œ ๋…ธ๋“œ์— ๋‹ค์‹œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹คํ–‰ ์ค‘์ธ Pod๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.10.1. Descheduler ์ •๋ณด

Descheduler๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์ „๋žต์— ๋”ฐ๋ผ Pod๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ Pod๋ฅผ ๋” ์ ์ ˆํ•œ ๋…ธ๋“œ์— ๋‹ค์‹œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์‹คํ–‰ ์ค‘์ธ Pod์˜ ์ผ์ •์„ ์กฐ์ •ํ•˜๋ฉด ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Descheduler๋Š” ์ œ๊ฑฐ๋œ Pod์˜ ๊ต์ฒด๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐ๋œ Pod์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Descheduler๊ฐ€ ๋…ธ๋“œ์—์„œ Pod๋ฅผ ์ œ๊ฑฐํ•˜๋„๋ก ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • openshift-* ๋ฐ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ Pod๋Š” ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • priorityClassName์ด system-cluster-critical ๋˜๋Š” system-node-critical๋กœ ์„ค์ •๋œ ์ค‘์š” Pod๋Š” ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ, ๋ณต์ œ๋ณธ ์„ธํŠธ, ๋ฐฐํฌ ๋˜๋Š” ์ž‘์—…์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์ •์ , ๋ฏธ๋Ÿฌ๋ง ๋˜๋Š” ๋…๋ฆฝํ˜• Pod๋Š” ๋‹ค์‹œ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐ๋ชฌ ์„ธํŠธ์™€ ์—ฐ๊ฒฐ๋œ Pod๋Š” ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์žˆ๋Š” Pod๋Š” ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ƒ์˜ Pod๊ฐ€ ๋ฒ„์ŠคํŠธ ๊ฐ€๋Šฅ Pod ๋ฐ ๋ณด์žฅ๋œ Pod๋ณด๋‹ค ๋จผ์ € ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • descheduler.alpha.kubernetes.io/evict ์ฃผ์„์ด ์žˆ๋Š” ๋ชจ๋“  Pod ์œ ํ˜•์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์„์€ ์ œ๊ฑฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒ€์‚ฌ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์ œ๊ฑฐํ•  Pod๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” Pod๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‹ค์‹œ ์ƒ์„ฑ๋˜๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • PDB(Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ)๊ฐ€ ์ ์šฉ๋˜๋Š” Pod๋Š” ์ผ์ • ์กฐ์ •์—์„œ ํ•ด๋‹น PDB๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pod๋Š” PDB๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ œ๊ฑฐ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

4.10.2. Descheduler ํ”„๋กœํ•„

๋‹ค์Œ Descheduler ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AffinityAndTaints

์ด ํ”„๋กœํ•„์€ Pod ๊ฐ„ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€, ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ, ๋…ธ๋“œ ํ…Œ์ธํŠธ๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „๋žต์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • RemovePodsViolatingInterPodAntiAffinity: Pod ๊ฐ„ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • RemovePodsViolatingNodeAffinity: ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์„ ์œ„๋ฐ˜ํ•˜๋Š” Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • RemovePodsViolatingNodeTaints: ๋…ธ๋“œ์—์„œ NoSchedule ํ…Œ์ธํŠธ๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ์œ ํ˜•์ด requiredDuringSchedulingIgnoredDuringExecution์ธ Pod๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

TopologyAndDuplicates

์ด ํ”„๋กœํ•„์€ ๋…ธ๋“œ ๊ฐ„์— ์œ ์‚ฌํ•œ Pod ๋˜๋Š” ๋™์ผํ•œ ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ์˜ Pod๋ฅผ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•˜๊ธฐ ์œ„ํ•ด Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „๋žต์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • RemovePodsViolatingTopologySpreadConstraint: DoNotSchedule ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒฝ์šฐ ๊ท ํ˜•์ด ๋งž์ง€ ์•Š๋Š” ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ์„ ์ฐพ์•„ ๋” ํฐ ๋„๋ฉ”์ธ์—์„œ Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • RemoveDuplicates: ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ณต์ œ๋ณธ ์„ธํŠธ, ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ, ๋ฐฐํฌ ๋˜๋Š” ์ž‘์—…๊ณผ ์—ฐ๊ฒฐ๋œ Pod๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Pod๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Pod๋ฅผ ๋” ์ž˜ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์ค‘๋ณต Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
LifecycleAndUtilization

์ด ํ”„๋กœํ•„์€ ์žฅ๊ธฐ ์‹คํ–‰ Pod๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋…ธ๋“œ ๊ฐ„ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์˜ ๊ท ํ˜•์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „๋žต์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • RemovePodsHavingTooManyRestarts: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋„ˆ๋ฌด ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค์‹œ ์‹œ์ž‘๋œ Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ(Init Container ํฌํ•จ)์—์„œ ๋‹ค์‹œ ์‹œ์ž‘๋˜๋Š” Pod๋Š” 100๊ฐœ ์ด์ƒ์ž…๋‹ˆ๋‹ค.

  • LowNodeUtilization: ํ™œ์šฉ๋„๊ฐ€ ๋‚ฎ์€ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ณ , Pod ์žฌ์ƒ์„ฑ ์‹œ Pod๊ฐ€ ์ด์ฒ˜๋Ÿผ ํ™œ์šฉ๋„๊ฐ€ ๋‚ฎ์€ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋˜๋„๋ก ๊ฐ€๋Šฅํ•˜๋ฉด ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ ๋…ธ๋“œ์—์„œ Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๋ชจ๋“  ์ž„๊ณ„๊ฐ’(CPU, ๋ฉ”๋ชจ๋ฆฌ, Pod ์ˆ˜)์—์„œ ์‚ฌ์šฉ๋Ÿ‰์ด 20% ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ ๋…ธ๋“œ๋Š” ํ™œ์šฉ๋„๊ฐ€ ๋‚ฎ์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

    ๋ชจ๋“  ์ž„๊ณ„๊ฐ’(CPU, ๋ฉ”๋ชจ๋ฆฌ, Pod ์ˆ˜)์—์„œ ์‚ฌ์šฉ๋Ÿ‰์ด 50%๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๋…ธ๋“œ๋Š” ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

  • PodLifeTime: ๋„ˆ๋ฌด ์˜ค๋ž˜๋œ Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๊ธฐ๋ณธ์ ์œผ๋กœ 24์‹œ๊ฐ„์ด ์ง€๋‚œ Pod๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. Pod ์ˆ˜๋ช… ๊ฐ’์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SoftTopologyAndDuplicates

์ด ํ”„๋กœํ•„์€ whenUnsatisfiable: ScheduleAnyway ์™€ ๊ฐ™์€ ์†Œํ”„ํŠธ ํ† ํด๋กœ์ง€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” Pod๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  TopologyAndDuplicates ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

softTopologyAndDuplicates์™€ TopologyAndDuplicates ๋ฅผ ๋ชจ๋‘ ํ™œ์„ฑํ™”ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‘ ๊ฒฐ๊ณผ ๋ชจ๋‘ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

EvictPodsWithLocalStorage
์ด ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์žˆ๋Š” Pod๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
EvictPodsWithPVC
์ด ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์ด ์žˆ๋Š” Pod๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.10.3. Descheduler ์„ค์น˜

Descheduler๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Descheduler๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด OperatorHub์—์„œ Kube Descheduler Operator๋ฅผ ์„ค์น˜ํ•˜๊ณ  Descheduler ํ”„๋กœํ•„์„ ํ•œ ๊ฐœ ์ด์ƒ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • OpenShift Container Platform ์›น ์ฝ˜์†”์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Kube Descheduler Operator์— ํ•„์š”ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๊ด€๋ฆฌ โ†’ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ด๋™ํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. ์ด๋ฆ„ ํ•„๋“œ์— openshift-kube-descheduler-operator ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Labels ํ•„๋“œ์— openshift.io/cluster-monitoring=true ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ Descheduler ์ง€ํ‘œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ ํ›„ ์ƒ์„ฑ ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. Kube Descheduler Operator๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    1. Operators โ†’ OperatorHub๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. ํ•„ํ„ฐ ๋ฐ•์Šค์— Kube Descheduler Operator๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    3. Kube Descheduler Operator๋ฅผ ์„ ํƒํ•˜๊ณ  ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    4. Operator ์„ค์น˜ ํŽ˜์ด์ง€์—์„œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ openshift-kube-descheduler-operator๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    5. ์—…๋ฐ์ดํŠธ ์ฑ„๋„ ๋ฐ ์Šน์ธ ์ „๋žต ๊ฐ’์„ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    6. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. Descheduler ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. Operator โ†’ ์„ค์น˜๋œ Operator ํŽ˜์ด์ง€์—์„œ Kube Descheduler Operator๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. Kube Descheduler ํƒญ์„ ์„ ํƒํ•˜๊ณ  KubeDescheduler ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    3. ํ•„์š”์— ๋”ฐ๋ผ ์„ค์ •์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

      1. ํ”„๋กœํ•„ ์„น์…˜์„ ํ™•์žฅํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•  ํ”„๋กœํ•„์„ ํ•˜๋‚˜ ์ด์ƒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. AffinityAndTaints ํ”„๋กœํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„ ์ถ”๊ฐ€ ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ถ”๊ฐ€ ํ”„๋กœํ•„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

        ์ฐธ๊ณ 

        TopologyAndDuplicates ์™€ softTopologyAndDuplicates ๋ฅผ ๋ชจ๋‘ ํ™œ์„ฑํ™”ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‘ ๊ฒฐ๊ณผ ๋ชจ๋‘ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

      2. ์„ ํƒ ์‚ฌํ•ญ: ํ”„๋กœํ•„ ์‚ฌ์šฉ์ž ์ง€์ • ์„น์…˜์„ ํ™•์žฅํ•˜์—ฌ LifecycleAndUtilization ํ”„๋กœํ•„์˜ ์‚ฌ์šฉ์ž ์ •์˜ Pod ์ˆ˜๋ช… ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ๋‹จ์œ„๋Š” s,m ๋˜๋Š” h ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Pod ์ˆ˜๋ช…์€ 24์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
      3. ์„ ํƒ ์‚ฌํ•ญ: Descheduling Interval Seconds ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Descheduler ์‹คํ–‰ ๊ฐ„๊ฒฉ์„ ์ดˆ ๋‹จ์œ„๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3600 ์ดˆ์ž…๋‹ˆ๋‹ค.
    4. ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์ค‘์— OpenShift CLI(oc)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Descheduler์˜ ํ”„๋กœํ•„ ๋ฐ ์„ค์ •์„ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น ์ฝ˜์†”์—์„œ Descheduler ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋กœํ•„์„ ์กฐ์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ AffinityAndTaints ํ”„๋กœํ•„์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

4.10.4. Descheduler ํ”„๋กœํ•„ ๊ตฌ์„ฑ

Descheduler์—์„œ Pod๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ•„์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ

ํ”„๋กœ์„ธ์Šค

  1. KubeDescheduler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. spec.profiles ์„น์…˜์— ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”„๋กœํ•„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600
      logLevel: Normal
      managementState: Managed
      operatorLogLevel: Normal
      profileCustomizations:
        podLifetime: 48h        1
      profiles:                 2
      - AffinityAndTaints
      - TopologyAndDuplicates   3
      - LifecycleAndUtilization
      - EvictPodsWithLocalStorage
      - EvictPodsWithPVC
    1
    ์„ ํƒ ์‚ฌํ•ญ: LifecycleAndUtilization ํ”„๋กœํ•„์— ์‚ฌ์šฉ์ž ์ •์˜ Pod ์ˆ˜๋ช… ๊ฐ’์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ๋‹จ์œ„๋Š” s,m ๋˜๋Š” h ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Pod ์ˆ˜๋ช…์€ 24์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
    2
    ์‚ฌ์šฉํ•  ํ”„๋กœํ•„์„ ํ•˜๋‚˜ ์ด์ƒ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ•„: AffinityAndTaints,TopologyAndDuplicates,LifecycleAndUtilization,softTopologyAndDuplicates,EvictPodsWithLocalStorage, and EvictPodsWithPVC.
    3
    TopologyAndDuplicates ์™€ softTopologyAndDuplicates ๋ฅผ ๋ชจ๋‘ ํ™œ์„ฑํ™”ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‘ ๊ฒฐ๊ณผ ๋ชจ๋‘ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ์—ฌ๋Ÿฌ ํ”„๋กœํ•„์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ”„๋กœํ•„์„ ์ง€์ •ํ•˜๋Š” ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

4.10.5. Descheduler ๊ฐ„๊ฒฉ ๊ตฌ์„ฑ

Descheduler ์‹คํ–‰ ๊ฐ„๊ฒฉ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3600์ดˆ(1์‹œ๊ฐ„)์ž…๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ

ํ”„๋กœ์„ธ์Šค

  1. KubeDescheduler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. deschedulingIntervalSeconds ํ•„๋“œ๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600 1
    ...
    1
    Descheduler ์‹คํ–‰ ๊ฐ„๊ฒฉ์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ ๊ฐ’์ด 0์ด๋ฉด Descheduler๊ฐ€ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  3. ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

4.10.6. Descheduler ์„ค์น˜ ์ œ๊ฑฐ

Descheduler ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  Kube Descheduler Operator๋ฅผ ์„ค์น˜ ์ œ๊ฑฐํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Descheduler๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” KubeDescheduler CRD ๋ฐ openshift-kube-descheduler-operator ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • OpenShift Container Platform ์›น ์ฝ˜์†”์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Descheduler ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    1. Operator โ†’ ์„ค์น˜๋œ Operator ํŽ˜์ด์ง€์—์„œ Kube Descheduler Operator๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. Kube Descheduler ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. ํด๋Ÿฌ์Šคํ„ฐ ํ•ญ๋ชฉ ์˜†์— ์žˆ๋Š” ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  KubeDescheduler ์‚ญ์ œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    4. ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž์—์„œ ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. Kube Descheduler Operator๋ฅผ ์„ค์น˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    1. Operators โ†’ ์„ค์น˜๋œ Operator๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. Kube Descheduler Operator ์˜†์— ์žˆ๋Š” ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  Operator ์„ค์น˜ ์ œ๊ฑฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž์—์„œ ์„ค์น˜ ์ œ๊ฑฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. openshift-kube-descheduler-operator ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    1. ๊ด€๋ฆฌ โ†’ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. ํ•„ํ„ฐ ๋ฐ•์Šค์— openshift-kube-descheduler-operator๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    3. openshift-kube-descheduler-operator ํ•ญ๋ชฉ ์˜†์— ์žˆ๋Š” ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    4. ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž์—์„œ openshift-kube-descheduler-operator๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  5. KubeDescheduler CRD๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    1. Administration โ†’ Custom Resource Definitions๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. ํ•„ํ„ฐ ๋ฐ•์Šค์— KubeDescheduler๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    3. KubeDescheduler ํ•ญ๋ชฉ ์˜†์— ์žˆ๋Š” ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  CustomResourceDefinition ์‚ญ์ œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    4. ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž์—์„œ ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

4.11. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ

4.11.1. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ ๊ฐœ์š”

Secondary Scheduler Operator๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.11.1.1. Secondary Scheduler Operator ์ •๋ณด

Red Hat OpenShift์šฉ Secondary Scheduler Operator๋Š” OpenShift Container Platform์— ์‚ฌ์šฉ์ž ์ง€์ • ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” Pod๋ฅผ ์˜ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ์™€ ํ•จ๊ป˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Pod ๊ตฌ์„ฑ์€ ์‚ฌ์šฉํ•  ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์—๋Š” /bin/kube-scheduler ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ Kubernetes ์Šค์ผ€์ค„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

Secondary Scheduler Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform์— ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Red Hat์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์˜ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Secondary Scheduler Operator๋Š” ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์—ญํ•  ๋ฐ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์— ๋Œ€ํ•ด KubeSchedulerConfiguration ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•  ์Šค์ผ€์ค„๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.11.2. Red Hat OpenShift ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์šฉ secondary Scheduler Operator

Red Hat OpenShift์šฉ Secondary Scheduler Operator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์— ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์—์„œ๋Š” Red Hat OpenShift์šฉ Secondary Scheduler Operator์˜ ๊ฐœ๋ฐœ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

Red Hat OpenShift์šฉ Secondary Scheduler Operator๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐํฌ ์ง€์›์€ ๋‹ค์Œ OpenShift Container Platform ๋ฆด๋ฆฌ์Šค์—์„œ ์ œ๊ฑฐ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Secondary Scheduler Operator ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

4.11.2.1. Secondary Scheduler Operator for Red Hat OpenShift 1.0.1 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

์ถœ์‹œ ๋‚ ์งœ: 2022-07-28

Red Hat OpenShift 1.0.1์šฉ Secondary Scheduler Operator๋Š” ๋‹ค์Œ ๊ถŒ๊ณ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

Red Hat OpenShift 1.0.0์— Secondary Scheduler Operator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ OpenShift Container Platform์˜ ๋‹ค์Œ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋กœ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋ฒ„์ „ 1.0.1๋กœ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

4.11.2.1.1. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ
  • Red Hat OpenShift 1.0.1์˜ Secondary Scheduler Operator์˜ ์ตœ๋Œ€ OpenShift Container Platform ๋ฒ„์ „์€ 4.11์ž…๋‹ˆ๋‹ค.
4.11.2.1.2. ๋ฒ„๊ทธ ์ˆ˜์ •
  • ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์ด ์‚ญ์ œ๋œ ํ›„ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐํฌ๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์•„ Secondary Scheduler Operator ๋ฐ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ CR์ด ์‚ญ์ œ๋  ๋•Œ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐํฌ๊ฐ€ ์‚ญ์ œ๋˜์–ด Secondary Scheduler Operator๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (BZ#2100923)
4.11.2.1.3. ํ™•์ธ๋œ ๋ฌธ์ œ
  • ํ˜„์žฌ๋Š” ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ Operator๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ ๋งต, CRD ๋˜๋Š” RBAC ์ •์ฑ…๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์— ํ•„์š”ํ•œ ์—ญํ•  ๋ฐ ์—ญํ•  ๋ฐ”์ธ๋”ฉ ์ด์™ธ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (BZ#2071684)
4.11.2.2. Red Hat OpenShift 1.0.0์šฉ Secondary Scheduler Operator ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

์ถœ์‹œ ๋‚ ์งœ: 2022-04-18

Red Hat OpenShift 1.0.0์˜ Secondary Scheduler Operator์— ๋Œ€ํ•ด ๋‹ค์Œ ๊ถŒ๊ณ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.11.2.2.1. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ
  • ์ด๋Š” Red Hat OpenShift์šฉ Secondary Scheduler Operator์˜ ์ดˆ๊ธฐ ๋ฆด๋ฆฌ์Šค์ž…๋‹ˆ๋‹ค.
4.11.2.2.2. ํ™•์ธ๋œ ๋ฌธ์ œ
  • ํ˜„์žฌ๋Š” ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ Operator๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ ๋งต, CRD ๋˜๋Š” RBAC ์ •์ฑ…๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์— ํ•„์š”ํ•œ ์—ญํ•  ๋ฐ ์—ญํ•  ๋ฐ”์ธ๋”ฉ ์ด์™ธ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (BZ#2071684)

4.11.3. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์˜ˆ์•ฝ

๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ Operator๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  Pod ์ •์˜์—์„œ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜์—ฌ OpenShift Container Platform์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.11.3.1. Secondary Scheduler Operator ์„ค์น˜

์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Red Hat OpenShift์šฉ Secondary Scheduler Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OpenShift Container Platform ์›น ์ฝ˜์†”์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Red Hat OpenShift์šฉ Secondary Scheduler Operator์— ํ•„์š”ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๊ด€๋ฆฌ โ†’ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ด๋™ํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. ์ด๋ฆ„ ํ•„๋“œ์— openshift-secondary-scheduler-operator ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. Red Hat OpenShift์šฉ Secondary Scheduler Operator๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    1. Operators โ†’ OperatorHub๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. Red Hat OpenShift์˜ Secondary Scheduler Operator๋ฅผ ํ•„ํ„ฐ ์ƒ์ž์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    3. Red Hat OpenShift์˜ Secondary Scheduler Operator๋ฅผ ์„ ํƒํ•˜๊ณ  ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    4. Operator ์„ค์น˜ ํŽ˜์ด์ง€์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      1. Update ์ฑ„๋„์€ stable ์œผ๋กœ ์„ค์ •๋˜์–ด Red Hat OpenShift์šฉ Secondary Scheduler Operator์˜ ์•ˆ์ •์ ์ธ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
      2. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ openshift-secondary-scheduler-operator ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      3. ์—…๋ฐ์ดํŠธ ์Šน์ธ ์ „๋žต์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

        • ์ž๋™ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด Operator ์ƒˆ ๋ฒ„์ „์ด ์ค€๋น„๋  ๋•Œ OLM(Operator Lifecycle Manager)์ด ์ž๋™์œผ๋กœ Operator๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        • ์ˆ˜๋™ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ Operator ์—…๋ฐ์ดํŠธ๋ฅผ ์Šน์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      4. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ

  1. Operators โ†’ ์„ค์น˜๋œ Operator๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Red Hat OpenShift์˜ Secondary Scheduler Operator ๊ฐ€ ์„ฑ๊ณต ์ƒํƒœ๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
4.11.3.2. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐํฌ

Secondary Scheduler Operator๋ฅผ ์„ค์น˜ํ•œ ํ›„ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ œ ์กฐ๊ฑด

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OpenShift Container Platform ์›น ์ฝ˜์†”์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Red Hat OpenShift์šฉ Secondary Scheduler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์›Œํฌ๋กœ๋“œ โ†’ ConfigMap์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. ConfigMap ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    3. YAML ํŽธ์ง‘๊ธฐ์—์„œ ํ•„์š”ํ•œ KubeSchedulerConfiguration ๊ตฌ์„ฑ์ด ํฌํ•จ๋œ ๊ตฌ์„ฑ ๋งต ์ •์˜๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: "secondary-scheduler-config"                  1
        namespace: "openshift-secondary-scheduler-operator" 2
      data:
        "config.yaml": |
          apiVersion: kubescheduler.config.k8s.io/v1beta3
          kind: KubeSchedulerConfiguration                  3
          leaderElection:
            leaderElect: false
          profiles:
            - schedulerName: secondary-scheduler            4
              plugins:                                      5
                score:
                  disabled:
                    - name: NodeResourcesBalancedAllocation
                    - name: NodeResourcesLeastAllocated
      1
      ๊ตฌ์„ฑ ๋งต์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌ์„ฑ ํ•„๋“œ์— SecondaryScheduler CR์„ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
      2
      ๊ตฌ์„ฑ ๋งต์€ openshift-secondary-scheduler-operator ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      3
      ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์˜ KubeSchedulerConfiguration ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubernetes API ๋ฌธ์„œ์˜ KubeSchedulerConfiguration ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
      4
      ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. spec.schedulerName ํ•„๋“œ๋ฅผ ์ด ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” Pod๋Š” ์ด ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.
      5
      ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Kubernetes ๋ฌธ์„œ์˜ ์Šค์ผ€์ค„๋ง ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
    4. ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. SecondaryScheduler CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. Operators โ†’ ์„ค์น˜๋œ Operator๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. Red Hat OpenShift์— ๋Œ€ํ•ด Secondary Scheduler Operator๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. Secondary Scheduler ํƒญ์„ ์„ ํƒํ•˜๊ณ  Create SecondaryScheduler ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    4. Name ํ•„๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ; ์ด ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
    5. Scheduler ๊ตฌ์„ฑ ํ•„๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ secondary-scheduler-config ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์ด ์ด ์ ˆ์ฐจ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์ƒ์„ฑ๋œ ๊ตฌ์„ฑ ๋งต์˜ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    6. Scheduler Image ํ•„๋“œ์— ์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

      ์ค‘์š”

      Red Hat์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    7. ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
4.11.3.3. ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์˜ˆ์•ฝ

๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด Pod ์ •์˜์—์„œ schedulerName ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ „์ œ ์กฐ๊ฑด

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OpenShift Container Platform ์›น ์ฝ˜์†”์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Red Hat OpenShift์šฉ Secondary Scheduler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์›Œํฌ๋กœ๋“œ โ†’ Pod๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. ํฌ๋“œ ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. YAML ํŽธ์ง‘๊ธฐ์—์„œ ์›ํ•˜๋Š” Pod ๊ตฌ์„ฑ์„ ์ž…๋ ฅํ•˜๊ณ  schedulerName ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      namespace: default
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80
      schedulerName: secondary-scheduler 1
    1
    schedulerName ํ•„๋“œ๋Š” ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๊ตฌ์„ฑ ๋งต์— ์ •์˜๋œ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  5. ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ

  1. OpenShift CLI์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    $ oc describe pod nginx -n default

    ์ถœ๋ ฅ ์˜ˆ

    Name:         nginx
    Namespace:    default
    Priority:     0
    Node:         ci-ln-t0w4r1k-72292-xkqs4-worker-b-xqkxp/10.0.128.3
    ...
    Events:
      Type    Reason          Age   From                 Message
      ----    ------          ----  ----                 -------
      Normal  Scheduled       12s   secondary-scheduler  Successfully assigned default/nginx to ci-ln-t0w4r1k-72292-xkqs4-worker-b-xqkxp
    ...

  3. ์ด๋ฒคํŠธ ํ‘œ์—์„œ Successfully assigned <namespace>/<pod_name>๊ณผ ์œ ์‚ฌํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ <node_name>์œผ๋กœ ์ฐพ์Šต๋‹ˆ๋‹ค.
  4. "From" ์—ด์—์„œ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์•„๋‹Œ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ๋˜ํ•œ openshift-secondary-scheduler-namespace ์˜ secondary-scheduler-* Pod ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ณด์กฐ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ Pod๋ฅผ ์˜ˆ์•ฝํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.11.4. Secondary Scheduler Operator ์„ค์น˜ ์ œ๊ฑฐ

Operator๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ด€๋ จ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ OpenShift Container Platform์—์„œ Red Hat OpenShift์˜ Secondary Scheduler Operator๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.11.4.1. Secondary Scheduler Operator ์„ค์น˜ ์ œ๊ฑฐ

์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Red Hat OpenShift์šฉ Secondary Scheduler Operator๋ฅผ ์„ค์น˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OpenShift Container Platform ์›น ์ฝ˜์†”์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Red Hat OpenShift์šฉ Secondary Scheduler Operator๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Red Hat OpenShift Operator์šฉ Secondary Scheduler Operator๋ฅผ ์„ค์น˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    1. Operators โ†’ ์„ค์น˜๋œ Operator๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. Secondary Scheduler Operator ํ•ญ๋ชฉ ์˜†์— ์žˆ๋Š” ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  Operator ์„ค์น˜ ์ œ๊ฑฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    3. ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž์—์„œ ์„ค์น˜ ์ œ๊ฑฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
4.11.4.2. Secondary Scheduler Operator ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ

์„ ํƒ์ ์œผ๋กœ Red Hat OpenShift์šฉ Secondary Scheduler Operator๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OpenShift Container Platform ์›น ์ฝ˜์†”์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Secondary Scheduler Operator๊ฐ€ ์„ค์น˜ํ•œ CRD๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    1. Administration โ†’ CustomResourceDefinitions ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. Name ํ•„๋“œ์— SecondaryScheduler ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ CRD๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
    3. SecondaryScheduler CRD ์˜†์— ์žˆ๋Š” ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ •์˜ ์‚ญ์ œ ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. openshift-secondary-scheduler-operator ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    1. ๊ด€๋ฆฌ โ†’ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. openshift-secondary-scheduler-operator ์˜†์— ์žˆ๋Š” ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์‚ญ์ œ ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. ํ™•์ธ ๋Œ€ํ™” ์ƒ์ž์—์„œ ํ•„๋“œ์— openshift-secondary-scheduler-operator ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

5์žฅ. ์ž‘์—… ๋ฐ DaemonSet ์‚ฌ์šฉ

5.1. ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์—์„œ ์ž๋™์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์‹คํ–‰

๊ด€๋ฆฌ์ž๋Š” ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์˜ ํŠน์ • ๋…ธ๋“œ ๋˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ Pod ๋ณต์ œ๋ณธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“ (๋˜๋Š” ์ผ๋ถ€) ๋…ธ๋“œ์—์„œ ํ•˜๋‚˜์˜ Pod ๋ณต์‚ฌ๋ณธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€๋˜๋ฉด Pod๋„ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด ํ•ด๋‹น Pod๋„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋ฐ๋ชฌ ์„ธํŠธ์—์„œ ์ƒ์„ฑํ•œ Pod๊ฐ€ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋กœ๊น… Pod๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๋…ธ๋“œ์— ๋ชจ๋‹ˆํ„ฐ๋ง ์—์ด์ „ํŠธ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž์™€ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ๋ชฌ ์„ธํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubernetes ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ค‘์š”

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

5.1.1. ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ์˜ˆ์•ฝ

๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์ ๊ฒฉ ๋…ธ๋“œ์—์„œ ํ•˜๋‚˜์˜ Pod ๋ณต์‚ฌ๋ณธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Pod๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋…ธ๋“œ๋Š” Kubernetes ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ๋ชฌ ์„ธํŠธ Pod๋Š” ๋ฐ๋ชฌ ์„ธํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑํ•˜๊ณ  ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ผ๊ด€๋˜์ง€ ์•Š๋Š” Pod ๋™์ž‘: ์˜ˆ์•ฝ ๋Œ€๊ธฐ ์ค‘์ธ ์ •์ƒ Pod๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ณด๋ฅ˜ ์ค‘ ์ƒํƒœ์ด์ง€๋งŒ ๋ฐ๋ชฌ ์„ธํŠธ Pod๋Š” Pending ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Pod ์„ ์ ์„ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„ ์  ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ฐ๋ชฌ ์„ธํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ Pod ์šฐ์„ ์ˆœ์œ„ ๋ฐ ์„ ์ ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์•ฝ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋œ ScheduleDaemonSetPods ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด spec.nodeName ์šฉ์–ด ๋Œ€์‹  NodeAffinity ์šฉ์–ด๋ฅผ ๋ฐ๋ชฌ ์„ธํŠธ Pod์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ๋ชฌ ์„ธํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๋Œ€์‹  ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋Š” Pod๋ฅผ ๋Œ€์ƒ ํ˜ธ์ŠคํŠธ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชฌ ์„ธํŠธ Pod์˜ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ต์ฒด๋ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชฌ ์„ธํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฐ๋ชฌ ์„ธํŠธ Pod๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ๋งŒ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋ฐ๋ชฌ ์„ธํŠธ์˜ spec.template๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

kind: Pod
apiVersion: v1
metadata:
  name: hello-node-6fbccf8d9-9tmzr
#...
spec:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchFields:
        - key: metadata.name
          operator: In
          values:
          - target-host-name
#...

๋˜ํ•œ ๋ฐ๋ชฌ ์„ธํŠธ Pod์— node.kubernetes.io/unschedulable:NoSchedule ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋ฐ๋ชฌ ์„ธํŠธ Pod๋ฅผ ์˜ˆ์•ฝํ•  ๋•Œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

5.1.2. ๋ฐ๋ชฌ ์„ธํŠธ ์ƒ์„ฑ

๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ nodeSelector ํ•„๋“œ๋Š” ๋ฐ๋ชฌ ์„ธํŠธ์—์„œ ๋ณต์ œ๋ณธ์„ ๋ฐฐํฌํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฃผ์„ openshift.io/node-selector๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค.

    $ oc patch namespace myproject -p \
        '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'
    ์ž‘์€ ์ •๋ณด

    ๋˜๋Š” ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: <namespace>
      annotations:
        openshift.io/node-selector: ''
    #...
  • ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

    $ oc adm new-project <name> --node-selector=""

์ ˆ์ฐจ

๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐ๋ชฌ ์„ธํŠธ yaml ํŒŒ์ผ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: hello-daemonset
    spec:
      selector:
          matchLabels:
            name: hello-daemonset 1
      template:
        metadata:
          labels:
            name: hello-daemonset 2
        spec:
          nodeSelector: 3
            role: worker
          containers:
          - image: openshift/hello-openshift
            imagePullPolicy: Always
            name: registry
            ports:
            - containerPort: 80
              protocol: TCP
            resources: {}
            terminationMessagePath: /dev/termination-log
          serviceAccount: default
          terminationGracePeriodSeconds: 10
    #...
    1
    ๋ฐ๋ชฌ ์„ธํŠธ์— ์†ํ•˜๋Š” Pod๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ผ๋ฒจ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค.
    2
    Pod ํ…œํ”Œ๋ฆฟ์˜ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    3
    ๋ฐฐํฌํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ Pod ๋ณต์ œ๋ณธ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋…ธ๋“œ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฐ๋ชฌ ์„ธํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f daemonset.yaml
  3. Pod๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๊ณ  ๊ฐ ๋…ธ๋“œ์— Pod ๋ณต์ œ๋ณธ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. daemonset Pod๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

      $ oc get pods

      ์ถœ๋ ฅ ์˜ˆ

      hello-daemonset-cx6md   1/1       Running   0          2m
      hello-daemonset-e3md9   1/1       Running   0          2m

    2. Pod๋ฅผ ๋ณด๊ณ  Pod๊ฐ€ ๋…ธ๋“œ์— ๋ฐฐ์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc describe pod/hello-daemonset-cx6md|grep Node

      ์ถœ๋ ฅ ์˜ˆ

      Node:        openshift-node01.hostname.com/10.14.20.134

      $ oc describe pod/hello-daemonset-e3md9|grep Node

      ์ถœ๋ ฅ ์˜ˆ

      Node:        openshift-node02.hostname.com/10.14.20.137

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

๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์ด์ „ ๋ณต์ œ๋ณธ ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜์—ฌ ์ƒˆ Pod ๋ณต์ œ๋ณธ์„ ๊ฐ•์ œ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

5.2. ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ Pod์—์„œ ์ž‘์—… ์‹คํ–‰

์ž‘์—…์€ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์—์„œ๋Š” ์ž‘์—…์˜ ์ „๋ฐ˜์ ์ธ ์ง„ํ–‰๋ฅ ์„ ์ถ”์ ํ•˜๊ณ  ํ™œ์„ฑ ์ƒํƒœ์— ์žˆ๊ฑฐ๋‚˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจํ•œ Pod์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์‚ญ์ œํ•˜๋ฉด ์ƒ์„ฑ๋œ Pod ๋ณต์ œ๋ณธ์ด ๋ชจ๋‘ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์€ Kubernetes API์˜ ์ผ๋ถ€์ด๋ฉฐ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ ์œ ํ˜•๊ณผ ๊ฐ™์ด oc ๋ช…๋ น์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ์‚ฌ์–‘ ์ƒ˜ํ”Œ

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  parallelism: 1    1
  completions: 1    2
  activeDeadlineSeconds: 1800 3
  backoffLimit: 6   4
  template:         5
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: OnFailure    6
#...

1
Pod ๋ณต์ œ๋ณธ์€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
2
์ž‘์—…์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋ ค๋ฉด Pod๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
3
์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธฐ๊ฐ„์ž…๋‹ˆ๋‹ค.
4
์ž‘์—… ์žฌ์‹œ๋„ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.
5
์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑํ•˜๋Š” Pod์— ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค.
6
Pod์˜ ์žฌ์‹œ์ž‘ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

5.2.1. ์ž‘์—… ๋ฐ cron ์ž‘์—… ์ดํ•ด

์ž‘์—…์—์„œ๋Š” ์ž‘์—…์˜ ์ „๋ฐ˜์ ์ธ ์ง„ํ–‰๋ฅ ์„ ์ถ”์ ํ•˜๊ณ  ํ™œ์„ฑ ์ƒํƒœ์— ์žˆ๊ฑฐ๋‚˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจํ•œ Pod์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์‚ญ์ œํ•˜๋ฉด ์ž‘์—…์—์„œ ์ƒ์„ฑํ•œ Pod๊ฐ€ ๋ชจ๋‘ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์€ Kubernetes API์˜ ์ผ๋ถ€์ด๋ฉฐ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ ์œ ํ˜•๊ณผ ๊ฐ™์ด oc ๋ช…๋ น์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenShift Container Platform์—๋Š” ํ•œ ๋ฒˆ ์‹คํ–‰ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Job

์ผ๋ฐ˜์ ์ธ ์ž‘์—…์€ ์ž‘์—…์„ ์ƒ์„ฑํ•˜๊ณ  ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•œ ๋ฒˆ ์‹คํ–‰ ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•œ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์ž‘์—… ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

  • ๋น„๋ณ‘๋ ฌ ์ž‘์—…:

    • Pod๊ฐ€ ์‹คํŒจํ•˜์ง€ ์•Š๋Š” ํ•œ ํ•˜๋‚˜์˜ Pod๋งŒ ์‹œ์ž‘ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
    • Pod๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด ์ž‘์—…์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • ์™„๋ฃŒ ํšŸ์ˆ˜๊ฐ€ ๊ณ ์ •๋œ ๋ณ‘๋ ฌ ์ž‘์—…:

    • ์—ฌ๋Ÿฌ Pod๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
    • ์ด ์ž‘์—…์€ ์ „์ฒด ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ 1์—์„œ completions ๊ฐ’ ์‚ฌ์ด์˜ ๊ฐ ๊ฐ’์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์„ฑ๊ณต์ ์ธ Pod๊ฐ€ ์žˆ์„ ๋•Œ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—… ํ๊ฐ€ ์žˆ๋Š” ๋ณ‘๋ ฌ ์ž‘์—…:

    • ์ง€์ •๋œ Pod์— ์—ฌ๋Ÿฌ ๋ณ‘๋ ฌ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
    • OpenShift Container Platform์€ Pod๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ž‘์—…์„ ๊ฒฐ์ •ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋Œ€๊ธฐ์—ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ Pod๋Š” ๋ชจ๋“  ํ”ผ์–ด Pod๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ๋ฐ ์ „์ฒด ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ž‘์—…์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋œ Pod๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ Pod๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ํ•˜๋‚˜ ์ด์ƒ์˜ Pod๊ฐ€ ์„ฑ๊ณต์œผ๋กœ ์ข…๋ฃŒ๋˜๊ณ  ๋ชจ๋“  Pod๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
    • ์„ฑ๊ณต์œผ๋กœ ์ข…๋ฃŒ๋œ Pod๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ Pod์—์„œ ์ด ์ž‘์—…์— ๋Œ€ํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ถœ๋ ฅ์„ ์ž‘์„ฑํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. Pod๋Š” ๋ชจ๋‘ ์ข…๋ฃŒ ํ”„๋กœ์„ธ์Šค์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

      ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubernetes ์„ค๋ช…์„œ์˜ ์ž‘์—… ํŒจํ„ด์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

cron ์ž‘์—…

cron ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋˜๋„๋ก ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cron ์ž‘์—…์€ ์ž‘์—… ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ์ž‘์—…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. cron ์ž‘์—…์€ Kubernetes API์˜ ์ผ๋ถ€์ด๋ฉฐ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ ์œ ํ˜•๊ณผ ๊ฐ™์ด oc ๋ช…๋ น์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฃผ์˜

cron ์ž‘์—…์—์„œ๋Š” Job ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋Œ€๋žต์ ์œผ๋กœ ์ผ์ • ์‹คํ–‰ ์‹œ๊ฐ„๋‹น ํ•œ ๋ฒˆ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์ž‘์—…์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๋‘ ๊ฐœ์˜ ์ž‘์—…์ด ์ƒ์„ฑ๋˜๋Š” ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์—…์ด idempotent์—ฌ์•ผ ํ•˜๊ณ  ๊ธฐ๋ก ์ œํ•œ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5.2.1.1. ์ž‘์—… ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ดํ•ด

๋‘ ๋ฆฌ์†Œ์Šค ์œ ํ˜• ๋ชจ๋‘ ๋‹ค์Œ ์ฃผ์š” ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์ž‘์—… ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Pod ํ…œํ”Œ๋ฆฟ: OpenShift Container Platform์—์„œ ์ƒ์„ฑํ•˜๋Š” Pod๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • parallelism ๋งค๊ฐœ๋ณ€์ˆ˜: ์ž‘์—…์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž„์˜์˜ ์‹œ์ ์— ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” Pod ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ๋น„๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
  • completions ๋งค๊ฐœ๋ณ€์ˆ˜: ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„ฑ๊ณต์ ์ธ Pod ์™„๋ฃŒ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ๋น„๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
    • ์™„๋ฃŒ ํšŸ์ˆ˜๊ฐ€ ๊ณ ์ •๋œ ๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ž‘์—… ํ๊ฐ€ ์žˆ๋Š” ๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ parallelism์ž…๋‹ˆ๋‹ค.
5.2.1.2. ์ตœ๋Œ€ ์ž‘์—… ๊ธฐ๊ฐ„ ์„ค์ • ๋ฐฉ๋ฒ• ์ดํ•ด

์ž‘์—…์„ ์ •์˜ํ•  ๋•Œ activeDeadlineSeconds ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ตœ๋Œ€ ๊ธฐ๊ฐ„์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ดˆ ๋‹จ์œ„๋กœ ์ง€์ •๋˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ตœ๋Œ€ ๊ธฐ๊ฐ„์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ตœ๋Œ€ ๊ธฐ๊ฐ„์€ ์‹œ์Šคํ…œ์—์„œ ์ฒซ ๋ฒˆ์งธ Pod๊ฐ€ ์˜ˆ์•ฝ๋˜๋Š” ์‹œ์ ๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋˜๋ฉฐ ์ž‘์—…์„ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ฐ„์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ํƒ€์ž„์•„์›ƒ์— ๋„๋‹ฌํ•˜๋ฉด OpenShift Container Platform์—์„œ ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

5.2.1.3. Pod๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์—… ๋ฐฑ์˜คํ”„ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

๊ตฌ์„ฑ์˜ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜ ๋˜๋Š” ๊ธฐํƒ€ ์œ ์‚ฌํ•œ ์ด์œ ๋กœ ์ธํ•ด ์„ค์ •๋œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ž‘์—…์ด ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…๊ณผ ์—ฐ๊ฒฐ๋œ ์‹คํŒจํ•œ Pod๋Š” ๊ธ‰๊ฒฉํ•œ ๋ฐฑ์˜คํ”„ ์ง€์—ฐ(10s, 20s, 40s โ€ฆ)์„ 6๋ถ„์œผ๋กœ ์ œํ•œํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ ํ™•์ธ ์ค‘ ์‹คํŒจํ•œ ์ƒˆ Pod๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ์ œํ•œ์ด ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

spec.backoffLimit ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์˜ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

5.2.1.4. ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋„๋ก cron ์ž‘์—…์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

cron ์ž‘์—…์—์„œ๋Š” ์ž‘์—… ๋˜๋Š” Pod์™€ ๊ฐ™์€ ์•„ํ‹ฐํŒฉํŠธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚จ๊ฒจ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด์ „ ์ž‘์—…๊ณผ Pod๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ฆฌ๋˜๋„๋ก ๊ธฐ๋ก ์ œํ•œ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. cron ์ž‘์—… ์‚ฌ์–‘ ๋‚ด์—๋Š” ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋‹ค์Œ ๋‘ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • .spec.successfulJobsHistoryLimit. ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•œ ์ž‘์—…์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’: 3).
  • .spec.failedJobsHistoryLimit. ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‹คํŒจํ•œ ์ž‘์—…์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’: 1).
์ž‘์€ ์ •๋ณด
  • ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ cron ์ž‘์—…์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    $ oc delete cronjob/<cron_job_name>

    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • spec.suspend๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ ์ถ”๊ฐ€ ์‹คํ–‰์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ›„์† ์‹คํ–‰์€ false๋กœ ์žฌ์„ค์ •ํ•  ๋•Œ๊นŒ์ง€ ์ผ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
5.2.1.5. ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ

์ž‘์—… ์‚ฌ์–‘ ์žฌ์‹œ์ž‘ ์ •์ฑ…์€ ์ž‘์—… ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์•„๋‹ŒPod์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž‘์—… ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์žฌ์‹œ๋„ํ•˜๋„๋ก ํ•˜๋“œ ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ restartPolicy: Never ๋˜๋Š” --restart=Never๋Š” restartPolicy: OnFailure ๋˜๋Š” --restart=OnFailure์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์ž‘์—…์ด ์‹คํŒจํ•˜๋ฉด ์ž‘์—…์ด ์„ฑ๊ณตํ•  ๋•Œ๊นŒ์ง€ (๋˜๋Š” ์ž‘์—…์„ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•  ๋•Œ๊นŒ์ง€) ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด ์ •์ฑ…์€ ์žฌ์‹œ์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•˜์œ„ ์‹œ์Šคํ…œ๋งŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Never ์ •์ฑ…์—์„œ๋Š” ์ž‘์—… ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์žฌ์‹œ์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•  ๋•Œ๋งˆ๋‹ค ์ž‘์—… ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ž‘์—… ์ƒํƒœ์˜ ์‹คํŒจ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์‹คํŒจํ•  ๋•Œ๋งˆ๋‹ค Pod ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

OnFailure ์ •์ฑ…์—์„œ๋Š” kubelet์—์„œ ์žฌ์‹œ์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•  ๋•Œ๋งˆ๋‹ค ์ž‘์—… ์ƒํƒœ์˜ ์‹คํŒจ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ kubelet์€ ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ Pod๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ์‹คํŒจํ•œ ์ž‘์—…์„ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

5.2.2. ์ž‘์—… ์ƒ์„ฑ

์ž‘์—… ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ OpenShift Container Platform์—์„œ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

์ž‘์—…์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      parallelism: 1    1
      completions: 1    2
      activeDeadlineSeconds: 1800 3
      backoffLimit: 6   4
      template:         5
        metadata:
          name: pi
        spec:
          containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: OnFailure    6
    #...
    1
    ์„ ํƒ ์‚ฌํ•ญ: ์ž‘์—…์ด ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” Pod ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1 ์ž…๋‹ˆ๋‹ค.
    • ๋น„๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
    2
    ์„ ํƒ ์‚ฌํ•ญ: ์ž‘์—…์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„ฑ๊ณต์ ์ธ Pod ์™„๋ฃŒ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๋น„๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
    • ์™„๋ฃŒ ํšŸ์ˆ˜๊ฐ€ ๊ณ ์ •๋œ ๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์™„๋ฃŒ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ž‘์—… ํ๊ฐ€ ์žˆ๋Š” ๋ณ‘๋ ฌ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ parallelism์ž…๋‹ˆ๋‹ค.
    3
    ์„ ํƒ ์‚ฌํ•ญ: ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    4
    ์„ ํƒ ์‚ฌํ•ญ: ์ž‘์—… ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 6์ž…๋‹ˆ๋‹ค.
    5
    ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑํ•˜๋Š” Pod์— ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    6
    Pod ์žฌ์‹œ์ž‘ ์ •์ฑ…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • Never. ์ž‘์—…์„ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • OnFailure. ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘์—…์„ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • Always ์ž‘์—…์„ ํ•ญ์ƒ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

      OpenShift Container Platform์—์„œ ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ์— ์žฌ์‹œ์ž‘ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubernetes ์„ค๋ช…์„œ์˜ ์˜ˆ์ œ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  2. ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>.yaml
์ฐธ๊ณ 

oc create job์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ๋ช…๋ น์œผ๋กœ ์ž‘์—…์„ ์ƒ์„ฑํ•˜๊ณ  ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์—์„œ๋Š” ์ด์ „ ์˜ˆ์ œ์—์„œ ์ง€์ •ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ƒ์„ฑํ•˜๊ณ  ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

$ oc create job pi --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)'

5.2.3. cron ์ž‘์—… ์ƒ์„ฑ

์ž‘์—… ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ OpenShift Container Platform์—์„œ cron ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

cron ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: pi
    spec:
      schedule: "*/1 * * * *"  1
      concurrencyPolicy: "Replace" 2
      startingDeadlineSeconds: 200 3
      suspend: true            4
      successfulJobsHistoryLimit: 3 5
      failedJobsHistoryLimit: 1     6
      jobTemplate:             7
        spec:
          template:
            metadata:
              labels:          8
                parent: "cronjobpi"
            spec:
              containers:
              - name: pi
                image: perl
                command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
              restartPolicy: OnFailure 9
    #...
    1
    cron ํ˜•์‹์— ์ง€์ •๋œ ์ž‘์—…์˜ ์Šค์ผ€์ค„์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ์ž‘์—…์€ ๋ถ„๋งˆ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    2
    cron ์ž‘์—… ๋‚ด์˜ ๋™์‹œ ์ž‘์—… ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋Š” ์„ ํƒ์  ๋™์‹œ์„ฑ ์ •์ฑ…์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋™์‹œ์„ฑ ์ •์ฑ… ์ค‘ ํ•˜๋‚˜๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ ๋™์‹œ ์‹คํ–‰์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • Allow๋Š” cron ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Forbid๋Š” ๋™์‹œ ์‹คํ–‰์„ ๊ธˆ์ง€ํ•˜๊ณ  ์ด์ „ ์‹คํ–‰์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ ์‹คํ–‰์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
    • Replace๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์ทจ์†Œํ•˜๊ณ  ์ƒˆ ์ž‘์—…์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
    3
    ์–ด๋– ํ•œ ์ด์œ ๋กœ ์˜ˆ์•ฝ๋œ ์‹œ๊ฐ„์„ ๋†“์น˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ์„ ํƒ์  ๋ฐ๋“œ๋ผ์ธ(์ดˆ)์ž…๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ์ž‘์—… ์‹คํ–‰์€ ์‹คํŒจํ•œ ์ž‘์—…์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ๋“œ๋ผ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.
    4
    cron ์ž‘์—…์˜ ์ค‘์ง€๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. true๋กœ ์„ค์ •ํ•˜๋ฉด ์ดํ›„์˜ ๋ชจ๋“  ์‹คํ–‰์ด ์ผ์‹œ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.
    5
    ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•œ ์ž‘์—…์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’: 3).
    6
    ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‹คํŒจํ•œ ์ž‘์—…์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’: 1).
    7
    ์ž‘์—… ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ์€ ์ž‘์—… ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    8
    ์ด cron ์ž‘์—…์—์„œ ์ƒ์„ฑํ•œ ์ž‘์—…์— ๋ผ๋ฒจ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    9
    Pod์˜ ์žฌ์‹œ์ž‘ ์ •์ฑ…์ž…๋‹ˆ๋‹ค. ์ด ์ •์ฑ…์€ ์ž‘์—… ์ปจํŠธ๋กค๋Ÿฌ์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ์ฐธ๊ณ 

    .spec.successfulJobsHistoryLimit ๋ฐ .spec.failedJobsHistoryLimit ํ•„๋“œ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•„๋“œ๋Š” ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์™„๋ฃŒ๋œ ์ž‘์—… ์ˆ˜ ๋ฐ ์‹คํŒจํ•œ ์ž‘์—… ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ๊ฐ 3๊ณผ 1๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ œํ•œ์„ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„ ์ž‘์—…์„ ์œ ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. cron ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>.yaml
์ฐธ๊ณ 

oc create cronjob์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ๋ช…๋ น์œผ๋กœ cron ์ž‘์—…์„ ์ƒ์„ฑํ•˜๊ณ  ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์—์„œ๋Š” ์ด์ „ ์˜ˆ์ œ์—์„œ ์ง€์ •ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ cron ์ž‘์—…์„ ์ƒ์„ฑํ•˜๊ณ  ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

$ oc create cronjob pi --image=perl --schedule='*/1 * * * *' -- perl -Mbignum=bpi -wle 'print bpi(2000)'

oc create cronjob์„ ์‚ฌ์šฉํ•˜๋ฉด --schedule ์˜ต์…˜์—์„œ cron ํ˜•์‹์œผ๋กœ ๋œ ์ผ์ •์„ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.

6์žฅ. ๋…ธ๋“œ ์ž‘์—…

6.1. OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ ๋ณด๊ธฐ ๋ฐ ๋‚˜์—ด

ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ๋…ธ๋“œ์˜ ์ƒํƒœ, ์ˆ˜๋ช…, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ์„ธ๋ถ€ ์ •๋ณด์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ๊ด€๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ CLI๋Š” ์‹ค์ œ ๋…ธ๋“œ ํ˜ธ์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋…ธ๋“œ ์˜ค๋ธŒ์ ํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ๋Š” ๋…ธ๋“œ ์˜ค๋ธŒ์ ํŠธ์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ์ ๊ฒ€์—์„œ ๋…ธ๋“œ๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

6.1.1. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ ๋‚˜์—ด ์ •๋ณด

ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

    $ oc get nodes

    ๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ •์ƒ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์ž…๋‹ˆ๋‹ค.

    $ oc get nodes

    ์ถœ๋ ฅ ์˜ˆ

    NAME                   STATUS    ROLES     AGE       VERSION
    master.example.com     Ready     master    7h        v1.23.0
    node1.example.com      Ready     worker    7h        v1.23.0
    node2.example.com      Ready     worker    7h        v1.23.0

    ๋‹ค์Œ ์˜ˆ์ œ๋Š” ํ•˜๋‚˜์˜ ๋น„์ •์ƒ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์ž…๋‹ˆ๋‹ค.

    $ oc get nodes

    ์ถœ๋ ฅ ์˜ˆ

    NAME                   STATUS                      ROLES     AGE       VERSION
    master.example.com     Ready                       master    7h        v1.23.0
    node1.example.com      NotReady,SchedulingDisabled worker    7h        v1.23.0
    node2.example.com      Ready                       worker    7h        v1.23.0

    NotReady ์ƒํƒœ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์กฐ๊ฑด์€ ์ด ์„น์…˜์˜ ๋’ท๋ถ€๋ถ„์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • -wide ์˜ต์…˜์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    $ oc get nodes -o wide

    ์ถœ๋ ฅ ์˜ˆ

    NAME                STATUS   ROLES    AGE    VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                                                       KERNEL-VERSION                 CONTAINER-RUNTIME
    master.example.com  Ready    master   171m   v1.23.0   10.0.129.108   <none>        Red Hat Enterprise Linux CoreOS 48.83.202103210901-0 (Ootpa)   4.18.0-240.15.1.el8_3.x86_64   cri-o://1.23.0-30.rhaos4.10.gitf2f339d.el8-dev
    node1.example.com   Ready    worker   72m    v1.23.0   10.0.129.222   <none>        Red Hat Enterprise Linux CoreOS 48.83.202103210901-0 (Ootpa)   4.18.0-240.15.1.el8_3.x86_64   cri-o://1.23.0-30.rhaos4.10.gitf2f339d.el8-dev
    node2.example.com   Ready    worker   164m   v1.23.0   10.0.142.150   <none>        Red Hat Enterprise Linux CoreOS 48.83.202103210901-0 (Ootpa)   4.18.0-240.15.1.el8_3.x86_64   cri-o://1.23.0-30.rhaos4.10.gitf2f339d.el8-dev

  • ๋‹ค์Œ ๋ช…๋ น์—์„œ๋Š” ๋‹จ์ผ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

    $ oc get node <node>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc get node node1.example.com

    ์ถœ๋ ฅ ์˜ˆ

    NAME                   STATUS    ROLES     AGE       VERSION
    node1.example.com      Ready     worker    7h        v1.23.0

  • ๋‹ค์Œ ๋ช…๋ น์€ ํ˜„์žฌ ์กฐ๊ฑด์˜ ์ด์œ ๋ฅผ ํฌํ•จํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    $ oc describe node <node>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc describe node node1.example.com

    ์ถœ๋ ฅ ์˜ˆ

    Name:               node1.example.com 1
    Roles:              worker 2
    Labels:             beta.kubernetes.io/arch=amd64   3
                        beta.kubernetes.io/instance-type=m4.large
                        beta.kubernetes.io/os=linux
                        failure-domain.beta.kubernetes.io/region=us-east-2
                        failure-domain.beta.kubernetes.io/zone=us-east-2a
                        kubernetes.io/hostname=ip-10-0-140-16
                        node-role.kubernetes.io/worker=
    Annotations:        cluster.k8s.io/machine: openshift-machine-api/ahardin-worker-us-east-2a-q5dzc  4
                        machineconfiguration.openshift.io/currentConfig: worker-309c228e8b3a92e2235edd544c62fea8
                        machineconfiguration.openshift.io/desiredConfig: worker-309c228e8b3a92e2235edd544c62fea8
                        machineconfiguration.openshift.io/state: Done
                        volumes.kubernetes.io/controller-managed-attach-detach: true
    CreationTimestamp:  Wed, 13 Feb 2019 11:05:57 -0500
    Taints:             <none>  5
    Unschedulable:      false
    Conditions:                 6
      Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
      ----             ------  -----------------                 ------------------                ------                       -------
      OutOfDisk        False   Wed, 13 Feb 2019 15:09:42 -0500   Wed, 13 Feb 2019 11:05:57 -0500   KubeletHasSufficientDisk     kubelet has sufficient disk space available
      MemoryPressure   False   Wed, 13 Feb 2019 15:09:42 -0500   Wed, 13 Feb 2019 11:05:57 -0500   KubeletHasSufficientMemory   kubelet has sufficient memory available
      DiskPressure     False   Wed, 13 Feb 2019 15:09:42 -0500   Wed, 13 Feb 2019 11:05:57 -0500   KubeletHasNoDiskPressure     kubelet has no disk pressure
      PIDPressure      False   Wed, 13 Feb 2019 15:09:42 -0500   Wed, 13 Feb 2019 11:05:57 -0500   KubeletHasSufficientPID      kubelet has sufficient PID available
      Ready            True    Wed, 13 Feb 2019 15:09:42 -0500   Wed, 13 Feb 2019 11:07:09 -0500   KubeletReady                 kubelet is posting ready status
    Addresses:   7
      InternalIP:   10.0.140.16
      InternalDNS:  ip-10-0-140-16.us-east-2.compute.internal
      Hostname:     ip-10-0-140-16.us-east-2.compute.internal
    Capacity:    8
     attachable-volumes-aws-ebs:  39
     cpu:                         2
     hugepages-1Gi:               0
     hugepages-2Mi:               0
     memory:                      8172516Ki
     pods:                        250
    Allocatable:
     attachable-volumes-aws-ebs:  39
     cpu:                         1500m
     hugepages-1Gi:               0
     hugepages-2Mi:               0
     memory:                      7558116Ki
     pods:                        250
    System Info:    9
     Machine ID:                              63787c9534c24fde9a0cde35c13f1f66
     System UUID:                             EC22BF97-A006-4A58-6AF8-0A38DEEA122A
     Boot ID:                                 f24ad37d-2594-46b4-8830-7f7555918325
     Kernel Version:                          3.10.0-957.5.1.el7.x86_64
     OS Image:                                Red Hat Enterprise Linux CoreOS 410.8.20190520.0 (Ootpa)
     Operating System:                        linux
     Architecture:                            amd64
     Container Runtime Version:               cri-o://1.16.0-0.6.dev.rhaos4.3.git9ad059b.el8-rc2
     Kubelet Version:                         v1.23.0
     Kube-Proxy Version:                      v1.23.0
    PodCIDR:                                  10.128.4.0/24
    ProviderID:                               aws:///us-east-2a/i-04e87b31dc6b3e171
    Non-terminated Pods:                      (13 in total)  10
      Namespace                               Name                                   CPU Requests  CPU Limits  Memory Requests  Memory Limits
      ---------                               ----                                   ------------  ----------  ---------------  -------------
      openshift-cluster-node-tuning-operator  tuned-hdl5q                            0 (0%)        0 (0%)      0 (0%)           0 (0%)
      openshift-dns                           dns-default-l69zr                      0 (0%)        0 (0%)      0 (0%)           0 (0%)
      openshift-image-registry                node-ca-9hmcg                          0 (0%)        0 (0%)      0 (0%)           0 (0%)
      openshift-ingress                       router-default-76455c45c-c5ptv         0 (0%)        0 (0%)      0 (0%)           0 (0%)
      openshift-machine-config-operator       machine-config-daemon-cvqw9            20m (1%)      0 (0%)      50Mi (0%)        0 (0%)
      openshift-marketplace                   community-operators-f67fh              0 (0%)        0 (0%)      0 (0%)           0 (0%)
      openshift-monitoring                    alertmanager-main-0                    50m (3%)      50m (3%)    210Mi (2%)       10Mi (0%)
      openshift-monitoring                    grafana-78765ddcc7-hnjmm               100m (6%)     200m (13%)  100Mi (1%)       200Mi (2%)
      openshift-monitoring                    node-exporter-l7q8d                    10m (0%)      20m (1%)    20Mi (0%)        40Mi (0%)
      openshift-monitoring                    prometheus-adapter-75d769c874-hvb85    0 (0%)        0 (0%)      0 (0%)           0 (0%)
      openshift-multus                        multus-kw8w5                           0 (0%)        0 (0%)      0 (0%)           0 (0%)
      openshift-sdn                           ovs-t4dsn                              100m (6%)     0 (0%)      300Mi (4%)       0 (0%)
      openshift-sdn                           sdn-g79hg                              100m (6%)     0 (0%)      200Mi (2%)       0 (0%)
    Allocated resources:
      (Total limits may be over 100 percent, i.e., overcommitted.)
      Resource                    Requests     Limits
      --------                    --------     ------
      cpu                         380m (25%)   270m (18%)
      memory                      880Mi (11%)  250Mi (3%)
      attachable-volumes-aws-ebs  0            0
    Events:     11
      Type     Reason                   Age                From                      Message
      ----     ------                   ----               ----                      -------
      Normal   NodeHasSufficientPID     6d (x5 over 6d)    kubelet, m01.example.com  Node m01.example.com status is now: NodeHasSufficientPID
      Normal   NodeAllocatableEnforced  6d                 kubelet, m01.example.com  Updated Node Allocatable limit across pods
      Normal   NodeHasSufficientMemory  6d (x6 over 6d)    kubelet, m01.example.com  Node m01.example.com status is now: NodeHasSufficientMemory
      Normal   NodeHasNoDiskPressure    6d (x6 over 6d)    kubelet, m01.example.com  Node m01.example.com status is now: NodeHasNoDiskPressure
      Normal   NodeHasSufficientDisk    6d (x6 over 6d)    kubelet, m01.example.com  Node m01.example.com status is now: NodeHasSufficientDisk
      Normal   NodeHasSufficientPID     6d                 kubelet, m01.example.com  Node m01.example.com status is now: NodeHasSufficientPID
      Normal   Starting                 6d                 kubelet, m01.example.com  Starting kubelet.
    #...

    1
    ๋…ธ๋“œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    2
    ๋…ธ๋“œ์˜ ์—ญํ• (master ๋˜๋Š” worker)์ž…๋‹ˆ๋‹ค.
    3
    ๋…ธ๋“œ์— ์ ์šฉ๋˜๋Š” ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.
    4
    ๋…ธ๋“œ์— ์ ์šฉ๋˜๋Š” ์ฃผ์„์ž…๋‹ˆ๋‹ค.
    5
    ๋…ธ๋“œ์— ์ ์šฉ๋˜๋Š” ํ…Œ์ธํŠธ์ž…๋‹ˆ๋‹ค.
    6
    ๋…ธ๋“œ ์กฐ๊ฑด ๋ฐ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. conditions ์Šคํƒ ์ž๋Š” Ready, PIDPressure, PIDPressure, MemoryPressure, DiskPressure OutOfDisk ์ƒํƒœ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์€ ์ด ์„น์…˜์˜ ๋’ท๋ถ€๋ถ„์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    7
    ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ ๋ฐ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    8
    Pod ๋ฆฌ์†Œ์Šค ๋ฐ ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค.
    9
    ๋…ธ๋“œ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.
    10
    ๋…ธ๋“œ์˜ Pod์ž…๋‹ˆ๋‹ค.
    11
    ๋…ธ๋“œ์—์„œ ๋ณด๊ณ ํ•œ ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ์— ํ‘œ์‹œ๋œ ์ •๋ณด ์ค‘์— ๋‹ค์Œ ๋…ธ๋“œ ์ƒํƒœ๊ฐ€ ์ด ์„น์…˜์— ํ‘œ์‹œ๋œ ๋ช…๋ น์˜ ์ถœ๋ ฅ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํ‘œ 6.1. ๋…ธ๋“œ ์ƒํƒœ
์ƒํƒœ์„ค๋ช…

Ready

true์ธ ๊ฒฝ์šฐ ๋…ธ๋“œ๊ฐ€ ์ •์ƒ์ด๊ณ  Pod๋ฅผ ํ—ˆ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. false์ธ ๊ฒฝ์šฐ ๋…ธ๋“œ์—์„œ ์ •์ƒ์ด ์•„๋‹ˆ๋ฉฐ Pod๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. unknown์ธ ๊ฒฝ์šฐ ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ node-monitor-grace-period (๊ธฐ๋ณธ๊ฐ’: 40์ดˆ)์— ๋Œ€ํ•ด ๋…ธ๋“œ์—์„œ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

DiskPressure

true์ธ ๊ฒฝ์šฐ ๋””์Šคํฌ ์šฉ๋Ÿ‰์ด ์ ์Šต๋‹ˆ๋‹ค.

MemoryPressure

true์ธ ๊ฒฝ์šฐ ๋…ธ๋“œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

PIDPressure

true์ธ ๊ฒฝ์šฐ ๋…ธ๋“œ์— ๋„ˆ๋ฌด ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

OutOfDisk

true์ธ ๊ฒฝ์šฐ ๋…ธ๋“œ์— pod๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋…ธ๋“œ์˜ ์—ฌ์œ  ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

NetworkUnavailable

true์ธ ๊ฒฝ์šฐ ๋…ธ๋“œ์˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

NotReady

true์ธ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ๋„คํŠธ์›Œํฌ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์•„์ง ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

SchedulingDisabled

Pod๋Š” ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•˜๋„๋ก ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

6.1.2. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ์— ์žˆ๋Š” Pod ๋‚˜์—ด

ํŠน์ • ๋…ธ๋“œ์˜ ๋ชจ๋“  Pod๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  • ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ์— ์žˆ๋Š” ๋ชจ๋“  Pod ๋˜๋Š” ์„ ํƒํ•œ Pod๋ฅผ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc describe node <node1> <node2>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc describe node ip-10-0-128-218.ec2.internal
  • ์„ ํƒํ•œ ๋…ธ๋“œ์—์„œ ๋ชจ๋“  Pod ๋˜๋Š” ์„ ํƒํ•œ Pod๋ฅผ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc describe --selector=<node_selector>
    $ oc describe node  --selector=kubernetes.io/os

    ๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc describe -l=<pod_selector>
    $ oc describe node -l node-role.kubernetes.io/worker
  • ์ข…๋ฃŒ๋œ Pod๋ฅผ ํฌํ•จํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์˜ ๋ชจ๋“  Pod๋ฅผ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc get pod --all-namespaces --field-selector=spec.nodeName=<nodename>

6.1.3. ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„ ๋ณด๊ธฐ

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

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๋ณด๋ ค๋ฉด cluster-reader ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๋ณด๋ ค๋ฉด ๋ฉ”ํŠธ๋ฆญ์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  • ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm top nodes

    ์ถœ๋ ฅ ์˜ˆ

    NAME                                   CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
    ip-10-0-12-143.ec2.compute.internal    1503m        100%      4533Mi          61%
    ip-10-0-132-16.ec2.compute.internal    76m          5%        1391Mi          18%
    ip-10-0-140-137.ec2.compute.internal   398m         26%       2473Mi          33%
    ip-10-0-142-44.ec2.compute.internal    656m         43%       6119Mi          82%
    ip-10-0-146-165.ec2.compute.internal   188m         12%       3367Mi          45%
    ip-10-0-19-62.ec2.compute.internal     896m         59%       5754Mi          77%
    ip-10-0-44-193.ec2.compute.internal    632m         42%       5349Mi          72%

  • ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์˜ ์‚ฌ์šฉ๋Ÿ‰ ํ†ต๊ณ„๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm top node --selector=''

    ํ•„ํ„ฐ๋งํ•  ์„ ํƒ๊ธฐ(๋ผ๋ฒจ ์ฟผ๋ฆฌ)๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. =, ==, !=๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

6.2. ๋…ธ๋“œ ์ž‘์—…

๊ด€๋ฆฌ์ž๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.2.1. ๋…ธ๋“œ์—์„œ Pod๋ฅผ ๋น„์šฐ๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

Pod๋ฅผ ๋น„์šฐ๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ์ง€์ •๋œ ๋…ธ๋“œ์—์„œ ๋ชจ๋“  Pod ๋˜๋Š” ์„ ํƒํ•œ Pod๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์›ํ•˜๋Š” Pod๋งŒ ๋น„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ง€์ •๋œ ๋…ธ๋“œ์—์„œ ๊ธฐ์กด Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฒ ์–ด Pod๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pod ์„ ํƒ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์—ฌ Pod์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋น„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod ์„ ํƒ๊ธฐ๋Š” ๋ผ๋ฒจ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ ๋ผ๋ฒจ์ด ์ง€์ •๋œ Pod๋ฅผ ๋ชจ๋‘ ๋น„์›๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. Pod ๋น„์šฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    1. ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

      $ oc adm cordon <node1>

      ์ถœ๋ ฅ ์˜ˆ

      node/<node1> cordoned

    2. ๋…ธ๋“œ ์ƒํƒœ๊ฐ€ Ready,SchedulingDisabled ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc get node <node1>

      ์ถœ๋ ฅ ์˜ˆ

      NAME        STATUS                     ROLES     AGE       VERSION
      <node1>     Ready,SchedulingDisabled   worker    1d        v1.24.0

  2. ๋‹ค์Œ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ๋น„์›๋‹ˆ๋‹ค.

    • ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ์— ์žˆ๋Š” ๋ชจ๋“  Pod ๋˜๋Š” ์„ ํƒํ•œ Pod๋ฅผ ๋น„์›๋‹ˆ๋‹ค.

      $ oc adm drain <node1> <node2> [--pod-selector=<pod_selector>]
    • --force ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ ์–ด Pod๋ฅผ ๊ฐ•์ œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. true๋กœ ์„ค์ •ํ•˜๋ฉด ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ, ๋ณต์ œ๋ณธ ์„ธํŠธ, ์ž‘์—…, ๋ฐ๋ชฌ ์„ธํŠธ ๋˜๋Š” ์ƒํƒœ ์ €์žฅ ์„ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” Pod๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๊ณ„์† ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

      $ oc adm drain <node1> <node2> --force=true
    • --grace-period ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ Pod๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋Š” ์‹œ๊ฐ„(์ดˆ)์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ Pod์— ์ง€์ •๋œ ๊ธฐ๋ณธ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

      $ oc adm drain <node1> <node2> --grace-period=-1
    • true๋กœ ์„ค์ •๋œ --ignore-daemonsets ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ๋ชฌ ์„ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” Pod๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

      $ oc adm drain <node1> <node2> --ignore-daemonsets=true
    • --timeout ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด 0์ด๋ฉด ์‹œ๊ฐ„์ด ์ œํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

      $ oc adm drain <node1> <node2> --timeout=5s
    • --delete-emptydir-data ํ”Œ๋ž˜๊ทธ๋ฅผ true ๋กœ ์„ค์ •ํ•˜์—ฌ emptyDir ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋Š” Pod๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ Pod๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ ๋“œ๋ ˆ์ด๋‹๋˜๋ฉด ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

      $ oc adm drain <node1> <node2> --delete-emptydir-data=true
    • --dry-run ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•˜์—ฌ ์‹ค์ œ๋กœ ๋น„์šฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

      $ oc adm drain <node1> <node2>  --dry-run=true

      ํŠน์ • ๋…ธ๋“œ ์ด๋ฆ„(์˜ˆ: <node1> <node2>)์„ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹  --selector=<node_selector> ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•œ ๋…ธ๋“œ์—์„œ Pod๋ฅผ ๋น„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์™„๋ฃŒ๋˜๋ฉด ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm uncordon <node1>

6.2.2. ๋…ธ๋“œ์—์„œ ๋ผ๋ฒจ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

๋…ธ๋“œ์—์„œ ์ž„์˜์˜ ๋ผ๋ฒจ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จธ์‹ ์—์„œ ๋…ธ๋“œ๋ฅผ ๋ฐฑ์—…ํ•ด๋„ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋…ธ๋“œ ๋ผ๋ฒจ์ด ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

MachineSet ์˜ค๋ธŒ์ ํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์€ ๋จธ์‹  ์„ธํŠธ์— ํฌํ•จ๋œ ๊ธฐ์กด ๋จธ์‹ ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์กด MachineSet ์˜ค๋ธŒ์ ํŠธ์—์„œ ํŽธ์ง‘ ๋˜๋Š” ์ถ”๊ฐ€๋œ ๋ผ๋ฒจ์€ ๋จธ์‹  ์„ธํŠธ์™€ ์—ฐ๊ฒฐ๋œ ๊ธฐ์กด ๋จธ์‹  ๋ฐ ๋…ธ๋“œ๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ ๋ช…๋ น์€ ๋…ธ๋“œ์—์„œ ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    $ oc label node <node> <key_1>=<value_1> ... <key_n>=<value_n>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc label nodes webconsole-7f7f6 unhealthy=true
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋ ˆ์ด๋ธ”์„ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    kind: Node
    apiVersion: v1
    metadata:
      name: webconsole-7f7f6
      labels:
        unhealthy: 'true'
    #...
  • ๋‹ค์Œ ๋ช…๋ น์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  Pod๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    $ oc label pods --all <key_1>=<value_1>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc label pods --all status=unhealthy

6.2.3. ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ๋˜๋Š” ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ๊ฐ€ Ready ์ธ ์ •์ƒ ๋…ธ๋“œ๋Š” ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋…ธ๋“œ์— ์ƒˆ Pod๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋กœ ํ‘œ์‹œํ•˜๋ฉด ์ƒˆ Pod๊ฐ€ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ ๊ธฐ์กด Pod์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ ๋ช…๋ น์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    $ oc adm cordon <node>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc adm cordon node1.example.com

    ์ถœ๋ ฅ ์˜ˆ

    node/node1.example.com cordoned
    
    NAME                 LABELS                                        STATUS
    node1.example.com    kubernetes.io/hostname=node1.example.com      Ready,SchedulingDisabled

  • ๋‹ค์Œ ๋ช…๋ น์€ ํ˜„์žฌ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm uncordon <node1>

    ๋˜๋Š” ํŠน์ • ๋…ธ๋“œ ์ด๋ฆ„(์˜ˆ: <node>)์„ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹  --selector=<node_selector> ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•œ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ๋˜๋Š” ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.2.4. ๋…ธ๋“œ ์‚ญ์ œ

6.2.4.1. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ ์‚ญ์ œ

CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด Kubernetes์—์„œ ๋…ธ๋“œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์‚ญ์ œ๋˜์ง€๋งŒ ๋…ธ๋“œ์— ์กด์žฌํ•˜๋Š” Pod๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ Pod๋Š” OpenShift Container Platform์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์›ํ•˜๋Š” Pod๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๋‹ค์‹œ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ Pod๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ํ•ด๋‹น MachineSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

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

  1. ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ๋จธ์‹  ์„ธํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get machinesets -n openshift-machine-api

    ๋จธ์‹  ์„ธํŠธ๋Š” <clusterid>-worker-<aws-region-az> ํ˜•์‹์œผ๋กœ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

  2. ๋จธ์‹  ์„ธํŠธ๋ฅผ ์Šค์ผ€์ผ๋งํ•ฉ๋‹ˆ๋‹ค.

    $ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api

    ๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit machineset <machineset> -n openshift-machine-api
    ์ž‘์€ ์ •๋ณด

    ๋˜๋Š” ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋จธ์‹  ์„ธํŠธ๋ฅผ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    metadata:
      name: <machineset>
      namespace: openshift-machine-api
    spec:
      replicas: 2
    #...

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

6.2.4.2. ๋ฒ ์–ด ๋ฉ”ํƒˆ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ ์‚ญ์ œ

CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด Kubernetes์—์„œ ๋…ธ๋“œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์‚ญ์ œ๋˜์ง€๋งŒ ๋…ธ๋“œ์— ์กด์žฌํ•˜๋Š” Pod๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ Pod๋Š” OpenShift Container Platform์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์›ํ•˜๋Š” Pod๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๋‹ค์‹œ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ Pod๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜์—ฌ ๋ฒ ์–ด ๋ฉ”ํƒˆ์—์„œ ์‹คํ–‰ ์ค‘์ธ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  1. ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm cordon <node_name>
  2. ๋…ธ๋“œ์˜ ๋ชจ๋“  Pod๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm drain <node_name> --force=true

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

  3. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    $ oc delete node <node_name>

    ๋…ธ๋“œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ญ์ œ๋˜์–ด๋„ ์žฌ๋ถ€ํŒ… ํ›„ ๋˜๋Š” kubelet ์„œ๋น„์Šค๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์‹œ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ์™€ ๋…ธ๋“œ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋…ธ๋“œ๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ฌผ๋ฆฌ ํ•˜๋“œ์›จ์–ด์˜ ์ „์›์„ ๋ˆ ๊ฒฝ์šฐ ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์‹œ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ํ•˜๋“œ์›จ์–ด๋ฅผ ๋‹ค์‹œ ์ผญ๋‹ˆ๋‹ค.

6.3. ๋…ธ๋“œ ๊ด€๋ฆฌ

OpenShift Container Platform์—์„œ๋Š” KubeletConfig CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์˜ ๊ตฌ์„ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. KubeletConfig ์˜ค๋ธŒ์ ํŠธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ด€๋ฆฌํ˜• ๋จธ์‹  ๊ตฌ์„ฑ์ด ์ƒ์„ฑ๋˜์–ด ๋…ธ๋“œ์˜ ์„ค์ •์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์›๊ฒฉ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒƒ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6.3.1. ๋…ธ๋“œ ์ˆ˜์ •

ํด๋Ÿฌ์Šคํ„ฐ ๋˜๋Š” ๋จธ์‹  ํ’€์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด CRD(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ •์˜) ๋˜๋Š” kubeletConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ๋Š” CRD๋ฅผ ํ†ตํ•ด ๋„์ž…๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋Š” ๋ฐ Machine Config Controller๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

kubeletConfig ์˜ค๋ธŒ์ ํŠธ์˜ ํ•„๋“œ๋Š” ์—…์ŠคํŠธ๋ฆผ Kubernetes์˜ kubelet์œผ๋กœ ์ง์ ‘ ์ „๋‹ฌ๋˜๋ฏ€๋กœ ํ•ด๋‹น ํ•„๋“œ์˜ ๊ฒ€์ฆ์€ kubelet ์ž์ฒด์—์„œ ์ง์ ‘ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•„๋“œ์— ์œ ํšจํ•œ ๊ฐ’์€ ๊ด€๋ จ Kubernetes ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. kubeletConfig ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ž˜๋ชป๋œ ๊ฐ’์œผ๋กœ ์ธํ•ด ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ๊ตฌ์„ฑํ•˜๋ ค๋Š” ๋…ธ๋“œ ์œ ํ˜•์˜ ์ •์  CRD์ธ ๋จธ์‹  ๊ตฌ์„ฑ ํ’€๊ณผ ์—ฐ๊ฒฐ๋œ ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. ์›ํ•˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์˜ ํ˜„์žฌ ๋ผ๋ฒจ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $  oc get machineconfigpool  --show-labels

      ์ถœ๋ ฅ ์˜ˆ

      NAME      CONFIG                                             UPDATED   UPDATING   DEGRADED   LABELS
      master    rendered-master-e05b81f5ca4db1d249a1bf32f9ec24fd   True      False      False      operator.machineconfiguration.openshift.io/required-for-upgrade=
      worker    rendered-worker-f50e78e1bc06d8e82327763145bfcf62   True      False      False

    2. ์›ํ•˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์— ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc label machineconfigpool worker custom-kubelet=enabled
  2. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ kubeletconfig CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    custom-config CR ๊ตฌ์„ฑ ์ƒ˜ํ”Œ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: custom-config 1
    spec:
      machineConfigPoolSelector:
        matchLabels:
          custom-kubelet: enabled 2
      kubeletConfig: 3
        podsPerCore: 10
        maxPods: 250
        systemReserved:
          cpu: 2000m
          memory: 1Gi
    #...

    1
    CR์— ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ผ๋ฒจ์€ ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์— ์ถ”๊ฐ€ํ•œ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.
    3
    ๋ณ€๊ฒฝํ•  ์ƒˆ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. CR ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc create -f master-kube-config.yaml

๋Œ€๋ถ€๋ถ„์˜ Kubelet ๊ตฌ์„ฑ ์˜ต์…˜ ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ต์…˜์€ ๋ฎ์–ด์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • CgroupDriver
  • ClusterDNS
  • ClusterDomain
  • StaticPodPath
์ฐธ๊ณ 

๋‹จ์ผ ๋…ธ๋“œ์— 50๊ฐœ ์ด์ƒ์˜ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ ๊ฐ„์— Pod ์˜ˆ์•ฝ์˜ ๋ถˆ๊ท ํ˜•์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋…ธ๋“œ์˜ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์ด ๊ธฐ๋ณธ์ ์œผ๋กœ 50๊ฐœ๋กœ ๋‹จ์ถ•๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. KubeletConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  nodeStatusMaxImages ์˜ ๊ฐ’์„ -1 ๋กœ ์„ค์ •ํ•˜์—ฌ ์ด๋ฏธ์ง€ ์ œํ•œ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.3.2. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์œผ๋กœ ๊ตฌ์„ฑ

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ƒˆ Pod๋ฅผ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋Š” ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งˆ์Šคํ„ฐ๋Š” ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž‘์—…์ž ๋…ธ๋“œ๋Š” ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ฒ ์–ด ๋ฉ”ํƒˆ ํด๋Ÿฌ์Šคํ„ฐ์— ์ž‘์—…์ž ๋…ธ๋“œ ์—†์ด OpenShift Container Platform์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

mastersSchedulable ํ•„๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

๊ธฐ๋ณธ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€์—์„œ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์œผ๋กœ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์ถ”๊ฐ€ ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๊ฐ€ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. schedulers.config.openshift.io ๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit schedulers.config.openshift.io cluster
  2. mastersSchedulable ํ•„๋“œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: config.openshift.io/v1
    kind: Scheduler
    metadata:
      creationTimestamp: "2019-09-10T03:04:05Z"
      generation: 1
      name: cluster
      resourceVersion: "433"
      selfLink: /apis/config.openshift.io/v1/schedulers/cluster
      uid: a636d30a-d377-11e9-88d4-0a60097bee62
    spec:
      mastersSchedulable: false 1
    status: {}
    #...
    1
    ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด true ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋ ค๋ฉด false ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

6.3.3. SELinux ๋ถ€์šธ ์„ค์ •

OpenShift Container Platform์„ ์‚ฌ์šฉํ•˜๋ฉด RHCOS(Red Hat Enterprise Linux CoreOS) ๋…ธ๋“œ์—์„œ SELinux ๋ถ€์šธ์„ ํ™œ์„ฑํ™” ๋ฐ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ ˆ์ฐจ์—์„œ๋Š” MCO(Machine Config Operator)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์—์„œ SELinux ๋ถ€์šธ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ˆ์ฐจ์—์„œ๋Š” container_manage_cgroup ์„ ์˜ˆ์ œ ๋ถ€์šธ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ํ•„์š”ํ•œ ๋ถ€์šธ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift CLI(oc)๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ๋‹ค์Œ ์˜ˆ์— ํ‘œ์‹œ๋œ MachineConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: 99-worker-setsebool
    spec:
      config:
        ignition:
          version: 3.2.0
        systemd:
          units:
          - contents: |
              [Unit]
              Description=Set SELinux booleans
              Before=kubelet.service
    
              [Service]
              Type=oneshot
              ExecStart=/sbin/setsebool container_manage_cgroup=on
              RemainAfterExit=true
    
              [Install]
              WantedBy=multi-user.target graphical.target
            enabled: true
            name: setsebool.service
    #...
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ƒˆ MachineConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f 99-worker-setsebool.yaml
์ฐธ๊ณ 

MachineConfig ์˜ค๋ธŒ์ ํŠธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋œ ํ›„ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์žฌ๋ถ€ํŒ…๋ฉ๋‹ˆ๋‹ค.

6.3.4. ๋…ธ๋“œ์— ์ปค๋„ ์ธ์ˆ˜ ์ถ”๊ฐ€

ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ ์„ธํŠธ์— ์ปค๋„ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋ฉฐ ๋จผ์ € ์„ค์ •๋œ ์ธ์ˆ˜์˜ ์˜ํ–ฅ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜

์ปค๋„ ์ธ์ˆ˜๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ๋ถ€ํŒ…๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋„ ์ธ์ˆ˜์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • enforcing=0: SELinux(Security Enhanced Linux)๋ฅผ ํ—ˆ์šฉ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ ๋ชจ๋“œ์—์„œ๋Š” SELinux๊ฐ€ ๊ฐœ์ฒด์— ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜๊ณ  ๋กœ๊ทธ์— ์•ก์„ธ์Šค ๊ฑฐ๋ถ€ ํ•ญ๋ชฉ์„ ๋‚ด๋ณด๋‚ด๋Š” ๋“ฑ ๋กœ๋“œ๋œ ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์–ด๋–ค ์ž‘์—…๋„ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ์‹œ์Šคํ…œ์—์„œ ์ง€์›๋˜์ง€ ์•Š์ง€๋งŒ ํ—ˆ์šฉ ๋ชจ๋“œ๋Š” ๋””๋ฒ„๊น…์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • nosmt: ์ปค๋„์—์„œ ๋Œ€์นญ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (SMT)์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์€ ๊ฐ CPU๋งˆ๋‹ค ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ผ๋ฆฌ ์Šค๋ ˆ๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ํ…Œ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ nosmt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž ์žฌ์ ์ธ ํฌ๋กœ์Šค ์Šค๋ ˆ๋“œ ๊ณต๊ฒฉ ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SMT๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ฑ๋Šฅ๋ณด๋‹ค๋Š” ๋ณด์•ˆ์„ ์ค‘์š”์‹œํ•˜์—ฌ ์„ ํƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • systemd.unified_cgroup_hierarchy: Linux ์ œ์–ด ๊ทธ๋ฃน ๋ฒ„์ „ 2 (cgroup v2)๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. cgroup v2๋Š” ์ปค๋„ ์ œ์–ด ๊ทธ๋ฃน ์˜ ๋‹ค์Œ ๋ฒ„์ „์ด๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    ์ค‘์š”

    OpenShift Container Platform cgroups ๋ฒ„์ „ 2 ๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœ์ž ํ”„๋ฆฌ๋ทฐ์— ์žˆ์œผ๋ฉฐ ํ˜„์žฌ Red Hat์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ปค๋„ ์ธ์ˆ˜ ๋ชฉ๋ก ๋ฐ ์„ค๋ช…์€ Kernel.org ์ปค๋„ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ๋‹ค์Œ์„ ์‹๋ณ„ํ•˜๋Š” MachineConfig๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ์ปค๋„ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋จธ์‹  ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ž‘์—…์ž ์—ญํ• ์„ ๊ฐ–๋Š” ๋จธ์‹ ์ž…๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ์ปค๋„ ์ธ์ˆ˜ ๋์— ์ถ”๊ฐ€๋˜๋Š” ์ปค๋„ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๋จธ์‹  ๊ตฌ์„ฑ ๋ชฉ๋ก์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋Š” ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ธฐ์กด MachineConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ๋จธ์‹  ๊ตฌ์„ฑ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

    $ oc get MachineConfig

    ์ถœ๋ ฅ ์˜ˆ

    NAME                                               GENERATEDBYCONTROLLER                      IGNITIONVERSION   AGE
    00-master                                          52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    00-worker                                          52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    01-master-container-runtime                        52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    01-master-kubelet                                  52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    01-worker-container-runtime                        52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    01-worker-kubelet                                  52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    99-master-generated-registries                     52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    99-master-ssh                                                                                 3.2.0             40m
    99-worker-generated-registries                     52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    99-worker-ssh                                                                                 3.2.0             40m
    rendered-master-23e785de7587df95a4b517e0647e5ab7   52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    rendered-worker-5d596d9293ca3ea80c896a1191735bb1   52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m

  2. ์ปค๋„ ์ธ์ˆ˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” MachineConfig ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค (์˜ˆ: 05-worker-kernelarg-selinuxpermissive.yaml).

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker1
      name: 05-worker-kernelarg-selinuxpermissive2
    spec:
      kernelArguments:
        - enforcing=03
    1
    ์ƒˆ ์ปค๋„ ์ธ์ˆ˜๋ฅผ ์ž‘์—…์ž ๋…ธ๋“œ์—๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    2
    ๋จธ์‹  ๊ตฌ์„ฑ(05) ์ค‘ ์ ํ•ฉํ•œ ์œ„์น˜์™€ ์–ด๋–ค ๊ธฐ๋Šฅ (SELinux ํ—ˆ์šฉ ๋ชจ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ปค๋„ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€)์„ ํ•˜๋Š”์ง€ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฆ„์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
    3
    ์ •ํ™•ํ•œ ์ปค๋„ ์ธ์ˆ˜๋ฅผ enforcing=0์œผ๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ƒˆ ๋จธ์‹  ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f 05-worker-kernelarg-selinuxpermissive.yaml
  4. ๋จธ์‹  ๊ตฌ์„ฑ์—์„œ ์ƒˆ ๊ตฌ์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get MachineConfig

    ์ถœ๋ ฅ ์˜ˆ

    NAME                                               GENERATEDBYCONTROLLER                      IGNITIONVERSION   AGE
    00-master                                          52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    00-worker                                          52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    01-master-container-runtime                        52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    01-master-kubelet                                  52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    01-worker-container-runtime                        52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    01-worker-kubelet                                  52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    05-worker-kernelarg-selinuxpermissive                                                         3.2.0             105s
    99-master-generated-registries                     52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    99-master-ssh                                                                                 3.2.0             40m
    99-worker-generated-registries                     52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    99-worker-ssh                                                                                 3.2.0             40m
    rendered-master-23e785de7587df95a4b517e0647e5ab7   52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m
    rendered-worker-5d596d9293ca3ea80c896a1191735bb1   52dd3ba6a9a527fc3ab42afac8d12b693534c8c9   3.2.0             33m

  5. ๋…ธ๋“œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get nodes

    ์ถœ๋ ฅ ์˜ˆ

    NAME                           STATUS                     ROLES    AGE   VERSION
    ip-10-0-136-161.ec2.internal   Ready                      worker   28m   v1.23.0
    ip-10-0-136-243.ec2.internal   Ready                      master   34m   v1.23.0
    ip-10-0-141-105.ec2.internal   Ready,SchedulingDisabled   worker   28m   v1.23.0
    ip-10-0-142-249.ec2.internal   Ready                      master   34m   v1.23.0
    ip-10-0-153-11.ec2.internal    Ready                      worker   28m   v1.23.0
    ip-10-0-153-150.ec2.internal   Ready                      master   34m   v1.23.0

    ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์ž‘์—…์ž ๋…ธ๋“œ์˜ ์˜ˆ์•ฝ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ์ž‘์—…์ž ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•˜์—ฌ ์ปค๋„ ๋ช…๋ น ํ–‰ ์ธ์ˆ˜ (ํ˜ธ์ŠคํŠธ์˜ /proc/cmdline ์— ์žˆ์Œ)๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ์ปค๋„ ์ธ์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc debug node/ip-10-0-141-105.ec2.internal

    ์ถœ๋ ฅ ์˜ˆ

    Starting pod/ip-10-0-141-105ec2internal-debug ...
    To use host binaries, run `chroot /host`
    
    sh-4.2# cat /host/proc/cmdline
    BOOT_IMAGE=/ostree/rhcos-... console=tty0 console=ttyS0,115200n8
    rootflags=defaults,prjquota rw root=UUID=fd0... ostree=/ostree/boot.0/rhcos/16...
    coreos.oem.id=qemu coreos.oem.id=ec2 ignition.platform.id=ec2 enforcing=0
    
    sh-4.2# exit

    enforcing=0 ์ธ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ปค๋„ ์ธ์ˆ˜์— ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.3.5. ๋…ธ๋“œ์—์„œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํ™œ์„ฑํ™”

์ค‘์š”

๋…ธ๋“œ์—์„œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์€ Red Hat ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค ์ˆ˜์ค€ ๊ณ„์•ฝ(SLA)์—์„œ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์™„์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ–ฅํ›„ ์ œํ’ˆ ๊ธฐ๋Šฅ์„ ์กฐ๊ธฐ์— ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๊ณ ๊ฐ์ด ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Red Hat ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์˜ ์ง€์› ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์ง€์› ๋ฒ”์œ„๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋…ธ๋“œ๋ณ„๋กœ OpenShift Container Platform ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜

์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์›Œํฌ๋กœ๋“œ ์„ฑ๋Šฅ๊ณผ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ ์ฒ˜๋ฆฌ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์—์„œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด kubeletconfig CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•˜์—ฌ swapbehavior ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ๋˜๊ฑฐ๋‚˜ ๋ฌด์ œํ•œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ œํ•œ๋œ: restricted Swap ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ์›Œํฌ๋กœ๋“œ์˜ ์–‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ์˜ ๋ชจ๋“  ์›Œํฌ๋กœ๋“œ๋Š” ์—ฌ์ „ํžˆ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LimitedSwap ๋™์ž‘์€ ๋…ธ๋“œ๊ฐ€ Linux ์ œ์–ด ๊ทธ๋ฃน ๋ฒ„์ „ 1(cgroups v1) ๋˜๋Š” ๋ฒ„์ „ 2(cgroups v 2) ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

    • cgroups v1: OpenShift Container Platform ์›Œํฌ๋กœ๋“œ๋Š” ์„ค์ •๋œ ๊ฒฝ์šฐ Pod์˜ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์™€ ์Šค์™‘์˜ ๋ชจ๋“  ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • cgroups v2: OpenShift Container Platform ์›Œํฌ๋กœ๋“œ๋Š” ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฌด์ œํ•œ: Keepalived Swap ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ๊ฐ€ ์š”์ฒญ ์‹œ ์‹œ์Šคํ…œ ์ œํ•œ๊นŒ์ง€ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

kubelet์ด ์ด ๊ตฌ์„ฑ ์—†์ด ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์—์„œ ์‹œ์ž‘๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋…ธ๋“œ์—์„œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์— OpenShift Container Platform์—์„œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด OpenShift Container Platform์—์„œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๋ฒ„์ „ 4.10 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ–‰ ์ค‘์ธ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ๋กœ๊ทธ์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ์—์„œ TechPreviewNoUpgrade ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค(๋…ธ๋“œ โ†’ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—… โ†’ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”์ฐธ์กฐ).

    ์ฐธ๊ณ 

    TechPreviewNoUpgrade ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ทจ์†Œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ ์„ธํŠธ๋Š” ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ์—์„œ cgroup v2๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ swapaccount=1 ์ปค๋„ ์ธ์ˆ˜๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋…ธ๋“œ์—์„œ ์Šค์™‘ ๊ณ„์ •์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์— ์‚ฌ์šฉ์ž ์ง€์ • ๋ผ๋ฒจ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    $ oc label machineconfigpool worker kubelet-swap=enabled
  2. ์Šค์™‘ ์„ค์ •์„ ํ™œ์„ฑํ™” ๋ฐ ๊ตฌ์„ฑํ•  CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: swap-config
    spec:
      machineConfigPoolSelector:
        matchLabels:
          kubelet-swap: enabled
      kubeletConfig:
        failSwapOn: false 1
        memorySwap:
          swapBehavior: LimitedSwap 2
    #...
    1
    ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์—์„œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด false ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด true ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ LimitedSwap ์ž…๋‹ˆ๋‹ค.
  3. ์‹œ์Šคํ…œ์—์„œ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

6.3.6. ํ•˜๋‚˜์˜ RHOSP ํ˜ธ์ŠคํŠธ์—์„œ ๋‹ค๋ฅธ RHOSP ํ˜ธ์ŠคํŠธ๋กœ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

RHOSP(Red Hat OpenStack Platform) ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ์ด๋™ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ OS_CLOUD ๋Š” clouds.yaml ํŒŒ์ผ์— ๊ด€๋ฆฌ ์ž๊ฒฉ ์ฆ๋ช…์ด ์žˆ๋Š” ํด๋ผ์šฐ๋“œ ํ•ญ๋ชฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ KUBECONFIG ๋Š” ๊ด€๋ฆฌ OpenShift Container Platform ์ธ์ฆ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๊ตฌ์„ฑ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  • ๋ช…๋ น์ค„์—์„œ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
#!/usr/bin/env bash

set -Eeuo pipefail

if [ $# -lt 1 ]; then
	echo "Usage: '$0 node_name'"
	exit 64
fi

# Check for admin OpenStack credentials
openstack server list --all-projects >/dev/null || { >&2 echo "The script needs OpenStack admin credentials. Exiting"; exit 77; }

# Check for admin OpenShift credentials
oc adm top node >/dev/null || { >&2 echo "The script needs OpenShift admin credentials. Exiting"; exit 77; }

set -x

declare -r node_name="$1"
declare server_id
server_id="$(openstack server list --all-projects -f value -c ID -c Name | grep "$node_name" | cut -d' ' -f1)"
readonly server_id

# Drain the node
oc adm cordon "$node_name"
oc adm drain "$node_name" --delete-emptydir-data --ignore-daemonsets --force

# Power off the server
oc debug "node/${node_name}" -- chroot /host shutdown -h 1

# Verify the server is shut off
until openstack server show "$server_id" -f value -c status | grep -q 'SHUTOFF'; do sleep 5; done

# Migrate the node
openstack server migrate --wait "$server_id"

# Resize the VM
openstack server resize confirm "$server_id"

# Wait for the resize confirm to finish
until openstack server show "$server_id" -f value -c status | grep -q 'SHUTOFF'; do sleep 5; done

# Restart the VM
openstack server start "$server_id"

# Wait for the node to show up as Ready:
until oc get node "$node_name" | grep -q "^${node_name}[[:space:]]\+Ready"; do sleep 5; done

# Uncordon the node
oc adm uncordon "$node_name"

# Wait for cluster operators to stabilize
until oc get co -o go-template='statuses: {{ range .items }}{{ range .status.conditions }}{{ if eq .type "Degraded" }}{{ if ne .status "False" }}DEGRADED{{ end }}{{ else if eq .type "Progressing"}}{{ if ne .status "False" }}PROGRESSING{{ end }}{{ else if eq .type "Available"}}{{ if ne .status "True" }}NOTAVAILABLE{{ end }}{{ end }}{{ end }}{{ end }}' | grep -qv '\(DEGRADED\|PROGRESSING\|NOTAVAILABLE\)'; do sleep 5; done

์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์‹œ์Šคํ…œ์ด ์ƒˆ RHOSP ๋…ธ๋“œ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๋‹ค.

6.4. ๋…ธ๋“œ๋‹น ์ตœ๋Œ€ Pod ์ˆ˜ ๊ด€๋ฆฌ

OpenShift Container Platform์—์„œ๋Š” ๋…ธ๋“œ์˜ ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด ์ˆ˜, ํ•˜๋“œ ์ œํ•œ ๋˜๋Š” ๋‘˜ ๋‹ค์— ๋”ฐ๋ผ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Pod ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์˜ต์…˜์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ์˜ต์…˜ ์ค‘ ๋” ๋‚ฎ์€ ๊ฐ’์ด ๋…ธ๋“œ์˜ Pod ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • OpenShift Container Platform์˜ CPU ์‚ฌ์šฉ๋ฅ  ์ฆ๊ฐ€.
  • Pod ์˜ˆ์•ฝ ์†๋„ ์ €ํ•˜.
  • ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐœ์ƒ.
  • IP ์ฃผ์†Œ ํ’€ ์†Œ๋ชจ.
  • ๋ฆฌ์†Œ์Šค ๊ณผ๋‹ค ํ• ๋‹น์œผ๋กœ ์ธํ•œ ์‚ฌ์šฉ์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ €ํ•˜.
์ฐธ๊ณ 

๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” Pod์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ๋„คํŠธ์›Œํ‚น์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ Pod 10๊ฐœ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์‹ค์ œ๋กœ๋Š” ์ปจํ…Œ์ด๋„ˆ 20๊ฐœ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

podsPerCore ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋…ธ๋“œ์˜ ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด ์ˆ˜์— ๋”ฐ๋ผ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Pod ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด๊ฐ€ 4๊ฐœ์ธ ๋…ธ๋“œ์—์„œ podsPerCore๊ฐ€ 10์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ์— ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ Pod ์ˆ˜๋Š” 40์ž…๋‹ˆ๋‹ค.

maxPods ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋…ธ๋“œ์˜ ์†์„ฑ๊ณผ ๊ด€๊ณ„์—†์ด ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Pod ์ˆ˜๋ฅผ ๊ณ ์ •๋œ ๊ฐ’์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

6.4.1. ๋…ธ๋“œ ๋‹น ์ตœ๋Œ€ pod ์ˆ˜ ๊ตฌ์„ฑ

podsPerCore ๋ฐ maxPods๋Š” ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Pod ์ˆ˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์˜ต์…˜์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ์˜ต์…˜ ์ค‘ ๋” ๋‚ฎ์€ ๊ฐ’์ด ๋…ธ๋“œ์˜ Pod ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 4 ๊ฐœ์˜ ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์—์„œ podsPerCore๊ฐ€ 10์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ Pod ์ˆ˜๋Š” 40์ž…๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๊ตฌ์„ฑํ•  ๋…ธ๋“œ ์œ ํ˜•์˜ ์ •์  MachineConfigPool CRD์™€ ์—ฐ๊ด€๋œ ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool <name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool worker

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 1
      name: worker
    #...

    1
    ๋ ˆ์ด๋ธ”์ด Labels ์•„๋ž˜์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    ์ž‘์€ ์ •๋ณด

    ๋ผ๋ฒจ์ด ์—†์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‚ค/๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label machineconfigpool worker custom-kubelet=small-pods

์ ˆ์ฐจ

  1. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค (CR)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    max-pods CR์˜ ์„ค์ • ์˜ˆ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: set-max-pods 1
    spec:
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 2
      kubeletConfig:
        podsPerCore: 10 3
        maxPods: 250 4
    #...

    1
    CR์— ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์—์„œ ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    ๋…ธ๋“œ์˜ ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด ์ˆ˜์— ๋”ฐ๋ผ ๋…ธ๋“œ๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” Pod ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    4
    ๋…ธ๋“œ์˜ ์†์„ฑ์— ๊ด€๊ณ„์—†์ด ๋…ธ๋“œ๊ฐ€ ๊ณ ์ • ๊ฐ’์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Pod ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์ฐธ๊ณ 

    podsPerCore๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ด ์ œํ•œ์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

    ์œ„์˜ ์˜ˆ์—์„œ podsPerCore์˜ ๊ธฐ๋ณธ๊ฐ’์€ 10์ด๋ฉฐ maxPods์˜ ๊ธฐ๋ณธ๊ฐ’์€ 250์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋…ธ๋“œ์— 25 ๊ฐœ ์ด์ƒ์˜ ์ฝ”์–ด๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ podsPerCore๊ฐ€ ์ œํ•œ ์š”์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file_name>.yaml

๊ฒ€์ฆ

  1. MachineConfigPool CRD๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Machine Config Controller์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์„ ํƒํ•˜๋ฉด UPDATING ์—ด์— True๊ฐ€ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.

    $ oc get machineconfigpools

    ์ถœ๋ ฅ ์˜ˆ

    NAME     CONFIG                        UPDATED   UPDATING   DEGRADED
    master   master-9cc2c72f205e103bb534   False     False      False
    worker   worker-8cecd1236b33ee3f8a5e   False     True       False

    ๋ณ€๊ฒฝ์ด ์™„๋ฃŒ๋˜๋ฉด UPDATED ์—ด์— True๊ฐ€ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.

    $ oc get machineconfigpools

    ์ถœ๋ ฅ ์˜ˆ

    NAME     CONFIG                        UPDATED   UPDATING   DEGRADED
    master   master-9cc2c72f205e103bb534   False     True       False
    worker   worker-8cecd1236b33ee3f8a5e   True      False      False

6.5. Node Tuning Operator ์‚ฌ์šฉ

Node Tuning Operator์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , Node Tuning Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Tuned ๋ฐ๋ชฌ์„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๊ณ  ๋…ธ๋“œ ์ˆ˜์ค€ ํŠœ๋‹์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

Node Tuning Operator๋Š” TuneD ๋ฐ๋ชฌ์„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋…ธ๋“œ ์ˆ˜์ค€ ํŠœ๋‹์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ณ ์„ฑ๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ์ผ์ • ์ˆ˜์ค€์˜ ์ปค๋„ ํŠœ๋‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Node Tuning Operator๋Š” ๋…ธ๋“œ ์ˆ˜์ค€ sysctls ์‚ฌ์šฉ์ž์—๊ฒŒ ํ†ตํ•ฉ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์‚ฌ์šฉ์ž์˜ ํ•„์š”์— ๋”ฐ๋ผ ์ง€์ •๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํŠœ๋‹์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Operator๋Š” OpenShift Container Platform์˜ ์ปจํ…Œ์ด๋„ˆํ™”๋œ TuneD ๋ฐ๋ชฌ์„ Kubernetes ๋ฐ๋ชฌ ์„ธํŠธ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆํ™”๋œ TuneD ๋ฐ๋ชฌ์— ์‚ฌ์šฉ์ž ์ •์˜ ํŠœ๋‹ ์‚ฌ์–‘์ด ๋ฐ๋ชฌ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชฌ์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋…ธ๋“œ๋‹น ํ•˜๋‚˜์”ฉ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆํ™”๋œ TuneD ๋ฐ๋ชฌ์„ ํ†ตํ•ด ์ ์šฉ๋˜๋Š” ๋…ธ๋“œ ์ˆ˜์ค€ ์„ค์ •์€ ํ”„๋กœํ•„ ๋ณ€๊ฒฝ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ด๋ฒคํŠธ ์‹œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆํ™”๋œ TuneD ๋ฐ๋ชฌ์ด ์ข…๋ฃŒ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜์—ฌ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋  ๋•Œ ๋กค๋ฐฑ๋ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 4.1 ์ด์ƒ์—์„œ๋Š” Node Tuning Operator๊ฐ€ ํ‘œ์ค€ OpenShift Container Platform ์„ค์น˜์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

6.5.1. Node Tuning Operator ์‚ฌ์–‘ ์˜ˆ์— ์•ก์„ธ์Šค

์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Node Tuning Operator ์‚ฌ์–‘ ์˜ˆ์— ์•ก์„ธ์Šคํ•˜์‹ญ์‹œ์˜ค.

์ ˆ์ฐจ

  1. ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc get Tuned/default -o yaml -n openshift-cluster-node-tuning-operator

๊ธฐ๋ณธ CR์€ OpenShift Container Platform ํ”Œ๋žซํผ์˜ ํ‘œ์ค€ ๋…ธ๋“œ ์ˆ˜์ค€ ํŠœ๋‹์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ Operator ๊ด€๋ฆฌ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Operator๋Š” ๊ธฐ๋ณธ CR์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ํŠœ๋‹์˜ ๊ฒฝ์šฐ ๊ณ ์œ ํ•œ Tuned CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ CR์€ ๋…ธ๋“œ ๋˜๋Š” Pod ๋ผ๋ฒจ ๋ฐ ํ”„๋กœํ•„ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ OpenShift Container Platform ๋…ธ๋“œ์— ์ ์šฉ๋œ ๊ธฐ๋ณธ CR ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜ ํŠœ๋‹๊ณผ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์˜

ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” Pod ๋ผ๋ฒจ์— ๋Œ€ํ•œ ์ง€์›์ด ํ•„์š”ํ•œ ํŠœ๋‹์„ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Tuned CR์€ Pod ๋ผ๋ฒจ์ด ์ผ์น˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Pod ๋ผ๋ฒจ์ด ์ผ์น˜๋œ ์ƒํƒœ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœํ•„์ด ์ƒ์„ฑ๋˜๋ฉด ํ•ด๋‹น ์‹œ์ ์— ์ด ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. Pod ๋ผ๋ฒจ ๊ธฐ๋Šฅ์€ Node Tuning Operator์˜ ํ–ฅํ›„ ๋ฒ„์ „์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.5.2. ์‚ฌ์šฉ์ž ์ •์˜ ํŠœ๋‹ ์‚ฌ์–‘

Operator์˜ CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์—๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์„น์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์„น์…˜์ธ profile:์€ TuneD ํ”„๋กœํ•„ ๋ฐ ํ•ด๋‹น ์ด๋ฆ„์˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ์ธ recommend:์€ ํ”„๋กœํ•„ ์„ ํƒ ๋…ผ๋ฆฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž ์ •์˜ ํŠœ๋‹ ์‚ฌ์–‘์€ Operator์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—ฌ๋Ÿฌ CR๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด CR์˜ ์กด์žฌ ๋˜๋Š” ์˜ค๋ž˜๋œ CR์˜ ์‚ญ์ œ๋Š” Operator์—์„œ ํƒ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ํŠœ๋‹ ์‚ฌ์–‘์ด ๋ณ‘ํ•ฉ๋˜๊ณ  ์ปจํ…Œ์ด๋„ˆํ™”๋œ TuneD ๋ฐ๋ชฌ์˜ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

๊ด€๋ฆฌ ์ƒํƒœ

Operator ๊ด€๋ฆฌ ์ƒํƒœ๋Š” ๊ธฐ๋ณธ Tuned CR์„ ์กฐ์ •ํ•˜์—ฌ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Operator๋Š” Managed ์ƒํƒœ์ด๋ฉฐ ๊ธฐ๋ณธ Tuned CR์—๋Š” spec.managementState ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Operator ๊ด€๋ฆฌ ์ƒํƒœ์— ์œ ํšจํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Managed: ๊ตฌ์„ฑ ๋ฆฌ์†Œ์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด Operator๊ฐ€ ํ•ด๋‹น ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • Unmanaged: Operator๊ฐ€ ๊ตฌ์„ฑ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
  • Removed: Operator๊ฐ€ ํ”„๋กœ๋น„์ €๋‹ํ•œ ํ•ด๋‹น ํ”ผ์—ฐ์‚ฐ์ž ๋ฐ ๋ฆฌ์†Œ์Šค๋ฅผ Operator๊ฐ€ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ

profile: ์„น์…˜์—๋Š” TuneD ํ”„๋กœํ•„ ๋ฐ ํ•ด๋‹น ์ด๋ฆ„์ด ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

profile:
- name: tuned_profile_1
  data: |
    # TuneD profile specification
    [main]
    summary=Description of tuned_profile_1 profile

    [sysctl]
    net.ipv4.ip_forward=1
    # ... other sysctl's or other TuneD daemon plugins supported by the containerized TuneD

# ...

- name: tuned_profile_n
  data: |
    # TuneD profile specification
    [main]
    summary=Description of tuned_profile_n profile

    # tuned_profile_n profile settings

๊ถŒ์žฅ ํ”„๋กœํ•„

profile: ์„ ํƒ ๋…ผ๋ฆฌ๋Š” CR์˜ recommend: ์„น์…˜์— ์˜ํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. recommend: ์„น์…˜์€ ์„ ํƒ ๊ธฐ์ค€์— ๋”ฐ๋ผ ํ”„๋กœํ•„์„ ๊ถŒ์žฅํ•˜๋Š” ํ•ญ๋ชฉ์˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

recommend:
<recommend-item-1>
# ...
<recommend-item-n>

๋ชฉ๋ก์˜ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

- machineConfigLabels: 1
    <mcLabels> 2
  match: 3
    <match> 4
  priority: <priority> 5
  profile: <tuned_profile_name> 6
  operand: 7
    debug: <bool> 8
1
์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
2
ํ‚ค/๊ฐ’ MachineConfig ๋ผ๋ฒจ ์‚ฌ์ „์ž…๋‹ˆ๋‹ค. ํ‚ค๋Š” ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
3
์ƒ๋žตํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ํ”„๋กœํ•„์ด ๋จผ์ € ์ผ์น˜๋˜๊ฑฐ๋‚˜ machineConfigLabels๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ํ”„๋กœํ•„์ด ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
4
์„ ํƒ์‚ฌํ•ญ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
5
ํ”„๋กœํ•„ ์ˆœ์„œ ์ง€์ • ์šฐ์„  ์ˆœ์œ„์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๊ฐ€ ์ž‘์„์ˆ˜๋ก ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค(0์ด ๊ฐ€์žฅ ๋†’์€ ์šฐ์„  ์ˆœ์œ„์ž„).
6
์ผ์น˜์— ์ ์šฉํ•  TuneD ํ”„๋กœํ•„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด tuned_profile_1์ด ์žˆ์Šต๋‹ˆ๋‹ค.
7
์„ ํƒ์  ํ”ผ์—ฐ์‚ฐ์ž ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.
8
TuneD ๋ฐ๋ชฌ์˜ ๋””๋ฒ„๊น…์„ ์ผœ๊ฑฐ๋‚˜ ๋•๋‹ˆ๋‹ค. off์˜ ๊ฒฝ์šฐ on ๋˜๋Š” false ์˜ ๊ฒฝ์šฐ ์˜ต์…˜์ด true ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

<match>๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์žฌ๊ท€์ ์œผ๋กœ ์ •์˜๋˜๋Š” ์„ ํƒ์‚ฌํ•ญ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

- label: <label_name> 1
  value: <label_value> 2
  type: <label_type> 3
    <match> 4
1
๋…ธ๋“œ ๋˜๋Š” Pod ๋ผ๋ฒจ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2
์„ ํƒ์‚ฌํ•ญ ๋…ธ๋“œ ๋˜๋Š” Pod ๋ผ๋ฒจ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด <label_name>์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ์น˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.
3
์„ ํƒ์‚ฌํ•ญ ์˜ค๋ธŒ์ ํŠธ ์œ ํ˜•(node ๋˜๋Š” pod)์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด node๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
4
์„ ํƒ์‚ฌํ•ญ <match> ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

<match>๋ฅผ ์ƒ๋žตํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ค‘์ฒฉ <match> ์„น์…˜๋„ true๋กœ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด false๋กœ ๊ฐ€์ •ํ•˜๊ณ  ํ•ด๋‹น <match> ์„น์…˜์ด ์žˆ๋Š” ํ”„๋กœํ•„์„ ์ ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘์ฒฉ(ํ•˜์œ„ <match> ์„น์…˜)์€ ๋…ผ๋ฆฌ AND ์—ฐ์‚ฐ์ž ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ <match> ๋ชฉ๋ก์˜ ํ•ญ๋ชฉ์ด ์ผ์น˜ํ•˜๋ฉด ์ „์ฒด <match> ๋ชฉ๋ก์ด true๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ชฉ๋ก์ด ๋…ผ๋ฆฌ OR ์—ฐ์‚ฐ์ž ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

machineConfigLabels๊ฐ€ ์ •์˜๋˜๋ฉด ์ง€์ •๋œ recommend: ๋ชฉ๋ก ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋จธ์‹  ๊ตฌ์„ฑ ํ’€ ๊ธฐ๋ฐ˜ ์ผ์น˜๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. <mcLabels>๋Š” ๋จธ์‹  ๊ตฌ์„ฑ์˜ ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ๊ตฌ์„ฑ์€ <tuned_profile_name> ํ”„๋กœํ•„์— ๋Œ€ํ•ด ์ปค๋„ ๋ถ€ํŒ… ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ํ˜ธ์ŠคํŠธ ์„ค์ •์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” <mcLabels>์™€ ์ผ์น˜ํ•˜๋Š” ๋จธ์‹  ๊ตฌ์„ฑ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์„ ์ฐพ๊ณ  ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์ด ํ• ๋‹น๋œ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ <tuned_profile_name> ํ”„๋กœํ•„์„ ์„ค์ •ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ ๋ฐ ์ž‘์—…์ž ์—ญํ• ์ด ๋ชจ๋‘ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ ค๋ฉด ๋งˆ์Šคํ„ฐ ์—ญํ• ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชฉ๋ก ํ•ญ๋ชฉ match ๋ฐ machineConfigLabels๋Š” ๋…ผ๋ฆฌ OR ์—ฐ์‚ฐ์ž๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. match ํ•ญ๋ชฉ์€ ๋‹จ๋ฝ ๋ฐฉ์‹์œผ๋กœ ๋จผ์ € ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ true๋กœ ํ‰๊ฐ€๋˜๋ฉด machineConfigLabels ํ•ญ๋ชฉ์ด ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘์š”

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

์˜ˆ: ๋…ธ๋“œ ๋˜๋Š” Pod ๋ผ๋ฒจ ๊ธฐ๋ฐ˜ ์ผ์น˜

- match:
  - label: tuned.openshift.io/elasticsearch
    match:
    - label: node-role.kubernetes.io/master
    - label: node-role.kubernetes.io/infra
    type: pod
  priority: 10
  profile: openshift-control-plane-es
- match:
  - label: node-role.kubernetes.io/master
  - label: node-role.kubernetes.io/infra
  priority: 20
  profile: openshift-control-plane
- priority: 30
  profile: openshift-node

์œ„์˜ CR์€ ์ปจํ…Œ์ด๋„ˆํ™”๋œ TuneD ๋ฐ๋ชฌ์˜ ํ”„๋กœํ•„ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ recommended.conf ํŒŒ์ผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ํ”„๋กœํ•„(10)์ด openshift-control-plane-es์ด๋ฏ€๋กœ ์ด ํ”„๋กœํ•„์„ ์ฒซ ๋ฒˆ์งธ๋กœ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ปจํ…Œ์ด๋„ˆํ™”๋œ TuneD ๋ฐ๋ชฌ์€ tuned.openshift.io/elasticsearch ๋ผ๋ฒจ์ด ์„ค์ •๋œ ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” Pod๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์—†๋Š” ๊ฒฝ์šฐ ์ „์ฒด <match> ์„น์…˜์ด false๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋ผ๋ฒจ์ด ์žˆ๋Š” Pod๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ <match> ์„น์…˜์„ true๋กœ ํ‰๊ฐ€ํ•˜๋ ค๋ฉด ๋…ธ๋“œ ๋ผ๋ฒจ๋„ node-role.kubernetes.io/master ๋˜๋Š” node-role.kubernetes.io/infra์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์œ„๊ฐ€ 10์ธ ํ”„๋กœํ•„์˜ ๋ผ๋ฒจ์ด ์ผ์น˜ํ•˜๋ฉด openshift-control-plane-es ํ”„๋กœํ•„์ด ์ ์šฉ๋˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœํ•„์€ ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ/Pod ๋ผ๋ฒจ ์กฐํ•ฉ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‘ ๋ฒˆ์งธ๋กœ ๋†’์€ ์šฐ์„  ์ˆœ์œ„ ํ”„๋กœํ•„(openshift-control-plane)์ด ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆํ™”๋œ TuneD Pod๊ฐ€ node-role.kubernetes.io/master ๋˜๋Š” node-role.kubernetes.io/infra. ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์ด ํ”„๋กœํ•„์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, openshift-node ํ”„๋กœํ•„์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ 30์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœํ•„์—๋Š” <match> ์„น์…˜์ด ์—†์œผ๋ฏ€๋กœ ํ•ญ์ƒ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ๋…ธ๋“œ์—์„œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ๋‹ค๋ฅธ ํ”„๋กœํ•„์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ openshift-node ํ”„๋กœํ•„์„ ์„ค์ •ํ•˜๋Š” ๋ฐ catch-all ํ”„๋กœํ•„ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ์ • ์›Œํฌํ”Œ๋กœ

์˜ˆ: ๋จธ์‹  ๊ตฌ์„ฑ ํ’€ ๊ธฐ๋ฐ˜ ์ผ์น˜

apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
  name: openshift-node-custom
  namespace: openshift-cluster-node-tuning-operator
spec:
  profile:
  - data: |
      [main]
      summary=Custom OpenShift node profile with an additional kernel parameter
      include=openshift-node
      [bootloader]
      cmdline_openshift_node_custom=+skew_tick=1
    name: openshift-node-custom

  recommend:
  - machineConfigLabels:
      machineconfiguration.openshift.io/role: "worker-custom"
    priority: 20
    profile: openshift-node-custom

๋…ธ๋“œ ์žฌ๋ถ€ํŒ…์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋ฉด ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์˜ ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ์ผ์น˜ํ•˜๋Š” ๋ผ๋ฒจ๋กœ ๋Œ€์ƒ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ์ง€์ •ํ•œ ํ›„ ์œ„์˜ Tuned CR์„ ์ƒ์„ฑํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

6.5.3. ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์ •๋œ ๊ธฐ๋ณธ ํ”„๋กœํ•„

๋‹ค์Œ์€ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์ •๋œ ๊ธฐ๋ณธ ํ”„๋กœํ•„์ž…๋‹ˆ๋‹ค.

apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
  name: default
  namespace: openshift-cluster-node-tuning-operator
spec:
  recommend:
  - profile: "openshift-control-plane"
    priority: 30
    match:
    - label: "node-role.kubernetes.io/master"
    - label: "node-role.kubernetes.io/infra"

  - profile: "openshift-node"
    priority: 40

OpenShift Container Platform 4.9๋ถ€ํ„ฐ ๋ชจ๋“  OpenShift TuneD ํ”„๋กœํ•„์ด TuneD ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. oc exec ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํ”„๋กœํ•„์˜ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc exec $tuned_pod -n openshift-cluster-node-tuning-operator -- find /usr/lib/tuned/openshift{,-control-plane,-node} -name tuned.conf -exec grep -H ^ {} \;

6.5.4. ์ง€์›๋˜๋Š” TuneD ๋ฐ๋ชฌ ํ”Œ๋Ÿฌ๊ทธ์ธ

Tuned CR์˜ profile: ์„น์…˜์— ์ •์˜๋œ ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ [main] ์„น์…˜์„ ์ œ์™ธํ•œ ๋‹ค์Œ TuneD ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

  • audio
  • cpu
  • disk
  • eeepc_she
  • modules
  • mounts
  • net
  • scheduler
  • scsi_host
  • selinux
  • sysctl
  • sysfs
  • usb
  • video
  • vm
  • bootloader

์ผ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋™์  ํŠœ๋‹ ๊ธฐ๋Šฅ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ TuneD ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ˜„์žฌ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • script
  • systemd
์ฐธ๊ณ 

TuneD ๋ถ€ํŠธ๋กœ๋” ํ”Œ๋Ÿฌ๊ทธ์ธ์€ RHCOS(Red Hat Enterprise Linux CoreOS) ์ž‘์—…์ž ๋…ธ๋“œ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

6.6. Poison Pill Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ์ˆ˜์ •

Poison Pill Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ •์ƒ ๋…ธ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์žฌ๋ถ€ํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์—…๋ฐ์ดํŠธ ์ „๋žต์—์„œ๋Š” ์ƒํƒœ ์ €์žฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค์šด ํƒ€์ž„ ๋ฐ ReadWriteOnce (RWO) ๋ณผ๋ฅจ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ผ์‹œ์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ปดํ“จํŒ… ์šฉ๋Ÿ‰์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

6.6.1. Poison Pill Operator ์ •๋ณด

Poison Pill Operator๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ ๋น„์ •์ƒ์œผ๋กœ ์‹๋ณ„๋˜๋Š” ๋…ธ๋“œ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•ฉ๋‹ˆ๋‹ค. Operator๋Š” MachineHealthCheck ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ ๋น„์ •์ƒ์œผ๋กœ ์‹๋ณ„๋˜๋ฉด MachineHealthCheck ๋ฆฌ์†Œ์Šค์—์„œ PoisonPillRemediation CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•˜์—ฌ Poison Pill Operator๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

Poison Pill Operator๋Š” ์ƒํƒœ ์ €์žฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค์šดํƒ€์ž„์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ผ์‹œ์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ปดํ“จํŒ… ์šฉ๋Ÿ‰์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ๊ด€๋ฆฌ์ž ํ”„๋กœ๋น„์ €๋‹ ์ธํ”„๋ผ ๋˜๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœ๋น„์ €๋‹ ์ธํ”„๋ผ์™€ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ์„ค์น˜ ์œ ํ˜•์— ๊ด€๊ณ„์—†์ด IPMI ๋˜๋Š” API์™€ ๊ฐ™์€ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ด€๊ณ„์—†์ด ์ด Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.6.1.1. Poison Pill Operator ์„ค์ • ์ดํ•ด

Poison Pill Operator๋Š” Poison Pill Operator์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ poison-pill-config ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ PoisonPillConfig CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด CR์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Poison Pill Operator์— ๋Œ€ํ•œ ์ƒˆ CR์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

PoisonPillConfig CR์˜ ๋ณ€๊ฒฝ์œผ๋กœ Poison Pill ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

PoisonPillConfig CR์€ ๋‹ค์Œ YAML ํŒŒ์ผ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

apiVersion: poison-pill.medik8s.io/v1alpha1
kind: PoisonPillConfig
metadata:
  name: poison-pill-config
  namespace: openshift-operators
spec:
  safeTimeToAssumeNodeRebootedSeconds: 180 1
  watchdogFilePath: /test/watchdog1 2
  isSoftwareRebootEnabled: true 3
  apiServerTimeout: 15s 4
  apiCheckInterval: 5s 5
  maxApiErrorThreshold: 3 6
  peerApiServerTimeout: 5s 7
  peerDialTimeout: 5s 8
  peerRequestTimeout: 5s 9
  peerUpdateInterval: 15m 10
1
surviving ํ”ผ์–ด์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Operator์—์„œ ๋น„์ •์ƒ ๋…ธ๋“œ๊ฐ€ ์žฌ๋ถ€ํŒ…๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Operator๋Š” ์ด ๊ฐ’์˜ ํ•˜ํ•œ๊ฐ’์„ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋‹ค๋ฅธ ์›Œ์น˜๋… ํƒ€์ž„์•„์›ƒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ๋” ๋†’์€ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
2
๋…ธ๋“œ์—์„œ ์›Œ์น˜๋… ์žฅ์น˜์˜ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์›Œ์น˜๋… ์žฅ์น˜์— ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด Poison Pill Operator์—์„œ softdog ์žฅ์น˜ ๊ฒฝ๋กœ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์›Œ์น˜๋… ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ PoisonPillConfig CR์€ ์†Œํ”„ํŠธ์›จ์–ด ์žฌ๋ถ€ํŒ…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3
๋น„์ •์ƒ ๋…ธ๋“œ์˜ ์†Œํ”„ํŠธ์›จ์–ด ์žฌ๋ถ€ํŒ…์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ’์€ SoftwareRebootEnabled๊ฐ€ true ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ์žฌ๋ถ€ํŒ…์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ false ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
4
๊ฐ API ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๋ ค๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด Operator๊ฐ€ ์ˆ˜์ •์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
5
๊ฐ API ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๋Š” ๋นˆ๋„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
6
์ž„๊ณ„๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž„๊ณ„๊ฐ’์— ๋„๋‹ฌํ•˜๋ฉด ๋…ธ๋“œ๊ฐ€ ํ”ผ์–ด์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
7
ํ”ผ์–ด๊ฐ€ API ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•  ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
8
ํ”ผ์–ด์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„ ์ œํ•œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
9
ํ”ผ์–ด์—์„œ ์‘๋‹ต์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์‹œ๊ฐ„ ์ œํ•œ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
10
ํ”ผ์–ด ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋นˆ๋„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: IP ์ฃผ์†Œ).
6.6.1.2. Poison Pill Remediation ํ…œํ”Œ๋ฆฟ ๊ตฌ์„ฑ ์ดํ•ด

๋˜ํ•œ Poison Pill Operator๋Š” Poison Pill Operator ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— PoisonPillRemediationTemplate CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด CR์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ˆ˜์ • ์ „๋žต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ˆ˜์ • ์ „๋žต์€ ๋…ธ๋“œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” NodeDeletion ์ž…๋‹ˆ๋‹ค. OpenShift Container Platform 4.10์—์„œ Poison Pill Operator์—๋Š” ResourceDeletion ์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์ˆ˜์ • ์ „๋žต์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ResourceDeletion ์ˆ˜์ • ์ „๋žต์—์„œ๋Š” node ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ์˜ Pod ๋ฐ ๊ด€๋ จ ๋ณผ๋ฅจ ์—ฐ๊ฒฐ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ „๋žต์€ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋” ๋นจ๋ฆฌ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

PoisonPillRemediationTemplate CR์€ ๋‹ค์Œ YAML ํŒŒ์ผ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

apiVersion: poison-pill.medik8s.io/v1alpha1
kind: PoisonPillRemediationTemplate
metadata:
  creationTimestamp: "2022-03-02T08:02:40Z"
  generation: 1
  name: poison-pill-default-template
  namespace: openshift-operators
  resourceVersion: "596469"
  uid: 5d29e437-c485-48fa-ba9e-0354649afd31
spec:
  template:
    spec:
      remediationStrategy: NodeDeletion 1
1
์ˆ˜์ • ์ „๋žต์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ˆ˜์ • ์ „๋žต์€ NodeDeletion ์ž…๋‹ˆ๋‹ค.
6.6.1.3. ์›Œ์น˜๋… ์žฅ์น˜ ์ •๋ณด

์›Œ์น˜๋… ์žฅ์น˜๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ๋™๋˜๋Š” ํ•˜๋“œ์›จ์–ด ์žฅ์น˜
  • ์ œ์–ด ๋Œ€์ƒ ํ˜ธ์ŠคํŠธ์™€ ์ „์›์„ ๊ณต์œ ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด ์žฅ์น˜
  • ์†Œํ”„ํŠธ์›จ์–ด ๋˜๋Š” softdog์—์„œ ๊ตฌํ˜„๋œ ๊ฐ€์ƒ ์žฅ์น˜

ํ•˜๋“œ์›จ์–ด watchdog ๋ฐ softdog ์žฅ์น˜์—๋Š” ๊ฐ๊ฐ ์ „์ž ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํƒ€์ด๋จธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์›Œ์น˜๋… ์žฅ์น˜๋Š” ์˜ค๋ฅ˜ ์ƒํƒœ๊ฐ€ ๊ฐ์ง€๋  ๋•Œ ์‹œ์Šคํ…œ์ด ์•ˆ์ „ํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ •์ƒ ์ƒํƒœ์ž„์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์›Œ์น˜๋… ํƒ€์ด๋จธ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์žฌ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํƒ€์ด๋จธ๋Š” ๊ต์ฐฉ ์ƒํƒœ, CPU ๋ถ€์กฑ, ๋„คํŠธ์›Œํฌ ๋˜๋Š” ๋””์Šคํฌ ์•ก์„ธ์Šค ์†์‹ค๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ์ƒํƒœ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด ์›Œ์น˜๋… ์žฅ์น˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žฅ์น˜๊ฐ€ ๋…ธ๋“œ์˜ ๊ฐ•์ œ ์žฌ์„ค์ •์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์›Œ์น˜๋… ์žฅ์น˜๋Š” softdog ์žฅ์น˜๋ณด๋‹ค ๋” ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.

6.6.1.3.1. ์›Œ์น˜๋… ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Poison Pill Operator ๋™์ž‘ ์ดํ•ด

Poison Pill Operator๋Š” ์กด์žฌํ•˜๋Š” ์›Œ์น˜๋… ์žฅ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ˆ˜์ • ์ „๋žต์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์›Œ์น˜๋… ์žฅ์น˜๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ Operator๋Š” ์ด๋ฅผ ์ˆ˜์ •์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ์›Œ์น˜๋… ์žฅ์น˜๊ฐ€ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Operator๋Š” ์ˆ˜์ •์„ ์œ„ํ•ด softdog ์žฅ์น˜๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๋˜๋Š” ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ์›Œ์น˜๋… ์žฅ์น˜๊ฐ€ ๋ชจ๋‘ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Operator๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์žฌ๋ถ€ํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

์›Œ์น˜๋… ๊ตฌ์„ฑ

6.6.2. ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Poison Pill Operator ์„ค์น˜

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Poison Pill Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Operator โ†’ OperatorHub๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Operator ๋ชฉ๋ก์—์„œ Poison Pill Operator๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๋‹ค์Œ ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ธฐ๋ณธ ์„ค์น˜ ๋ชจ๋“œ ๋ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ๊ณ„์† ์„ ํƒํ•˜์—ฌ Operator๊ฐ€ openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ

์„ค์น˜์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. Operator โ†’ ์„ค์น˜๋œ Operator ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Operator๊ฐ€ openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ค์น˜๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ์ƒํƒœ๋Š” Succeeded ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Operator๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. Operator โ†’ ์„ค์น˜๋œ Operator ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ Status ์—ด์— ์˜ค๋ฅ˜ ๋˜๋Š” ์‹คํŒจ๊ฐ€ ์žˆ๋Š”์ง€ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์›Œํฌ๋กœ๋“œ โ†’ Pod ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” poison-pill-controller-manager ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

6.6.3. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Poison Pill Operator ์„ค์น˜

OpenShift CLI(oc)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Poison Pill Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Poison Pill Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ์ ˆ์ฐจ์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ์ƒˆ Namespace CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค) ๋ฐ OperatorGroup CR์„ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ์ฐจ์˜ 3๋‹จ๊ณ„๋กœ ๊ฑด๋„ˆ๋›ฐ์‹ญ์‹œ์˜ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift CLI(oc)๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. Poison Pill Operator์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. Namespace CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: poison-pill-namespace.yaml ).

      apiVersion: v1
      kind: Namespace
      metadata:
        name: poison-pill
    2. ๋„ค์ž„์ŠคํŽ˜์ด์Šค CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f poison-pill-namespace.yaml
  2. OperatorGroup CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. OperatorGroup CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: poison-pill-operator-group.yaml ).

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: poison-pill-manager
        namespace: poison-pill
    2. OperatorGroup CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f poison-pill-operator-group.yaml
  3. ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜ CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜ CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: poison-pill-subscription.yaml ).

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
          name: poison-pill-manager
          namespace: poison-pill 1
      spec:
          channel: stable
          installPlanApproval: Manual 2
          name: poison-pill-manager
          source: redhat-operators
          sourceNamespace: openshift-marketplace
          package: poison-pill-manager
      1
      Poison Pill Operator๋ฅผ ์„ค์น˜ํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Poison Pill Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด Subscription CR์—์„œ openshift-operators ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      2
      ์ง€์ •๋œ ๋ฒ„์ „์ด ์นดํƒˆ๋กœ๊ทธ์˜ ์ดํ›„ ๋ฒ„์ „์œผ๋กœ ๋Œ€์ฒด๋˜๋Š” ๊ฒฝ์šฐ ์Šน์ธ ์ „๋žต์„ Manual๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„ํš์—์„œ๋Š” ์ดํ›„ ๋ฒ„์ „์œผ๋กœ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹œ์ž‘ CSV์—์„œ ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•˜๋ ค๋ฉด ์ˆ˜๋™ ์Šน์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    2. Subscription CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f poison-pill-subscription.yaml

๊ฒ€์ฆ

  1. CSV ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์„ค์น˜์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get csv -n poison-pill

    ์ถœ๋ ฅ ์˜ˆ

    NAME                   DISPLAY                 VERSION   REPLACES    PHASE
    poison-pill.v.0.2.0     Poison Pill Operator    0.2.0                 Succeeded

  2. Poison Pill Operator๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get deploy -n poison-pill

    ์ถœ๋ ฅ ์˜ˆ

    NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
    poison-pill-controller-manager       1/1     1            1           10d

  3. Poison Pill Operator๊ฐ€ PoisonPillConfig CR์„ ์ƒ์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get PoisonPillConfig -n poison-pill

    ์ถœ๋ ฅ ์˜ˆ

    NAME                 AGE
    poison-pill-config   10d

  4. ๊ฐ ์ค‘๋…์„ฑ ์•Œ์•ฝ Pod๊ฐ€ ๊ฐ ์ž‘์—…์ž ๋…ธ๋“œ์—์„œ ์˜ˆ์•ฝ๋˜๊ณ  ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get daemonset -n poison-pill

    ์ถœ๋ ฅ ์˜ˆ

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    poison-pill-ds   2         2         2       2            2           <none>          10d

    ์ฐธ๊ณ 

    ์ด ๋ช…๋ น์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6.6.4. Poison Pill Operator๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€ ๊ตฌ์„ฑ

๋‹ค์Œ ์ ˆ์ฐจ์— ๋”ฐ๋ผ Poison Pill Operator๋ฅผ ์ˆ˜์ • ๊ณต๊ธ‰์ž๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift CLI(oc)๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. PoisonPillRemediationTemplate CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. PoisonPillRemediationTemplate CR์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: poison-pill.medik8s.io/v1alpha1
      kind: PoisonPillRemediationTemplate
      metadata:
        namespace: openshift-machine-api
        name: poisonpillremediationtemplate-sample
      spec:
        template:
          spec: {}
    2. PoisonPillRemediationTemplate CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <ppr-name>.yaml
  2. PoisonPillRemediationTemplate CR์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก MachineHealthCheck CR์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    1. MachineHealthCheck CR์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineHealthCheck
      metadata:
        name: machine-health-check
        namespace: openshift-machine-api
      spec:
        selector:
          matchLabels:
            machine.openshift.io/cluster-api-machine-role: "worker"
            machine.openshift.io/cluster-api-machine-type: "worker"
        unhealthyConditions:
        - type:    "Ready"
          timeout: "300s"
          status: "False"
        - type:    "Ready"
          timeout: "300s"
          status: "Unknown"
        maxUnhealthy: "40%"
        nodeStartupTimeout: "10m"
        remediationTemplate: 1
          kind: PoisonPillRemediationTemplate
          apiVersion: poison-pill.medik8s.io/v1alpha1
          name: poisonpillremediationtemplate-sample
      1
      ์ˆ˜์ • ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. MachineHealthCheck CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml
    3. MachineHealthCheck CR์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc apply -f <file-name>.yaml

6.6.5. Poison Pill Operator ๋ฌธ์ œ ํ•ด๊ฒฐ

6.6.5.1. ์ผ๋ฐ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ
๋ฌธ์ œ
Poison Pill Operator ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ
Operator ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
6.6.5.2. ๋ฐ๋ชฌ ์„ธํŠธ ํ™•์ธ
๋ฌธ์ œ
Poison Pill Operator๊ฐ€ ์„ค์น˜๋˜์—ˆ์ง€๋งŒ ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ
Operator ๋กœ๊ทธ์— ์˜ค๋ฅ˜ ๋˜๋Š” ๊ฒฝ๊ณ ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
6.6.5.3. ์‹คํŒจํ•œ ์ˆ˜์ •
๋ฌธ์ œ
๋น„์ •์ƒ ๋…ธ๋“œ๊ฐ€ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ PoisonPillRemediation CR์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ oc get ppr -A

๋…ธ๋“œ๊ฐ€ ๋น„์ •์ƒ์ธ ๊ฒฝ์šฐ MachineHealthCheck ์ปจํŠธ๋กค๋Ÿฌ์—์„œ PoisonPillRemediation CR์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ MachineHealthCheck ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ MachineHealthCheck CR์— ์ˆ˜์ • ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‚ฌ์–‘์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

PoisonPillRemediation CR์ด ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ์ด๋ฆ„์ด ๋น„์ •์ƒ ๋…ธ๋“œ ๋˜๋Š” ๋จธ์‹  ์˜ค๋ธŒ์ ํŠธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

6.6.5.4. Poison Pill Operator๋ฅผ ์ œ๊ฑฐํ•œ ํ›„์—๋„ ๋ฐ๋ชฌ ์„ธํŠธ ๋ฐ ๊ธฐํƒ€ Poison Pill Operator ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ
Operator๋ฅผ ์ œ๊ฑฐํ•œ ํ›„์—๋„ ๋ฐ๋ชฌ ์„ธํŠธ, ๊ตฌ์„ฑ CR ๋ฐ ์ˆ˜์ • ํ…œํ”Œ๋ฆฟ CR๊ณผ ๊ฐ™์€ Poison Pill Operator ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ

Poison Pill Operator ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๊ฐ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์— ๋Œ€ํ•ด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

$ oc delete ds <poison-pill-ds> -n <namespace>
$ oc delete ppc <poison-pill-config> -n <namespace>
$ oc delete pprt <poison-pill-remediation-template> -n <namespace>

6.6.6. Poison Pill Operator์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

Poison Pill Operator์— ๋Œ€ํ•œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด must-gather ํˆด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Poison Pill Operator์˜ must-gather ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

6.6.7. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

6.7. Node Health Check Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€ ๋ฐฐํฌ

Node Health Check Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NodeHealthCheck ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋น„์ •์ƒ ๋…ธ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  Poison Pill Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ •์ƒ ๋…ธ๋“œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

Node Health Check Operator๋Š” ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์€ Red Hat ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค ์ˆ˜์ค€ ๊ณ„์•ฝ(SLA)์—์„œ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์™„์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ–ฅํ›„ ์ œํ’ˆ ๊ธฐ๋Šฅ์„ ์กฐ๊ธฐ์— ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๊ณ ๊ฐ์ด ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Red Hat ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์˜ ์ง€์› ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์ง€์› ๋ฒ”์œ„๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

6.7.1. Node Health Check Operator ์ •๋ณด

Node Health Check Operator๋Š” NodeHealthCheck ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ฐฐํฌํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. NodeHealthCheck ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋…ธ๋“œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ธฐ์ค€ ๋ฐ ์ž„๊ณ„๊ฐ’์„ ์ •์˜ํ•˜๋Š” NodeHealthCheck CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Node Health Check Operator๋Š” ๋˜ํ•œ Poison Pill Operator๋ฅผ ๊ธฐ๋ณธ ์ˆ˜์ • ๊ณต๊ธ‰์ž๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

Node Health Check Operator๊ฐ€ ๋น„์ •์ƒ ๋…ธ๋“œ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ์ˆ˜์ • ๊ณต๊ธ‰์ž๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ˆ˜์ • CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํŠธ๋กค๋Ÿฌ๋Š” Poison Pill Operator๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ ๋น„์ •์ƒ ๋…ธ๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” PoisonPillRemediation CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

NodeHealthCheck CR์€ ๋‹ค์Œ YAML ํŒŒ์ผ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

apiVersion: remediation.medik8s.io/v1alpha1
kind: NodeHealthCheck
metadata:
  name: nodehealthcheck-sample
spec:
  minHealthy: 51% 1
  pauseRequests: 2
    - <pause-test-cluster>
  remediationTemplate: 3
    apiVersion: poison-pill.medik8s.io/v1alpha1
    name: group-x
    namespace: openshift-operators
    kind: PoisonPillRemediationTemplate
  selector: 4
    matchExpressions:
      - key: node-role.kubernetes.io/worker
        operator: Exists
  unhealthyConditions: 5
    - type: Ready
      status: "False"
      duration: 300s 6
    - type: Ready
      status: Unknown
      duration: 300s 7
1
ํ•ด๊ฒฐ ๊ณต๊ธ‰์ž๊ฐ€ ๋Œ€์ƒ ํ’€์˜ ๋…ธ๋“œ๋ฅผ ๋™์‹œ์— ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •์ƒ ๋…ธ๋“œ ์ˆ˜(% ๋˜๋Š” ์ˆซ์ž)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ ์ƒํƒœ์˜ ๋…ธ๋“œ ์ˆ˜๊ฐ€ minHealthy ์—์„œ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์ •์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ leader์ž…๋‹ˆ๋‹ค.
2
์ƒˆ๋กœ์šด ์ˆ˜์ •์ด ์‹œ์ž‘๋˜์ง€ ์•Š๊ณ  ์ง€์†์ ์ธ ์ˆ˜์ •์„ ๊ณ„์† ์œ ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์ • ์ค‘๋‹จ์˜ ์›์ธ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: pause-test-cluster.
์ฐธ๊ณ 

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

3
์ˆ˜์ • ๊ณต๊ธ‰์ž์—์„œ ์ˆ˜์ • ํ…œํ”Œ๋ฆฟ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Poison Pill Operator์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
4
ํ™•์ธํ•˜๋ ค๋Š” ๋ผ๋ฒจ ๋˜๋Š” ํ‘œํ˜„์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ์„ ํƒ๊ธฐ ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋น„์–ด ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
5
๋…ธ๋“œ๊ฐ€ ๋น„์ •์ƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์กฐ๊ฑด ๋ชฉ๋ก์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
6 7
๋…ธ๋“œ ์ƒํƒœ์— ๋Œ€ํ•œ ์‹œ๊ฐ„ ์ œํ•œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ธฐ๊ฐ„ ๋™์•ˆ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋…ธ๋“œ๊ฐ€ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ œํ•œ์ด ๊ธธ์–ด์ง€๋ฉด ๋น„์ •์ƒ ๋…ธ๋“œ์˜ ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ ๋‹ค์šดํƒ€์ž„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
6.7.1.1. Node Health Check Operator ์›Œํฌํ”Œ๋กœ์šฐ ์ดํ•ด

๋…ธ๋“œ๊ฐ€ ๋น„์ •์ƒ์œผ๋กœ ํ™•์ธ๋˜๋ฉด Node Health Check Operator์—์„œ ๋น„์ •์ƒ์ ์ธ ๋‹ค๋ฅธ ๋…ธ๋“œ ์ˆ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ ๋…ธ๋“œ ์ˆ˜๊ฐ€ NodeHealthCheck CR์˜ minHealthy ํ•„๋“œ์— ์ง€์ •๋œ ์–‘์„ ์ดˆ๊ณผํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ˆ˜์ • ์ œ๊ณต์ž๊ฐ€ ์™ธ๋ถ€ ์ˆ˜์ • ํ…œํ”Œ๋ฆฟ์— ์ œ๊ณต๋˜๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์—์„œ ์ˆ˜์ • CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ • ํ›„ kubelet์€ ๋…ธ๋“œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ๊ฐ€ ์ •์ƒ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์™ธ๋ถ€ ์ˆ˜์ • ํ…œํ”Œ๋ฆฟ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

6.7.1.2. ๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€์—์„œ ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€๊ณผ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ •๋ณด

๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€ ๋ฐ ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€์ด ๋ชจ๋‘ ๋ฐฐํฌ๋˜๋ฉด ๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€์ด ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

OpenShift Container Platform์€ machine-api-termination-handler ๋ฅผ ๊ธฐ๋ณธ MachineHealthCheck ๋ฆฌ์†Œ์Šค๋กœ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ชฉ๋ก์€ ๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€ ๋ฐ ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€์ด ๋ฐฐํฌ๋  ๋•Œ ์‹œ์Šคํ…œ ๋™์ž‘์„ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€์€ ๋น„์ •์ƒ ๋…ธ๋“œ๋ฅผ ๊ณ„์† ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€์€ ์ข…๋ฃŒ ์ƒํƒœ์˜ ๋น„์ •์ƒ ๋…ธ๋“œ๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€์€ Terminating ์ƒํƒœ๋กœ ๋น„์ •์ƒ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ์˜ˆ

    INFO MHCChecker	ignoring unhealthy Node, it is terminating and will be handled by MHC	{"NodeName": "node-1.example.com"}

  • ๊ธฐ๋ณธ ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€์ด ์ˆ˜์ •๋˜๊ฑฐ๋‚˜ ๋น„์ •์ƒConditions ๊ฐ€ Ready์ธ ๊ฒฝ์šฐ ๋˜๋Š” ์ถ”๊ฐ€ ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€์ด ์ƒ์„ฑ๋˜๋ฉด ๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ์˜ˆ

    INFO controllers.NodeHealthCheck disabling NHC in order to avoid conflict with custom MHCs configured in the cluster {"NodeHealthCheck": "/nhc-worker-default"}

  • ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ธฐ๋ณธ ๋จธ์‹  ์ƒํƒœ ์ ๊ฒ€๋งŒ ์žˆ์œผ๋ฉด ๋…ธ๋“œ ์ƒํƒœ ์ ๊ฒ€์ด ๋‹ค์‹œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

    ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ์˜ˆ

    INFO controllers.NodeHealthCheck re-enabling NHC, no conflicting MHC configured in the cluster {"NodeHealthCheck": "/nhc-worker-default"}

6.7.2. ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Node Health Check Operator ์„ค์น˜

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Node Health Check Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Operator โ†’ OperatorHub๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Node Health Check Operator๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๋‹ค์Œ ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ธฐ๋ณธ ์„ค์น˜ ๋ชจ๋“œ ๋ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ๊ณ„์† ์„ ํƒํ•˜์—ฌ Operator๊ฐ€ openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ค์น˜๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ

์„ค์น˜์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. Operator โ†’ ์„ค์น˜๋œ Operator ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Operator๊ฐ€ openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ค์น˜๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ์ƒํƒœ๊ฐ€ Succeeded ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Operator๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. Operator โ†’ ์„ค์น˜๋œ Operator ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ Status ์—ด์— ์˜ค๋ฅ˜ ๋˜๋Š” ์‹คํŒจ๊ฐ€ ์žˆ๋Š”์ง€ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์›Œํฌ๋กœ๋“œ โ†’ Pod ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ openshift-operators ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” Pod์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

6.7.3. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Node Health Check Operator ์„ค์น˜

OpenShift CLI(oc)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Node Health Check Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ์ ˆ์ฐจ์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ์ƒˆ Namespace CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค) ๋ฐ OperatorGroup CR์„ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ์ฐจ์˜ 3๋‹จ๊ณ„๋กœ ๊ฑด๋„ˆ๋›ฐ์‹ญ์‹œ์˜ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift CLI(oc)๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. Node Health Check Operator์˜ Namespace CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. Namespace CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: node-health-check-namespace.yaml ).

      apiVersion: v1
      kind: Namespace
      metadata:
        name: node-health-check
    2. ๋„ค์ž„์ŠคํŽ˜์ด์Šค CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f node-health-check-namespace.yaml
  2. OperatorGroup CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. OperatorGroup CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: node-health-check-operator-group.yaml ).

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: node-health-check-operator
        namespace: node-health-check
    2. OperatorGroup CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f node-health-check-operator-group.yaml
  3. ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜ CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜ CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: node-health-check-subscription.yaml ).

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
          name: node-health-check-operator
          namespace: node-health-check 1
      spec:
          channel: candidate 2
          installPlanApproval: Manual 3
          name: node-healthcheck-operator
          source: redhat-operators
          sourceNamespace: openshift-marketplace
          package: node-healthcheck-operator
      1
      Node Health Check Operator๋ฅผ ์„ค์น˜ํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Node Health Check Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด Subscription CR์—์„œ openshift-operators ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      2
      ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜์˜ ์ฑ„๋„ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Node Health Check Operator์˜ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๋ฉด ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜์˜ ์ฑ„๋„ ์ด๋ฆ„์„ alpha ์—์„œ candidate ๋กœ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      3
      ์ง€์ •๋œ ๋ฒ„์ „์ด ์นดํƒˆ๋กœ๊ทธ์˜ ์ดํ›„ ๋ฒ„์ „์œผ๋กœ ๋Œ€์ฒด๋˜๋Š” ๊ฒฝ์šฐ ์Šน์ธ ์ „๋žต์„ Manual๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„ํš์—์„œ๋Š” ์ดํ›„ ๋ฒ„์ „์œผ๋กœ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹œ์ž‘ CSV์—์„œ ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•˜๋ ค๋ฉด ์ˆ˜๋™ ์Šน์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    2. Subscription CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f node-health-check-subscription.yaml

๊ฒ€์ฆ

  1. CSV ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์„ค์น˜์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get csv -n openshift-operators

    ์ถœ๋ ฅ ์˜ˆ

    NAME                              DISPLAY                     VERSION  REPLACES PHASE
    node-healthcheck-operator.v0.2.0. Node Health Check Operator  0.2.0             Succeeded

  2. Node Health Check Operator๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get deploy -n openshift-operators

    ์ถœ๋ ฅ ์˜ˆ

    NAME                                           READY   UP-TO-DATE   AVAILABLE   AGE
    node-health-check-operator-controller-manager  1/1     1            1           10d

6.7.4. Node Health Check Operator์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

Node Health Check Operator์— ๋Œ€ํ•œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด must-gather ํˆด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Node Health Check Operator์˜ must-gather ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

6.7.5. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

6.8. Node Maintenance Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ๋กœ ๋ฐฐ์น˜

Node Maintenance Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ๋กœ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” OpenShift Virtualization ์„ค์น˜์™€๋Š” ๋ณ„๋„๋กœ ์ œ๊ณต๋˜๋Š” ๋…๋ฆฝํ˜• ๋ฒ„์ „์˜ Node Maintenance Operator์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ 

OpenShift Virtualization์„ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” Node Maintenance Operator๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

6.8.1. Node Maintenance Operator ์ •๋ณด

oc adm ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ NodeMaintenance CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node Maintenance Operator๋Š” ์ƒˆ๋กœ์šด ๋˜๋Š” ์‚ญ์ œ๋œ NodeMaintenance CR์„ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ NodeMaintenance CR์ด ๊ฐ์ง€๋˜๋ฉด ์ƒˆ ์›Œํฌ๋กœ๋“œ๊ฐ€ ์˜ˆ์•ฝ๋˜์ง€ ์•Š๊ณ  ๋‚˜๋จธ์ง€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ๊ฐ€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  Pod๋Š” ๋…ธ๋“œ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. NodeMaintenance CR์ด ์‚ญ์ œ๋˜๋ฉด CR์—์„œ ์ฐธ์กฐ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ์ƒˆ ์›Œํฌ๋กœ๋“œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋…ธ๋“œ ์œ ์ง€๋ณด์ˆ˜ ์ž‘์—…์— NodeMaintenance CR์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œ์ค€ OpenShift Container Platform CR ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ oc adm cordon ๋ฐ oc adm drain ๋ช…๋ น๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.8.2. ๋ฒ ์–ด ๋ฉ”ํƒˆ ๋…ธ๋“œ ์œ ์ง€๊ด€๋ฆฌ

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

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

6.8.3. Node Maintenance Operator ์„ค์น˜

์›น ์ฝ˜์†” ๋˜๋Š” OpenShift CLI(oc)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Node Maintenance Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.8.3.1. ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Node Maintenance Operator ์„ค์น˜

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Node Maintenance Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Operator โ†’ OperatorHub๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Node Maintenance Operator๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๋‹ค์Œ ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ธฐ๋ณธ ์„ค์น˜ ๋ชจ๋“œ ๋ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ๊ณ„์† ์„ ํƒํ•˜์—ฌ Operator๊ฐ€ openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ค์น˜๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ

์„ค์น˜์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. Operator โ†’ ์„ค์น˜๋œ Operator ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Operator๊ฐ€ openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ค์น˜๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ์ƒํƒœ๊ฐ€ Succeeded ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Operator๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. Operator โ†’ ์„ค์น˜๋œ Operator ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ Status ์—ด์— ์˜ค๋ฅ˜ ๋˜๋Š” ์‹คํŒจ๊ฐ€ ์žˆ๋Š”์ง€ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์›Œํฌ๋กœ๋“œ โ†’ Pod ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ openshift-operators ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” Pod์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
6.8.3.2. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Node Maintenance Operator ์„ค์น˜

OpenShift CLI(oc)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Node Maintenance Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Node Maintenance Operator๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ์ ˆ์ฐจ์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ์ƒˆ Namespace CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค) ๋ฐ OperatorGroup CR์„ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ์ฐจ์˜ 3๋‹จ๊ณ„๋กœ ๊ฑด๋„ˆ๋›ฐ์‹ญ์‹œ์˜ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift CLI(oc)๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ๋…ธ๋“œ ์œ ์ง€๋ณด์ˆ˜ Operator์˜ Namespace CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. Namespace CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: node-maintenance-namespace.yaml ).

      apiVersion: v1
      kind: Namespace
      metadata:
        name: nmo-test
    2. ๋„ค์ž„์ŠคํŽ˜์ด์Šค CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f node-maintenance-namespace.yaml
  2. OperatorGroup CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. OperatorGroup CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: node-maintenance-operator-group.yaml ).

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: node-maintenance-operator
        namespace: nmo-test
    2. OperatorGroup CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f node-maintenance-operator-group.yaml
  3. ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜ CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜ CR์„ ์ •์˜ํ•˜๊ณ  YAML ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: node-maintenance-subscription.yaml ).

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: node-maintenance-operator
        namespace: nmo-test 1
      spec:
        channel: stable
        InstallPlaneApproval: Automatic
        name: node-maintenance-operator
        source: redhat-operators
        sourceNamespace: openshift-marketplace
        StartingCSV: node-maintenance-operator.v4.10.0
      1
      Node Maintenance Operator๋ฅผ ์„ค์น˜ํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      ์ค‘์š”

      openshift-operators ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Node Maintenance Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด Subscription CR์—์„œ openshift-operators ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. Subscription CR์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f node-maintenance-subscription.yaml

๊ฒ€์ฆ

  1. CSV ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์„ค์น˜์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get csv -n openshift-operators

    ์ถœ๋ ฅ ์˜ˆ

    NAME                               DISPLAY                     VERSION   REPLACES  PHASE
    node-maintenance-operator.v4.10    Node Maintenance Operator   4.10                Succeeded

  2. Node Maintenance Operator๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get deploy -n openshift-operators

    ์ถœ๋ ฅ ์˜ˆ

    NAME                                           READY   UP-TO-DATE   AVAILABLE   AGE
    node-maintenance-operator-controller-manager   1/1     1            1           10d

Node Maintenance Operator๋Š” ์ œํ•œ๋œ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ œํ•œ๋œ ๋„คํŠธ์›Œํฌ์—์„œ Operator Lifecycle Manager ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

6.8.4. ๋…ธ๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ๋กœ ์„ค์ •

NodeMaintenance CR์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์ฝ˜์†” ๋˜๋Š” CLI์—์„œ ๋…ธ๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.8.4.1. ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ๋กœ ์„ค์ •

๋…ธ๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ NodeMaintenance CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  • OperatorHub ์—์„œ Node Maintenance Operator๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์›น ์ฝ˜์†”์˜ ๊ด€๋ฆฌ์ž ํ™”๋ฉด์—์„œ Operator โ†’ ์„ค์น˜๋œ Operator ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Operator ๋ชฉ๋ก์—์„œ Node Maintenance Operator๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. Node Maintenance ํƒญ์—์„œ NodeMaintenance๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. Create NodeMaintenance ํŽ˜์ด์ง€์—์„œ ์–‘์‹ ๋ณด๊ธฐ ๋˜๋Š” YAML ๋ณด๊ธฐ๋ฅผ ์„ ํƒํ•˜์—ฌ NodeMaintenance CR์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ตฌ์„ฑํ•œ NodeMaintenance CR์„ ์ ์šฉํ•˜๋ ค๋ฉด ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ

Node Maintenance ํƒญ์—์„œ Status (์ƒํƒœ) ์—ด์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ•ด๋‹น ์ƒํƒœ๊ฐ€ Succeeded ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

6.8.4.2. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ๋กœ ์„ค์ •

NodeMaintenance CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์œ ์ง€๊ด€๋ฆฌ ๋ชจ๋“œ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NodeMaintenance CR์„ ์ ์šฉํ•˜๋ฉด ํ—ˆ์šฉ๋˜๋Š” ๋ชจ๋“  Pod๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ๋…ธ๋“œ๊ฐ€ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐ๋œ Pod๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐ์—ด์— ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift Container Platform CLI oc๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ๋‹ค์Œ NodeMaintenance CR์„ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ์ผ์„ nodemaintenance-cr.yaml ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: nodemaintenance.medik8s.io/v1beta1
    kind: NodeMaintenance
    metadata:
      name: nodemaintenance-cr  1
    spec:
      nodeName: node-1.example.com 2
      reason: "NIC replacement" 3
    1
    ๋…ธ๋“œ ์œ ์ง€๋ณด์ˆ˜ CR์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    2
    ์œ ์ง€๊ด€๋ฆฌ ๋ชจ๋“œ์— ๋ฐฐ์น˜ํ•  ๋…ธ๋“œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    3
    ์œ ์ง€ ๊ด€๋ฆฌ ์ด์œ ์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋…ธ๋“œ ์œ ์ง€๋ณด์ˆ˜ CR์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    $ oc apply -f nodemaintenance-cr.yaml
  3. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ์ž‘์—…์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ™•์ธํ•˜๊ณ  < node-name >์„ ๋…ธ๋“œ ์ด๋ฆ„์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: node-1.example.com ):

    $ oc describe node node-1.example.com

    ์ถœ๋ ฅ ์˜ˆ

    Events:
      Type     Reason                     Age                   From     Message
      ----     ------                     ----                  ----     -------
      Normal   NodeNotSchedulable         61m                   kubelet  Node node-1.example.com status is now: NodeNotSchedulable

6.8.4.2.1. ํ˜„์žฌ NodeMaintenance CR ์ž‘์—…์˜ ์ƒํƒœ ํ™•์ธ

ํ˜„์žฌ NodeMaintenance CR ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift Container Platform CLI oc๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  • ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํ˜„์žฌ ๋…ธ๋“œ ์œ ์ง€๊ด€๋ฆฌ ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: NodeMaintenance CR ๋˜๋Š” nm ์˜ค๋ธŒ์ ํŠธ).

    $ oc get nm -o yaml

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: v1
    items:
    - apiVersion: nodemaintenance.medik8s.io/v1beta1
      kind: NodeMaintenance
      metadata:
    ...
      spec:
        nodeName: node-1.example.com
        reason: Node maintenance
      status:
        evictionPods: 3   1
        lastError: "Last failure message" 2
        phase: Succeeded
        totalpods: 5 3
    ...

    1
    ์ œ๊ฑฐ๋กœ ์˜ˆ์•ฝ๋œ Pod ์ˆ˜์ž…๋‹ˆ๋‹ค.
    2
    ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์‹  ์ œ๊ฑฐ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
    3
    ๋…ธ๋“œ๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜๊ธฐ ์ „ ์ด pod ์ˆ˜์ž…๋‹ˆ๋‹ค.

6.8.5. ์œ ์ง€๊ด€๋ฆฌ ๋ชจ๋“œ์—์„œ ๋…ธ๋“œ ์žฌ์‹œ์ž‘

CLI์—์„œ ๋˜๋Š” NodeMaintenance CR์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์—์„œ ๋…ธ๋“œ๋ฅผ ์žฌ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ๋…ธ๋“œ๊ฐ€ ์œ ์ง€๊ด€๋ฆฌ ๋ชจ๋“œ์—์„œ ํ•ด์ œ๋˜์–ด ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.8.5.1. ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์—์„œ ๋…ธ๋“œ ์žฌ์‹œ์ž‘

์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์—์„œ ๋…ธ๋“œ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ NodeMaintenance CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  • OperatorHub ์—์„œ Node Maintenance Operator๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์›น ์ฝ˜์†”์˜ ๊ด€๋ฆฌ์ž ํ™”๋ฉด์—์„œ Operator โ†’ ์„ค์น˜๋œ Operator ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Operator ๋ชฉ๋ก์—์„œ Node Maintenance Operator๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ๋…ธ๋“œ ์œ ์ง€๋ณด์ˆ˜ ํƒญ์—์„œ ์‚ญ์ œํ•  NodeMaintenance CR์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ๋…ธ๋“œ ๋์— ์žˆ๋Š” ์˜ต์…˜ ๋ฉ”๋‰ด kebab ๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋…ธ๋“œ ์œ ์ง€ ๊ด€๋ฆฌ ์‚ญ์ œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ

  1. OpenShift Container Platform ์ฝ˜์†”์—์„œ ์ปดํ“จํŒ… โ†’ ๋…ธ๋“œ ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. NodeMaintenance CR์„ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ์ƒํƒœ ์—ด์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ•ด๋‹น ์ƒํƒœ๊ฐ€ Ready ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
6.8.5.2. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์—์„œ ๋…ธ๋“œ ์žฌ์‹œ์ž‘

NodeMaintenance CR์„ ์‚ญ์ œํ•˜์—ฌ NodeMaintenance CR์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘๋œ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์—์„œ ๋…ธ๋“œ๋ฅผ ์žฌ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift Container Platform CLI oc๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • cluster-admin ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  • ๋…ธ๋“œ ์œ ์ง€๊ด€๋ฆฌ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ํ™œ์„ฑ NodeMaintenance CR์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    $ oc delete -f nodemaintenance-cr.yaml

    ์ถœ๋ ฅ ์˜ˆ

    nodemaintenance.nodemaintenance.medik8s.io "maintenance-example" deleted

6.8.6. Node Maintenance Operator์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

Node Maintenance Operator์— ๋Œ€ํ•œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด must-gather ํˆด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Node Maintenance Operator์˜ must-gather ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

6.8.7. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

6.9. ๋…ธ๋“œ ์žฌ๋ถ€ํŒ… ์ดํ•ด

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

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

6.9.1. ์ค‘์š”ํ•œ ์ธํ”„๋ผ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋…ธ๋“œ ์žฌ๋ถ€ํŒ… ์ •๋ณด

๋ผ์šฐํ„ฐ Pod, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ Pod, ๋ชจ๋‹ˆํ„ฐ๋ง Pod์™€ ๊ฐ™์€ ์ค‘์š”ํ•œ OpenShift Container Platform ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•  ๋•Œ๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ๊ฐ€ ์„ธ ๊ฐœ ์ด์ƒ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ OpenShift Container Platform์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋น„์Šค ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ A๊ฐ€ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋กœ ํ‘œ์‹œ๋˜๊ณ  ๋ชจ๋“  Pod๊ฐ€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ œ ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ Pod๊ฐ€ ๋…ธ๋“œ B์— ๋‹ค์‹œ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋…ธ๋“œ B๋Š” ๋‘ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ Pod๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ œ ๋…ธ๋“œ B๊ฐ€ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋กœ ํ‘œ์‹œ๋˜๊ณ  ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋…ธ๋“œ B์— Pod ๋์  ๋‘ ๊ฐœ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ์„œ๋น„์Šค์—์„œ๋Š” ํ•ด๋‹น ๋์ ์ด ๋…ธ๋“œ A์— ๋‹ค์‹œ ๋ฐฐํฌ๋  ๋•Œ๊นŒ์ง€ ์ž ์‹œ ๋ชจ๋“  ๋์ ์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

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

์ถ”๊ฐ€ ์ •๋ณด

6.9.2. Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ์žฌ๋ถ€ํŒ…

Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋Š” ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€์™€ ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Pod๋ฅผ ๋ฐฐํฌํ•  ๋‹ค๋ฅธ ์ ์ ˆํ•œ ์œ„์น˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ํ•„์ˆ˜ ๋˜๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ทœ์น™์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ์ธํ”„๋ผ ๋…ธ๋“œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•œ ๊ฐœ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ Pod๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. oc get pods๋Š” ์ ์ ˆํ•œ ๋…ธ๋“œ๊ฐ€ ์ œ๊ณต๋  ๋•Œ๊นŒ์ง€ Pod๋ฅผ ์ค€๋น„๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  Pod๊ฐ€ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์žฌ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋…ธ๋“œ ์‚ฌ์–‘์„ ํŽธ์ง‘ํ•˜์—ฌ Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: with-pod-antiaffinity
    spec:
      affinity:
        podAntiAffinity: 1
          preferredDuringSchedulingIgnoredDuringExecution: 2
          - weight: 100 3
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: registry 4
                  operator: In 5
                  values:
                  - default
              topologyKey: kubernetes.io/hostname
    #...
    1
    Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์Šคํƒ ์ž์ž…๋‹ˆ๋‹ค.
    2
    ๊ธฐ๋ณธ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    3
    ๊ธฐ๋ณธ ๊ทœ์น™์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋…ธ๋“œ๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
    4
    ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€ ๊ทœ์น™์ด ์ ์šฉ๋˜๋Š” ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” Pod ๋ผ๋ฒจ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ๋ผ๋ฒจ์˜ ํ‚ค์™€ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    5
    ์ด ์—ฐ์‚ฐ์ž๋Š” ๊ธฐ์กด Pod์˜ ๋ผ๋ฒจ๊ณผ ์ƒˆ Pod ์‚ฌ์–‘์— ์žˆ๋Š” matchExpression ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ง‘ํ•ฉ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. In, NotIn, Exists ๋˜๋Š” DoesNotExist์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด ์˜ˆ์ œ์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ Pod์— registry=default ๋ผ๋ฒจ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€์—์„œ๋Š” ๋ชจ๋“  Kubernetes ์ผ์น˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์˜ˆ์•ฝ ์ •์ฑ… ํŒŒ์ผ์—์„œ MatchInterPodAffinity ์Šค์ผ€์ค„๋Ÿฌ ์„œ์ˆ ์ž๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋…ธ๋“œ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

6.9.3. ๋ผ์šฐํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ OpenShift Container Platform ๋ผ์šฐํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” Pod์—์„œ๋Š” ํ˜ธ์ŠคํŠธ ํฌํŠธ๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

PodFitsPorts ์Šค์ผ€์ค„๋Ÿฌ ์„œ์ˆ ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํ„ฐ Pod๊ฐ€ ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  Pod ์œ ์‚ฌ์„ฑ ๋ฐฉ์ง€๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํ„ฐ์—์„œ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด IP ์žฅ์•  ์กฐ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ์กฐ์น˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด AWS Elastic Load Balancing๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํ„ฐ Pod์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์„œ๋น„์Šค์—์„œ ๋ผ์šฐํ„ฐ Pod ์žฌ์‹œ์ž‘์— ๋Œ€์‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋“œ๋ฌผ์ง€๋งŒ ๋ผ์šฐํ„ฐ Pod์— ํ˜ธ์ŠคํŠธ ํฌํŠธ๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ธํ”„๋ผ ๋…ธ๋“œ์— ๊ถŒ์žฅ๋˜๋Š” ์žฌ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

6.9.4. ๋…ธ๋“œ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์žฌ๋ถ€ํŒ…

๋…ธ๋“œ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๊ธฐ ์ „์— ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด etcd ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด kubeconfig ํŒŒ์ผ์— ์ธ์ฆ์„œ๊ฐ€ ์—†๋Š” oc login ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ผ ๋…ธ๋“œ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ์šฐ ๋…ธ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ๋“œ๋ ˆ์ด๋‹ํ•œ ํ›„์—๋Š” oc adm ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” cordon์œผ๋กœ ์ธํ•ด openshift-oauth-apiserver Pod๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ ˆ์ฐจ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ SSH๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ผ ๋…ธ๋“œ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ฐจ๋‹จ ๋ฐ ๋“œ๋ ˆ์ด๋‹ ์‹œ Pod๋ฅผ ๋‹ค์‹œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Pod, ํŠนํžˆ ์›Œํฌ๋กœ๋“œ Pod๋ฅผ ํ†ตํ•ด ๊ด€๋ จ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ค‘์ง€ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

๋…ธ๋“œ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm cordon <node1>
  2. ์‹คํ–‰์ค‘์ธ Pod๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm drain <node1> --ignore-daemonsets --delete-emptydir-data --force

    ์‚ฌ์šฉ์ž ์ •์˜ PDB(Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ)์™€ ์—ฐ๊ฒฐ๋œ Pod๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ค๋ฅ˜ ์˜ˆ

    error when evicting pods/"rails-postgresql-example-1-72v2w" -n "rails" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

    ์ด ๊ฒฝ์šฐ drain ๋ช…๋ น์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ PDB ๊ฒ€์‚ฌ๋ฅผ ๋ฐ”์ดํŒจ์Šคํ•˜๋Š” disable-eviction ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm drain <node1> --ignore-daemonsets --delete-emptydir-data --force --disable-eviction
  3. ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ๋…ธ๋“œ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

    $ oc debug node/<node1>
  4. ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ /host ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    $ chroot /host
  5. ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    $ systemctl reboot

    ์ž ์‹œ ํ›„ ๋…ธ๋“œ๊ฐ€ NotReady ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ์ผ๋ถ€ ๋‹จ์ผ ๋…ธ๋“œ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” openshift-oauth-apiserver Pod๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ๋“œ๋ ˆ์ด๋‹ํ•œ ํ›„ oc ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. SSH๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•˜๊ณ  ์žฌ๋ถ€ํŒ…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    $ ssh core@<master-node>.<cluster_name>.<base_domain>
    $ sudo systemctl reboot
  6. ์žฌ๋ถ€ํŒ…์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm uncordon <node1>
    ์ฐธ๊ณ 

    ์ผ๋ถ€ ๋‹จ์ผ ๋…ธ๋“œ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” openshift-oauth-apiserver Pod๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ๋“œ๋ ˆ์ด๋‹ํ•œ ํ›„ oc ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. SSH๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•˜๊ณ  uncordonํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    $ ssh core@<target_node>
    $ sudo oc adm uncordon <node> --kubeconfig /etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/localhost.kubeconfig
  7. ๋…ธ๋“œ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get node <node1>

    ์ถœ๋ ฅ ์˜ˆ

    NAME    STATUS  ROLES    AGE     VERSION
    <node1> Ready   worker   6d22h   v1.18.3+b0068a8

์ถ”๊ฐ€ ์ •๋ณด

etcd ๋ฐ์ดํ„ฐ ๋ฐฑ์—…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ etcd ๋ฐ์ดํ„ฐ ๋ฐฑ์—…์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

6.10. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ๋ฆฌ์†Œ์Šค ํ•ด์ œ

๊ด€๋ฆฌ์ž๋Š” OpenShift Container Platform์—์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•๋ณดํ•จ์œผ๋กœ์จ ๋…ธ๋“œ๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenShift Container Platform ๋…ธ๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜: ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜: ์‹คํ–‰ ์ค‘์ธ Pod์—์„œ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

6.10.1. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•

์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์—์„œ๋Š” ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ๋…ธ๋“œ๋Š” API์—์„œ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  pod์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ ์ง€ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. pod๊ฐ€ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋„ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. pod๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’์— ๋„๋‹ฌํ•˜์ง€ ์•Š๋Š” ํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณด์กด๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ ๋””์Šคํฌ ๋ถ€์กฑ (disk pressure) ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๊ณ  oc logs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋กœ๊ทธ์— ๋” ์ด์ƒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • eviction-soft - ์†Œํ”„ํŠธ ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’์€ ๊ด€๋ฆฌ์ž๊ฐ€ ์ง€์ •ํ•œ ํ•„์ˆ˜ ์œ ์˜ˆ ๊ธฐ๊ฐ„์ด ์žˆ๋Š” ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • eviction-hard - ํ•˜๋“œ ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’์— ๋Œ€ํ•œ ์œ ์˜ˆ ๊ธฐ๊ฐ„์ด ์—†์œผ๋ฉฐ ๊ฐ์ง€๋˜๋Š” ๊ฒฝ์šฐ OpenShift Container Platform์€ ์ฆ‰์‹œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ‘œ์—๋Š” ์ œ๊ฑฐ ์ž„๊ณ„๊ฐ’์ด ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 6.2. ์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ตฌ์„ฑ์„ ์œ„ํ•œ ๋ณ€์ˆ˜
๋…ธ๋“œ ์ƒํƒœ์ œ๊ฑฐ ์‹ ํ˜ธ์„ค๋ช…

MemoryPressure

memory.available

๋…ธ๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค.

DiskPressure

  • nodefs.available
  • nodefs.inodesFree
  • imagefs.available
  • imagefs.inodesFree

๋…ธ๋“œ ๋ฃจํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ, nodefs ๋˜๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ ์‹œ์Šคํ…œ์ธ imagefs ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋””์Šคํฌ ๊ณต๊ฐ„ ๋˜๋Š” inode์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ 

evictionHard ์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์ ์šฉ๋˜๊ณ  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ๊ฐ€ ์†Œํ”„ํŠธ ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’ ์ƒํ•œ๊ณผ ํ•˜ํ•œ ์‚ฌ์ด์—์„œ ๋ณ€๋™ํ•˜๊ณ  ์—ฐ๊ด€๋œ ์œ ์˜ˆ ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ด๋‹น ๋…ธ๋“œ๋Š” ์ง€์†์ ์œผ๋กœ true ์™€ false ์‚ฌ์ด์—์„œ ๋ณ€๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ž˜๋ชป๋œ ์Šค์ผ€์ค„๋ง ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€๋™์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด eviction-pressure-transition-period ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform์ด ๋ถ€์กฑ ์ƒํƒœ์—์„œ ์ „ํ™˜ํ•˜๊ธฐ ์ „์— ๋Œ€๊ธฐํ•ด์•ผํ•˜๋Š” ์‹œ๊ฐ„์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์€ false ์ƒํƒœ๋กœ ์ „ํ™˜๋˜๊ธฐ ์ „์— ์ง€์ •๋œ ๊ธฐ๊ฐ„์— ์ง€์ •๋œ ๋ถ€์กฑ ์ƒํƒœ์— ๋Œ€ํ•ด ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’์„ ์ถฉ์กฑํ•˜๋„๋ก ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6.10.2. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ์ด๋ฏธ์ง€๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์—์„œ๋Š” ์‹คํ–‰ ์ค‘์ธ Pod์—์„œ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform์€ cAdvisor ์—์„œ ๋ณด๊ณ ํ•˜๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋…ธ๋“œ์—์„œ ์‚ญ์ œํ•  ์ด๋ฏธ์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ •์ฑ…์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ๋ฐฑ๋ถ„์œจ (์ •์ˆ˜๋กœ ํ‘œ์‹œ)์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 85์ž…๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ํ•ด์ œํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ๋ฐฑ๋ถ„์œจ (์ •์ˆ˜๋กœ ํ‘œ์‹œ)์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 80์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 6.3. ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ตฌ์„ฑ์„ ์œ„ํ•œ ๋ณ€์ˆ˜
์„ค์ •์„ค๋ช…

imageMinimumGCAge

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ์˜ํ•ด ์ด๋ฏธ์ง€๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€์˜ ์ตœ์†Œ ๋ณด์กด ๊ธฐ๊ฐ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 2m์ž…๋‹ˆ๋‹ค.

imageGCHighThresholdPercent

์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ •์ˆ˜๋กœ ํ‘œ์‹œ๋˜๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ๋ฐฑ๋ถ„์œจ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 85์ž…๋‹ˆ๋‹ค.

imageGCLowThresholdPercent

์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ํ•ด์ œํ•˜๋ ค๊ณ ํ•˜๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ๋ฐฑ๋ถ„์œจ (์ •์ˆ˜๋กœ ํ‘œ์‹œ)์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 80์ž…๋‹ˆ๋‹ค.

๊ฐ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์‹คํ–‰์œผ๋กœ ๋‘ ๊ฐœ์˜ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์ด ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค.

  1. ํ•˜๋‚˜ ์ด์ƒ์˜ Pod์—์„œ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
  2. ํ˜ธ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฏธ์ง€์—๋Š” ํƒ€์ž„ ์Šคํƒฌํ”„๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ (์œ„์˜ ์ฒซ ๋ฒˆ์งธ ๋ชฉ๋ก) ์ƒˆ๋กœ ๊ฐ์ง€๋œ ๊ฒฝ์šฐ (์œ„์˜ ๋‘ ๋ฒˆ์งธ ๋ชฉ๋ก) ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ด๋ฏธ์ง€๋Š” ์ด๋ฏธ ์ด์ „ ์‹คํ–‰์—์„œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฏธ์ง€๋Š” ํƒ€์ž„ ์Šคํƒฌํ”„๋ณ„๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜์ด ์‹œ์ž‘๋˜๋ฉด ์ค‘์ง€ ๊ธฐ์ค€์ด ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์ด๋ฏธ์ง€๊ฐ€ ๋จผ์ € ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

6.10.3. ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์ด๋ฏธ์ง€์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ตฌ์„ฑ

๊ด€๋ฆฌ์ž๋Š” ๊ฐ machine config pool๋งˆ๋‹ค kubeletConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ OpenShift Container Platform์ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

OpenShift Container Platform์€ ๊ฐ ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ kubeletConfig ์˜ค๋ธŒ์ ํŠธ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์˜ ์กฐํ•ฉ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์†Œํ”„ํŠธ ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ
  • ํ•˜๋“œ ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ
  • ์ด๋ฏธ์ง€ ์ œ๊ฑฐ

์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์—์„œ๋Š” ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์—์„œ๋Š” ์‹คํ–‰ ์ค‘์ธ Pod์—์„œ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๊ตฌ์„ฑํ•  ๋…ธ๋“œ ์œ ํ˜•์˜ ์ •์  MachineConfigPool CRD์™€ ์—ฐ๊ด€๋œ ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool <name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool worker

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 1
      name: worker
    #...

    1
    ๋ ˆ์ด๋ธ”์ด Labels ์•„๋ž˜์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    ์ž‘์€ ์ •๋ณด

    ๋ผ๋ฒจ์ด ์—†์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‚ค/๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label machineconfigpool worker custom-kubelet=small-pods

ํ”„๋กœ์„ธ์Šค

  1. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค (CR)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ์ค‘์š”

    ํ•˜๋‚˜์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์žˆ๊ฑฐ๋‚˜ /var/lib/kubelet ๋ฐ /var/lib/containers/ ๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฐ’์ด ๊ฐ€์žฅ ๋งŽ์€ ์„ค์ •์„ ๋จผ์ € ์ถฉ์กฑํ•˜๋ฏ€๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์ œ๊ฑฐ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ CR์˜ ์„ค์ • ์˜ˆ:

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: worker-kubeconfig 1
    spec:
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 2
      kubeletConfig:
        evictionSoft: 3
          memory.available: "500Mi" 4
          nodefs.available: "10%"
          nodefs.inodesFree: "5%"
          imagefs.available: "15%"
          imagefs.inodesFree: "10%"
        evictionSoftGracePeriod:  5
          memory.available: "1m30s"
          nodefs.available: "1m30s"
          nodefs.inodesFree: "1m30s"
          imagefs.available: "1m30s"
          imagefs.inodesFree: "1m30s"
        evictionHard: 6
          memory.available: "200Mi"
          nodefs.available: "5%"
          nodefs.inodesFree: "4%"
          imagefs.available: "10%"
          imagefs.inodesFree: "5%"
        evictionPressureTransitionPeriod: 0s 7
        imageMinimumGCAge: 5m 8
        imageGCHighThresholdPercent: 80 9
        imageGCLowThresholdPercent: 75 10
    #...

    1
    ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    2
    ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์—์„œ ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    ์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ eviction: evictionSoft ๋˜๋Š” evictionHard ์ž…๋‹ˆ๋‹ค.
    4
    ์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ: ํŠน์ • ์ œ๊ฑฐ ํŠธ๋ฆฌ๊ฑฐ ์‹ ํ˜ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ œ๊ฑฐ ์ž„๊ณ„๊ฐ’์ž…๋‹ˆ๋‹ค.
    5
    ์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ: ์†Œํ”„ํŠธ ์ œ๊ฑฐ์— ๋Œ€ํ•œ grace ๊ธฐ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” eviction-hard์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    6
    ์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ: ํŠน์ • ์ œ๊ฑฐ ํŠธ๋ฆฌ๊ฑฐ ์‹ ํ˜ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ œ๊ฑฐ ์ž„๊ณ„๊ฐ’์ž…๋‹ˆ๋‹ค. evictionHard ์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์ ์šฉ๋˜๊ณ  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    7
    ์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ: ์ œ๊ฑฐ ๋ถ€์กฑ ์ƒํƒœ์—์„œ ์ „ํ™˜๋˜๊ธฐ ์ „์— ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
    8
    ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์— ์˜ํ•ด ์ด๋ฏธ์ง€๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€์˜ ์ตœ์†Œ ์ˆ˜๋ช…์ž…๋‹ˆ๋‹ค.
    9
    ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ: ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ๋ฐฑ๋ถ„์œจ(์ •์ˆ˜๋กœ ํ‘œ์‹œ)์ž…๋‹ˆ๋‹ค.
    10
    ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ํ•ด์ œํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ๋ฐฑ๋ถ„์œจ(์ •์ˆ˜๋กœ ํ‘œ์‹œ)์ž…๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file_name>.yaml

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc create -f gc-container.yaml

    ์ถœ๋ ฅ ์˜ˆ

    kubeletconfig.machineconfiguration.openshift.io/gc-container created

๊ฒ€์ฆ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค์— ์ง€์ •ํ•œ Machine Config Pool์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์™„์ „ํžˆ ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ UPDATING๊ณผ ํ•จ๊ป˜ 'true'๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    $ oc get machineconfigpool

    ์ถœ๋ ฅ ์˜ˆ

    NAME     CONFIG                                   UPDATED   UPDATING
    master   rendered-master-546383f80705bd5aeaba93   True      False
    worker   rendered-worker-b4c51bb33ccaae6fc4a6a5   False     True

6.11. OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ์— ๋ฆฌ์†Œ์Šค ํ• ๋‹น

๋” ์•ˆ์ •์ ์ธ ์˜ˆ์•ฝ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ๋…ธ๋“œ ๋ฆฌ์†Œ์Šค ๊ณผ๋‹ค ํ• ๋‹น์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ๋…ธ๋“œ ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ: kubelet, kube-proxy) ๋ฐ ๋‚˜๋จธ์ง€ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ: sshd, NetworkManager)์—์„œ ์‚ฌ์šฉํ•  CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค์˜ ์ผ๋ถ€๋ฅผ ์˜ˆ์•ฝํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ์•ฝํ•  ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜๋ฉด Pod์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์˜ ๋‚˜๋จธ์ง€ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์Šค์ผ€์ค„๋Ÿฌ์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์ด ๋…ธ๋“œ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ system-reserved CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ฒฐ์ • ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

๋ฆฌ์†Œ์Šค ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด kubelet ๊ตฌ์„ฑ CR์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ๊ตฌ์„ฑ CR์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

6.11.1. ๋…ธ๋“œ์— ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

OpenShift Container Platform์—์„œ ๋…ธ๋“œ ๊ตฌ์„ฑ ์š”์†Œ์šฉ์œผ๋กœ ์˜ˆ์•ฝ๋œ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋Š” ๋‹ค์Œ ๋‘ ๋…ธ๋“œ ์„ค์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •์„ค๋ช…

kube-reserved

์ด ์„ค์ •์€ OpenShift Container Platform๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. system-reserved ์„ค์ •์— ์˜ˆ์•ฝํ•  CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

system-reserved

์ด ์„ค์ •์€ CRI-O ๋ฐ Kubelet๊ณผ ๊ฐ™์€ ๋…ธ๋“œ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์— ์˜ˆ์•ฝํ•  ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ค์ •์€ OpenShift Container Platform ๋ฐ Machine Config Operator ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. machine-config-operator ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๊ธฐ๋ณธ systemReserved ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ• ๋‹น๋œ ๋ฆฌ์†Œ์Šค๋Š” ํ• ๋‹น ๊ฐ€๋Šฅ ๋ฆฌ์†Œ์Šค๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋…ธ๋“œ์˜ ์šฉ๋Ÿ‰์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

reservedSystemCPUs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน๋ณ„ํžˆ ์˜ˆ์•ฝํ•œ CPU๋Š” kube-reserved ๋˜๋Š” system-reserved๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

6.11.1.1. OpenShift Container Platform์—์„œ ํ• ๋‹น๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ• ๋‹น๋œ ๋ฆฌ์†Œ์Šค ์–‘์€ ๋‹ค์Œ ๊ณต์‹์— ๋”ฐ๋ผ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

[Allocatable] = [Node Capacity] - [system-reserved] - [Hard-Eviction-Thresholds]
์ฐธ๊ณ 

Allocatable์—์„œ Hard-Eviction-Thresholds๋ฅผ ๋ณด๋ฅ˜ํ•˜๋ฉด Allocatable ๊ฐ’์ด ๋…ธ๋“œ ์ˆ˜์ค€์—์„œ Pod์— ์ ์šฉ๋˜๋ฏ€๋กœ ์‹œ์Šคํ…œ ์‹ ๋ขฐ๋„๊ฐ€ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

Allocatable์ด ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ 0์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๊ฐ ๋…ธ๋“œ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๋ฐ kubelet์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. system-reserved ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๋ ค๋ฉด Node Summary API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์š”์•ฝ์€ /api/v1/nodes/<node>/proxy/stats/summary์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

6.11.1.2. ๋…ธ๋“œ์—์„œ ๋ฆฌ์†Œ์Šค ์ œ์•ฝ ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋…ธ๋“œ๋Š” ๊ตฌ์„ฑ๋œ ํ• ๋‹น ๊ฐ€๋Šฅ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ Pod์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด ๋ฆฌ์†Œ์Šค ์–‘์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๋ฐ ๋…ธ๋“œ ์—์ด์ „ํŠธ์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ์„œ๋น„์Šค์— ํ•„์š”ํ•œ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ Pod์—์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜์—ฌ ๋…ธ๋“œ์˜ ์•ˆ์ •์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋Š” ๋…ธ๋“œ ์•ˆ์ •์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ๋ชฉํ‘œ์— ๋”ฐ๋ผ ๋ฆฌ์†Œ์Šค๋ฅผ ์˜ˆ์•ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ๋Š” ์„œ๋น„์Šค ํ’ˆ์งˆ์„ ์ ์šฉํ•˜๋Š” ์ƒˆ cgroup ๊ณ„์ธต์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ œ์•ฝ ์กฐ๊ฑด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  Pod๋Š” ์‹œ์Šคํ…œ ๋ฐ๋ชฌ๊ณผ๋Š” ๋ณ„๋„์˜ ์ „์šฉ cgroup ๊ณ„์ธต์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž๋Š” ์„œ๋น„์Šค ํ’ˆ์งˆ์ด ๋ณด์žฅ๋œ Pod์™€ ๋น„์Šทํ•œ ์‹œ์Šคํ…œ ๋ฐ๋ชฌ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋ฐ๋ชฌ์€ ๋ฐ”์ธ๋”ฉ ์ œ์–ด ๊ทธ๋ฃน ๋‚ด์—์„œ ๋ฒ„์ŠคํŠธ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๋™์ž‘์€ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐฐํฌ์˜ ์ผ๋ถ€๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. system-reserved์— CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ฐ๋ชฌ์„ ์œ„ํ•œ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

system-reserved ์ œํ•œ์„ ๊ฐ•์ œ ์ ์šฉํ•˜์—ฌ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ ์„œ๋น„์Šค์—์„œ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ข…๋ฃŒ์ž์—์„œ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ ์„œ๋น„์Šค๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์ถ”์ •์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ๋ฅผ ์ฒ ์ €ํžˆ ํ”„๋กœํŒŒ์ผ๋งํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ข…๋ฃŒ์ž์—์„œ ํ•ด๋‹น ๊ทธ๋ฃน์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ ์„œ๋น„์Šค๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ system-reserved๋ฅผ ๊ฐ•์ œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

6.11.1.3. ์ œ๊ฑฐ ์ž„๊ณ„๊ฐ’ ์ดํ•ด

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

--eviction-hard ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์šฉ์„ฑ์ด ์ด ์ ˆ๋Œ€๊ฐ’ ๋˜๋Š” ๋ฐฑ๋ถ„์œจ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๋ฉด Pod๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ์‹œ์Šคํ…œ ๋ฐ๋ชฌ์ด ์—†๋Š” ๊ฒฝ์šฐ Pod๋Š” ๋ฉ”๋ชจ๋ฆฌ capacity - eviction-hard๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ƒํƒœ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์ œ๊ฑฐํ•  ๋ฒ„ํผ๋กœ ๋”ฐ๋กœ ์„ค์ •๋œ ๋ฆฌ์†Œ์Šค๋ฅผ Pod์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ์˜ ์˜ํ–ฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ ์šฉ๋Ÿ‰์ด 32Gi์ž…๋‹ˆ๋‹ค.
  • --system-reserved๊ฐ€ 3Gi์ž…๋‹ˆ๋‹ค.
  • --eviction-hard๊ฐ€ 100Mi๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ ์œ ํšจ ๋…ธ๋“œ ํ• ๋‹น ๊ฐ€๋Šฅ ๊ฐ’์€ 28.9Gi์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์˜ˆ์•ฝ๋œ ์šฉ๋Ÿ‰์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Pod์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” 28.9Gi์ด๊ณ  ์ด ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ Kubelet์€ Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ ํ• ๋‹น ๊ฐ€๋Šฅ 28.9Gi๋ฅผ ์ตœ์ƒ์œ„ cgroups์™€ ํ•จ๊ป˜ ์ ์šฉํ•˜๋ฉด Pod์—์„œ 28.9Gi๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋ฐ๋ชฌ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 3.1Gi๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ œ๊ฑฐ ์ž‘์—…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์—์„œ ์‹œ์Šคํ…œ ๋ฐ๋ชฌ์ด ์˜ˆ์•ฝ๋œ ์šฉ๋Ÿ‰์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ ์ œ๊ฑฐ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— Pod์˜ ๋ฐ”์ธ๋”ฉ cgroup์—์„œ memcg OOM์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ QoS๋ฅผ ๋” ์ž˜ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ๋Š” ๋ชจ๋“  Pod๊ฐ€ Node Allocatable + Eviction Hard Thresholds๊ฐ€ ๋˜๋„๋ก ์ตœ์ƒ์œ„ cgroup์— ํ•˜๋“œ ์ œ๊ฑฐ ์ž„๊ณ„๊ฐ’์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๋ฐ๋ชฌ์—์„œ ์˜ˆ์•ฝ๋œ ์šฉ๋Ÿ‰์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ๋Š” Pod์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 28.9Gi๋ฅผ ์ดˆ๊ณผํ•  ๋•Œ๋งˆ๋‹ค Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐ ์ž‘์—…์ด ์ œ์‹œ๊ฐ„์— ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•„ Pod์—์„œ 29Gi์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Pod๊ฐ€ OOM ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

6.11.1.4. ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ๋ฆฌ์†Œ์Šค ๊ฐ€์šฉ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

์Šค์ผ€์ค„๋Ÿฌ๋Š” node.Status.Capacity๊ฐ€ ์•„๋‹Œ node.Status.Allocatable์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๊ฐ€ Pod ์˜ˆ์•ฝ ํ›„๋ณด๊ฐ€ ๋ ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ „์ฒด ๋จธ์‹  ์šฉ๋Ÿ‰์„ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

6.11.2. ๋…ธ๋“œ์˜ ๋ฆฌ์†Œ์Šค ์ž๋™ ํ• ๋‹น

OpenShift Container Platform์€ ํŠน์ • ๋จธ์‹  ๊ตฌ์„ฑ ํ’€๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ system-reserved CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๋…ธ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ system-reserved CPU๋Š” 500m ์ด๊ณ  system-reserved ๋ฉ”๋ชจ๋ฆฌ๋Š” 1Gi ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ์—์„œ system-reserved ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ํ• ๋‹นํ•˜๋ ค๋ฉด KubeletConfig CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•˜์—ฌ autoSizingReserved: true ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ ๋…ธ๋“œ์— ์„ค์น˜๋œ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ˆ์•ฝ๋œ ๊ฐ ๋ฆฌ์†Œ์Šค์— ์ตœ์  ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์šฉ๋Ÿ‰์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜ˆ์•ฝ๋œ ๋ฆฌ์†Œ์Šค์—์„œ ํ•ด๋‹น ์ฆ๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ ์˜ system-reserved ์„ค์ •์„ ์ž๋™์œผ๋กœ ํ™•์ธํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ๊ณ„์‚ฐ ๋ฐ ์—…๋ฐ์ดํŠธํ•  ํ•„์š” ์—†์ด CRI-O ๋ฐ kubelet๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ๋…ธ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๊ตฌ์„ฑํ•  ๋…ธ๋“œ ์œ ํ˜•์˜ ์ •์  MachineConfigPool ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ด€๋œ ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool <name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool worker

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 1
      name: worker
    #...

    1
    ๋ ˆ์ด๋ธ”์€ Labels ์•„๋ž˜์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    ์ž‘์€ ์ •๋ณด

    ์ ์ ˆํ•œ ๋ผ๋ฒจ์ด ์—†์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‚ค/๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label machineconfigpool worker custom-kubelet=small-pods

ํ”„๋กœ์„ธ์Šค

  1. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ๋ฆฌ์†Œ์Šค ํ• ๋‹น CR ๊ตฌ์„ฑ ์ƒ˜ํ”Œ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: dynamic-node 1
    spec:
      autoSizingReserved: true 2
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 3
    #...

    1
    CR์— ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    OpenShift Container Platform์ด ์ง€์ •๋œ ๋ผ๋ฒจ๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์—์„œ system-reserved ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก autoSizingReserved ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ธํŠธ๋ฅผ true ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์ž๋™ ํ• ๋‹น์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ false ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    "์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ" ์„น์…˜์— ๊ตฌ์„ฑํ•œ ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์—์„œ ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. custom-kubelet: small-pods, default ๋ ˆ์ด๋ธ”, pool .operator.machineconfiguration.openshift.io/worker: "" ์™€ ๊ฐ™์€ ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ๋ ˆ์ด๋ธ”์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด์ „ ์˜ˆ์ œ์—์„œ๋Š” ๋ชจ๋“  ์ž‘์—…์ž ๋…ธ๋“œ์—์„œ ์ž๋™ ๋ฆฌ์†Œ์Šค ํ• ๋‹น์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์€ ๋…ธ๋“œ๋ฅผ ๋“œ๋ ˆ์ธํ•˜๊ณ  kubelet ๊ตฌ์„ฑ์„ ์ ์šฉํ•œ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file_name>.yaml

๊ฒ€์ฆ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๊ตฌ์„ฑํ•œ ๋…ธ๋“œ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc debug node/<node_name>
  2. ๋””๋ฒ„๊ทธ ์‰˜ ๋‚ด์—์„œ /host๋ฅผ root ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    # chroot /host
  3. /etc/node-sizing.env ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    SYSTEM_RESERVED_MEMORY=3Gi
    SYSTEM_RESERVED_CPU=0.08

    kubelet์€ /etc/node-sizing.env ํŒŒ์ผ์˜ system-reserved ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์˜ˆ์—์„œ ์ž‘์—…์ž ๋…ธ๋“œ์— 0.08 CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ 3Gi๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์ตœ์ ์˜ ๊ฐ’์ด ํ‘œ์‹œ๋˜๋Š” ๋ฐ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.11.3. ๋…ธ๋“œ์— ์ˆ˜๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค ํ• ๋‹น

OpenShift Container Platform์€ ํ• ๋‹น์„ ์œ„ํ•ด CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ephemeral-resource ๋ฆฌ์†Œ์Šค ์œ ํ˜•๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. cpu ์œ ํ˜•์˜ ๊ฒฝ์šฐ 200m,0.5 ๋˜๋Š” 1 ๊ณผ ๊ฐ™์€ ์ฝ”์–ด ๋‹จ์œ„๋กœ ๋ฆฌ์†Œ์Šค ์ˆ˜๋Ÿ‰์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. memory ๋ฐ ephemeral-storage ์˜ ๊ฒฝ์šฐ 200Ki,50Mi ๋˜๋Š” 5Gi ์™€ ๊ฐ™์€ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฆฌ์†Œ์Šค ์ˆ˜๋Ÿ‰์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ system-reserved CPU๋Š” 500m ์ด๊ณ  system-reserved ๋ฉ”๋ชจ๋ฆฌ๋Š” 1Gi ์ž…๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž๋Š” <resource _type>=<resource_quantity> ์Œ ์ง‘ํ•ฉ(์˜ˆ: cpu=200m,memory=512Mi )์„ ํ†ตํ•ด kubelet ๊ตฌ์„ฑ CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

๋ฆฌ์†Œ์Šค ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด kubelet ๊ตฌ์„ฑ CR์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ๊ตฌ์„ฑ CR์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ถŒ์žฅ system-reserved ๊ฐ’์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ถŒ์žฅ system-reserved ๊ฐ’์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๊ตฌ์„ฑํ•  ๋…ธ๋“œ ์œ ํ˜•์˜ ์ •์  MachineConfigPool CRD์™€ ์—ฐ๊ด€๋œ ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool <name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool worker

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 1
      name: worker
    #...

    1
    ๋ ˆ์ด๋ธ”์ด Labels ์•„๋ž˜์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    ์ž‘์€ ์ •๋ณด

    ๋ผ๋ฒจ์ด ์—†์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‚ค/๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label machineconfigpool worker custom-kubelet=small-pods

ํ”„๋กœ์„ธ์Šค

  1. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค (CR)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ๋ฆฌ์†Œ์Šค ํ• ๋‹น CR ๊ตฌ์„ฑ ์ƒ˜ํ”Œ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: set-allocatable 1
    spec:
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 2
      kubeletConfig:
        systemReserved: 3
          cpu: 1000m
          memory: 1Gi
    #...

    1
    CR์— ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์—์„œ ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    ๋…ธ๋“œ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์— ์˜ˆ์•ฝํ•  ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file_name>.yaml

6.12. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ์— ํŠน์ • CPU ํ• ๋‹น

์ •์  CPU ๊ด€๋ฆฌ์ž ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํŠน์ • ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉํ•  ํŠน์ • CPU๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด CPU๊ฐ€ 24๊ฐœ์ธ ์‹œ์Šคํ…œ์—์„œ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— 0~3๋ฒˆ CPU๋ฅผ ์˜ˆ์•ฝํ•˜์—ฌ ์ปดํ“จํŒ… ๋…ธ๋“œ์—์„œ 4~23๋ฒˆ CPU๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.12.1. ๋…ธ๋“œ์˜ CPU ์˜ˆ์•ฝ

ํŠน์ • ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋œ CPU ๋ชฉ๋ก์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๋ ค๋ฉด KubeletConfig CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•˜์—ฌ reservedSystemCPUs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ systemReserved ๋ฐ kubeReserved ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” CPU๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. ๊ตฌ์„ฑํ•˜๋ ค๋Š” ๋…ธ๋“œ ์œ ํ˜•์˜ MCP(๋จธ์‹  ๊ตฌ์„ฑ ํ’€)์™€ ์—ฐ๊ฒฐ๋œ ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ oc describe machineconfigpool <name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc describe machineconfigpool worker

    ์ถœ๋ ฅ ์˜ˆ

    Name:         worker
    Namespace:
    Labels:       machineconfiguration.openshift.io/mco-built-in=
                  pools.operator.machineconfiguration.openshift.io/worker= 1
    Annotations:  <none>
    API Version:  machineconfiguration.openshift.io/v1
    Kind:         MachineConfigPool
    #...

    1
    MCP ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  2. KubeletConfig CR์˜ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: set-reserved-cpus 1
    spec:
      kubeletConfig:
        reservedSystemCPUs: "0,1,2,3" 2
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 3
    #...
    1
    CR ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    MCP์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•  CPU์˜ ์ฝ”์–ด ID๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    MCP์—์„œ ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. CR ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file_name>.yaml

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

6.13. kubelet์˜ TLS ๋ณด์•ˆ ํ”„๋กœํ•„ ํ™œ์„ฑํ™”

TLS(Transport Layer Security) ๋ณด์•ˆ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์„œ๋ฒ„ ์—ญํ• ์„ ํ•  ๋•Œ kubelet์— ํ•„์š”ํ•œ TLS ์•”ํ˜ธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. kubelet์€ HTTP/GRPC ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ Pod์— ์ „์†กํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ฉฐ kubelet์„ ํ†ตํ•ด Pod์—์„œ exec ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” Kubernetes API ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

TLS ๋ณด์•ˆ ํ”„๋กœํ•„์€ kubelet๊ณผ Kubernetes API ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด kubelet์— ์—ฐ๊ฒฐํ•  ๋•Œ Kubernetes API ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” TLS ์•”ํ˜ธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๊ธฐ๋ณธ์ ์œผ๋กœ kubelet์ด Kubernetes API ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์—ญํ• ์„ ํ•  ๋•Œ API ์„œ๋ฒ„์™€ TLS ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ํ˜‘์ƒํ•ฉ๋‹ˆ๋‹ค.

6.13.1. TLS ๋ณด์•ˆ ํ”„๋กœํ•„ ์ดํ•ด

TLS(Transport Layer Security) ๋ณด์•ˆ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ OpenShift Container Platform ๊ตฌ์„ฑ ์š”์†Œ์— ํ•„์š”ํ•œ TLS ์•”ํ˜ธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenShift Container Platform TLS ๋ณด์•ˆ ํ”„๋กœํ•„์€ Mozilla ๊ถŒ์žฅ ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹ค์Œ TLS ๋ณด์•ˆ ํ”„๋กœํ•„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 6.4. TLS ๋ณด์•ˆ ํ”„๋กœํ•„
Profile์„ค๋ช…

Old

์ด ํ”„๋กœํ•„์€ ๋ ˆ๊ฑฐ์‹œ ํด๋ผ์ด์–ธํŠธ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํ•„์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๊ถŒ์žฅ ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Old ํ”„๋กœํŒŒ์ผ์—๋Š” ์ตœ์†Œ TLS ๋ฒ„์ „ 1.0์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Ingress ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฒฝ์šฐ ์ตœ์†Œ TLS ๋ฒ„์ „์ด 1.0์—์„œ 1.1๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

Intermediate

์ด ํ”„๋กœํ•„์€ ๋Œ€๋ถ€๋ถ„์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ถŒ์žฅ๋˜๋Š” ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. Ingress ์ปจํŠธ๋กค๋Ÿฌ, kubelet ๋ฐ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ๊ธฐ๋ณธ TLS ๋ณด์•ˆ ํ”„๋กœํ•„์ž…๋‹ˆ๋‹ค. ํ”„๋กœํ•„์€ ์ค‘๊ฐ„ ํ˜ธํ™˜์„ฑ ๊ถŒ์žฅ ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Intermediate ํ”„๋กœํ•„์—๋Š” ์ตœ์†Œ TLS ๋ฒ„์ „์ด 1.2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Modern

์ด ํ”„๋กœํ•„์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ตœ์‹  ํด๋ผ์ด์–ธํŠธ์™€ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœํ•„์€ ์ตœ์‹  ํ˜ธํ™˜์„ฑ ๊ถŒ์žฅ ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Modern ํ”„๋กœํ•„์—๋Š” ์ตœ์†Œ TLS ๋ฒ„์ „ 1.3์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ •

์ด ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉํ•  TLS ๋ฒ„์ „๊ณผ ์•”ํ˜ธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜

Custom ํ”„๋กœํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ฏธ๋ฆฌ ์ •์˜๋œ ํ”„๋กœํŒŒ์ผ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์œ ํšจํ•œ ํ”„๋กœํŒŒ์ผ ๊ตฌ์„ฑ์€ ๋ฆด๋ฆฌ์Šค๋งˆ๋‹ค ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆด๋ฆฌ์Šค X.Y.Z์— ๋ฐฐํฌ๋œ ์ค‘๊ฐ„ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์–‘์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฆด๋ฆฌ์Šค X.Y.Z+1๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ƒˆ ํ”„๋กœํ•„ ๊ตฌ์„ฑ์ด ์ ์šฉ๋˜์–ด ๋กค์•„์›ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.13.2. kubelet์˜ TLS ๋ณด์•ˆ ํ”„๋กœํ•„ ๊ตฌ์„ฑ

HTTP ์„œ๋ฒ„ ์—ญํ• ์„ ํ•  ๋•Œ kubelet์— ๋Œ€ํ•œ TLS ๋ณด์•ˆ ํ”„๋กœํ•„์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด KubeletConfig CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์— ๋Œ€ํ•ด ์‚ฌ์ „ ์ •์˜ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • TLS ๋ณด์•ˆ ํ”„๋กœํ•„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. TLS ๋ณด์•ˆ ํ”„๋กœํ•„์ด ๊ตฌ์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ TLS ๋ณด์•ˆ ํ”„๋กœํ•„์€ Intermediate์ž…๋‹ˆ๋‹ค.

์ž‘์—…์ž ๋…ธ๋“œ์—์„œ Old TLS ๋ณด์•ˆ ํ”„๋กœํ•„์„ ๊ตฌ์„ฑํ•˜๋Š” ์ƒ˜ํ”Œ KubeletConfig CR

apiVersion: config.openshift.io/v1
kind: KubeletConfig
 ...
spec:
  tlsSecurityProfile:
    old: {}
    type: Old
  machineConfigPoolSelector:
    matchLabels:
      pools.operator.machineconfiguration.openshift.io/worker: ""
#...

๊ตฌ์„ฑ๋œ ๋…ธ๋“œ์˜ kubelet.conf ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ๋œ TLS ๋ณด์•ˆ ํ”„๋กœํ•„์˜ ์•”ํ˜ธ ๋ฐ ์ตœ์†Œ TLS ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • cluster-admin ์—ญํ• ์˜ ์‚ฌ์šฉ์ž๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. KubeletConfig CR์„ ์ƒ์„ฑํ•˜์—ฌ TLS ๋ณด์•ˆ ํ”„๋กœํ•„์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    Custom ํ”„๋กœํŒŒ์ผ์˜ ์ƒ˜ํ”Œ KubeletConfig CR

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: set-kubelet-tls-security-profile
    spec:
      tlsSecurityProfile:
        type: Custom 1
        custom: 2
          ciphers: 3
          - ECDHE-ECDSA-CHACHA20-POLY1305
          - ECDHE-RSA-CHACHA20-POLY1305
          - ECDHE-RSA-AES128-GCM-SHA256
          - ECDHE-ECDSA-AES128-GCM-SHA256
          minTLSVersion: VersionTLS11
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 4
    #...

    1
    TLS ๋ณด์•ˆ ํ”„๋กœํ•„ ์œ ํ˜•(Old,Intermediate ๋˜๋Š” Custom)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Intermediate์ž…๋‹ˆ๋‹ค.
    2
    ์„ ํƒํ•œ ์œ ํ˜•์˜ ์ ์ ˆํ•œ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • old: {}
    • intermediate: {}
    • custom:
    3
    custom ์œ ํ˜•์˜ ๊ฒฝ์šฐ TLS ์•”ํ˜ธํ™” ๋ชฉ๋ก ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ๋œ TLS ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    4
    ์„ ํƒ ์‚ฌํ•ญ: TLS ๋ณด์•ˆ ํ”„๋กœํ•„์„ ์ ์šฉํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ๋จธ์‹  ๊ตฌ์„ฑ ํ’€ ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. KubeletConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <filename>

    ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ž‘์—…์ž ๋…ธ๋“œ ์ˆ˜์— ๋”ฐ๋ผ ๊ตฌ์„ฑ๋œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ์žฌ๋ถ€ํŒ…๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

๊ฒ€์ฆ

ํ”„๋กœํ•„์ด ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋…ธ๋“œ๊ฐ€ Ready ์ƒํƒœ๊ฐ€ ๋œ ํ›„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ตฌ์„ฑ๋œ ๋…ธ๋“œ์˜ ๋””๋ฒ„๊ทธ ์„ธ์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    $ oc debug node/<node_name>
  2. ๋””๋ฒ„๊ทธ ์‰˜ ๋‚ด์—์„œ /host๋ฅผ root ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    sh-4.4# chroot /host
  3. kubelet.conf ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    sh-4.4# cat /etc/kubernetes/kubelet.conf

    ์ถœ๋ ฅ ์˜ˆ

      "kind": "KubeletConfiguration",
      "apiVersion": "kubelet.config.k8s.io/v1beta1",
    #...
      "tlsCipherSuites": [
        "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
        "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
        "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
        "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
        "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
        "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"
      ],
      "tlsMinVersion": "VersionTLS12",
    #...

6.14. ๋จธ์‹  ๊ตฌ์„ฑ ๋ฐ๋ชฌ ๋ฉ”ํŠธ๋ฆญ

๋จธ์‹  ๊ตฌ์„ฑ ๋ฐ๋ชฌ์€ Machine Config Operator์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ๊ตฌ์„ฑ ๋ฐ๋ชฌ์€ ๊ฐ ๋…ธ๋“œ์˜ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ๋ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

6.14.1. ๋จธ์‹  ๊ตฌ์„ฑ ๋ฐ๋ชฌ ๋ฉ”ํŠธ๋ฆญ

OpenShift Container Platform 4.3๋ถ€ํ„ฐ๋Š” ๋จธ์‹  ๊ตฌ์„ฑ ๋ฐ๋ชฌ์—์„œ ์ผ๋ จ์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”ํŠธ๋ฆญ์€ Prometheus ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํ…Œ์ด๋ธ”์— ์ด๋Ÿฌํ•œ ๋ฉ”ํŠธ๋ฆญ ์ง‘ํ•ฉ์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

* Name* ๋ฐ Description ์—ด์—์„œ *๋กœ ํ‘œ์‹œ๋œ ๋ฉ”ํŠธ๋ฆญ์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์—…๋ฐ์ดํŠธ ๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ผ๋ถ€ ํ•ญ๋ชฉ์—๋Š” ํŠน์ • ๋กœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ช…๋ น์ด ํฌํ•จ๋˜์ง€๋งŒ oc adm must-gather ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ํฌ๊ด„์ ์ธ ๋กœ๊ทธ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 6.5. MCO ๋ฉ”ํŠธ๋ฆญ
์ด๋ฆ„ํ˜•์‹์„ค๋ช…์ฐธ๊ณ 

mcd_host_os_and_version

[]string{"os", "version"}

MCD๊ฐ€ ์‹คํ–‰ ์ค‘์ธ OS(์˜ˆ: RHCOS ๋˜๋Š” RHEL)๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. RHCOS์˜ ๊ฒฝ์šฐ ๋ฒ„์ „์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

ย 

mcd_drain_err*

{"drain_time", "err"}

๋“œ๋ ˆ์ด๋‹ ์‹คํŒจ ์ค‘ ์ˆ˜์‹ ํ•œ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. *

๋“œ๋ ˆ์ด๋‹์— ์„ฑ๊ณตํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹œ๋„ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ„ฐ๋ฏธ๋„์—์„œ ๋“œ๋ ˆ์ด๋‹์ด ์‹คํŒจํ•˜๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. drain_time ๋ฉ”ํŠธ๋ฆญ์€ ๋“œ๋ ˆ์ด๋‹์— ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๋ฉฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

$ oc logs -f -n openshift-machine-config-operator machine-config-daemon-<hash> -c machine-config-daemon

mcd_pivot_err*

[]string{"err", "node", "pivot_target"}

ํ”ผ๋ฒ— ์ค‘ ๋กœ๊ทธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. *

ํ”ผ๋ฒ— ์˜ค๋ฅ˜๋กœ ์ธํ•ด OS ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์กฐ์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋…ธ๋“œ์— ์•ก์„ธ์Šคํ•œ ํ›„ ํ•ด๋‹น ๋กœ๊ทธ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ oc debug node/<node>โ€‰โ€”โ€‰chroot /host journalctl -u pivot.service

๋˜๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ machine-config-daemon ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ๋งŒ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc logs -f -n openshift-machine-config-operator machine-config-daemon-<hash> -c machine-config-daemon

mcd_state

[]string{"state", "reason"}

ํ‘œ์‹œ๋œ ๋…ธ๋“œ์˜ ๋จธ์‹  ๊ตฌ์„ฑ ๋ฐ๋ชฌ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋Š” "์™„๋ฃŒ", "์ž‘์—… ์ค‘", "์ €ํ•˜๋จ"์ž…๋‹ˆ๋‹ค. "์ €ํ•˜๋จ"์˜ ๊ฒฝ์šฐ ์ด์œ ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

$ oc logs -f -n openshift-machine-config-operator machine-config-daemon-<hash> -c machine-config-daemon

mcd_kubelet_state*

[]string{"err"}

kubelet ์ƒํƒœ ์žฅ์• ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. *

์ด ๊ฐ’์€ ๋น„์–ด ์žˆ๊ณ  ์‹คํŒจ ํšŸ์ˆ˜๊ฐ€ 0์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจ ํšŸ์ˆ˜๊ฐ€ 2๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ž„๊ณ„๊ฐ’์ด ์ดˆ๊ณผ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” kubelet ์ƒํƒœ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์กฐ์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋…ธ๋“œ์— ์•ก์„ธ์Šคํ•œ ํ›„ ํ•ด๋‹น ๋กœ๊ทธ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ oc debug node/<node>โ€‰โ€”โ€‰chroot /host journalctl -u kubelet

mcd_reboot_err*

[]string{"message", "err", "node"}

์‹คํŒจํ•œ ์žฌ๋ถ€ํŒ… ๋ฐ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. *

์ด ๊ฐ’์€ ๋น„์–ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฉฐ, ์žฌ๋ถ€ํŒ…์— ์„ฑ๊ณตํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

$ oc logs -f -n openshift-machine-config-operator machine-config-daemon-<hash> -c machine-config-daemon

mcd_update_state

[]string{"config", "err"}

๊ตฌ์„ฑ ์—…๋ฐ์ดํŠธ์˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์™€ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ ๊ฐ’์€ rendered-master/rendered-worker-XXXX์ž…๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ์— ์‹คํŒจํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

$ oc logs -f -n openshift-machine-config-operator machine-config-daemon-<hash> -c machine-config-daemon

6.15. ์ธํ”„๋ผ ๋…ธ๋“œ ์ƒ์„ฑ

์ค‘์š”

๋จธ์‹  API๊ฐ€ ์ž‘๋™ํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋งŒ ๊ณ ๊ธ‰ ๋จธ์‹  ๊ด€๋ฆฌ ๋ฐ ์Šค์ผ€์ผ๋ง ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ํ”„๋กœ๋น„์ €๋‹ ์ธํ”„๋ผ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” Machine API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ๊ฒ€์ฆ ๋ฐ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ธํ”„๋ผ ํ”Œ๋žซํผ ์œ ํ˜•์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ Machine API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ œํ•œ์€ ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐ๋œ ์ปดํ“จํŒ… ์‹œ์Šคํ…œ์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ํ”Œ๋žซํผ์— ์„ค์น˜๋œ ๊ฒฝ์šฐ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์„ค์น˜ ํ›„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ”Œ๋žซํผ ์œ ํ˜•์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ oc get infrastructure cluster -o jsonpath='{.status.platform}'

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

ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ์—์„œ๋Š” ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ ๊ฐœ ์ด์ƒ์˜ ๋จธ์‹  ์„ธํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. OpenShift Logging ๋ฐ Red Hat OpenShift Service Mesh ๋‘˜ ๋‹ค ๋‹ค๋ฅธ ๋…ธ๋“œ์— 3๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” Elasticsearch๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ ๋…ธ๋“œ๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฐ€์šฉ์„ฑ ์˜์—ญ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์—๋Š” ๊ฐ€์šฉ์„ฑ ์˜์—ญ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ 3๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋จธ์‹  ์„ธํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์šฉ์„ฑ ์˜์—ญ์ด ์—†๋Š” ๊ธ€๋กœ๋ฒŒ Azure ๋ฆฌ์ „์—์„œ๋Š” ๊ฐ€์šฉ์„ฑ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ธํ”„๋ผ ๋…ธ๋“œ์— NoSchedule ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ธฐ์กด DNS Pod๊ฐ€ ์ž˜๋ชป ์˜ˆ์•ฝ ๋จ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป ์Šค์ผ€์ค„๋ง๋œ DNS Pod์—์„œ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

6.15.1. OpenShift Container Platform ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ

๋‹ค์Œ ์ธํ”„๋ผ ์›Œํฌ๋กœ๋“œ์—์„œ๋Š” OpenShift Container Platform ์ž‘์—…์ž ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋งˆ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” Kubernetes ๋ฐ OpenShift Container Platform ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์„œ๋น„์Šค
  • ๊ธฐ๋ณธ ๋ผ์šฐํ„ฐ
  • ํ†ตํ•ฉ๋œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ
  • HAProxy ๊ธฐ๋ฐ˜ Ingress ์ปจํŠธ๋กค๋Ÿฌ
  • ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ์œ„ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋น„์Šค
  • ํด๋Ÿฌ์Šคํ„ฐ ์ง‘๊ณ„ ๋กœ๊น…
  • ์„œ๋น„์Šค ๋ธŒ๋กœ์ปค
  • Red Hat Quay
  • Red Hat OpenShift Data Foundation
  • Red Hat Advanced Cluster Manager
  • Red Hat Advanced Cluster Security for Kubernetes
  • Red Hat OpenShift GitOps
  • Red Hat OpenShift Pipelines

๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ, Pod ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ž ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

์ธํ”„๋ผ ๋…ธ๋“œ ๋ฐ ์ธํ”„๋ผ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ Kubernetes์šฉ OpenShift ํฌ๊ธฐ ์กฐ์ • ๋ฐ ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜ ๊ฐ€์ด๋“œ์˜ "Red Hat OpenShift ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋ฐ ์ธํ”„๋ผ ๋…ธ๋“œ" ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ธํ”„๋ผ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จธ์‹  ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜๋…ธ๋“œ์— ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.15.1.1. ์ธํ”„๋ผ ๋…ธ๋“œ ์ƒ์„ฑ
์ค‘์š”

์„ค์น˜ ๊ด€๋ฆฌ์ž ํ”„๋กœ๋น„์ €๋‹ ์ธํ”„๋ผ ํ™˜๊ฒฝ ๋˜๋Š” ๋จธ์‹  API์—์„œ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ธํ”„๋ผ ๋จธ์‹  ์„ธํŠธ ์ƒ์„ฑ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

ํ”„๋กœ์„ธ์Šค

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋…ธ๋“œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž ๋…ธ๋“œ์— ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label node <node-name> node-role.kubernetes.io/app=""
  2. ์ธํ”„๋ผ ๋…ธ๋“œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž ๋…ธ๋“œ์— ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label node <node-name> node-role.kubernetes.io/infra=""
  3. ํ•ด๋‹น ๋…ธ๋“œ์— infra ์—ญํ•  ๋ฐ app ์—ญํ• ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get nodes
  4. ๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋Š” ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ƒ์„ฑ๋œ Pod์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Pod์˜ ๊ธฐ์กด ๋…ธ๋“œ ์„ ํƒ๊ธฐ์™€ ๊ต์ฐจ์ ์ด ์ƒ์„ฑ๋˜์–ด Pod์˜ ์„ ํƒ๊ธฐ๊ฐ€ ์ถ”๊ฐ€๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

    ์ค‘์š”

    ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ ํ‚ค๊ฐ€ Pod ๋ผ๋ฒจ ํ‚ค์™€ ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฌ๋‚˜ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์„ค์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด Pod์˜ ๋ผ๋ฒจ์ด node-role.kubernetes.io/master=""์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋…ธ๋“œ ์—ญํ• ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ node-role.kubernetes.io/infra=""์™€ ๊ฐ™์€ ํŠน์ • ๋…ธ๋“œ ์—ญํ• ๋กœ ์„ค์ •ํ•˜๋ฉด Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ํŠน์ • ๋…ธ๋“œ ์—ญํ• ๋กœ ์„ค์ •ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

    1. Scheduler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

      $ oc edit scheduler cluster
    2. ์ ์ ˆํ•œ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ defaultNodeSelector ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: config.openshift.io/v1
      kind: Scheduler
      metadata:
        name: cluster
      spec:
        defaultNodeSelector: topology.kubernetes.io/region=us-east-1 1
      # ...
      1
      ์ด ์˜ˆ์ œ ๋…ธ๋“œ ์„ ํƒ๊ธฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ us-east-1 ๋ฆฌ์ „์˜ ๋…ธ๋“œ์— Pod๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
    3. ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ธํ”„๋ผ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒˆ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ธํ”„๋ผ ๋…ธ๋“œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7์žฅ. ์ปจํ…Œ์ด๋„ˆ ์ž‘์—…

7.1. ์ปจํ…Œ์ด๋„ˆ ์ดํ•ด

OpenShift Container Platform ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๋Š” ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Linux ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์€ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฐ„๋‹จํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ์ด๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋Š” ์ง€์ •๋œ ๋ฆฌ์†Œ์Šคํ•˜๊ณ ๋งŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋„๋ก ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

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

Linux ์ปค๋„์€ ์ˆ˜๋…„๊ฐ„ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. OpenShift Container Platform ๋ฐ Kubernetes๋Š” ๋‹ค์ค‘ ํ˜ธ์ŠคํŠธ ์„ค์น˜์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๋ฐ RHEL ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด

RHEL(Red Hat Enterprise Linux) ๋™์ž‘์œผ๋กœ ์ธํ•ด CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์€ ๋…ธ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์˜ˆ์ƒ๋ณด๋‹ค ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€๋Š” RHEL ์ปค๋„์˜ kmem_cache๋กœ ์ธํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RHEL ์ปค๋„์€ ๊ฐ cgroup์— kmem_cache๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด kmem_cache์—๋Š” cpu_cache์™€ ๋ชจ๋“  NUMA ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋…ธ๋“œ ์บ์‹œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์บ์‹œ๋Š” ๋ชจ๋‘ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์บ์‹œ์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์–‘์€ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” CPU ์ˆ˜์— ๋น„๋ก€ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ CPU ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ด๋Ÿฌํ•œ ์บ์‹œ์— ๋” ๋งŽ์€ ์–‘์˜ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์บ์‹œ์˜ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ์–‘์ด ๋Š˜์–ด๋‚˜๋ฉด OpenShift Container Platform ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ตฌ์„ฑ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋กœ ์ธํ•œ ์ปจํ…Œ์ด๋„ˆ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถฉ๋ถ„ํžˆ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜์—ฌ kmem_cache ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ nproc ๋Š” nproc ๋ช…๋ น์—์„œ ๋ณด๊ณ ํ•˜๋Š” ์ฒ˜๋ฆฌ ๋‹จ์œ„์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์š”์ฒญ์˜ ํ•˜ํ•œ์€ ์ด ๊ฐ’์— ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋”ํ•œ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

$(nproc) X 1/2 MiB

7.2. Pod๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— Init Container๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ์ˆ˜ํ–‰

OpenShift Container Platform์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๊ณ  ์•ฑ ์ด๋ฏธ์ง€์— ์—†๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋˜๋Š” ์„ค์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ ์ปจํ…Œ์ด๋„ˆ์ธ Init Container๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

7.2.1. Init Container ์ดํ•ด

Init Container ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋จธ์ง€ Pod๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pod์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ์™ธ์—๋„ Init Container๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Init Container๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ค์ • ์Šคํฌ๋ฆฝํŠธ ๋ฐ ๋ฐ”์ธ๋”ฉ ์ฝ”๋“œ๋ฅผ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Init Container๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์•ฑ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํฌํ•จ ๋ฐ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ ์ด๋ฏธ์ง€์— ์—†๋Š” ์„ค์ •์— ๋Œ€ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ค์น˜ ์ค‘์— sed, awk, python ๋˜๋Š” dig์™€ ๊ฐ™์€ ํˆด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ด๋ฏธ์ง€์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๋ณด์•ˆ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ๊ณผ ๊ฐ™์ด ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณด๊ธฐ๊ฐ€ ์•ฑ ์ปจํ…Œ์ด๋„ˆ์™€ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜๋„๋ก Linux ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ Init Container๋Š” ๋‹ค์Œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Init Container์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์ „ ์กฐ๊ฑด ์ง‘ํ•ฉ์ด ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ์•ฑ ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘์„ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ Init Container๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‰˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

    for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ํ•˜์œ„ API์˜ ์›๊ฒฉ ์„œ๋ฒ„์— ์ด Pod๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

    $ curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d โ€˜instance=$()&ip=$()โ€™
  • sleep 60๊ณผ ๊ฐ™์€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณผ๋ฅจ์— ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ํŒŒ์ผ์— ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ํ…œํ”Œ๋ฆฟ ํˆด์„ ์‹คํ–‰ํ•˜์—ฌ ๊ธฐ๋ณธ ์•ฑ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด POD_IP ๊ฐ’์„ ๊ตฌ์„ฑ์— ์ €์žฅํ•˜๊ณ  Jinja๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ์•ฑ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubernetes ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

7.2.2. Init Container ์ƒ์„ฑ

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” Init Container ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ Pod๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ๋Š” myservice๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ๋Š” mydb๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋‘ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋ฉด Pod๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. Init Container์˜ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: myapp-pod
        labels:
          app: myapp
      spec:
        containers:
        - name: myapp-container
          image: registry.access.redhat.com/ubi8/ubi:latest
          command: ['sh', '-c', 'echo The app is running! && sleep 3600']
        initContainers:
        - name: init-myservice
          image: registry.access.redhat.com/ubi8/ubi:latest
          command: ['sh', '-c', 'until getent hosts myservice; do echo waiting for myservice; sleep 2; done;']
        - name: init-mydb
          image: registry.access.redhat.com/ubi8/ubi:latest
          command: ['sh', '-c', 'until getent hosts mydb; do echo waiting for mydb; sleep 2; done;']
      # ...
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f myapp.yaml
    3. Pod ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc get pods

      ์ถœ๋ ฅ ์˜ˆ

      NAME                          READY     STATUS              RESTARTS   AGE
      myapp-pod                     0/1       Init:0/2            0          5s

      ํฌ๋“œ ์ƒํƒœ Init:0/2 ๋Š” ๋‘ ์„œ๋น„์Šค๋ฅผ ๋Œ€๊ธฐ ์ค‘์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  2. myservice ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      kind: Service
      apiVersion: v1
      metadata:
        name: myservice
      spec:
        ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f myservice.yaml
    3. Pod ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc get pods

      ์ถœ๋ ฅ ์˜ˆ

      NAME                          READY     STATUS              RESTARTS   AGE
      myapp-pod                     0/1       Init:1/2            0          5s

      Pod ์ƒํƒœ Init:1/2 ๋Š” ํ•˜๋‚˜์˜ ์„œ๋น„์Šค(์ด ๊ฒฝ์šฐ mydb ์„œ๋น„์Šค)๋ฅผ ๋Œ€๊ธฐ ์ค‘์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  3. mydb ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      kind: Service
      apiVersion: v1
      metadata:
        name: mydb
      spec:
        ports:
        - protocol: TCP
          port: 80
          targetPort: 9377
    2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f mydb.yaml
    3. Pod ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc get pods

      ์ถœ๋ ฅ ์˜ˆ

      NAME                          READY     STATUS              RESTARTS   AGE
      myapp-pod                     1/1       Running             0          2m

      Pod ์ƒํƒœ๋Š” ๋” ์ด์ƒ ์„œ๋น„์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์‹คํ–‰ ์ค‘์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

7.3. ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ฐ์ดํ„ฐ ์œ ์ง€

์ปจํ…Œ์ด๋„ˆ์˜ ํŒŒ์ผ์€ ์ž„์‹œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถฉ๋Œํ•˜๊ฑฐ๋‚˜ ์ค‘์ง€๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณผ๋ฅจ์€ Pod ์ˆ˜๋ช… ๋™์•ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” Pod์˜ ์ปจํ…Œ์ด๋„ˆ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

7.3.1. ๋ณผ๋ฅจ ์ดํ•ด

๋ณผ๋ฅจ์€ Pod ๋ฐ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์šดํŠธ๋œ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ, ๋‹ค์ˆ˜์˜ ํ˜ธ์ŠคํŠธ-๋กœ์ปฌ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์Šคํ† ๋ฆฌ์ง€ ๋์ ์—์„œ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜๊ตฌ์ ์ด ์•„๋‹ˆ๋ฉฐ ์žฌ์‹œ์ž‘ ์‹œ ์ €์žฅ๋œ ์ฝ˜ํ…์ธ ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

๋ณผ๋ฅจ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•œ ํ›„ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๊ณ  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ณต๊ตฌํ•˜๊ธฐ ์œ„ํ•ด OpenShift Container Platform์—์„œ๋Š” mount ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ด์ „์— fsck ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๋ณผ๋ฅจ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ณผ๋ฅจ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ณผ๋ฅจ ์œ ํ˜•์€ ๋‹จ์ผ ๋จธ์‹ ์˜ ์ž„์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ์ธ emptyDir์ž…๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋Š” Pod์— ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์˜๊ตฌ ๋ณผ๋ฅจ์„ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ FSGroup ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด Pod์˜ FSGroup์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ• ๋‹น๋Ÿ‰์— ๋”ฐ๋ผ emptyDir ๋ณผ๋ฅจ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.3.2. OpenShift Container Platform CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ ์ž‘์—…

CLI ๋ช…๋ น oc set volume์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ ๋˜๋Š” ๋ฐฐํฌ ๊ตฌ์„ฑ๊ณผ ๊ฐ™์€ Pod ํ…œํ”Œ๋ฆฟ์ด ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ๋ณผ๋ฅจ ๋ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod์˜ ๋ณผ๋ฅจ ๋˜๋Š” Pod ํ…œํ”Œ๋ฆฟ์ด ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋„ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

oc set volume ๋ช…๋ น์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ oc set volume <object_selection> <operation> <mandatory_parameters> <options>
์˜ค๋ธŒ์ ํŠธ ์„ ํƒ
oc set volume ๋ช…๋ น์—์„œ object_selection ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
ํ‘œ 7.1. ์˜ค๋ธŒ์ ํŠธ ์„ ํƒ
๊ตฌ๋ฌธ์„ค๋ช…์˜ˆ

<object_type> <name>

์œ ํ˜• <object_type>์˜ <name>์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

deploymentConfig registry

<object_type>/<name>

์œ ํ˜• <object_type>์˜ <name>์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

deploymentConfig/registry

<object_type>--selector=<object_label_selector>

์ง€์ •๋œ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ์™€ ์ผ์น˜ํ•˜๋Š” ์œ ํ˜• <object_type>์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

deploymentConfig--selector="name=registry"

<object_type> --all

์œ ํ˜• <object_type>์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

deploymentConfig --all

-f ๋˜๋Š” --filename=<file_name>

๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ํŒŒ์ผ ์ด๋ฆ„, ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” URL์ž…๋‹ˆ๋‹ค.

-f registry-deployment-config.json

์ž‘์—…
oc set volume ๋ช…๋ น์˜ operation ๋งค๊ฐœ๋ณ€์ˆ˜์— --add ๋˜๋Š” --remove๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜
๋ชจ๋“  ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์„ ํƒํ•œ ์ž‘์—…์— ํ•œ์ •๋˜๋ฉฐ ๋’ค์— ๋‚˜์˜ค๋Š” ์„น์…˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
์˜ต์…˜
๋ชจ๋“  ์˜ต์…˜์€ ์„ ํƒํ•œ ์ž‘์—…์— ํ•œ์ •๋˜๋ฉฐ ๋’ค์— ๋‚˜์˜ค๋Š” ์„น์…˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

7.3.3. Pod์˜ ๋ณผ๋ฅจ ๋ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ๋‚˜์—ด

Pod ๋˜๋Š” Pod ํ…œํ”Œ๋ฆฟ์˜ ๋ณผ๋ฅจ ๋ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

๋ณผ๋ฅจ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ oc set volume <object_type>/<name> [options]

๋ณผ๋ฅจ์—์„œ ์ง€์›ํ•˜๋Š” ์˜ต์…˜์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜์„ค๋ช…๊ธฐ๋ณธ

--name

๋ณผ๋ฅจ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

ย 

-c, --containers

์ด๋ฆ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์™€ ์ผ์น˜ํ•˜๋Š” ์™€์ผ๋“œ์นด๋“œ '*'๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

'*'

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Pod p1์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ณผ๋ฅจ์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume pod/p1
  • ๋ชจ๋“  ๋ฐฐํฌ ๊ตฌ์„ฑ์— ์ •์˜๋œ ๋ณผ๋ฅจ v1์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume dc --all --name=v1

7.3.4. Pod์— ๋ณผ๋ฅจ ์ถ”๊ฐ€

Pod์— ๋ณผ๋ฅจ ๋ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

๋ณผ๋ฅจ, ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ Pod ํ…œํ”Œ๋ฆฟ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ oc set volume <object_type>/<name> --add [options]
ํ‘œ 7.2. ๋ณผ๋ฅจ ์ถ”๊ฐ€์— ์ง€์›๋˜๋Š” ์˜ต์…˜
์˜ต์…˜์„ค๋ช…๊ธฐ๋ณธ

--name

๋ณผ๋ฅจ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

-t, --type

๋ณผ๋ฅจ ์†Œ์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ฐ’์€ emptyDir, hostPath, secret, configmap, persistentVolumeClaim ๋˜๋Š” projected์ž…๋‹ˆ๋‹ค.

emptyDir

-c, --containers

์ด๋ฆ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์™€ ์ผ์น˜ํ•˜๋Š” ์™€์ผ๋“œ์นด๋“œ '*'๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

'*'

-m, --mount-path

์„ ํƒํ•œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฃจํŠธ, / ๋˜๋Š” ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋™์ผํ•œ ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜ธ์ŠคํŠธ /dev/pts ํŒŒ์ผ๊ณผ ๊ฐ™์ด ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /host๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ๋ฅผ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

ย 

--path

ํ˜ธ์ŠคํŠธ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. --type=hostPath์— ๋Œ€ํ•œ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฃจํŠธ, / ๋˜๋Š” ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋™์ผํ•œ ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜ธ์ŠคํŠธ /dev/pts ํŒŒ์ผ๊ณผ ๊ฐ™์ด ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /host๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ๋ฅผ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

ย 

--secret-name

๋ณด์•ˆ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. --type=secret์— ๋Œ€ํ•œ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

ย 

--configmap-name

๊ตฌ์„ฑ ๋งต์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. --type=configmap์— ๋Œ€ํ•œ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

ย 

--claim-name

์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. --type=persistentVolumeClaim์— ๋Œ€ํ•œ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

ย 

--source

JSON ๋ฌธ์ž์—ด๋กœ ๋œ ๋ณผ๋ฅจ ์†Œ์Šค ์„ธ๋ถ€ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ณผ๋ฅจ ์†Œ์Šค๋ฅผ --type์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ย 

-o, --output

์ˆ˜์ •๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„œ๋ฒ„์—์„œ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋Œ€์‹  ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ฐ’์€ json, yaml์ž…๋‹ˆ๋‹ค.

ย 

--output-version

์ง€์ •๋œ ๋ฒ„์ „์œผ๋กœ ์ˆ˜์ •๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

api-version

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ DeploymentConfig ์˜ค๋ธŒ์ ํŠธ์— ์ƒˆ ๋ณผ๋ฅจ ์†Œ์Šค emptyDir์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume dc/registry --add
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ 7.1. ์ถ”๊ฐ€๋œ ๋ณผ๋ฅจ์ด ์žˆ๋Š” ๋ฐฐํฌ ๊ตฌ์„ฑ ์ƒ˜ํ”Œ

    kind: DeploymentConfig
    apiVersion: apps.openshift.io/v1
    metadata:
      name: registry
      namespace: registry
    spec:
      replicas: 3
      selector:
        app: httpd
      template:
        metadata:
          labels:
            app: httpd
        spec:
          volumes: 1
            - name: volume-pppsw
              emptyDir: {}
          containers:
            - name: httpd
              image: >-
                image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest
              ports:
                - containerPort: 8080
                  protocol: TCP
    1
    ๋ณผ๋ฅจ ์†Œ์Šค emptyDir ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ r1์— ๋Œ€ํ•ด ๋ณด์•ˆ secret1์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ v1์„ ์ถ”๊ฐ€ํ•˜๊ณ  /data:์˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ๋งˆ์šดํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume rc/r1 --add --name=v1 --type=secret --secret-name='secret1' --mount-path=/data
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ 7.2. ๋ณผ๋ฅจ ๋ฐ ์‹œํฌ๋ฆฟ์ด ์ถ”๊ฐ€๋œ ์ƒ˜ํ”Œ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ

    kind: ReplicationController
    apiVersion: v1
    metadata:
      name: example-1
      namespace: example
    spec:
      replicas: 0
      selector:
        app: httpd
        deployment: example-1
        deploymentconfig: example
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: httpd
            deployment: example-1
            deploymentconfig: example
        spec:
          volumes: 1
            - name: v1
              secret:
                secretName: secret1
                defaultMode: 420
          containers:
            - name: httpd
              image: >-
                image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest
              volumeMounts: 2
                - name: v1
                  mountPath: /data
    1
    ๋ณผ๋ฅจ ๋ฐ ๋ณด์•ˆ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์ปจํ…Œ์ด๋„ˆ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ ˆ์ž„ ์ด๋ฆ„์ด pvc1์ธ ๊ธฐ์กด ์˜๊ตฌ ๋ณผ๋ฅจ v1์„ ๋””์Šคํฌ์˜ ๋ฐฐํฌ ๊ตฌ์„ฑ dc.json์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด /data์˜ ์ปจํ…Œ์ด๋„ˆ c1์— ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜๊ณ  ์„œ๋ฒ„์—์„œ DeploymentConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume -f dc.json --add --name=v1 --type=persistentVolumeClaim \
      --claim-name=pvc1 --mount-path=/data --containers=c1
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ 7.3. ์˜๊ตฌ ๋ณผ๋ฅจ์ด ์ถ”๊ฐ€๋œ ๋ฐฐํฌ ๊ตฌ์„ฑ์˜ ์˜ˆ

    kind: DeploymentConfig
    apiVersion: apps.openshift.io/v1
    metadata:
      name: example
      namespace: example
    spec:
      replicas: 3
      selector:
        app: httpd
      template:
        metadata:
          labels:
            app: httpd
        spec:
          volumes:
            - name: volume-pppsw
              emptyDir: {}
            - name: v1 1
              persistentVolumeClaim:
                claimName: pvc1
          containers:
            - name: httpd
              image: >-
                image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest
              ports:
                - containerPort: 8080
                  protocol: TCP
              volumeMounts: 2
                - name: v1
                  mountPath: /data
    1
    'pvc1์ด๋ผ๋Š” ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    2
    ์ปจํ…Œ์ด๋„ˆ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ˆ˜์ • ๋ฒ„์ „์ด 5125c45f9f563์ธ Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ https://github.com/namespace1/project1์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณผ๋ฅจ v1์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume rc --all --add --name=v1 \
      --source='{"gitRepo": {
                    "repository": "https://github.com/namespace1/project1",
                    "revision": "5125c45f9f563"
                }}'

7.3.5. Pod์˜ ๋ณผ๋ฅจ ๋ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ์—…๋ฐ์ดํŠธ

Pod์—์„œ ๋ณผ๋ฅจ ๋ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

--overwrite ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ๋ณผ๋ฅจ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

$ oc set volume <object_type>/<name> --add --overwrite [options]

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ r1์˜ ๊ธฐ์กด ๋ณผ๋ฅจ v1์„ ๊ธฐ์กด ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„ pvc1๋กœ ๊ต์ฒดํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume rc/r1 --add --overwrite --name=v1 --type=persistentVolumeClaim --claim-name=pvc1
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ๊ต์ฒดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ 7.4. pvc1์ด๋ผ๋Š” ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์ด ์žˆ๋Š” ์ƒ˜ํ”Œ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ

    kind: ReplicationController
    apiVersion: v1
    metadata:
      name: example-1
      namespace: example
    spec:
      replicas: 0
      selector:
        app: httpd
        deployment: example-1
        deploymentconfig: example
      template:
        metadata:
          labels:
            app: httpd
            deployment: example-1
            deploymentconfig: example
        spec:
          volumes:
            - name: v1 1
              persistentVolumeClaim:
                claimName: pvc1
          containers:
            - name: httpd
              image: >-
                image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest
              ports:
                - containerPort: 8080
                  protocol: TCP
              volumeMounts:
                - name: v1
                  mountPath: /data
    1
    ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์„ pvc1 ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • DeploymentConfig ์˜ค๋ธŒ์ ํŠธ d1 ๋งˆ์šดํŠธ ์˜ต์…˜์„ ๋ณผ๋ฅจ v1์˜ /opt๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume dc/d1 --add --overwrite --name=v1 --mount-path=/opt
    ์ž‘์€ ์ •๋ณด

    ๋‹ค์Œ YAML์„ ์ ์šฉํ•˜์—ฌ ๋งˆ์šดํŠธ ์ง€์ ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ 7.5. ๋งˆ์šดํŠธ ์ง€์ ์ด ์˜ตํŠธ์ธ ์œผ๋กœ ์„ค์ •๋œ ์ƒ˜ํ”Œ ๋ฐฐํฌ ๊ตฌ์„ฑ.

    kind: DeploymentConfig
    apiVersion: apps.openshift.io/v1
    metadata:
      name: example
      namespace: example
    spec:
      replicas: 3
      selector:
        app: httpd
      template:
        metadata:
          labels:
            app: httpd
        spec:
          volumes:
            - name: volume-pppsw
              emptyDir: {}
            - name: v2
              persistentVolumeClaim:
                claimName: pvc1
            - name: v1
              persistentVolumeClaim:
                claimName: pvc1
          containers:
            - name: httpd
              image: >-
                image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest
              ports:
                - containerPort: 8080
                  protocol: TCP
              volumeMounts: 1
                - name: v1
                  mountPath: /opt
    1
    ๋งˆ์šดํŠธ ์ง€์ ์„ /opt ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

7.3.6. Pod์—์„œ ๋ณผ๋ฅจ ๋ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ์ œ๊ฑฐ

Pod์—์„œ ๋ณผ๋ฅจ ๋˜๋Š” ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

Pod ํ…œํ”Œ๋ฆฟ์—์„œ ๋ณผ๋ฅจ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ oc set volume <object_type>/<name> --remove [options]
ํ‘œ 7.3. ๋ณผ๋ฅจ ์ œ๊ฑฐ์— ์ง€์›๋˜๋Š” ์˜ต์…˜
์˜ต์…˜์„ค๋ช…๊ธฐ๋ณธ

--name

๋ณผ๋ฅจ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

ย 

-c, --containers

์ด๋ฆ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์™€ ์ผ์น˜ํ•˜๋Š” ์™€์ผ๋“œ์นด๋“œ '*'๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

'*'

--confirm

ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณผ๋ฅจ์„ ์ œ๊ฑฐํ•  ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ย 

-o, --output

์ˆ˜์ •๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„œ๋ฒ„์—์„œ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋Œ€์‹  ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ฐ’์€ json, yaml์ž…๋‹ˆ๋‹ค.

ย 

--output-version

์ง€์ •๋œ ๋ฒ„์ „์œผ๋กœ ์ˆ˜์ •๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

api-version

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • DeploymentConfig ์˜ค๋ธŒ์ ํŠธ d1์—์„œ ๋ณผ๋ฅจ v1์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume dc/d1 --remove --name=v1
  • DeploymentConfig ์˜ค๋ธŒ์ ํŠธ d1์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ d1์˜ ์ปจํ…Œ์ด๋„ˆ c1์—์„œ ๋ณผ๋ฅจ v1์„ ๋งˆ์šดํŠธ ํ•ด์ œํ•˜๊ณ  ๋ณผ๋ฅจ v1์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume dc/d1 --remove --name=v1 --containers=c1
  • ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ r1์˜ ๋ชจ๋“  ๋ณผ๋ฅจ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc set volume rc/r1 --remove --confirm

7.3.7. Pod์—์„œ ๋‹ค์–‘ํ•œ ์šฉ๋„์˜ ๋ณผ๋ฅจ ๊ตฌ์„ฑ

๋ณผ๋ฅจ์˜ ๋ฃจํŠธ ๋Œ€์‹  ๋ณผ๋ฅจ ๋‚ด๋ถ€์— subPath ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” volumeMounts.subPath ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ Pod์—์„œ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ํ•˜๋‚˜์˜ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•˜๋„๋ก ๋ณผ๋ฅจ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ์•ฝ๋œ ๊ธฐ์กด Pod์— subPath ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  1. ๋ณผ๋ฅจ์˜ ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด oc rsh ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc rsh <pod>

    ์ถœ๋ ฅ ์˜ˆ

    sh-4.2$ ls /path/to/volume/subpath/mount
    example_file1 example_file2 example_file3

  2. subPath๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    subPath ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ Pod ์‚ฌ์–‘์˜ ์˜ˆ

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-site
    spec:
        containers:
        - name: mysql
          image: mysql
          volumeMounts:
          - mountPath: /var/lib/mysql
            name: site-data
            subPath: mysql 1
        - name: php
          image: php
          volumeMounts:
          - mountPath: /var/www/html
            name: site-data
            subPath: html 2
        volumes:
        - name: site-data
          persistentVolumeClaim:
            claimName: my-site-data

    1
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” mysql ํด๋”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    2
    HTML ์ฝ˜ํ…์ธ ๋Š” html ํด๋”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

7.4. ์˜ˆ์ƒ๋œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ ๋งคํ•‘

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

๋‹ค์Œ ์œ ํ˜•์˜ ๋ณผ๋ฅจ ์†Œ์Šค๋ฅผ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ
  • Config Map
  • Downward API
์ฐธ๊ณ 

๋ชจ๋“  ์†Œ์Šค๋Š” Pod์™€ ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

7.4.1. ์˜ˆ์ƒ ๋ณผ๋ฅจ ์ดํ•ด

์˜ˆ์ƒ ๋ณผ๋ฅจ์€ ํ•ด๋‹น ๋ณผ๋ฅจ ์†Œ์Šค์˜ ์กฐํ•ฉ์„ ๋‹จ์ผ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Linux ๊ธฐ๋ฐ˜ Pod์˜ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์—์„œ RunAsUser ๊ถŒํ•œ์ด ์„ค์ •๋œ ๊ฒฝ์šฐ ์˜ˆ์ƒ ํŒŒ์ผ์—๋Š” ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์ž ์†Œ์œ ๊ถŒ์„ ํฌํ•จํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๊ถŒํ•œ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Windows ๋™๋“ฑํ•œ RunAsUsername ๊ถŒํ•œ์ด Windows Pod์— ์„ค์ •๋œ ๊ฒฝ์šฐ kubelet์€ ์˜ˆ์ƒ ๋ณผ๋ฅจ์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ์†Œ์œ ๊ถŒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Windows Pod์˜ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์—์„œ ์„ค์ •๋œ RunAsUsername ๊ถŒํ•œ์€ OpenShift Container Platform์—์„œ ์‹คํ–‰๋˜๋Š” Windows ์˜ˆ์ƒ ๋ณผ๋ฅจ์— ๋Œ€ํ•ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ผ๋ฐ˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์˜ˆ์ƒ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๋งต, ๋ณด์•ˆ, Downward API
์˜ˆ์ƒ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธ๊ฐ€ ํฌํ•จ๋œ ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Kubernetes์— RHOSP(Red Hat OpenStack Platform)๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋ฅผ ํ”„๋กœ๋•์…˜ ๋˜๋Š” ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์–ด์…ˆ๋ธ”ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod์— ํ”„๋กœ๋•์…˜ ๋˜๋Š” ํ…Œ์ŠคํŠธ๋กœ ๋ผ๋ฒจ์ด ์ง€์ •๋˜๋ฉด Downward API ์„ ํƒ๊ธฐ metadata.labels๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ RHOSP ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ์„ฑ ๋งต + ๋ณด์•ˆ
์˜ˆ์ƒ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ ๋ฐ ์•”ํ˜ธ์™€ ๊ด€๋ จ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด Vault ์•”ํ˜ธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธ๋ฅผ ํ•ด๋…ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฏผ๊ฐํ•œ ์•”ํ˜ธํ™”๋œ ์ž‘์—…์—์„œ ๊ตฌ์„ฑ ๋งต์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ์„ฑ ๋งต + Downward API
์˜ˆ์ƒ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋ฉด Pod ์ด๋ฆ„(metadata.name ์„ ํƒ๊ธฐ๋ฅผ ํ†ตํ•ด ์ œ๊ณต)์„ ํฌํ•จํ•˜์—ฌ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ IP ์ถ”์ ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์†Œ์Šค๋ฅผ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์š”์ฒญ๊ณผ ํ•จ๊ป˜ Pod ์ด๋ฆ„์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณด์•ˆ + Downward API
์˜ˆ์ƒ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด์•ˆ์„ ๊ณต๊ฐœํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ Pod์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(metadata.namespace ์„ ํƒ๊ธฐ๋ฅผ ํ†ตํ•ด ์ œ๊ณต)๋ฅผ ์•”ํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Operator์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ ์ „์†ก์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
7.4.1.1. Pod ์‚ฌ์–‘์˜ ์˜ˆ

๋‹ค์Œ์€ ์˜ˆ์ƒ๋˜๋Š” ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•˜๋Š” Pod ์‚ฌ์–‘์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

๋ณด์•ˆ, Downward API, ๊ตฌ์„ฑ ๋งต์ด ์žˆ๋Š” Pod

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts: 1
    - name: all-in-one
      mountPath: "/projected-volume"2
      readOnly: true 3
  volumes: 4
  - name: all-in-one 5
    projected:
      defaultMode: 0400 6
      sources:
      - secret:
          name: mysecret 7
          items:
            - key: username
              path: my-group/my-username 8
      - downwardAPI: 9
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap: 10
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config
              mode: 0777 11

1
๋ณด์•ˆ์ด ํ•„์š”ํ•œ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— volumeMounts ์„น์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
2
๋ณด์•ˆ์ด ํ‘œ์‹œ๋  ๋ฏธ์‚ฌ์šฉ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3
readOnly๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
4
volumes ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ ์˜ˆ์ƒ ๋ณผ๋ฅจ ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
5
๋ณผ๋ฅจ์— ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
6
ํŒŒ์ผ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ถŒํ•œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
7
๋ณด์•ˆ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ์‹œํฌ๋ฆฟ์„ ๋‚˜์—ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
8
mountPath ์•„๋ž˜์— ๋ณด์•ˆ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ณด์•ˆ ํŒŒ์ผ์€ /projected-volume/my-group/my-username์— ์žˆ์Šต๋‹ˆ๋‹ค.
9
Downward API ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
10
๊ตฌ์„ฑ ๋งต ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
11
ํŠน์ • ์˜ˆ์ƒ์— ๋Œ€ํ•œ ๋ชจ๋“œ ์„ค์ •
์ฐธ๊ณ 

Pod์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— volumeMounts ์„น์…˜์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ volumes ์„น์…˜์€ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ด ์•„๋‹Œ ๊ถŒํ•œ ๋ชจ๋“œ๊ฐ€ ์„ค์ •๋œ ๋ณด์•ˆ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ Pod

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      defaultMode: 0755
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - secret:
          name: mysecret2
          items:
            - key: password
              path: my-group/my-password
              mode: 511

์ฐธ๊ณ 

defaultMode๋Š” ๊ฐ ๋ณผ๋ฅจ ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์˜ˆ์ƒ ์ˆ˜์ค€์—์„œ๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๊ฐœ๋ณ„ ์˜ˆ์ƒ๋งˆ๋‹ค mode๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.4.1.2. ๊ฒฝ๋กœ ์ง€์ • ๊ณ ๋ ค ์‚ฌํ•ญ
๊ตฌ์„ฑ๋œ ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•  ๋•Œ ํ‚ค ๊ฐ„ ์ถฉ๋Œ

๋™์ผํ•œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด Pod ์‚ฌ์–‘์ด ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ์Šน์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ์—์„œ mysecret ๋ฐ myconfigmap์— ์ง€์ •๋œ ๊ฒฝ๋กœ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/data
      - configMap:
          name: myconfigmap
          items:
            - key: config
              path: my-group/data

๋ณผ๋ฅจ ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ๊ด€๋ จ๋œ ๋‹ค์Œ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

7.4.2. Pod์˜ ์˜ˆ์ƒ ๋ณผ๋ฅจ ๊ตฌ์„ฑ

์˜ˆ์ƒ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์˜ˆ์ƒ ๋ณผ๋ฅจ ์ดํ•ด์— ์„ค๋ช…๋œ ๋ณผ๋ฅจ ํŒŒ์ผ ๊ฒฝ๋กœ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ ์•”ํ˜ธ ๊ฐ’์€ base64 ๋กœ ์ธ์ฝ”๋”ฉ๋œ ์œ ํšจํ•œ ๋ฌธ์ž์—ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” admin์„ base64 ํ˜•์‹์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

$ echo -n "admin" | base64

์ถœ๋ ฅ ์˜ˆ

YWRtaW4=

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ์•”ํ˜ธ 1f2d1e2e67df ๋ฅผ base64๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

$ echo -n "1f2d1e2e67df" | base64

์ถœ๋ ฅ ์˜ˆ

MWYyZDFlMmU2N2Rm

ํ”„๋กœ์„ธ์Šค

์˜ˆ์ƒ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ๋ณด์•ˆ ๋ณผ๋ฅจ ์†Œ์Šค๋ฅผ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.

  1. ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์•”ํ˜ธ ๋ฐ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Secret
      metadata:
        name: mysecret
      type: Opaque
      data:
        pass: MWYyZDFlMmU2N2Rm
        user: YWRtaW4=
    2. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <secrets-filename>

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create -f secret.yaml

      ์ถœ๋ ฅ ์˜ˆ

      secret "mysecret" created

    3. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      $ oc get secret <secret-name>

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc get secret mysecret

      ์ถœ๋ ฅ ์˜ˆ

      NAME       TYPE      DATA      AGE
      mysecret   Opaque    2         17h

      $ oc get secret <secret-name> -o yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc get secret mysecret -o yaml
      apiVersion: v1
      data:
        pass: MWYyZDFlMmU2N2Rm
        user: YWRtaW4=
      kind: Secret
      metadata:
        creationTimestamp: 2017-05-30T20:21:38Z
        name: mysecret
        namespace: default
        resourceVersion: "2107"
        selfLink: /api/v1/namespaces/default/secrets/mysecret
        uid: 959e0424-4575-11e7-9f97-fa163e4bd54c
      type: Opaque
  2. ์˜ˆ์ƒ ๋ณผ๋ฅจ์ด ํฌํ•จ๋œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. volumes ์„น์…˜์„ ํฌํ•จํ•˜์—ฌ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      kind: Pod
      metadata:
        name: test-projected-volume
      spec:
        containers:
        - name: test-projected-volume
          image: busybox
          args:
          - sleep
          - "86400"
          volumeMounts:
          - name: all-in-one
            mountPath: "/projected-volume"
            readOnly: true
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop:
                  - ALL
        volumes:
        - name: all-in-one
          projected:
            sources:
            - secret:
                name: mysecret 1
      1
      ์ƒ์„ฑํ•œ ๋ณด์•ˆ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    2. ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <your_yaml_file>.yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create -f secret-pod.yaml

      ์ถœ๋ ฅ ์˜ˆ

      pod "test-projected-volume" created

  3. Pod ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•œ ํ›„ Pod ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get pod <name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc get pod test-projected-volume

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    NAME                    READY     STATUS    RESTARTS   AGE
    test-projected-volume   1/1       Running   0          14s

  4. ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ oc exec ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ์‰˜์„ ์—ฝ๋‹ˆ๋‹ค.

    $ oc exec -it <pod> <command>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc exec -it test-projected-volume -- /bin/sh
  5. ์‰˜์—์„œ projected-volumes ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์˜ˆ์ƒ ์†Œ์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    / # ls

    ์ถœ๋ ฅ ์˜ˆ

    bin               home              root              tmp
    dev               proc              run               usr
    etc               projected-volume  sys               var

7.5. ์ปจํ…Œ์ด๋„ˆ์—์„œ API ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉ

Downward API๋Š” OpenShift Container Platform์— ๊ฒฐํ•ฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ปจํ…Œ์ด๋„ˆ์—์„œ API ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •๋ณด์—๋Š” Pod ์ด๋ฆ„, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋ฆฌ์†Œ์Šค ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ Downward API์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.5.1. Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— Pod ์ •๋ณด ๋…ธ์ถœ

Downward API์—๋Š” Pod ์ด๋ฆ„, ํ”„๋กœ์ ํŠธ, ๋ฆฌ์†Œ์Šค ๊ฐ’๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ Downward API์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pod ๋‚ด ํ•„๋“œ๋Š” FieldRef API ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. FieldRef์—๋Š” ๋‘ ๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„๋“œ์„ค๋ช…

fieldPath

Pod์™€ ๊ด€๋ จํ•˜์—ฌ ์„ ํƒํ•  ํ•„๋“œ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

apiVersion

fieldPath ์„ ํƒ๊ธฐ๋ฅผ ํ•ด์„ํ•  API ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ v1 API์—์„œ ์œ ํšจํ•œ ์„ ํƒ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ ํƒ๊ธฐ์„ค๋ช…

metadata.name

Pod์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ๋ณผ๋ฅจ ๋ชจ๋‘์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

metadata.namespace

Pod์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ๋ณผ๋ฅจ ๋ชจ๋‘์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

metadata.labels

Pod์˜ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค. ๋ณผ๋ฅจ์—์„œ๋งŒ ์ง€์›๋˜๋ฉฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

metadata.annotations

Pod์˜ ์ฃผ์„์ž…๋‹ˆ๋‹ค. ๋ณผ๋ฅจ์—์„œ๋งŒ ์ง€์›๋˜๋ฉฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

status.podIP

Pod์˜ IP์ž…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ๋งŒ ์ง€์›๋˜๋ฉฐ ๋ณผ๋ฅจ์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

apiVersion ํ•„๋“œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ ํฌํ•จ๋œ Pod ํ…œํ”Œ๋ฆฟ์˜ API ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

7.5.2. Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

์ปจํ…Œ์ด๋„ˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ API ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Pod ์ด๋ฆ„
  • Pod ํ”„๋กœ์ ํŠธ/๋„ค์ž„์ŠคํŽ˜์ด์Šค
  • Pod ์ฃผ์„
  • Pod ๋ผ๋ฒจ

๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์„ ๋ฐ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.5.2.1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐ’ ์‚ฌ์šฉ

์ปจํ…Œ์ด๋„ˆ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ณ€์ˆ˜ ๊ฐ’์„ value ํ•„๋“œ์—์„œ ์ง€์ •ํ•˜๋Š” ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’ ๋Œ€์‹  FieldRef ์†Œ์Šค์—์„œ ์ œ๊ณตํ•˜๋„๋ก EnvVar ์œ ํ˜•์˜ valueFrom ํ•„๋“œ(EnvVarSource ์œ ํ˜•)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

  • Pod ์ด๋ฆ„
  • Pod ํ”„๋กœ์ ํŠธ/๋„ค์ž„์ŠคํŽ˜์ด์Šค

์ ˆ์ฐจ

  1. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์ƒˆ Pod ์‚ฌ์–‘์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ pod.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_POD_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: MY_POD_NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
        restartPolicy: Never
      # ...
    2. pod.yaml ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f pod.yaml

๊ฒ€์ฆ

  • ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ์— MY_POD_NAME ๋ฐ MY_POD_NAMESPACE ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc logs -p dapi-env-test-pod
7.5.2.2. ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐ’ ์‚ฌ์šฉ

์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ API ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Pod ์ด๋ฆ„
  • Pod ํ”„๋กœ์ ํŠธ/๋„ค์ž„์ŠคํŽ˜์ด์Šค
  • Pod ์ฃผ์„
  • Pod ๋ผ๋ฒจ

์ ˆ์ฐจ

๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์ƒˆ Pod ์‚ฌ์–‘์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ volume-pod.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      kind: Pod
      apiVersion: v1
      metadata:
        labels:
          zone: us-east-coast
          cluster: downward-api-test-cluster1
          rack: rack-123
        name: dapi-volume-test-pod
        annotations:
          annotation1: "345"
          annotation2: "456"
      spec:
        containers:
          - name: volume-test-container
            image: gcr.io/google_containers/busybox
            command: ["sh", "-c", "cat /tmp/etc/pod_labels /tmp/etc/pod_annotations"]
            volumeMounts:
              - name: podinfo
                mountPath: /tmp/etc
                readOnly: false
        volumes:
        - name: podinfo
          downwardAPI:
            defaultMode: 420
            items:
            - fieldRef:
                fieldPath: metadata.name
              path: pod_name
            - fieldRef:
                fieldPath: metadata.namespace
              path: pod_namespace
            - fieldRef:
                fieldPath: metadata.labels
              path: pod_labels
            - fieldRef:
                fieldPath: metadata.annotations
              path: pod_annotations
        restartPolicy: Never
      # ...
    2. volume-pod.yaml ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f volume-pod.yaml

๊ฒ€์ฆ

  • ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ตฌ์„ฑ๋œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc logs -p dapi-volume-test-pod

    ์ถœ๋ ฅ ์˜ˆ

    cluster=downward-api-test-cluster1
    rack=rack-123
    zone=us-east-coast
    annotation1=345
    annotation2=456
    kubernetes.io/config.source=api

7.5.3. Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฏธ์ง€ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ์ž๊ฐ€ ํŠน์ • ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฐ ์ œํ•œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.5.3.1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ

Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” Downward API์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฐ ์ œํ•œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pod ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•  ๋•Œ spec.container ํ•„๋“œ์˜ resources ํ•„๋“œ์— ํ•ด๋‹นํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ฆฌ์†Œ์Šค ์ œํ•œ์ด ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Downward API์˜ ๊ธฐ๋ณธ๊ฐ’์€ ๋…ธ๋“œ์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ฐ€๋Šฅ ๊ฐ’์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์‚ฝ์ž…ํ•  ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋œ ์ƒˆ Pod ์‚ฌ์–‘์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ pod.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: test-container
            image: gcr.io/google_containers/busybox:1.24
            command: [ "/bin/sh", "-c", "env" ]
            resources:
              requests:
                memory: "32Mi"
                cpu: "125m"
              limits:
                memory: "64Mi"
                cpu: "250m"
            env:
              - name: MY_CPU_REQUEST
                valueFrom:
                  resourceFieldRef:
                    resource: requests.cpu
              - name: MY_CPU_LIMIT
                valueFrom:
                  resourceFieldRef:
                    resource: limits.cpu
              - name: MY_MEM_REQUEST
                valueFrom:
                  resourceFieldRef:
                    resource: requests.memory
              - name: MY_MEM_LIMIT
                valueFrom:
                  resourceFieldRef:
                    resource: limits.memory
      # ...
    2. pod.yaml ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f pod.yaml
7.5.3.2. ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ

Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฐ ์ œํ•œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pod ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•  ๋•Œ spec.volumes.downwardAPI.items ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ spec.resources ํ•„๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ฆฌ์†Œ์Šค ์ œํ•œ์ด ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Downward API์˜ ๊ธฐ๋ณธ๊ฐ’์€ ๋…ธ๋“œ์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ฐ€๋Šฅ ๊ฐ’์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์‚ฝ์ž…ํ•  ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋œ ์ƒˆ Pod ์‚ฌ์–‘์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ pod.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: client-container
            image: gcr.io/google_containers/busybox:1.24
            command: ["sh", "-c", "while true; do echo; if [[ -e /etc/cpu_limit ]]; then cat /etc/cpu_limit; fi; if [[ -e /etc/cpu_request ]]; then cat /etc/cpu_request; fi; if [[ -e /etc/mem_limit ]]; then cat /etc/mem_limit; fi; if [[ -e /etc/mem_request ]]; then cat /etc/mem_request; fi; sleep 5; done"]
            resources:
              requests:
                memory: "32Mi"
                cpu: "125m"
              limits:
                memory: "64Mi"
                cpu: "250m"
            volumeMounts:
              - name: podinfo
                mountPath: /etc
                readOnly: false
        volumes:
          - name: podinfo
            downwardAPI:
              items:
                - path: "cpu_limit"
                  resourceFieldRef:
                    containerName: client-container
                    resource: limits.cpu
                - path: "cpu_request"
                  resourceFieldRef:
                    containerName: client-container
                    resource: requests.cpu
                - path: "mem_limit"
                  resourceFieldRef:
                    containerName: client-container
                    resource: limits.memory
                - path: "mem_request"
                  resourceFieldRef:
                    containerName: client-container
                    resource: requests.memory
      # ...
    2. volume-pod.yaml ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f volume-pod.yaml

7.5.4. Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ์‚ฌ์šฉ

Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฏธ์ง€ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ์ž๊ฐ€ ํŠน์ • ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์‚ฝ์ž…ํ•  ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ secret.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Secret
      metadata:
        name: mysecret
      data:
        password: <password>
        username: <username>
      type: kubernetes.io/basic-auth
    2. secret.yaml ํŒŒ์ผ์—์„œ ๋ณด์•ˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f secret.yaml
  2. ์œ„ Secret ์˜ค๋ธŒ์ ํŠธ์˜ username ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ pod.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_SECRET_USERNAME
                valueFrom:
                  secretKeyRef:
                    name: mysecret
                    key: username
        restartPolicy: Never
      # ...
    2. pod.yaml ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f pod.yaml

๊ฒ€์ฆ

  • ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ์— MY_SECRET_USERNAME ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc logs -p dapi-env-test-pod

7.5.5. Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต ์‚ฌ์šฉ

Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฏธ์ง€ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ์ž๊ฐ€ ํŠน์ • ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก Downward API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต ๊ฐ’์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ์‚ฝ์ž…ํ•  ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ configmap.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: myconfigmap
      data:
        mykey: myvalue
    2. configmap.yaml ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f configmap.yaml
  2. ์œ„ ๊ตฌ์„ฑ ๋งต์„ ์ฐธ์กฐํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ pod.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_CONFIGMAP_VALUE
                valueFrom:
                  configMapKeyRef:
                    name: myconfigmap
                    key: mykey
        restartPolicy: Always
      # ...
    2. pod.yaml ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f pod.yaml

๊ฒ€์ฆ

  • ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ์— MY_CONFIGMAP_VALUE ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc logs -p dapi-env-test-pod

7.5.6. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐธ์กฐ

Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ $() ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „์— ์ •์˜ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ’์ด ์ œ๊ณต๋œ ๋ฌธ์ž์—ด๋กœ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ๊ธฐ์กด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ pod.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_EXISTING_ENV
                value: my_value
              - name: MY_ENV_VAR_REF_ENV
                value: $(MY_EXISTING_ENV)
        restartPolicy: Never
      # ...
    2. pod.yaml ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f pod.yaml

๊ฒ€์ฆ

  • ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ์— MY_ENV_VAR_REF_ENV ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc logs -p dapi-env-test-pod

7.5.7. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐธ์กฐ ์ด์Šค์ผ€์ดํ”„

Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด์ค‘ ๋‹ฌ๋Ÿฌ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐธ์กฐ๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๊ฐ’์ด ์ œ๊ณต๋œ ๊ฐ’์˜ ๋‹จ์ผ ๋‹ฌ๋Ÿฌ ๊ธฐํ˜ธ ๋ฒ„์ „์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. ๊ธฐ์กด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ pod.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_NEW_ENV
                value: $$(SOME_OTHER_ENV)
        restartPolicy: Never
      # ...
    2. pod.yaml ํŒŒ์ผ์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f pod.yaml

๊ฒ€์ฆ

  • ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ์— MY_NEW_ENV ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc logs -p dapi-env-test-pod

7.6. OpenShift Container Platform ์ปจํ…Œ์ด๋„ˆ์— ๋˜ํ•œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์—์„œ ํŒŒ์ผ ๋ณต์‚ฌ

CLI์—์„œ rsync ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ์›๊ฒฉ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋˜๋Š” ์›๊ฒฉ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋กœ์ปฌ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.6.1. ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

oc rsync ๋ช…๋ น ๋˜๋Š” ์›๊ฒฉ ๋™๊ธฐํ™”๋Š” ๋ฐฑ์—… ๋ฐ ๋ณต์›์„ ์œ„ํ•ด Pod์—์„œ ๋ฐ Pod๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•„์นด์ด๋ธŒ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์œ ์šฉํ•œ ํˆด์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ Pod์—์„œ ์†Œ์Šค ํŒŒ์ผ์˜ ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด oc rsync๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹คํ–‰ ์ค‘์ธ Pod์— ๋ณต์‚ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc rsync <source> <destination> [-c <container>]
7.6.1.1. ์š”๊ตฌ์‚ฌํ•ญ
๋ณต์‚ฌ ์†Œ์Šค ์ง€์ •

oc rsync ๋ช…๋ น์˜ ์†Œ์Šค ์ธ์ˆ˜๋Š” ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” pod ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ํŒŒ์ผ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Pod ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•  ๋•Œ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„ ์•ž์— Pod ์ด๋ฆ„์„ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<pod name>:<dir>

๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์ด ๊ฒฝ๋กœ ๊ตฌ๋ถ„์ž(/)๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ฝ˜ํ…์ธ ๋งŒ ๋Œ€์ƒ์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ ํ•ด๋‹น ์ฝ˜ํ…์ธ ๊ฐ€ ๋Œ€์ƒ์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

๋ณต์‚ฌ ๋Œ€์ƒ ์ง€์ •
oc rsync ๋ช…๋ น์˜ ๋Œ€์ƒ ์ธ์ˆ˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ rsync๊ฐ€ ๋ณต์‚ฌ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
๋Œ€์ƒ์˜ ํŒŒ์ผ ์‚ญ์ œ
--delete ํ”Œ๋ž˜๊ทธ๋Š” ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์—†๋Š” ํŒŒ์ผ์„ ์›๊ฒฉ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์‚ญ์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ์—ฐ์† ๋™๊ธฐํ™”

--watch ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…๋ น์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ์˜ ์†Œ์Šค ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…๋ น์ด ์˜๊ตฌ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

--watch ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋™์ž‘์€ ์ผ๋ฐ˜์ ์œผ๋กœ oc rsync์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•˜์—ฌ oc rsync๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ์‚ฌ์‹ค์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ -delete์™€ ๊ฐ™์ด oc rsync๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.6.2. ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ํŒŒ์ผ ๋ณต์‚ฌ

์ปจํ…Œ์ด๋„ˆ์—์„œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋กœ์ปฌ ํŒŒ์ผ ๋ณต์‚ฌ ์ง€์› ๊ธฐ๋Šฅ์€ CLI์— ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

oc rsync๋กœ ์ž‘์—…ํ•  ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  • rsync๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. oc rsync ๋ช…๋ น์€ ํด๋ผ์ด์–ธํŠธ ๋จธ์‹  ๋ฐ ์›๊ฒฉ ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋กœ์ปฌ rsync ํˆด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    rsync๊ฐ€ ๋กœ์ปฌ์ด๋‚˜ ์›๊ฒฉ ์ปจํ…Œ์ด๋„ˆ์— ์—†๋Š” ๊ฒฝ์šฐ tar ์•„์นด์ด๋ธŒ๋Š” ๋กœ์ปฌ์— ์ƒ์„ฑ๋œ ํ›„ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋˜๋ฉฐ, ์—ฌ๊ธฐ์—์„œ tar ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์ด ์ถ”์ถœ๋ฉ๋‹ˆ๋‹ค. ์›๊ฒฉ ์ปจํ…Œ์ด๋„ˆ์—์„œ tar๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ณต์‚ฌ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

    tar ๋ณต์‚ฌ ๋ฐฉ๋ฒ•์—์„œ๋Š” oc rsync์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด oc rsync๋Š” ๋Œ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋Œ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์†Œ์Šค์™€ ๋Œ€์ƒ ๊ฐ„์— ๋‹ค๋ฅธ ํŒŒ์ผ๋งŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    Windows์—์„œ๋Š” oc rsync ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก cwRsync ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  PATH์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  • ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ Pod ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณต์‚ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc rsync <local-dir> <pod-name>:/<remote-dir> -c <container-name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc rsync /home/user/source devpod1234:/src -c user-container
  • Pod ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณต์‚ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc rsync devpod1234:/src /home/user/source

    ์ถœ๋ ฅ ์˜ˆ

    $ oc rsync devpod1234:/src/status.txt /home/user/

7.6.3. ๊ณ ๊ธ‰ Rsync ๊ธฐ๋Šฅ ์‚ฌ์šฉ

oc rsync ๋ช…๋ น์€ ํ‘œ์ค€ rsync๋ณด๋‹ค ์ ์€ ์ˆ˜์˜ ๋ช…๋ น์ค„ ์˜ต์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. oc rsync์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํ‘œ์ค€ rsync ๋ช…๋ น์ค„ ์˜ต์…˜(์˜ˆ: --exclude-from=FILE ์˜ต์…˜)์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ‘œ์ค€ rsync์˜ --rsh(-e) ์˜ต์…˜ ๋˜๋Š” RSYNC_RSH ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ rsync --rsh='oc rsh' --exclude-from=<file_name> <local-dir> <pod-name>:/<remote-dir>

๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

RSYNC_RSH ๋ณ€์ˆ˜๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

$ export RSYNC_RSH='oc rsh'

๊ทธ๋Ÿฐ ๋‹ค์Œ rsync ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ rsync --exclude-from=<file_name> <local-dir> <pod-name>:/<remote-dir>

์œ„์˜ ๋‘ ๊ฐ€์ง€ ์˜ˆ ๋ชจ๋‘ oc rsh๋ฅผ ์›๊ฒฉ ์‰˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ Pod์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‘œ์ค€ rsync๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  oc rsync๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.7. OpenShift Container Platform ์ปจํ…Œ์ด๋„ˆ์—์„œ ์›๊ฒฉ ๋ช…๋ น ์‹คํ–‰

CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform ์ปจํ…Œ์ด๋„ˆ์—์„œ ์›๊ฒฉ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.7.1. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์›๊ฒฉ ๋ช…๋ น ์‹คํ–‰

์›๊ฒฉ ์ปจํ…Œ์ด๋„ˆ ๋ช…๋ น ์‹คํ–‰์„ ์œ„ํ•œ ์ง€์›์€ CLI์— ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ oc exec <pod> [-c <container>] -- <command> [<arg_1> ... <arg_n>]

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ oc exec mypod date

์ถœ๋ ฅ ์˜ˆ

Thu Apr  9 02:21:53 UTC 2015

์ค‘์š”

๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ cluster-admin ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ถŒํ•œ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์•ก์„ธ์Šคํ•˜๋ฉด oc exec ๋ช…๋ น์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

7.7.2. ํด๋ผ์ด์–ธํŠธ์—์„œ ์›๊ฒฉ ๋ช…๋ น์„ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

ํด๋ผ์ด์–ธํŠธ๋Š” Kubernetes API ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ฐœํ–‰ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์›๊ฒฉ ๋ช…๋ น ์‹คํ–‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

/proxy/nodes/<node_name>/exec/<namespace>/<pod>/<container>?command=<command>

์œ„ URL์—์„œ

  • <node_name>์€ ๋…ธ๋“œ์˜ FQDN์ž…๋‹ˆ๋‹ค.
  • <namespace>๋Š” ๋Œ€์ƒ Pod์˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.
  • <pod>๋Š” ๋Œ€์ƒ Pod์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • <container>๋Š” ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • <command>๋Š” ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/proxy/nodes/node123.openshift.com/exec/myns/mypod/mycontainer?command=date

๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์Œ์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์›๊ฒฉ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น(stdin)์— ์ž…๋ ฅ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์˜ ํ„ฐ๋ฏธ๋„์ด TTY์ž…๋‹ˆ๋‹ค.
  • ์›๊ฒฉ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น์—์„œ stdout์˜ ์ถœ๋ ฅ์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์›๊ฒฉ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น์—์„œ stderr์˜ ์ถœ๋ ฅ์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” API ์„œ๋ฒ„๋กœ exec ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ๋‹ค์ค‘ ์ŠคํŠธ๋ฆผ์„ ์ง€์›ํ•˜๋Š” ์—ฐ๊ฒฐ๋กœ ์—ฐ๊ฒฐ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” HTTP/2 ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” stdin, stdout, stderr์— ๋Œ€ํ•ด ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ŠคํŠธ๋ฆผ์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ์˜ streamType ํ—ค๋”๋ฅผ stdin, stdout, stderr ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ์›๊ฒฉ ๋ช…๋ น ์‹คํ–‰ ์š”์ฒญ์„ ์™„๋ฃŒํ•˜๋ฉด ๋ชจ๋“  ์ŠคํŠธ๋ฆผ, ์—…๊ทธ๋ ˆ์ด๋“œ๋œ ์—ฐ๊ฒฐ, ๊ธฐ๋ณธ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

7.8. ํฌํŠธ ์ „๋‹ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ก์„ธ์Šค

OpenShift Container Platform์—์„œ๋Š” Pod๋กœ ํฌํŠธ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.8.1. ํฌํŠธ ์ „๋‹ฌ ์ดํ•ด

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

ํฌํŠธ ์ „๋‹ฌ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ์ง€์›์€ CLI์— ๋นŒ๋“œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]

CLI๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๊ฐ ๋กœ์ปฌ ํฌํŠธ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  ์•„๋ž˜์— ์„ค๋ช…๋œ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํฌํŠธ๋Š” ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5000

ํด๋ผ์ด์–ธํŠธ๋Š” ํฌํŠธ 5000์—์„œ ๋กœ์ปฌ๋กœ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  Pod์˜ 5000์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

6000:5000

ํด๋ผ์ด์–ธํŠธ๋Š” ํฌํŠธ 6000์—์„œ ๋กœ์ปฌ๋กœ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  Pod์˜ 5000์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

:5000 ๋˜๋Š” 0:5000

ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ์ปฌ ํฌํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  Pod์˜ 5000์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform์€ ํด๋ผ์ด์–ธํŠธ์˜ ํฌํŠธ ์ „๋‹ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์ˆ˜์‹ ๋˜๋ฉด OpenShift Container Platform์—์„œ ์‘๋‹ต์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ํฌํŠธ ์ „๋‹ฌ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ ์ƒˆ ์ŠคํŠธ๋ฆผ์„ ์ˆ˜์‹ ํ•˜๋ฉด ์ŠคํŠธ๋ฆผ๊ณผ Pod์˜ ํฌํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ ์œผ๋กœ Pod์˜ ํฌํŠธ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” OpenShift Container Platform ๊ตฌํ˜„์—์„œ๋Š” ๋…ธ๋“œ ํ˜ธ์ŠคํŠธ์—์„œ ์ง์ ‘ nsenter๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Pod์˜ ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ž…๋ ฅํ•œ ๋‹ค์Œ socat์„ ํ˜ธ์ถœํ•˜์—ฌ ์ŠคํŠธ๋ฆผ๊ณผ Pod ํฌํŠธ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌํ˜„์—๋Š” nsenter ๋ฐ socat์„ ์‹คํ–‰ํ•˜๋Š” helper Pod ์‹คํ–‰์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ˜ธ์ŠคํŠธ์— ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

7.8.2. ํฌํŠธ ์ „๋‹ฌ ์‚ฌ์šฉ

CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋กœ์ปฌ ํฌํŠธ๋ฅผ Pod๋กœ ํฌํŠธ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Pod์˜ ์ง€์ •๋œ ํฌํŠธ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌํŠธ 5000 ๋ฐ 6000์—์„œ ๋กœ์ปฌ๋กœ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  Pod์˜ ํฌํŠธ 5000 ๋ฐ 6000์—์„œ ๋˜๋Š” ํ•ด๋‹น ํฌํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    $ oc port-forward <pod> 5000 6000

    ์ถœ๋ ฅ ์˜ˆ

    Forwarding from 127.0.0.1:5000 -> 5000
    Forwarding from [::1]:5000 -> 5000
    Forwarding from 127.0.0.1:6000 -> 6000
    Forwarding from [::1]:6000 -> 6000

  • ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌํŠธ 8888์—์„œ ๋กœ์ปฌ๋กœ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  Pod์˜ 5000์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    $ oc port-forward <pod> 8888:5000

    ์ถœ๋ ฅ ์˜ˆ

    Forwarding from 127.0.0.1:8888 -> 5000
    Forwarding from [::1]:8888 -> 5000

  • ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํฌํŠธ์—์„œ ๋กœ์ปฌ๋กœ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  Pod์˜ 5000์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    $ oc port-forward <pod> :5000

    ์ถœ๋ ฅ ์˜ˆ

    Forwarding from 127.0.0.1:42390 -> 5000
    Forwarding from [::1]:42390 -> 5000

    ๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc port-forward <pod> 0:5000

7.8.3. ํด๋ผ์ด์–ธํŠธ์—์„œ ํฌํŠธ ์ „๋‹ฌ์„ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

ํด๋ผ์ด์–ธํŠธ๋Š” Kubernetes API ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ฐœํ–‰ํ•˜์—ฌ Pod๋กœ์˜ ํฌํŠธ ์ „๋‹ฌ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

/proxy/nodes/<node_name>/portForward/<namespace>/<pod>

์œ„ URL์—์„œ

  • <node_name>์€ ๋…ธ๋“œ์˜ FQDN์ž…๋‹ˆ๋‹ค.
  • <namespace>๋Š” ๋Œ€์ƒ Pod์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
  • <pod>๋Š” ๋Œ€์ƒ Pod์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/proxy/nodes/node123.openshift.com/portForward/myns/mypod

ํด๋ผ์ด์–ธํŠธ๋Š” API ์„œ๋ฒ„๋กœ ํฌํŠธ ์ „๋‹ฌ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ๋‹ค์ค‘ ์ŠคํŠธ๋ฆผ์„ ์ง€์›ํ•˜๋Š” ์—ฐ๊ฒฐ๋กœ ์—ฐ๊ฒฐ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” Hyptertext Transfer Protocol Version 2(HTTP/2) ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” Pod์— ๋Œ€์ƒ ํฌํŠธ๊ฐ€ ํฌํ•จ๋œ port ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์— ๊ธฐ๋ก๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” kubelet์„ ํ†ตํ•ด ๋Œ€์ƒ Pod ๋ฐ ํฌํŠธ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋ ‡๊ฒŒ ์ „๋‹ฌ๋œ ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด Pod์—์„œ ์ „์†ก๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋™์ผํ•œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋‹ค์‹œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ํฌํŠธ ์ „๋‹ฌ ์š”์ฒญ์„ ์™„๋ฃŒํ•˜๋ฉด ๋ชจ๋“  ์ŠคํŠธ๋ฆผ, ์—…๊ทธ๋ ˆ์ด๋“œ๋œ ์—ฐ๊ฒฐ, ๊ธฐ๋ณธ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

7.9. ์ปจํ…Œ์ด๋„ˆ์˜ sysctl ์‚ฌ์šฉ

sysctl ์„ค์ •์€ Kubernetes๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋Š” ๋Ÿฐํƒ€์ž„์— ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ํŠน์ • ์ปค๋„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์ •๋œ sysctl๋งŒ Pod์— ๋…๋ฆฝ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sysctl์ด ๋…ธ๋“œ ์ˆ˜์ค€ ์ด๋ผ๊ณ  ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ Node Tuning Operator ์™€ ๊ฐ™์€ sysctl์„ ์„ค์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” sysctl๋งŒ ํ—ˆ์šฉ ๋ชฉ๋ก์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ ๋‹ค๋ฅธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋„๋ก ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7.9.1. sysctl ์ •๋ณด

Linux์—์„œ sysctl ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ด€๋ฆฌ์ž๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์ปค๋„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” /proc/sys/ ๊ฐ€์ƒ ํ”„๋กœ์„ธ์Šค ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ปค๋„(๊ณต์šฉ ์ ‘๋‘์‚ฌ: kernel.)
  • ๋„คํŠธ์›Œํ‚น(๊ณต์šฉ ์ ‘๋‘์‚ฌ: net.)
  • ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ(๊ณต์šฉ ์ ‘๋‘์‚ฌ: vm.)
  • MDADM(๊ณต์šฉ ์ ‘๋‘์‚ฌ: dev.)

์ปค๋„ ์„ค๋ช…์„œ์— ๋” ๋งŽ์€ ํ•˜์œ„ ์‹œ์Šคํ…œ์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ sudo sysctl -a
7.9.1.1. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ง€์ • sysctl ๋ฐ ๋…ธ๋“œ ์ˆ˜์ค€ sysctl ๋น„๊ต

๋Œ€๋‹ค์ˆ˜์˜ sysctl์€ Linux ์ปค๋„์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋…ธ๋“œ์˜ ๊ฐ Pod์— ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes ๋‚ด์˜ Pod ์ปจํ…์ŠคํŠธ์—์„œ sysctl์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ sysctl์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  • kernel.shm*
  • kernel.msg*
  • kernel.sem
  • fs.mqueue.*

๋˜ํ•œ net.* ๊ทธ๋ฃน์— ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ sysctl์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฑ„ํƒ์€ ์ปค๋„ ๋ฒ„์ „ ๋ฐ ๋ฐฐํฌ์ž์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ Sysctl์€ ๋…ธ๋“œ ์ˆ˜์ค€์ด๋ผ๊ณ  ํ•˜๋ฉฐ ๋…ธ๋“œ์˜ ๊ธฐ๋ณธ Linux ๋ฐฐํฌ(์˜ˆ: /etc/sysctls.conf ํŒŒ์ผ ์ˆ˜์ •)๋ฅผ ํ†ตํ•ด ๋˜๋Š” ๊ถŒํ•œ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Node Tuning Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ์ˆ˜์ค€ sysctl์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

ํŠน์ˆ˜ sysctl์ด ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํ…Œ์ธํŠธ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ sysctl ์„ค์ •์ด ํ•„์š”ํ•œ ๋…ธ๋“œ์—๋งŒ Pod๋ฅผ ์˜ˆ์•ฝํ•˜์‹ญ์‹œ์˜ค. ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

7.9.1.2. ์•ˆ์ „ํ•œ sysctl ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl ๋น„๊ต

sysctl์€ ์•ˆ์ „ํ•œ sysctl ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl๋กœ ๊ทธ๋ฃนํ™”๋ฉ๋‹ˆ๋‹ค.

sysctl์ด ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ ค๋ฉด ์ ์ ˆํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ๋™์ผํ•œ ๋…ธ๋“œ์˜ Pod ๊ฐ„์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฒฉ๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ํ•˜๋‚˜์˜ Pod์— sysctl์„ ์„ค์ •ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ์˜ ๋‹ค๋ฅธ Pod์— ์˜ํ–ฅ์„ ๋ฏธ์นจ
  • ๋…ธ๋“œ ์ƒํƒœ ์†์ƒ
  • Pod์˜ ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ๋ฒ—์–ด๋‚˜๋Š” CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค ํ™•๋ณด

OpenShift Container Platform์—์„œ๋Š” ์•ˆ์ „ ์„ค์ •์— ์žˆ๋Š” ๋‹ค์Œ sysctl์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ํ—ˆ์šฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • kernel.shm_rmid_forced
  • net.ipv4.ip_local_port_range
  • net.ipv4.tcp_syncookies
  • net.ipv4.ping_group_range

์•ˆ์ „ํ•œ sysctl์€ ๋ชจ๋‘ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. Pod ์‚ฌ์–‘์„ ์ˆ˜์ •ํ•˜์—ฌ Pod์—์„œ sysctl์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenShift Container Platform์—์„œ ํ—ˆ์šฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์€ sysctl์€ OpenShift Container Platform์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. sysctl์„ ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ๋…ธ๋“œ๋ณ„๋กœ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์ด ๋น„ํ™œ์„ฑํ™”๋œ Pod๋Š” ์˜ˆ์•ฝ์€ ๋˜์ง€๋งŒ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

$ oc get pod

์ถœ๋ ฅ ์˜ˆ

NAME        READY   STATUS            RESTARTS   AGE
hello-pod   0/1     SysctlForbidden   0          14s

7.9.2. Pod์˜ sysctl ์„ค์ •

Pod์˜ securityContext๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod์— sysctl์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. securityContext๋Š” ๋™์ผํ•œ Pod์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์•ˆ์ „ํ•œ sysctl์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์ด ์žˆ๋Š” Pod๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์„ ๋ช…์‹œ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š๋Š” ํ•œ ์–ด๋– ํ•œ ๋…ธ๋“œ์—์„œ๋„ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์ˆ˜์ค€ sysctl๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋…ธ๋“œ์— ํ…Œ์ธํŠธ ๋ฐ ํ—ˆ์šฉ ์˜ค์ฐจ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น Pod๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” Pod securityContext ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•œ sysctl kernel.shm_rmid_forced ์™€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์ธ net.core.somaxconn ๋ฐ kernel.msgmax ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์–‘์—์„œ๋Š” ์•ˆ์ „ ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์ด ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์˜

์šด์˜ ์ฒด์ œ๊ฐ€ ๋ถˆ์•ˆ์ •ํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด sysctl ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜์ •์ด ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ํŒŒ์•…ํ•œ ํ›„์—๋งŒ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.

ํ”„๋กœ์„ธ์Šค

์•ˆ์ „ํ•œ sysctl ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์ด Pod๋ฅผ ์ •์˜ํ•˜๋Š” YAML ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  securityContext ์‚ฌ์–‘์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: sysctl-example
    spec:
      securityContext:
        sysctls:
        - name: kernel.shm_rmid_forced
          value: "0"
        - name: net.core.somaxconn
          value: "1024"
        - name: kernel.msgmax
          value: "65536"
      ...
  2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc apply -f <file-name>.yaml

    ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์„ ๋…ธ๋“œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ Pod๋Š” ์˜ˆ์•ฝ๋˜์ง€๋งŒ ๋ฐฐํฌ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

    $ oc get pod

    ์ถœ๋ ฅ ์˜ˆ

    NAME        READY   STATUS            RESTARTS   AGE
    hello-pod   0/1     SysctlForbidden   0          14s

7.9.3. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl ํ™œ์„ฑํ™”

ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ๊ณ ์„ฑ๋Šฅ ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠœ๋‹๊ณผ ๊ฐ™์ด ๋งค์šฐ ํŠน๋ณ„ํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŠน์ • sysctl์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ํŠน์ • ์œ ํ˜•์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. sysctl์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ์ปจํ…์ŠคํŠธ ์ œ์•ฝ ์กฐ๊ฑด์˜ allowedUnsafeSysctls ํ•„๋“œ์— sysctls ๋ชฉ๋ก ๋˜๋Š” sysctl ํŒจํ„ด ๋ชฉ๋ก์„ ์ง€์ •ํ•˜์—ฌ Pod์— ์„ค์ •๋œ sysctl์„ ์ถ”๊ฐ€๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • allowedUnsafeSysctls ์˜ต์…˜์€ ๊ณ ์„ฑ๋Šฅ ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠœ๋‹๊ณผ ๊ฐ™์€ ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์˜

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

ํ”„๋กœ์„ธ์Šค

  1. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool worker
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: 2019-02-08T14:52:39Z
      generation: 1
      labels:
        custom-kubelet: sysctl 1
    1
    key: pair ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. KubeletConfig CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: custom-kubelet
    spec:
      machineConfigPoolSelector:
        matchLabels:
          custom-kubelet: sysctl 1
      kubeletConfig:
        allowedUnsafeSysctls: 2
          - "kernel.msg*"
          - "net.core.somaxconn"
    1
    ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์—์„œ ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ํ—ˆ์šฉํ•  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
  3. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc apply -f set-sysctl-worker.yaml

    99-worker-XXXXXX-XXXXX-XXXX-XXXXX-kubelet ํ˜•์‹์œผ๋กœ ์ด๋ฆ„์ด ์ง€์ •๋œ ์ƒˆ MachineConfig ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  4. machineconfigpool ์˜ค๋ธŒ์ ํŠธ ์ƒํƒœ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žฌ๋ถ€ํŒ…๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    status:
      conditions:
        - lastTransitionTime: '2019-08-11T15:32:00Z'
          message: >-
            All nodes are updating to
            rendered-worker-ccbfb5d2838d65013ab36300b7b3dc13
          reason: ''
          status: 'True'
          type: Updating

    ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋ฉด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

       - lastTransitionTime: '2019-08-11T16:00:00Z'
          message: >-
            All nodes are updated with
            rendered-worker-ccbfb5d2838d65013ab36300b7b3dc13
          reason: ''
          status: 'True'
          type: Updated
  5. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋ฉด ์ƒˆ MachineConfig ์˜ค๋ธŒ์ ํŠธ์— ๋ณ‘ํ•ฉ๋œ KubeletConfig ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get machineconfig 99-worker-XXXXXX-XXXXX-XXXX-XXXXX-kubelet -o json | grep ownerReference -A7
            "ownerReferences": [
                {
                    "apiVersion": "machineconfiguration.openshift.io/v1",
                    "blockOwnerDeletion": true,
                    "controller": true,
                    "kind": "KubeletConfig",
                    "name": "custom-kubelet",
                    "uid": "3f64a766-bae8-11e9-abe8-0a1a2a4813f2"
                }
            ]

    ์ด์ œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Pod์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ sysctl์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8์žฅ. ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…

8.1. OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ ์ •๋ณด ๋ณด๊ธฐ

OpenShift Container Platform์˜ ์ด๋ฒคํŠธ๋Š” OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์˜ API ์˜ค๋ธŒ์ ํŠธ์— ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋ธ๋ง๋ฉ๋‹ˆ๋‹ค.

8.1.1. ์ด๋ฒคํŠธ ์ดํ•ด

OpenShift Container Platform์€ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค์™€ ๊ด€๊ณ„์—†์ด ์‹ค์ œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐœ๋ฐœ์ž์™€ ๊ด€๋ฆฌ์ž๋Š” ํ†ตํ•ฉ๋œ ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.1.2. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ณด๊ธฐ

CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฒคํŠธ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

  • ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    $ oc get events [-n <project>] 1
    1
    ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc get events -n openshift-config

    ์ถœ๋ ฅ ์˜ˆ

    LAST SEEN   TYPE      REASON                   OBJECT                      MESSAGE
    97m         Normal    Scheduled                pod/dapi-env-test-pod       Successfully assigned openshift-config/dapi-env-test-pod to ip-10-0-171-202.ec2.internal
    97m         Normal    Pulling                  pod/dapi-env-test-pod       pulling image "gcr.io/google_containers/busybox"
    97m         Normal    Pulled                   pod/dapi-env-test-pod       Successfully pulled image "gcr.io/google_containers/busybox"
    97m         Normal    Created                  pod/dapi-env-test-pod       Created container
    9m5s        Warning   FailedCreatePodSandBox   pod/dapi-volume-test-pod    Failed create pod sandbox: rpc error: code = Unknown desc = failed to create pod network sandbox k8s_dapi-volume-test-pod_openshift-config_6bc60c1f-452e-11e9-9140-0eec59c23068_0(748c7a40db3d08c07fb4f9eba774bd5effe5f0d5090a242432a73eee66ba9e22): Multus: Err adding pod to network "openshift-sdn": cannot set "openshift-sdn" ifname to "eth0": no netns: failed to Statfs "/proc/33366/ns/net": no such file or directory
    8m31s       Normal    Scheduled                pod/dapi-volume-test-pod    Successfully assigned openshift-config/dapi-volume-test-pod to ip-10-0-171-202.ec2.internal

  • OpenShift Container Platform ์ฝ˜์†”์—์„œ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. OpenShift Container Platform ์ฝ˜์†”์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    2. ํ™ˆ โ†’ ์ด๋ฒคํŠธ๋ฅผ ํด๋ฆญํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. ์ด๋ฒคํŠธ๋ฅผ ํ‘œ์‹œํ•  ๋ฆฌ์†Œ์Šค๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ํ™ˆ โ†’ ํ”„๋กœ์ ํŠธ โ†’ <ํ”„๋กœ์ ํŠธ ์ด๋ฆ„> โ†’ <๋ฆฌ์†Œ์Šค ์ด๋ฆ„>๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      Pod ๋ฐ ๋ฐฐํฌ์™€ ๊ฐ™์ด ๋งŽ์€ ์˜ค๋ธŒ์ ํŠธ์—๋Š” ์ž์ฒด ์ด๋ฒคํŠธ ํƒญ๋„ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์™€ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

8.1.3. ์ด๋ฒคํŠธ ๋ชฉ๋ก

์ด ์„น์…˜์—์„œ๋Š” OpenShift Container Platform์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ 8.1. ๊ตฌ์„ฑ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

FailedValidation

Pod ๊ตฌ์„ฑ ๊ฒ€์ฆ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.2. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

BackOff

๋ฐฑ์˜คํ”„๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Created

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Failed

๊ฐ€์ ธ์˜ค๊ธฐ/์ƒ์„ฑ/์‹œ์ž‘์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

Killing

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

Started

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Preempting

๋‹ค๋ฅธ Pod๋ฅผ ์„ ์ ํ•ฉ๋‹ˆ๋‹ค.

ExceededGracePeriod

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์ด ์ง€์ •๋œ ์œ ์˜ˆ ๊ธฐ๊ฐ„ ๋‚ด์— Pod๋ฅผ ์ค‘์ง€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.3. ์ƒํƒœ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

Unhealthy

์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๊ฐ€ ๋น„์ •์ƒ์ž…๋‹ˆ๋‹ค.

ํ‘œ 8.4. ์ด๋ฏธ์ง€ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

BackOff

Ctr Start๋ฅผ ๋ฐฑ์˜คํ”„ํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

ErrImageNeverPull

์ด๋ฏธ์ง€์˜ NeverPull Policy๋ฅผ ์œ„๋ฐ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

Failed

์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

InspectFailed

์ด๋ฏธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Pulled

์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™”๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ ๋จธ์‹ ์— ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.

Pulling

์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

ํ‘œ 8.5. ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ์ž ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

FreeDiskSpaceFailed

๋””์Šคํฌ ๊ณต๊ฐ„์„ ๋น„์šฐ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

InvalidDiskCapacity

๋””์Šคํฌ ์šฉ๋Ÿ‰์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.6. ๋…ธ๋“œ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

FailedMount

๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

HostNetworkNotSupported

ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

HostPortConflict

ํ˜ธ์ŠคํŠธ/ํฌํŠธ๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

KubeletSetupFailed

kubelet ์„ค์ •์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

NilShaper

์ •์˜๋˜์ง€ ์•Š์€ ์‰์ดํผ์ž…๋‹ˆ๋‹ค.

NodeNotReady

๋…ธ๋“œ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

NodeNotSchedulable

๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

NodeReady

๋…ธ๋“œ๊ฐ€ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

NodeSchedulable

๋…ธ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NodeSelectorMismatching

๋…ธ๋“œ ์„ ํƒ๊ธฐ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

OutOfDisk

๋””์Šคํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Rebooted

๋…ธ๋“œ๊ฐ€ ์žฌ๋ถ€ํŒ…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Starting

kubelet์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

FailedAttachVolume

๋ณผ๋ฅจ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

FailedDetachVolume

๋ณผ๋ฅจ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

VolumeResizeFailed

๋ณผ๋ฅจ์„ ํ™•์žฅ/์ถ•์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

VolumeResizeSuccessful

๋ณผ๋ฅจ์„ ํ™•์žฅ/์ถ•์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

FileSystemResizeFailed

ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ™•์žฅ/์ถ•์†Œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FileSystemResizeSuccessful

ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ™•์žฅ/์ถ•์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedUnMount

๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธ ํ•ด์ œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedMapVolume

๋ณผ๋ฅจ์„ ๋งคํ•‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedUnmapDevice

์žฅ์น˜๋ฅผ ๋งคํ•‘ ํ•ด์ œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

AlreadyMountedVolume

๋ณผ๋ฅจ์ด ์ด๋ฏธ ๋งˆ์šดํŠธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

SuccessfulDetachVolume

๋ณผ๋ฅจ์ด ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SuccessfulMountVolume

๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

SuccessfulUnMountVolume

๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธ ํ•ด์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

ContainerGCFailed

์ปจํ…Œ์ด๋„ˆ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

ImageGCFailed

์ด๋ฏธ์ง€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedNodeAllocatableEnforcement

์‹œ์Šคํ…œ ์˜ˆ์•ฝ Cgroup ์ œํ•œ์„ ์ ์šฉํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

NodeAllocatableEnforced

์‹œ์Šคํ…œ ์˜ˆ์•ฝ Cgroup ์ œํ•œ์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

UnsupportedMountOption

์ง€์›๋˜์ง€ ์•Š๋Š” ๋งˆ์šดํŠธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

SandboxChanged

Pod ์ƒŒ๋“œ๋ฐ•์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

FailedCreatePodSandBox

Pod ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedPodSandBoxStatus

์‹คํŒจํ•œ Pod ์ƒŒ๋“œ๋ฐ•์Šค ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

ํ‘œ 8.7. Pod ์ž‘์—…์ž ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

FailedSync

Pod ๋™๊ธฐํ™”์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.8. ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

SystemOOM

ํด๋Ÿฌ์Šคํ„ฐ์— OOM(๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ) ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.9. Pod ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

FailedKillPod

Pod๋ฅผ ์ค‘์ง€ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedCreatePodContainer

Pod ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Failed

Pod ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

NetworkNotReady

๋„คํŠธ์›Œํฌ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

FailedCreate

์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(<error-msg>).

SuccessfulCreate

Pod๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(<pod-name>).

FailedDelete

์‚ญ์ œํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(<error-msg>).

SuccessfulDelete

Pod๊ฐ€ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(<pod-id>).

ํ‘œ 8.10. ์ˆ˜ํ‰ Pod ์ž๋™ ์Šค์ผ€์ผ๋Ÿฌ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

SelectorRequired

์„ ํƒ๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

InvalidSelector

์„ ํƒ๊ธฐ๋ฅผ ํ•ด๋‹น ๋‚ด๋ถ€ ์„ ํƒ๊ธฐ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

FailedGetObjectMetric

HPA์—์„œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

InvalidMetricSourceType

์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”ํŠธ๋ฆญ ์†Œ์Šค ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

ValidMetricFound

HPA์—์„œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

FailedConvertHPA

์ง€์ •๋œ HPA๋ฅผ ๋ณ€ํ™˜ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedGetScale

HPA ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋Œ€์ƒ์˜ ํ˜„์žฌ ๊ทœ๋ชจ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

SucceededGetScale

HPA ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋Œ€์ƒ์˜ ํ˜„์žฌ ๊ทœ๋ชจ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

FailedComputeMetricsReplicas

๋‚˜์—ด๋œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์›ํ•˜๋Š” ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedRescale

์ƒˆ ํฌ๊ธฐ: <size>, ์ด์œ : <msg>, ์˜ค๋ฅ˜: <error-msg>

SuccessfulRescale

์ƒˆ ํฌ๊ธฐ: <size>, ์ด์œ : <msg>

FailedUpdateStatus

์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.11. ๋„คํŠธ์›Œํฌ ์ด๋ฒคํŠธ(openshift-sdn)
์ด๋ฆ„์„ค๋ช…

Starting

Starting OpenShift SDN.

NetworkFailed

Pod์˜ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์†์‹ค๋˜์–ด Pod๊ฐ€ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

ํ‘œ 8.12. ๋„คํŠธ์›Œํฌ ์ด๋ฒคํŠธ(kube-proxy)
์ด๋ฆ„์„ค๋ช…

NeedPods

์„œ๋น„์Šค ํฌํŠธ <serviceName>:<port>์— Pod๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ 8.13. ๋ณผ๋ฅจ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

FailedBinding

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜๊ตฌ ๋ณผ๋ฅจ์ด ์—†์œผ๋ฉฐ ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

VolumeMismatch

๋ณผ๋ฅจ ํฌ๊ธฐ ๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ ํด๋ ˆ์ž„์—์„œ ์š”์ฒญํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

VolumeFailedRecycle

์žฌ์ƒ๊ธฐ Pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

VolumeRecycled

๋ณผ๋ฅจ์ด ์žฌ์ƒ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

RecyclerPod

Pod๊ฐ€ ์žฌ์ƒ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

VolumeDelete

๋ณผ๋ฅจ์ด ์‚ญ์ œ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

VolumeFailedDelete

๋ณผ๋ฅจ์„ ์‚ญ์ œํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ExternalProvisioning

ํด๋ ˆ์ž„์— ๋Œ€ํ•œ ๋ณผ๋ฅจ์ด ์ˆ˜๋™์œผ๋กœ ๋˜๋Š” ์™ธ๋ถ€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ๋น„์ €๋‹๋˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ProvisioningFailed

๋ณผ๋ฅจ์„ ํ”„๋กœ๋น„์ €๋‹ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

ProvisioningCleanupFailed

ํ”„๋กœ๋น„์ €๋‹๋œ ๋ณผ๋ฅจ์„ ์ •๋ฆฌํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ProvisioningSucceeded

๋ณผ๋ฅจ์ด ์„ฑ๊ณต์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

WaitForFirstConsumer

Pod๊ฐ€ ์˜ˆ์•ฝ๋  ๋•Œ๊นŒ์ง€ ๋ฐ”์ธ๋”ฉ์ด ์ง€์—ฐ๋ฉ๋‹ˆ๋‹ค.

ํ‘œ 8.14. ๋ผ์ดํ”„์‚ฌ์ดํด ํ›„ํฌ
์ด๋ฆ„์„ค๋ช…

FailedPostStartHook

ํ•ธ๋“ค๋Ÿฌ์—์„œ Pod๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedPreStopHook

ํ•ธ๋“ค๋Ÿฌ์—์„œ ์‚ฌ์ „ ์ •์ง€ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

UnfinishedPreStopHook

์‚ฌ์ „ ์ •์ง€ ํ›„ํฌ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.15. ๋ฐฐํฌ
์ด๋ฆ„์„ค๋ช…

DeploymentCancellationFailed

๋ฐฐํฌ๋ฅผ ์ทจ์†Œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

DeploymentCancelled

๋ฐฐํฌ๊ฐ€ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

DeploymentCreated

์ƒˆ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

IngressIPRangeFull

์„œ๋น„์Šค์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” Ingress IP๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.16. ์Šค์ผ€์ค„๋Ÿฌ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

FailedScheduling

Pod(<pod-namespace>/<pod-name>)๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” AssumePodVolumes ์‹คํŒจ, ๋ฐ”์ธ๋”ฉ ๊ฑฐ๋ถ€ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ด์œ ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Preempted

<node-name> ๋…ธ๋“œ์˜ <preemptor-namespace>/<preemptor-name>์— ์˜ํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Scheduled

<pod-name>์„(๋ฅผ) <node-name>์— ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 8.17. ๋ฐ๋ชฌ ์„ธํŠธ ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

SelectingAll

์ด ๋ฐ๋ชฌ ์„ธํŠธ๋Š” ๋ชจ๋“  Pod๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์„ ํƒ๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

FailedPlacement

<node-name>์— Pod๋ฅผ ๋ฐฐ์น˜ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

FailedDaemonPod

<node-name> ๋…ธ๋“œ์— ์‹คํŒจํ•œ ๋ฐ๋ชฌ Pod <pod-name>์ด(๊ฐ€) ์žˆ์–ด ์ข…๋ฃŒํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ 8.18. LoadBalancer ์„œ๋น„์Šค ์ด๋ฒคํŠธ
์ด๋ฆ„์„ค๋ช…

CreatingLoadBalancerFailed

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

DeletingLoadBalancer

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

EnsuringLoadBalancer

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ™•์ธํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

EnsuredLoadBalancer

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

UnAvailableLoadBalancer

LoadBalancer ์„œ๋น„์Šค์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

LoadBalancerSourceRanges

์ƒˆ LoadBalancerSourceRanges๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด <old-source-range> โ†’ <new-source-range>์ž…๋‹ˆ๋‹ค.

LoadbalancerIP

์ƒˆ IP ์ฃผ์†Œ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด <old-ip> โ†’ <new-ip>์ž…๋‹ˆ๋‹ค.

ExternalIP

์™ธ๋ถ€ IP ์ฃผ์†Œ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด Added: <external-ip>์ž…๋‹ˆ๋‹ค.

UID

์ƒˆ UID๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด <old-service-uid> โ†’ <new-service-uid>์ž…๋‹ˆ๋‹ค.

ExternalTrafficPolicy

์ƒˆ ExternalTrafficPolicy๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด <old-policy> โ†’ <new-policy>์ž…๋‹ˆ๋‹ค.

HealthCheckNodePort

์ƒˆ HealthCheckNodePort๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด <old-node-port> โ†’ <new-node-port>์ž…๋‹ˆ๋‹ค.

UpdatedLoadBalancer

์ƒˆ ํ˜ธ์ŠคํŠธ๋กœ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

LoadBalancerUpdateFailed

์ƒˆ ํ˜ธ์ŠคํŠธ๋กœ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

DeletingLoadBalancer

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

DeletingLoadBalancerFailed

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

DeletedLoadBalancer

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

8.2. OpenShift Container Platform ๋…ธ๋“œ์—์„œ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋Š” Pod ์ˆ˜ ์ถ”์ •

ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” OpenShift Cluster Capacity Tool์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋ฆฌ์†Œ์Šค๊ฐ€ ์†Œ์ง„๋˜๊ธฐ ์ „์— ํ˜„์žฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋Š˜๋ฆฌ๊ธฐ ์ „์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” Pod ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ํ–ฅํ›„ ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์šฉ๋Ÿ‰์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐœ๋ณ„ ๋…ธ๋“œ ํ˜ธ์ŠคํŠธ์—์„œ ์ œ๊ณตํ•˜๋ฉฐ CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ ๊ณต๊ฐ„ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

8.2.1. OpenShift Cluster Capacity ํˆด ์ดํ•ด

OpenShift Cluster Capacity Tool์€ ๋ณด๋‹ค ์ •ํ™•ํ•œ ์ถ”์ •์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์†Œ์ง„๋˜๊ธฐ ์ „์— ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ ํฌ๋“œ์˜ ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ์Šค์ผ€์ค„๋ง ๊ฒฐ์ •์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋‚˜๋จธ์ง€ ํ• ๋‹น ๊ฐ€๋Šฅ ์šฉ๋Ÿ‰์€ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ฐฐํฌ๋˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋žต์ ์ธ ์ถ”์ •์น˜์ž…๋‹ˆ๋‹ค. ๋‚จ์€ ๋ฆฌ์†Œ์Šค๋งŒ ๋ถ„์„ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์ •๋œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ Pod์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค ์ธก๋ฉด์—์„œ ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์šฉ ์šฉ๋Ÿ‰์„ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค.

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

OpenShift Cluster Capacity Tool์„ ๋ช…๋ น์ค„์—์„œ ๋…๋ฆฝํ˜• ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์˜ Pod์—์„œ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod ๋‚ด์—์„œ ํˆด์„ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๊ฐœ์ž… ์—†์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.2.2. ๋ช…๋ น์ค„์—์„œ OpenShift Cluster Capacity Tool ์‹คํ–‰

๋ช…๋ น์ค„์—์„œ OpenShift Cluster Capacity Tool์„ ์‹คํ–‰ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋“œ ์ˆ˜๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํˆด์—์„œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ์ถ”์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ƒ˜ํ”Œ Pod ์‚ฌ์–‘ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Pod ์‚ฌ์–‘์€ ๋ฆฌ์†Œ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œํ•œ ๋˜๋Š” ์š”์ฒญ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ํˆด์—์„œ๋Š” ์ถ”์ • ๋ถ„์„์— Pod์˜ ๋ฆฌ์†Œ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  1. Red Hat Ecosystem Catalog์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” OpenShift ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ํˆด์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ƒ˜ํ”Œ Pod ์‚ฌ์–‘ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: small-pod
        labels:
          app: guestbook
          tier: frontend
      spec:
        containers:
        - name: php-redis
          image: gcr.io/google-samples/gb-frontend:v4
          imagePullPolicy: Always
          resources:
            limits:
              cpu: 150m
              memory: 100Mi
            requests:
              cpu: 150m
              memory: 100Mi
    2. ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file_name>.yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create -f pod-spec.yaml

์ ˆ์ฐจ

๋ช…๋ น์ค„์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ํˆด์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ„ฐ๋ฏธ๋„์—์„œ Red Hat Registry์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

    $ podman login registry.redhat.io
  2. ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ํˆด ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ podman pull registry.redhat.io/openshift4/ose-cluster-capacity
  3. ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ํˆด์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ podman run -v $HOME/.kube:/kube:Z -v $(pwd):/cc:Z  ose-cluster-capacity \
    /bin/cluster-capacity --kubeconfig /kube/config --<pod_spec>.yaml /cc/<pod_spec>.yaml \
    --verbose

    ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    <pod_spec>.yaml
    ์‚ฌ์šฉํ•  Pod ์‚ฌ์–‘์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์ƒ์„ธ ์ •๋ณด
    ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋…ธ๋“œ์—์„œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” Pod ์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    small-pod pod requirements:
    	- CPU: 150m
    	- Memory: 100Mi
    
    The cluster can schedule 88 instance(s) of the pod small-pod.
    
    Termination reason: Unschedulable: 0/5 nodes are available: 2 Insufficient cpu,
    3 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't
    tolerate.
    
    Pod distribution among nodes:
    small-pod
    	- 192.168.124.214: 45 instance(s)
    	- 192.168.124.120: 43 instance(s)

    ์œ„ ์˜ˆ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ƒ Pod ์ˆ˜๋Š” 88์ž…๋‹ˆ๋‹ค.

8.2.3. Pod ๋‚ด์—์„œ OpenShift Cluster Capacity Tool์„ ์ž‘์—…์œผ๋กœ ์‹คํ–‰

ํฌ๋“œ ๋‚ด์—์„œ OpenShift Cluster Capacity Tool์„ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์‚ฌ์šฉ์ž ๊ฐœ์ž… ์—†์ด๋„ ํˆด์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ConfigMap ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Cluster Capacity Tool์„ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

OpenShift Cluster Capacity ํˆด ์„ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ํˆด์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      kind: ClusterRole
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: cluster-capacity-role
      rules:
      - apiGroups: [""]
        resources: ["pods", "nodes", "persistentvolumeclaims", "persistentvolumes", "services", "replicationcontrollers"]
        verbs: ["get", "watch", "list"]
      - apiGroups: ["apps"]
        resources: ["replicasets", "statefulsets"]
        verbs: ["get", "watch", "list"]
      - apiGroups: ["policy"]
        resources: ["poddisruptionbudgets"]
        verbs: ["get", "watch", "list"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "watch", "list"]
    2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file_name>.yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create sa cluster-capacity-sa
  2. ์„œ๋น„์Šค ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create sa cluster-capacity-sa -n default
  3. ์„œ๋น„์Šค ๊ณ„์ •์— ์—ญํ• ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc adm policy add-cluster-role-to-user cluster-capacity-role \
        system:serviceaccount:<namespace>:cluster-capacity-sa

    ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    <namespace>
    Pod๊ฐ€ ์žˆ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. Pod ์‚ฌ์–‘์„ ์ •์˜ํ•˜๊ณ  ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: small-pod
        labels:
          app: guestbook
          tier: frontend
      spec:
        containers:
        - name: php-redis
          image: gcr.io/google-samples/gb-frontend:v4
          imagePullPolicy: Always
          resources:
            limits:
              cpu: 150m
              memory: 100Mi
            requests:
              cpu: 150m
              memory: 100Mi
    2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file_name>.yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create -f pod.yaml
  5. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๊ตฌ์„ฑ ๋งต ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

    $ oc create configmap cluster-capacity-configmap \
        --from-file=pod.yaml=pod.yaml

    ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ๋ถ„์„์€ ์ž…๋ ฅ Pod ์‚ฌ์–‘ ํŒŒ์ผ pod.yaml ์„ ๊ฒฝ๋กœ /test-pod ์˜ ๋ณผ๋ฅจ test-volume ์— ๋งˆ์šดํŠธํ•˜๊ธฐ ์œ„ํ•ด cluster-capacity-configmap ์ด๋ผ๋Š” ๊ตฌ์„ฑ ๋งต ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์— ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค.

  6. ์•„๋ž˜์˜ ์ž‘์—… ์‚ฌ์–‘ ํŒŒ์ผ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: cluster-capacity-job
      spec:
        parallelism: 1
        completions: 1
        template:
          metadata:
            name: cluster-capacity-pod
          spec:
              containers:
              - name: cluster-capacity
                image: openshift/origin-cluster-capacity
                imagePullPolicy: "Always"
                volumeMounts:
                - mountPath: /test-pod
                  name: test-volume
                env:
                - name: CC_INCLUSTER 1
                  value: "true"
                command:
                - "/bin/sh"
                - "-ec"
                - |
                  /bin/cluster-capacity --podspec=/test-pod/pod.yaml --verbose
              restartPolicy: "Never"
              serviceAccountName: cluster-capacity-sa
              volumes:
              - name: test-volume
                configMap:
                  name: cluster-capacity-configmap
      1
      ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ํˆด์— ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ Pod๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ํ•„์ˆ˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
      ConfigMap ์˜ค๋ธŒ์ ํŠธ์˜ pod.yaml ํ‚ค๋Š” ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ Pod ์‚ฌ์–‘ ํŒŒ์ผ์˜ ์ด๋ฆ„๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Pod ๋‚ด๋ถ€์—์„œ /test-pod/pod.yaml๋กœ ์ž…๋ ฅ Pod ์‚ฌ์–‘ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ Pod์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์šฉ๋Ÿ‰ ์ด๋ฏธ์ง€๋ฅผ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f cluster-capacity-job.yaml

๊ฒ€์ฆ

  1. ์ž‘์—… ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” Pod ์ˆ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

    $ oc logs jobs/cluster-capacity-job

    ์ถœ๋ ฅ ์˜ˆ

    small-pod pod requirements:
            - CPU: 150m
            - Memory: 100Mi
    
    The cluster can schedule 52 instance(s) of the pod small-pod.
    
    Termination reason: Unschedulable: No nodes are available that match all of the
    following predicates:: Insufficient cpu (2).
    
    Pod distribution among nodes:
    small-pod
            - 192.168.124.214: 26 instance(s)
            - 192.168.124.120: 26 instance(s)

8.3. Pod์— ๋Œ€ํ•œ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

๊ด€๋ฆฌ์ž๋Š” Pod์— ํšจ์œจ์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

8.3.1. ์žฌ์‹œ์ž‘ ํ›„ Pod ์ž‘๋™ ๋ฐฉ์‹ ๊ตฌ์„ฑ

Pod ์žฌ์‹œ์ž‘ ์ •์ฑ…์— ๋”ฐ๋ผ ํ•ด๋‹น Pod์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ OpenShift Container Platform์—์„œ ์‘๋‹ตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ •์ฑ…์€ ํ•ด๋‹น Pod์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Always - ๊ธ‰๊ฒฉํ•œ ๋ฐฑ์˜คํ”„ ์ง€์—ฐ(10์ดˆ, 20์ดˆ, 40์ดˆ)์„ 5๋ถ„์œผ๋กœ ์ œํ•œํ•˜์—ฌ Pod์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์†์ ์œผ๋กœ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Always์ž…๋‹ˆ๋‹ค.
  • OnFailure - ๊ธ‰๊ฒฉํ•œ ๋ฐฑ์˜คํ”„ ์ง€์—ฐ(10์ดˆ, 20์ดˆ, 40์ดˆ)์„ 5๋ถ„์œผ๋กœ ์ œํ•œํ•˜์—ฌ Pod์—์„œ ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • Never - Pod์—์„œ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pod๊ฐ€ ์ฆ‰์‹œ ์‹คํŒจํ•˜๊ณ  ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Pod๊ฐ€ ํŠน์ • ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ๋œ ํ›„์—๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋…ธ๋“œ ์žฅ์•  ์‹œ Pod๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ์ปจํŠธ๋กค๋Ÿฌ ์œ ํ˜•์žฌ์‹œ์ž‘ ์ •์ฑ…

์ข…๋ฃŒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” Pod(์˜ˆ: ์ผ๊ด„ ๊ณ„์‚ฐ)

Job

OnFailure ๋˜๋Š” Never

์ข…๋ฃŒ๋˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” Pod(์˜ˆ: ์›น ์„œ๋ฒ„)

๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ

Always

๋จธ์‹ ๋‹น ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” Pod

๋ฐ๋ชฌ ์„ธํŠธ

Any

Pod์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์žฌ์‹œ์ž‘ ์ •์ฑ…์ด OnFailure๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ Pod๊ฐ€ ๋…ธ๋“œ์— ๋‚จ์•„ ์žˆ๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์žฌ์‹œ์ž‘ ์ •์ฑ… Never๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ „์ฒด Pod๊ฐ€ ์‹คํŒจํ•˜๋ฉด OpenShift Container Platform์—์„œ ์ƒˆ Pod๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒˆ Pod์—์„œ ์žฌ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ด์ „ ์‹คํ–‰์œผ๋กœ ๋ฐœ์ƒํ•œ ์ž„์‹œ ํŒŒ์ผ, ์ž ๊ธˆ, ๋ถˆ์™„์ „ํ•œ ์ถœ๋ ฅ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Kubernetes ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์˜ ๋์ ์ด ์•ˆ์ •์ ์ธ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ์ค‘๋‹จ๋˜๋ฉด kubelet์—์„œ OpenShift Container Platform์ด ์žฌ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ๋์ ์ด ์•ˆ์ •์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํด๋ผ์šฐ๋“œ๊ฐ€ ์•„๋‹Œ ํ™˜๊ฒฝ์—์„œ์ฒ˜๋Ÿผ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ํ†ตํ•ฉ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

OpenShift Container Platform์—์„œ ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ์— ์žฌ์‹œ์ž‘ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubernetes ์„ค๋ช…์„œ์˜ ์˜ˆ์ œ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

8.3.2. Pod์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์—ญํญ ์ œํ•œ

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

์ ˆ์ฐจ

Pod์˜ ๋Œ€์—ญํญ์„ ์ œํ•œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์˜ค๋ธŒ์ ํŠธ ์ •์˜ JSON ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  kubernetes.io/ingress-bandwidth ๋ฐ kubernetes.io/egress-bandwidth ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํŠธ๋ž˜ํ”ฝ ์†๋„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Pod ์†ก์‹  ๋ฐ ์ˆ˜์‹  ๋Œ€์—ญํญ์„ ๋‘˜ ๋‹ค 10M/s๋กœ ์ œํ•œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ์ œํ•œ๋œ Pod ์˜ค๋ธŒ์ ํŠธ ์ •์˜

    {
        "kind": "Pod",
        "spec": {
            "containers": [
                {
                    "image": "openshift/hello-openshift",
                    "name": "hello-openshift"
                }
            ]
        },
        "apiVersion": "v1",
        "metadata": {
            "name": "iperf-slow",
            "annotations": {
                "kubernetes.io/ingress-bandwidth": "10M",
                "kubernetes.io/egress-bandwidth": "10M"
            }
        }
    }

  2. ์˜ค๋ธŒ์ ํŠธ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file_or_dir_path>

8.3.3. Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ pod ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ๋…ธ๋“œ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•˜๋Š” ๋“ฑ ์ž‘์—… ์ค‘์— Pod์— ๋Œ€ํ•œ ๋ณด์•ˆ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

PodDisruptionBudget ์˜ค๋ธŒ์ ํŠธ์˜ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ผ๋ จ์˜ pod์— ๋Œ€ํ•œ ๋ผ๋ฒจ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์ธ ๋ผ๋ฒจ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค.
  • ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ตœ์†Œ pod ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฐ€์šฉ์„ฑ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

    • minAvailable์€ ์ค‘๋‹จ ์ค‘์—๋„ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋Š” pod ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • maxUnavailable์€ ์ค‘๋‹จ ์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” pod ์ˆ˜์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ 

Available ์€ condition Ready=True ๊ฐ€ ์žˆ๋Š” Pod ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ready=True ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Pod๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค์˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

maxUnavailable 0 % ๋˜๋Š” 0์ด๋‚˜ minAvailable์˜ 100 % ํ˜น์€ ๋ณต์ œ๋ณธ ์ˆ˜์™€ ๋™์ผํ•œ ๊ฐ’์€ ํ—ˆ์šฉ๋˜์ง€๋งŒ ์ด๋กœ ์ธํ•ด ๋…ธ๋“œ๊ฐ€ ๋“œ๋ ˆ์ธ๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc get poddisruptionbudget --all-namespaces

์ถœ๋ ฅ ์˜ˆ

NAMESPACE                              NAME                                    MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
openshift-apiserver                    openshift-apiserver-pdb                 N/A             1                 1                     121m
openshift-cloud-controller-manager     aws-cloud-controller-manager            1               N/A               1                     125m
openshift-cloud-credential-operator    pod-identity-webhook                    1               N/A               1                     117m
openshift-cluster-csi-drivers          aws-ebs-csi-driver-controller-pdb       N/A             1                 1                     121m
openshift-cluster-storage-operator     csi-snapshot-controller-pdb             N/A             1                 1                     122m
openshift-cluster-storage-operator     csi-snapshot-webhook-pdb                N/A             1                 1                     122m
openshift-console                      console                                 N/A             1                 1                     116m
#...

PodDisruptionBudget์€ ์‹œ์Šคํ…œ์—์„œ ์ตœ์†Œ minAvailable pod๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ ์ •์ƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ด ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋Š” ๋ชจ๋“  pod๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Pod ์šฐ์„  ์ˆœ์œ„ ๋ฐ ์„ ์  ์„ค์ •์— ๋”ฐ๋ผ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ pod๋Š” pod ์ค‘๋‹จ ์˜ˆ์‚ฐ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ฌด์‹œํ•˜๊ณ  ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.3.3.1. Pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•ด์•ผ ํ•  pod ์ˆ˜ ์ง€์ •

PodDisruptionBudget ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ์— ๊ฐ€๋™๋˜์–ด์•ผ ํ•˜๋Š” ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜ ๋˜๋Š” ๋ฐฑ๋ถ„์œจ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

pod ์ค‘๋‹จ ์˜ˆ์‚ฐ์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ YAML ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    apiVersion: policy/v1 1
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      minAvailable: 2  2
      selector:  3
        matchLabels:
          name: my-pod
    1
    PodDisruptionBudget ์€ policy/v1 API ๊ทธ๋ฃน์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.
    2
    ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ํ•„์š”๊ฐ€ ์žˆ๋Š” ์ตœ์†Œ pod ์ˆ˜ ์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋˜๋Š” ๋ฐฑ๋ถ„์œจ (์˜ˆ: 20 %)์„ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3
    ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋ผ๋ฒจ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. matchLabels ๋ฐ matchExpressions์˜ ๊ฒฐ๊ณผ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜(์˜ˆ: selector {} )๋ฅผ ๋น„์›Œ ๋‘๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  Pod๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: policy/v1 1
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      maxUnavailable: 25% 2
      selector: 3
        matchLabels:
          name: my-pod
    1
    PodDisruptionBudget ์€ policy/v1 API ๊ทธ๋ฃน์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.
    2
    ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์ตœ๋Œ€ pod ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋˜๋Š” ๋ฐฑ๋ถ„์œจ (์˜ˆ: 20 %)์„ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3
    ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋ผ๋ฒจ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. matchLabels ๋ฐ matchExpressions์˜ ๊ฒฐ๊ณผ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜(์˜ˆ: selector {} )๋ฅผ ๋น„์›Œ ๋‘๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  Pod๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f </path/to/file> -n <project_name>

8.3.4. ์ค‘์š” Pod๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ์ œ๊ฑฐ ๋ฐฉ์ง€

์™„์ „ํžˆ ์ž‘๋™ํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ค‘์š”ํ•˜์ง€๋งŒ ๋งˆ์Šคํ„ฐ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ๋˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”๋กœ ํ‘œ์‹œ๋œ Pod๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

Pod๋ฅผ ์ค‘์š”๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. Pod ์‚ฌ์–‘์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ system-cluster-critical ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๋„๋ก ๊ธฐ์กด Pod๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pdb
    spec:
      template:
        metadata:
          name: critical-pod
        priorityClassName: system-cluster-critical 1
    1
    ๋…ธ๋“œ์—์„œ ์ œ๊ฑฐํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” Pod์˜ ๊ธฐ๋ณธ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

    ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ค‘์š”ํ•œ Pod์— ๋Œ€ํ•ด system-node-critical์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file-name>.yaml

8.4. ์ œํ•œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ์ œํ•œ

๊ธฐ๋ณธ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋Š” OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค์™€ ํ•จ๊ป˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ œํ•œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ ํŠน์ • ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Pod ๋ฐ ์ปจํ…Œ์ด๋„ˆ: Pod ๋ฐ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ: ImageStream ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ด๋ฏธ์ง€ ๋ฐ ํƒœ๊ทธ ์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€: ๋‚ด๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • PVC(์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„): ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” PVC ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pod๊ฐ€ ์ œํ•œ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์ ์šฉ๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Pod๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

8.4.1. ์ œํ•œ ๋ฒ”์œ„ ์ •๋ณด

LimitRange ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ •์˜ํ•˜๋Š” ์ œํ•œ ๋ฒ”์œ„๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Pod, ์ปจํ…Œ์ด๋„ˆ, ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ ๋˜๋Š” PVC(์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„)์— ๋Œ€ํ•œ ํŠน์ • ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •์„ ์œ„ํ•œ ๋ชจ๋“  ์š”์ฒญ์€ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ LimitRange ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๊ฐ€ ์—ด๊ฑฐ๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋Š” ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

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

์ปจํ…Œ์ด๋„ˆ์˜ ์ œํ•œ ๋ฒ”์œ„ ์˜ค๋ธŒ์ ํŠธ ์ƒ˜ํ”Œ

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits"
spec:
  limits:
    - type: "Container"
      max:
        cpu: "2"
        memory: "1Gi"
      min:
        cpu: "100m"
        memory: "4Mi"
      default:
        cpu: "300m"
        memory: "200Mi"
      defaultRequest:
        cpu: "200m"
        memory: "100Mi"
      maxLimitRequestRatio:
        cpu: "10"

8.4.1.1. ๊ตฌ์„ฑ ์š”์†Œ ์ œํ•œ ์ •๋ณด

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ œํ•œ ๋ฒ”์œ„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜ˆ์ œ๋Š” ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ๋ถ„๋ฅ˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ์ผ๋ถ€ ๋˜๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹จ์ผ LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.4.1.1.1. ์ปจํ…Œ์ด๋„ˆ ์ œํ•œ

์ œํ•œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Pod์˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด Pod ์‚ฌ์–‘์˜ ์ปจํ…Œ์ด๋„ˆ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์„ค์ •๋œ ๊ฐ’์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด Pod๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์š”์ฒญ ๋ฐ ์ œํ•œ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ์˜ min ๋ฆฌ์†Œ์Šค ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๋ฐ ์ œํ•œ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ์˜ max ๋ฆฌ์†Œ์Šค ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    LimitRange ์˜ค๋ธŒ์ ํŠธ์—์„œ max CPU๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ Pod ์‚ฌ์–‘์— CPU request ๊ฐ’์„ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œํ•œ ๋ฒ”์œ„์— ์ง€์ •๋œ ์ตœ๋Œ€ CPU ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” CPU limit ๊ฐ’์€ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์š”์ฒญ์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ ์ œํ•œ ๋น„์œจ์€ LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ์˜ maxLimitRequestRatio ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    LimitRange ์˜ค๋ธŒ์ ํŠธ์—์„œ maxLimitRequestRatio ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ์— request ๋ฐ limit ๊ฐ’์ด ๋ชจ๋‘ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์€ limit ๊ฐ’์„ request ๊ฐ’์œผ๋กœ ๋‚˜๋ˆ  ์ œํ•œ ๋Œ€ ์š”์ฒญ ๋น„์œจ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ 1๋ณด๋‹ค ํฐ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…Œ์ด๋„ˆ์˜ limit ๊ฐ’์ด cpu: 500์ด๊ณ  request ๊ฐ’์ด cpu: 100์ธ ๊ฒฝ์šฐ cpu์˜ ์ œํ•œ ๋Œ€ ์š”์ฒญ ๋น„์œจ์€ 5์ž…๋‹ˆ๋‹ค. ์ด ๋น„์œจ์€ maxLimitRequestRatio๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Pod ์‚ฌ์–‘์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ์ œํ•œ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ œํ•œ ๋ฒ”์œ„ ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ์˜ default ๋˜๋Š” defaultRequest CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์ด ์ปจํ…Œ์ด๋„ˆ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ LimitRange ์˜ค๋ธŒ์ ํŠธ ์ •์˜

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: "Container"
      max:
        cpu: "2" 2
        memory: "1Gi" 3
      min:
        cpu: "100m" 4
        memory: "4Mi" 5
      default:
        cpu: "300m" 6
        memory: "200Mi" 7
      defaultRequest:
        cpu: "200m" 8
        memory: "100Mi" 9
      maxLimitRequestRatio:
        cpu: "10" 10

1
LimitRange ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2
Pod์˜ ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ CPU ์–‘์ž…๋‹ˆ๋‹ค.
3
Pod์˜ ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ์–‘์ž…๋‹ˆ๋‹ค.
4
Pod์˜ ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ CPU ์–‘์ž…๋‹ˆ๋‹ค.
5
Pod์˜ ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋ฉ”๋ชจ๋ฆฌ ์–‘์ž…๋‹ˆ๋‹ค.
6
Pod ์‚ฌ์–‘์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ CPU ์–‘์ž…๋‹ˆ๋‹ค.
7
Pod ์‚ฌ์–‘์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ์–‘์ž…๋‹ˆ๋‹ค.
8
Pod ์‚ฌ์–‘์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ CPU ์–‘์ž…๋‹ˆ๋‹ค.
9
Pod ์‚ฌ์–‘์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ์–‘์ž…๋‹ˆ๋‹ค.
10
์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์ œํ•œ ๋Œ€ ์š”์ฒญ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
8.4.1.1.2. Pod ์ œํ•œ

์ œํ•œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์ •๋œ ํ”„๋กœ์ ํŠธ์˜ Pod์—์„œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด Pod ์‚ฌ์–‘์˜ ์ปจํ…Œ์ด๋„ˆ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์„ค์ •๋œ ๊ฐ’์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด Pod๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Pod ์‚ฌ์–‘์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ์ œํ•œ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ œํ•œ ๋ฒ”์œ„ ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ์˜ default ๋˜๋Š” defaultRequest CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์ด ์ปจํ…Œ์ด๋„ˆ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

Pod์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค์Œ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์š”์ฒญ ๋ฐ ์ œํ•œ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ Pod์˜ min ๋ฆฌ์†Œ์Šค ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์š”์ฒญ ๋ฐ ์ œํ•œ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ Pod์˜ max ๋ฆฌ์†Œ์Šค ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ ์ œํ•œ ๋Œ€ ์š”์ฒญ ๋น„์œจ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ maxLimitRequestRatio ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Pod LimitRange ์˜ค๋ธŒ์ ํŠธ ์ •์˜

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: "Pod"
      max:
        cpu: "2" 2
        memory: "1Gi" 3
      min:
        cpu: "200m" 4
        memory: "6Mi" 5
      maxLimitRequestRatio:
        cpu: "10" 6

1
์ œํ•œ ๋ฒ”์œ„ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2
Pod์—์„œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ CPU ์–‘์ž…๋‹ˆ๋‹ค.
3
Pod์—์„œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ์–‘์ž…๋‹ˆ๋‹ค.
4
Pod์—์„œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ CPU ์–‘์ž…๋‹ˆ๋‹ค.
5
Pod์—์„œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋ฉ”๋ชจ๋ฆฌ ์–‘์ž…๋‹ˆ๋‹ค.
6
์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์ œํ•œ ๋Œ€ ์š”์ฒญ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
8.4.1.1.3. ์ด๋ฏธ์ง€ ์ œํ•œ

LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด OpenShift ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ด๋ฏธ์ง€์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenShift ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ ์ด๋ฏธ์ง€์˜ max ํฌ๊ธฐ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ LimitRange ์˜ค๋ธŒ์ ํŠธ ์ •์˜

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: openshift.io/Image
      max:
        storage: 1Gi 2

1
LimitRange ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2
OpenShift ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ด๋ฏธ์ง€์˜ ์ตœ๋Œ€ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ 

์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋Š” Blob์ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์—…๋กœ๋“œ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ํ• ๋‹น๋Ÿ‰์„ ์ ์šฉํ•˜๋„๋ก ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜

์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํŠนํžˆ Docker 1.10 ์ด์ƒ์œผ๋กœ ๋นŒ๋“œํ•˜์—ฌ v2 ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ๋‚ด๋ณด๋‚ธ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ ๊ทธ๋Ÿฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ Docker ๋ฐ๋ชฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ชจ๋“  ํฌ๊ธฐ ์ •๋ณด๊ฐ€ ์—†๋Š” ์Šคํ‚ค๋งˆ v1๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์— ์Šคํ† ๋ฆฌ์ง€ ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

8.4.1.1.4. ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ ์ œํ•œ

LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ œํ•œ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ์—์„œ ๋‹ค์Œ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ImageStream ์‚ฌ์–‘์˜ ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์ˆ˜๊ฐ€ LimitRange ์˜ค๋ธŒ์ ํŠธ์˜ openshift.io/image-tags ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ImageStream ์‚ฌ์–‘์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๊ณ ์œ  ์ฐธ์กฐ ์ˆ˜๊ฐ€ ์ œํ•œ ๋ฒ”์œ„ ์˜ค๋ธŒ์ ํŠธ์˜ openshift.io/images ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ LimitRange ์˜ค๋ธŒ์ ํŠธ ์ •์˜

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: openshift.io/ImageStream
      max:
        openshift.io/image-tags: 20 2
        openshift.io/images: 30 3

1
LimitRange ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2
imagestream ์‚ฌ์–‘์˜ imagestream.spec.tags ๋งค๊ฐœ๋ณ€์ˆ˜์— ์žˆ๋Š” ์ตœ๋Œ€ ๊ณ ์œ  ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์ˆ˜์ž…๋‹ˆ๋‹ค.
3
imagestream ์‚ฌ์–‘์˜ imagestream.status.tags ๋งค๊ฐœ๋ณ€์ˆ˜์— ์žˆ๋Š” ์ตœ๋Œ€ ๊ณ ์œ  ์ด๋ฏธ์ง€ ์ฐธ์กฐ ์ˆ˜์ž…๋‹ˆ๋‹ค.

openshift.io/image-tags ๋ฆฌ์†Œ์Šค๋Š” ๊ณ ์œ  ์ด๋ฏธ์ง€ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ๋Š” ImageStreamTag, ImageStreamImage, DockerImage์ž…๋‹ˆ๋‹ค. ํƒœ๊ทธ๋Š” oc tag ๋ฐ oc import-image ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์ฐธ์กฐ์™€ ์™ธ๋ถ€ ์ฐธ์กฐ๋Š” ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ImageStream ์‚ฌ์–‘์— ํƒœ๊ทธ๋œ ๊ฐ๊ฐ์˜ ๊ณ ์œ  ์ฐธ์กฐ๋Š” ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋Œ€ํ•œ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ œํ•œํ•˜์ง€ ์•Š์ง€๋งŒ ํƒœ๊ทธ ์ œํ•œ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

openshift.io/images ๋ฆฌ์†Œ์Šค๋Š” ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ ์ƒํƒœ์— ๊ธฐ๋ก๋œ ๊ณ ์œ  ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด OpenShift ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€ ์ฐธ์กฐ๋Š” ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

8.4.1.1.5. ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„ ์ œํ•œ

LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PVC(์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„)์— ์š”์ฒญ๋œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์—์„œ ๋‹ค์Œ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • PVC(์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„)์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ PVC์˜ min ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • PVC(์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„)์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด LimitRange ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ •๋œ PVC์˜ max ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PVC LimitRange ์˜ค๋ธŒ์ ํŠธ ์ •์˜

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: "PersistentVolumeClaim"
      min:
        storage: "2Gi" 2
      max:
        storage: "50Gi" 3

1
LimitRange ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2
์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์Šคํ† ๋ฆฌ์ง€ ์–‘์ž…๋‹ˆ๋‹ค.
3
์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์Šคํ† ๋ฆฌ์ง€ ์–‘์ž…๋‹ˆ๋‹ค.

8.4.2. ์ œํ•œ ๋ฒ”์œ„ ์ƒ์„ฑ

ํ”„๋กœ์ ํŠธ์— ์ œํ•œ ๋ฒ”์œ„๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•„์š”ํ•œ ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: "v1"
    kind: "LimitRange"
    metadata:
      name: "resource-limits" 1
    spec:
      limits:
        - type: "Pod" 2
          max:
            cpu: "2"
            memory: "1Gi"
          min:
            cpu: "200m"
            memory: "6Mi"
        - type: "Container" 3
          max:
            cpu: "2"
            memory: "1Gi"
          min:
            cpu: "100m"
            memory: "4Mi"
          default: 4
            cpu: "300m"
            memory: "200Mi"
          defaultRequest: 5
            cpu: "200m"
            memory: "100Mi"
          maxLimitRequestRatio: 6
            cpu: "10"
        - type: openshift.io/Image 7
          max:
            storage: 1Gi
        - type: openshift.io/ImageStream 8
          max:
            openshift.io/image-tags: 20
            openshift.io/images: 30
        - type: "PersistentVolumeClaim" 9
          min:
            storage: "2Gi"
          max:
            storage: "50Gi"
    1
    LimitRange ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    Pod์— ์ œํ•œ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ํ•„์š”์— ๋”ฐ๋ผ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    ์ปจํ…Œ์ด๋„ˆ์— ์ œํ•œ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ํ•„์š”์— ๋”ฐ๋ผ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    4
    ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ Pod ์‚ฌ์–‘์— ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    5
    ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ Pod ์‚ฌ์–‘์— ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    6
    ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ Pod ์‚ฌ์–‘์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ œํ•œ ๋Œ€ ์š”์ฒญ ๋น„์œจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    7
    ์ด๋ฏธ์ง€ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ œํ•œ์„ ์„ค์ •ํ•˜๋ ค๋ฉด OpenShift ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    8
    ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ œํ•œ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ํ•„์š”์— ๋”ฐ๋ผ ImageStream ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด๋ฏธ์ง€ ํƒœ๊ทธ ๋ฐ ์ฐธ์กฐ ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    9
    ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„์— ๋Œ€ํ•œ ์ œํ•œ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ์Šคํ† ๋ฆฌ์ง€ ์–‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <limit_range_file> -n <project> 1
    1
    ์ƒ์„ฑํ•œ YAML ํŒŒ์ผ์˜ ์ด๋ฆ„๊ณผ ์ œํ•œ์„ ์ ์šฉํ•  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

8.4.3. ์ œํ•œ ๋ณด๊ธฐ

์›น ์ฝ˜์†”์—์„œ ํ”„๋กœ์ ํŠธ์˜ ํ• ๋‹น๋Ÿ‰ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์— ์ •์˜๋œ ์ œํ•œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œํ•œ ๋ฒ”์œ„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋กœ์ ํŠธ์— ์ •์˜๋œ LimitRange ์˜ค๋ธŒ์ ํŠธ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด demoproject๋ผ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc get limits -n demoproject
    NAME              CREATED AT
    resource-limits   2020-07-15T17:14:23Z
  2. ๊ด€์‹ฌ ์žˆ๋Š” LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: resource-limits ์ œํ•œ ๋ฒ”์œ„).

    $ oc describe limits resource-limits -n demoproject
    Name:                           resource-limits
    Namespace:                      demoproject
    Type                            Resource                Min     Max     Default Request Default Limit   Max Limit/Request Ratio
    ----                            --------                ---     ---     --------------- -------------   -----------------------
    Pod                             cpu                     200m    2       -               -               -
    Pod                             memory                  6Mi     1Gi     -               -               -
    Container                       cpu                     100m    2       200m            300m            10
    Container                       memory                  4Mi     1Gi     100Mi           200Mi           -
    openshift.io/Image              storage                 -       1Gi     -               -               -
    openshift.io/ImageStream        openshift.io/image      -       12      -               -               -
    openshift.io/ImageStream        openshift.io/image-tags -       10      -               -               -
    PersistentVolumeClaim           storage                 -       50Gi    -               -               -

8.4.4. ์ œํ•œ ๋ฒ”์œ„ ์‚ญ์ œ

ํ™œ์„ฑ LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋” ์ด์ƒ ํ”„๋กœ์ ํŠธ์— ์ œํ•œ์„ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    $ oc delete limits <limit_name>

8.5. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์œ„ํ—˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์„ฑ

ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์œ„ํ—˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ตœ์ ์œผ๋กœ ์ค€์ˆ˜ํ•˜๋„๋ก ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Ÿฐํƒ€์ž„(์˜ˆ: OpenJDK)์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๊ณผ ์—ฐ๊ฒฐ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์˜ค๋ฅ˜ ์กฐ๊ฑด์„ ์ง„๋‹จ ๋ฐ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

8.5.1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ดํ•ด

๊ณ„์†ํ•˜๊ธฐ ์ „์— OpenShift Container Platform์—์„œ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ๊ผผ๊ผผํžˆ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐ ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค(๋ฉ”๋ชจ๋ฆฌ, CPU, ์Šคํ† ๋ฆฌ์ง€)์— ๋Œ€ํ•ด OpenShift Container Platform์—์„œ๋Š” ์„ ํƒ์ ์ธ ์š”์ฒญ ๋ฐ ์ œํ•œ ๊ฐ’์„ Pod์˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์— ๋Œ€ํ•ด ๋‹ค์Œ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  • ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ

    • ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด OpenShift Container Platform ์Šค์ผ€์ค„๋Ÿฌ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋…ธ๋“œ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ˆ์•ฝํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์„ ๊ณ ๋ คํ•œ ๋‹ค์Œ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์„ ํƒํ•œ ๋…ธ๋“œ์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
    • ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ๋ชจ๋˜๋ฉด OpenShift Container Platform์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์„ ๊ฐ€์žฅ ๋งŽ์ด ์ดˆ๊ณผํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ๊ฐ€ ์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ ๋…ธ๋“œ OOM ์ข…๋ฃŒ์ž๋Š” ์œ ์‚ฌํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ ํƒํ•˜๊ณ  ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๊ฐ’์— ํ• ๋‹น๋Ÿ‰์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ณผ๋‹ค ํ• ๋‹น์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๊ฐ’์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ

    • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํ•˜๋“œ ์ œํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์ปจํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—์„œ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋ฉด ๋…ธ๋“œ์˜ OOM(Out of Memory) ์ข…๋ฃŒ์ž์—์„œ ์ฆ‰์‹œ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๋ฐ ์ œํ•œ์„ ๋‘˜ ๋‹ค ์ง€์ •ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ๊ฐ’์— ํ• ๋‹น๋Ÿ‰์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ตœ์†Œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์€ 12MB์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ Pod ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ๋„ˆ๋ฌด ๋‚ฎ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ์„ ์ œ๊ฑฐํ•˜๋ฉด Pod์—์„œ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
8.5.1.1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ ์ „๋žต ๊ด€๋ฆฌ

OpenShift Container Platform์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์˜ˆ์ƒ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

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

  2. ์œ„ํ—˜ ์œ ํ˜• ํ™•์ธ

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

  3. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ์„ค์ •

    ์œ„ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ผ์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์ด ๋„ˆ๋ฌด ๋†’์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ํ• ๋‹น๋Ÿ‰ ์‚ฌ์šฉ์ด ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์ด ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œ๊ฑฐ ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง‘๋‹ˆ๋‹ค.

  4. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์„ค์ •

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

    ์ผ๋ถ€ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ์ œํ•œ ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ์ œํ•œ์— ๋”ฐ๋ผ ์š”์ฒญ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€์—์„œ๋Š” ์š”์ฒญ ๊ฐ’๋ณด๋‹ค ํƒ์ง€ํ•˜๊ธฐ ์‰ฌ์šด ์„ค์ •๋œ ์ œํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์ƒ๋˜๋Š” ์ตœ๋Œ€ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๋ฐฑ๋ถ„์œจ๋กœ ๋œ ์•ˆ์ „ ๋ฒ”์œ„ ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  5. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠœ๋‹๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

    ์ ์ ˆํ•œ ๊ฒฝ์šฐ ๊ตฌ์„ฑ๋œ ์š”์ฒญ ๋ฐ ์ œํ•œ ๊ฐ’๊ณผ ๊ด€๋ จํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠœ๋‹๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ํŠนํžˆ JVM๊ณผ ๊ฐ™์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ’€๋งํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ๋Š” ์ด ์ž‘์—…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

8.5.2. OpenShift Container Platform์— ๋Œ€ํ•œ OpenJDK ์„ค์ • ์ดํ•ด

๊ธฐ๋ณธ OpenJDK ์„ค์ •์€ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ํ™˜๊ฒฝ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ์—์„œ OpenJDK๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ Java ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •์„ ํ•ญ์ƒ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

JVM ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์€ ๋ณต์žกํ•˜๊ณ  ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด ๋ฌธ์„œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์†Œํ•œ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์ž‘์—…์€ ์ปจํ…Œ์ด๋„ˆ์—์„œ OpenJDK๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์ž‘์ ์œผ๋กœ์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. JVM ์ตœ๋Œ€ ํž™ ํฌ๊ธฐ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  2. ์ ์ ˆํ•œ ๊ฒฝ์šฐ JVM์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šด์˜ ์ฒด์ œ์— ์ œ๊ณตํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ๋ชจ๋“  JVM ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

8.5.2.1. JVM ์ตœ๋Œ€ ํž™ ํฌ๊ธฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

๋Œ€๋‹ค์ˆ˜์˜ Java ์›Œํฌ๋กœ๋“œ์—์„œ JVM ํž™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ผ ์†Œ๋น„ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ OpenJDK๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ OpenJDK๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š”์ง€์˜ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์ปดํ“จํŒ… ๋…ธ๋“œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ตœ๋Œ€ 1/4(1/-XX:MaxRAMFraction)์„ ํž™์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠนํžˆ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ๋„ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๋™์ž‘์„ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์ž‘์—…์€ ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ๊ณ  JVM์—์„œ ์‹คํ—˜ ์˜ต์…˜์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    UseCGroupMemoryLimitForHeap ์˜ต์…˜์ด JDK 11์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  -XX:+UseContainerSupport๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ์ด ๋ช…๋ น์€ -XX:MaxRAM์„ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์ตœ๋Œ€ ํž™ ํฌ๊ธฐ(-XX:MaxHeapSize / -Xmx)๋ฅผ 1/-XX:MaxRAMFraction(๊ธฐ๋ณธ๊ฐ’: 1/4)์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • -XX:MaxRAM, -XX:MaxHeapSize ๋˜๋Š” -Xmx ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง์ ‘ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

    ์ด ์˜ต์…˜์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๊ฐ’์„ ํ•˜๋“œ ์ฝ”๋”ฉํ•ด์•ผ ํ•˜์ง€๋งŒ ์•ˆ์ „ํ•œ ์—ฌ๋ฐฑ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

8.5.2.2. JVM์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šด์˜ ์ฒด์ œ์— ์ œ๊ณตํ•˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

๊ธฐ๋ณธ์ ์œผ๋กœ OpenJDK๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šด์˜ ์ฒด์ œ์— ์ ๊ทน์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๋‹ค์ˆ˜์˜ ์ปจํ…Œ์ด๋„ˆํ™”๋œ Java ์›Œํฌ๋กœ๋“œ์— ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ”๊ฐ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ์ธ์ง€ ์ถ”๊ฐ€ JVM์ธ์ง€ ๋˜๋Š” ์ด ๋‘˜์˜ ์กฐํ•ฉ์ธ์ง€์™€ ๊ด€๊ณ„์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์ถ”๊ฐ€ ํ™œ์„ฑ ํ”„๋กœ์„ธ์Šค๊ฐ€ JVM๊ณผ ๊ณต์กดํ•˜๋Š” ์›Œํฌ๋กœ๋“œ๋Š” ์ฃผ๋ชฉํ•  ๋งŒํ•œ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

OpenShift Container Platform Jenkins maven ์Šฌ๋ ˆ์ด๋ธŒ ์ด๋ฏธ์ง€์—์„œ๋Š” ๋‹ค์Œ JVM ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JVM์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šด์˜ ์ฒด์ œ์— ์ œ๊ณตํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.

-XX:+UseParallelGC
-XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4
-XX:AdaptiveSizePolicyWeight=90.

์ด๋Ÿฌํ•œ ์ธ์ˆ˜๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ์˜ 110%(-XX:MaxHeapFreeRatio)๋ฅผ ์ดˆ๊ณผํ•  ๋•Œ๋งˆ๋‹ค ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šด์˜ ์ฒด์ œ์— ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ, ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ์—์„œ ์ตœ๋Œ€ 20%(-XX:GCTimeRatio)์˜ CPU ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํž™ ํ• ๋‹น์€ ํ•ญ์ƒ ์ดˆ๊ธฐ ํž™ ํ• ๋‹น(-XX:InitialHeapSize / -Xms๋กœ ๋ฎ์–ด์”€)๋ณด๋‹ค ์ ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ OpenShift์—์„œ Java ํ’‹ํ”„๋ฆฐํŠธ ํŠœ๋‹(1๋ถ€), OpenShift์—์„œ Java ํ’‹ํ”„๋ฆฐํŠธ ํŠœ๋‹(2๋ถ€), OpenJDK ๋ฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.5.2.3. ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ๋ชจ๋“  JVM ํ”„๋กœ์„ธ์Šค๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ดํ•ด

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

๋Œ€๋‹ค์ˆ˜์˜ Java ํˆด์—์„œ๋Š” ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(JAVA_OPTS, GRADLE_OPTS, MAVEN_OPTS ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JVM์„ ๊ตฌ์„ฑํ•˜๋ฉฐ, ์˜ฌ๋ฐ”๋ฅธ ์„ค์ •์„ ์˜ฌ๋ฐ”๋ฅธ JVM์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenJDK๋Š” ํ•ญ์ƒ JAVA_TOOL_OPTIONS ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ค€์ˆ˜ํ•˜๊ณ  JAVA_TOOL_OPTIONS์— ์ง€์ •๋œ ๊ฐ’์€ JVM ๋ช…๋ น์ค„์— ์ง€์ •๋œ ๋‹ค๋ฅธ ์˜ต์…˜์—์„œ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์˜ต์…˜์ด ์Šฌ๋ ˆ์ด๋ธŒ ์ด๋ฏธ์ง€์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  JVM ์›Œํฌ๋กœ๋“œ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋„๋ก OpenShift Container Platform Jenkins maven ์Šฌ๋ ˆ์ด๋ธŒ ์ด๋ฏธ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

JAVA_TOOL_OPTIONS="-XX:+UnlockExperimentalVMOptions
-XX:+UseCGroupMemoryLimitForHeap -Dsun.zip.disableMemoryMapping=true"
์ฐธ๊ณ 

UseCGroupMemoryLimitForHeap ์˜ต์…˜์ด JDK 11์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  -XX:+UseContainerSupport๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์„ค์ •์„ ํ†ตํ•ด ์ถ”๊ฐ€ ์˜ต์…˜์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์œ ์šฉํ•œ ์‹œ์ž‘์ ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.5.3. Pod ๋‚ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๋ฐ ์ œํ•œ ์ฐพ๊ธฐ

Pod ๋‚ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๋ฐ ์ œํ•œ์„ ๋™์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ ค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Downward API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

  1. MEMORY_REQUEST ๋ฐ MEMORY_LIMIT ์Šคํƒ ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก Pod๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Pod
      metadata:
        name: test
      spec:
        containers:
        - name: test
          image: fedora:latest
          command:
          - sleep
          - "3600"
          env:
          - name: MEMORY_REQUEST 1
            valueFrom:
              resourceFieldRef:
                containerName: test
                resource: requests.memory
          - name: MEMORY_LIMIT 2
            valueFrom:
              resourceFieldRef:
                containerName: test
                resource: limits.memory
          resources:
            requests:
              memory: 384Mi
            limits:
              memory: 512Mi
      1
      ์ด ์Šคํƒ ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
      2
      ์ด ์Šคํƒ ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
    2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ Pod๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

๊ฒ€์ฆ

  1. ์›๊ฒฉ ์‰˜์„ ์‚ฌ์šฉํ•˜์—ฌ Pod์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

    $ oc rsh test
  2. ์š”์ฒญ๋œ ๊ฐ’์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ env | grep MEMORY | sort

    ์ถœ๋ ฅ ์˜ˆ

    MEMORY_LIMIT=536870912
    MEMORY_REQUEST=402653184

์ฐธ๊ณ 

๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ๊ฐ’์€ /sys/fs/cgroup/memory/memory.limit_in_bytes ํŒŒ์ผ์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.5.4. OOM ์ข…๋ฃŒ ์ •์ฑ… ์ดํ•ด

์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ ์ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ƒํƒœ๊ฐ€ ์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ์—๋Š” OpenShift Container Platform์—์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๊ฐ€ OOM(Out of Memory) ์ข…๋ฃŒ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ PID 1 ํ”„๋กœ์„ธ์Šค์—์„œ SIGKILL์„ ์ˆ˜์‹ ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ์ปจํ…Œ์ด๋„ˆ ๋™์ž‘์ด ๊ธฐํƒ€ ํ”„๋กœ์„ธ์Šค์˜ ๋™์ž‘์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฝ”๋“œ 137๋กœ ์ข…๋ฃŒ๋˜๋ฉด SIGKILL ์‹ ํ˜ธ๊ฐ€ ์ˆ˜์‹ ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด OOM ์ข…๋ฃŒ๋ฅผ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์›๊ฒฉ ์‰˜์„ ์‚ฌ์šฉํ•˜์—ฌ Pod์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

    # oc rsh test
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ /sys/fs/cgroup/memory/memory.oom_control์—์„œ ํ˜„์žฌ OOM ์ข…๋ฃŒ ์ˆ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control

    ์ถœ๋ ฅ ์˜ˆ

    oom_kill 0

  3. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ OOM ์ข…๋ฃŒ๋ฅผ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.

    $ sed -e '' </dev/zero

    ์ถœ๋ ฅ ์˜ˆ

    Killed

  4. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ sed ๋ช…๋ น์˜ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ echo $?

    ์ถœ๋ ฅ ์˜ˆ

    137

    137 ์ฝ”๋“œ๋Š” ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฝ”๋“œ 137๋กœ ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” SIGKILL ์‹ ํ˜ธ๊ฐ€ ์ˆ˜์‹ ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  5. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ /sys/fs/cgroup/memory/memory.oom_control์—์„œ OOM ์ข…๋ฃŒ ์นด์šดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control

    ์ถœ๋ ฅ ์˜ˆ

    oom_kill 1

    Pod์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ OOM ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ ๋‚˜์ค‘์— Pod๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด(์ฆ‰์‹œ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด) ๋‹จ๊ณ„๋Š” ์‹คํŒจ, ์ด์œ ๋Š” OOM ์ข…๋ฃŒ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. restartPolicy ๊ฐ’์— ๋”ฐ๋ผ OOM ์ข…๋ฃŒ๋œ Pod๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์‹œ์ž‘๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” Pod์˜ ์‹คํŒจ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด์ „ Pod๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Pod ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ oc get pod test

    ์ถœ๋ ฅ ์˜ˆ

    NAME      READY     STATUS      RESTARTS   AGE
    test      0/1       OOMKilled   0          1m

    • Pod๊ฐ€ ์žฌ์‹œ์ž‘๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ Pod๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc get pod test -o yaml

      ์ถœ๋ ฅ ์˜ˆ

      ...
      status:
        containerStatuses:
        - name: test
          ready: false
          restartCount: 0
          state:
            terminated:
              exitCode: 137
              reason: OOMKilled
        phase: Failed

    • ์žฌ์‹œ์ž‘๋œ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ Pod๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      $ oc get pod test -o yaml

      ์ถœ๋ ฅ ์˜ˆ

      ...
      status:
        containerStatuses:
        - name: test
          ready: true
          restartCount: 1
          lastState:
            terminated:
              exitCode: 137
              reason: OOMKilled
          state:
            running:
        phase: Running

8.5.5. Pod ์ œ๊ฑฐ ์ดํ•ด

๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ๋ชจ๋˜๋ฉด OpenShift Container Platform์€ ํ•ด๋‹น ๋…ธ๋“œ์—์„œ Pod๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์ œ๊ฑฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ์ œ๊ฑฐ์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„์ง ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค(PID 1)์—์„œ SIGTERM ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•œ ๋‹ค์Œ ์ž ์‹œ ํ›„ SIGKILL ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ •์ƒ์ ์ธ ์ œ๊ฑฐ์—์„œ๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค์—์„œ SIGKILL ์‹ ํ˜ธ๋ฅผ ์ฆ‰์‹œ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฑฐ๋œ Pod์˜ ๋‹จ๊ณ„๋Š” ์‹คํŒจ, ์ด์œ ๋Š” ์ œ๊ฑฐ๋จ์ž…๋‹ˆ๋‹ค. restartPolicy ๊ฐ’๊ณผ ๊ด€๊ณ„์—†์ด ์žฌ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” Pod์˜ ์‹คํŒจ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ƒˆ Pod๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด์ „ Pod๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

$ oc get pod test

์ถœ๋ ฅ ์˜ˆ

NAME      READY     STATUS    RESTARTS   AGE
test      0/1       Evicted   0          1m

$ oc get pod test -o yaml

์ถœ๋ ฅ ์˜ˆ

...
status:
  message: 'Pod The node was low on resource: [MemoryPressure].'
  phase: Failed
  reason: Evicted

8.6. ๊ณผ๋‹ค ํ• ๋‹น๋œ ๋…ธ๋“œ์— Pod๋ฅผ ๋ฐฐ์น˜ํ•˜๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

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

์ปจํ…Œ์ด๋„ˆ๋Š” ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฐ ์ œํ•œ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ์ปจํ…Œ์ด๋„ˆ ์˜ˆ์•ฝ์— ์‚ฌ์šฉ๋˜๋ฉฐ ์ตœ์†Œ ์„œ๋น„์Šค ๋ณด์žฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ์€ ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค์˜ ์–‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. Pod์˜ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฐ ๋…ธ๋“œ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์šฉ๋Ÿ‰์„ ๊ณ ๋ คํ•˜์—ฌ ํŠน์ • ๋…ธ๋“œ์— Pod๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform ๊ด€๋ฆฌ์ž๋Š” ๋…ธ๋“œ์—์„œ ๊ณผ๋‹ค ํ• ๋‹น ์ˆ˜์ค€์„ ์ œ์–ดํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋ฐ€๋„๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ClusterResourceOverrideOperator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๊ณผ๋‹ค ํ• ๋‹น์„ ๊ตฌ์„ฑํ•˜๋ฉด ๊ฐœ๋ฐœ์ž ์ปจํ…Œ์ด๋„ˆ์— ์„ค์ •๋œ ์š”์ฒญ๊ณผ ์ œํ•œ ์‚ฌ์ด์˜ ๋น„์œจ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ณผ๋‹ค ํ• ๋‹น ๋ฐ ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ์ œํ•œ๊ณผ ๊ธฐ๋ณธ๊ฐ’๊ณผ ํ•จ๊ป˜ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฐ ์š”์ฒญ์„ ์กฐ์ •ํ•˜์—ฌ ์›ํ•˜๋Š” ์ˆ˜์ค€์˜ ๊ณผ๋‹ค ํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

OpenShift Container Platform์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๊ณผ๋‹ค ํ• ๋‹น์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ณผ๋‹ค ํ• ๋‹น์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ ๊ณผ๋‹ค ํ• ๋‹น ๋น„ํ™œ์„ฑํ™”๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

8.6.1. ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฐ ๊ณผ๋‹ค ํ• ๋‹น

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

์ œํ•œ ์ ์šฉ์€ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์ œํ•œํ•˜์ง€ ์•Š์œผ๋ฉด ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฆฌ์†Œ์Šค ๋ณด์žฅ์ด ์—†๋Š” ์ƒํƒœ์—์„œ ๋…ธ๋“œ๋กœ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ๋กœ์ปฌ ์šฐ์„  ์ˆœ์œ„๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋งŒํผ์˜ ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•œ ์ƒํƒœ์—์„œ๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์˜ QoS (Quality of Service)๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์•ฝ์€ ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” ๋ฐ˜๋ฉด ํ• ๋‹น๋Ÿ‰ ๋ฐ ํ•˜๋“œ ์ œํ•œ์€ ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ด๋Š” ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๋ณด๋‹ค ๋†’์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ๊ณผ ์ œํ•œ์˜ ์ฐจ์ด์— ๋”ฐ๋ผ ์˜ค๋ฒ„ ์ปค๋ฐ‹ ์ˆ˜์ค€์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปจํ…Œ์ด๋„ˆ์— 1Gi์˜ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ๊ณผ 2Gi์˜ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์ง€์ •๋˜๋ฉด ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ 1Gi ์š”์ฒญ์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ˆ์•ฝ๋˜์ง€๋งŒ ์ตœ๋Œ€ 2Gi๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ 200% ์˜ค๋ฒ„ ์ปค๋ฐ‹๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

8.6.2. Cluster Resource Override Operator๋ฅผ ์‚ฌ์šฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ์˜ค๋ฒ„ ์ปค๋ฐ‹

Cluster Resource Override Operator๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์˜ค๋ฒ„ ์ปค๋ฐ‹ ์ˆ˜์ค€์„ ์ œ์–ดํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋ฐ€๋„๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์Šน์ธWebhook์ž…๋‹ˆ๋‹ค. Operator๋Š” ํŠน์ • ํ”„๋กœ์ ํŠธ์˜ ๋…ธ๋“œ๊ฐ€ ์ •์˜๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ํ•œ๊ณ„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์„น์…˜์— ์„ค๋ช…๋œ๋Œ€๋กœ OpenShift Container Platform ์ฝ˜์†” ๋˜๋Š” CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cluster Resource Override Operator๋ฅผ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ ์˜ˆ์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์˜ค๋ฒ„ ์ปค๋ฐ‹ ์ˆ˜์ค€์„ ์„ค์ •ํ•˜๋Š” ClusterResourceOverride ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค (CR)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

apiVersion: operator.autoscaling.openshift.io/v1
kind: ClusterResourceOverride
metadata:
    name: cluster 1
spec:
  podResourceOverride:
    spec:
      memoryRequestToLimitPercent: 50 2
      cpuRequestToLimitPercent: 25 3
      limitCPUToMemoryPercent: 200 4
# ...
1
์ด๋ฆ„์€ instance์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
2
์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์ง€์ •๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์ด ์ œํ•œ ๋ฐฑ๋ถ„์œจ (1-100)๋กœ ๋ฎ์–ด ์“ฐ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 50์ž…๋‹ˆ๋‹ค.
3
์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ CPU ์ œํ•œ์ด ์ง€์ •๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ CPU ์š”์ฒญ์ด 1-100 ์‚ฌ์ด์˜ ์ œํ•œ ๋ฐฑ๋ถ„์œจ๋กœ ๋ฎ์–ด ์“ฐ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 25์ž…๋‹ˆ๋‹ค.
4
์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์ง€์ •๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, CPU ์ œํ•œ์ด ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์˜ ๋ฐฑ๋ถ„์œจ๋กœ ๋ฎ์–ด ์“ฐ๊ธฐ๋ฉ๋‹ˆ๋‹ค. 1Gi์˜ RAM์„ 100 %๋กœ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๊ฒƒ์€ 1 ๊ฐœ์˜ CPU ์ฝ”์–ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. CPU ์š”์ฒญ์„ ์žฌ์ •์˜ํ•˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค (์„ค์ •๋œ ๊ฒฝ์šฐ). ๊ธฐ๋ณธ๊ฐ’์€ 200์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ 

์ปจํ…Œ์ด๋„ˆ์— ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ Cluster Resource Override Operator ๋ฎ์–ด ์“ฐ๊ธฐ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ณ„ ๊ธฐ๋ณธ ์ œํ•œ์ด ์žˆ๋Š” LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ Pod ์‚ฌ์–‘์— ์ œํ•œ์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ฐ ํ”„๋กœ์ ํŠธ์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋‹ค์Œ ๋ผ๋ฒจ์„ ์ ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ๋ฎ์–ด ์“ฐ๊ธฐ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Namespace
metadata:

# ...

  labels:
    clusterresourceoverrides.admission.autoscaling.openshift.io/enabled: "true"

# ...

Operator๋Š” ClusterResourceOverride CR์„ ๊ฐ์‹œํ•˜๊ณ  ClusterResourceOverride ์Šน์ธ Webhook๊ฐ€ operator์™€ ๋™์ผํ•œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

8.6.2.1. ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Cluster Resource Override Operator ์„ค์น˜

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Cluster Resource Override Operator๋ฅผ ์„ค์น˜ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ์ปจํ…Œ์ด๋„ˆ์— ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ Cluster Resource Override Operator์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์ œํ•œ์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ Pod ์‚ฌ์–‘์— ์ œํ•œ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Cluster Resource Override Operator๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ Home โ†’ Projects๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    1. Create Project๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. clusterresourceoverride-operator๋ฅผ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3. Create๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. Operators โ†’ OperatorHub๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    1. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Operator ๋ชฉ๋ก์—์„œ ClusterResourceOverride Operator๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ Install์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. Operator ์„ค์น˜ ํŽ˜์ด์ง€์—์„œ ์„ค์น˜ ๋ชจ๋“œ์— ๋Œ€ํ•ด ํด๋Ÿฌ์Šคํ„ฐ์˜ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์„ ํƒ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    3. Installed Namespace์— ๋Œ€ํ•ด clusterresourceoverride-operator๊ฐ€ ์„ ํƒ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    4. Update Channel ๋ฐ Approval Strategy๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    5. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. Installed Operators ํŽ˜์ด์ง€์—์„œ ClusterResourceOverride๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    1. ClusterResourceOverride Operator ์„ธ๋ถ€ ์ •๋ณด ํŽ˜์ด์ง€์—์„œ Create ClusterResourceOverride ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. Create ClusterResourceOverride ํŽ˜์ด์ง€์—์„œ YAML ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•˜๊ณ  YAML ํ…œํ”Œ๋ฆฟ์„ ํŽธ์ง‘ํ•˜์—ฌ ํ•„์š”์— ๋”ฐ๋ผ ์˜ค๋ฒ„ ์ปค๋ฐ‹ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: operator.autoscaling.openshift.io/v1
      kind: ClusterResourceOverride
      metadata:
        name: cluster 1
      spec:
        podResourceOverride:
          spec:
            memoryRequestToLimitPercent: 50 2
            cpuRequestToLimitPercent: 25 3
            limitCPUToMemoryPercent: 200 4
      # ...
      1
      ์ด๋ฆ„์€ instance์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      2
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ 1-100 ์‚ฌ์ด์˜ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 50์ž…๋‹ˆ๋‹ค.
      3
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ CPU ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ 1-100 ์‚ฌ์ด์˜ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 25์ž…๋‹ˆ๋‹ค.
      4
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค (์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ). 1Gi์˜ RAM์„ 100 %๋กœ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๊ฒƒ์€ 1 ๊ฐœ์˜ CPU ์ฝ”์–ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. CPU ์š”์ฒญ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค (์„ค์ •๋œ ๊ฒฝ์šฐ). ๊ธฐ๋ณธ๊ฐ’์€ 200์ž…๋‹ˆ๋‹ค.
    3. Create๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์—ฌ ์Šน์ธ Webhook์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    1. ClusterResourceOverride Operator ํŽ˜์ด์ง€์—์„œ cluster๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. ClusterResourceOverride Details ํŽ˜์ด์ง€์—์„œ YAML ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. webhook ํ˜ธ์ถœ ์‹œ mutatingWebhookConfigurationRef ์„น์…˜์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

      apiVersion: operator.autoscaling.openshift.io/v1
      kind: ClusterResourceOverride
      metadata:
        annotations:
          kubectl.kubernetes.io/last-applied-configuration: |
            {"apiVersion":"operator.autoscaling.openshift.io/v1","kind":"ClusterResourceOverride","metadata":{"annotations":{},"name":"cluster"},"spec":{"podResourceOverride":{"spec":{"cpuRequestToLimitPercent":25,"limitCPUToMemoryPercent":200,"memoryRequestToLimitPercent":50}}}}
        creationTimestamp: "2019-12-18T22:35:02Z"
        generation: 1
        name: cluster
        resourceVersion: "127622"
        selfLink: /apis/operator.autoscaling.openshift.io/v1/clusterresourceoverrides/cluster
        uid: 978fc959-1717-4bd1-97d0-ae00ee111e8d
      spec:
        podResourceOverride:
          spec:
            cpuRequestToLimitPercent: 25
            limitCPUToMemoryPercent: 200
            memoryRequestToLimitPercent: 50
      status:
      
      # ...
      
          mutatingWebhookConfigurationRef: 1
            apiVersion: admissionregistration.k8s.io/v1
            kind: MutatingWebhookConfiguration
            name: clusterresourceoverrides.admission.autoscaling.openshift.io
            resourceVersion: "127621"
            uid: 98b3b8ae-d5ce-462b-8ab5-a729ea8f38f3
      
      # ...
      1
      ClusterResourceOverride ์Šน์ธ Webhook ์ฐธ์กฐ
8.6.2.2. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cluster Resource Override Operator ์„ค์น˜

OpenShift Container Platform CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cluster Resource Override Operator๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์˜ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ์ปจํ…Œ์ด๋„ˆ์— ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ Cluster Resource Override Operator์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์ œํ•œ์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ Pod ์‚ฌ์–‘์— ์ œํ•œ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cluster Resource Override Operator๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. Cluster Resource Override Operator์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. Cluster Resource Override Operator์˜ Namespace ์˜ค๋ธŒ์ ํŠธ YAML ํŒŒ์ผ(์˜ˆ: cro-namespace.yaml)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: v1
      kind: Namespace
      metadata:
        name: clusterresourceoverride-operator
    2. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create -f cro-namespace.yaml
  2. Operator ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. Cluster Resource Override Operator์˜ OperatorGroup ์˜ค๋ธŒ์ ํŠธ YAML ํŒŒ์ผ(์˜ˆ: cro-og.yaml)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: clusterresourceoverride-operator
        namespace: clusterresourceoverride-operator
      spec:
        targetNamespaces:
          - clusterresourceoverride-operator
    2. Operator ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create -f cro-og.yaml
  3. ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. Cluster Resource Override Operator์˜ Subscription ์˜ค๋ธŒ์ ํŠธ YAML ํŒŒ์ผ(์˜ˆ: cro-sub.yaml)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: clusterresourceoverride
        namespace: clusterresourceoverride-operator
      spec:
        channel: "4.10"
        name: clusterresourceoverride
        source: redhat-operators
        sourceNamespace: openshift-marketplace
    2. ์„œ๋ธŒ์Šคํฌ๋ฆฝ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create -f cro-sub.yaml
  4. clusterresourceoverride-operator ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์„œ ClusterResourceOverride ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค (CR) ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    1. clusterresourceoverride-operator ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

      $ oc project clusterresourceoverride-operator
    2. Cluster Resource Override Operator์˜ ClusterResourceOverride ์˜ค๋ธŒ์ ํŠธ YAML ํŒŒ์ผ (์˜ˆ: cro-cr.yaml)์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

      apiVersion: operator.autoscaling.openshift.io/v1
      kind: ClusterResourceOverride
      metadata:
          name: cluster 1
      spec:
        podResourceOverride:
          spec:
            memoryRequestToLimitPercent: 50 2
            cpuRequestToLimitPercent: 25 3
            limitCPUToMemoryPercent: 200 4
      1
      ์ด๋ฆ„์€ instance์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      2
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ 1-100 ์‚ฌ์ด์˜ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 50์ž…๋‹ˆ๋‹ค.
      3
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ CPU ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ 1-100 ์‚ฌ์ด์˜ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 25์ž…๋‹ˆ๋‹ค.
      4
      ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค (์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ). 1Gi์˜ RAM์„ 100 %๋กœ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๊ฒƒ์€ 1 ๊ฐœ์˜ CPU ์ฝ”์–ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. CPU ์š”์ฒญ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค (์„ค์ •๋œ ๊ฒฝ์šฐ). ๊ธฐ๋ณธ๊ฐ’์€ 200์ž…๋‹ˆ๋‹ค.
    3. ClusterResourceOverride ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

      $ oc create -f <file-name>.yaml

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      $ oc create -f cro-cr.yaml
  5. ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์—ฌ ์Šน์ธ Webhook์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ oc get clusterresourceoverride cluster -n clusterresourceoverride-operator -o yaml

    webhook ํ˜ธ์ถœ ์‹œ mutatingWebhookConfigurationRef ์„น์…˜์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: operator.autoscaling.openshift.io/v1
    kind: ClusterResourceOverride
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"operator.autoscaling.openshift.io/v1","kind":"ClusterResourceOverride","metadata":{"annotations":{},"name":"cluster"},"spec":{"podResourceOverride":{"spec":{"cpuRequestToLimitPercent":25,"limitCPUToMemoryPercent":200,"memoryRequestToLimitPercent":50}}}}
      creationTimestamp: "2019-12-18T22:35:02Z"
      generation: 1
      name: cluster
      resourceVersion: "127622"
      selfLink: /apis/operator.autoscaling.openshift.io/v1/clusterresourceoverrides/cluster
      uid: 978fc959-1717-4bd1-97d0-ae00ee111e8d
    spec:
      podResourceOverride:
        spec:
          cpuRequestToLimitPercent: 25
          limitCPUToMemoryPercent: 200
          memoryRequestToLimitPercent: 50
    status:
    
    # ...
    
        mutatingWebhookConfigurationRef: 1
          apiVersion: admissionregistration.k8s.io/v1
          kind: MutatingWebhookConfiguration
          name: clusterresourceoverrides.admission.autoscaling.openshift.io
          resourceVersion: "127621"
          uid: 98b3b8ae-d5ce-462b-8ab5-a729ea8f38f3
    
    # ...

    1
    ClusterResourceOverride ์Šน์ธ Webhook ์ฐธ์กฐ
8.6.2.3. ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ์˜ค๋ฒ„ ์ปค๋ฐ‹ ์„ค์ •

Cluster Resource Override Operator์—๋Š” Operator๊ฐ€ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฐ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ผ๋ฒจ ๋ฐ ClusterResourceOverride ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค (CR)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ์ปจํ…Œ์ด๋„ˆ์— ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ Cluster Resource Override Operator์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด LimitRange ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์ œํ•œ์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ Pod ์‚ฌ์–‘์— ์ œํ•œ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ˆ์ฐจ

ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ClusterResourceOverride CR์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: operator.autoscaling.openshift.io/v1
    kind: ClusterResourceOverride
    metadata:
        name: cluster
    spec:
      podResourceOverride:
        spec:
          memoryRequestToLimitPercent: 50 1
          cpuRequestToLimitPercent: 25 2
          limitCPUToMemoryPercent: 200 3
    # ...
    1
    ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ 1-100 ์‚ฌ์ด์˜ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 50์ž…๋‹ˆ๋‹ค.
    2
    ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ CPU ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ 1-100 ์‚ฌ์ด์˜ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 25์ž…๋‹ˆ๋‹ค.
    3
    ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฑ๋ถ„์œจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค (์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ). 1Gi์˜ RAM์„ 100 %๋กœ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๊ฒƒ์€ 1 ๊ฐœ์˜ CPU ์ฝ”์–ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. CPU ์š”์ฒญ์„ ๋ฎ์–ด ์“ฐ๊ธฐํ•˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค (์„ค์ •๋œ ๊ฒฝ์šฐ). ๊ธฐ๋ณธ๊ฐ’์€ 200์ž…๋‹ˆ๋‹ค.
  2. Cluster Resource Override Operator๊ฐ€ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฐ ํ”„๋กœ์ ํŠธ์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋‹ค์Œ ๋ผ๋ฒจ์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Namespace
    metadata:
    
    # ...
    
      labels:
        clusterresourceoverrides.admission.autoscaling.openshift.io/enabled: "true" 1
    
    # ...
    1
    ์ด ๋ผ๋ฒจ์„ ๊ฐ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

8.6.3. ๋…ธ๋“œ ์ˆ˜์ค€ ์˜ค๋ฒ„ ์ปค๋ฐ‹

QoS (Quality of Service) ๋ณด์žฅ, CPU ์ œํ•œ ๋˜๋Š” ๋ฆฌ์†Œ์Šค ์˜ˆ์•ฝ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํŠน์ • ๋…ธ๋“œ์—์„œ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋…ธ๋“œ ๋ฐ ํŠน์ • ํ”„๋กœ์ ํŠธ์˜ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

8.6.3.1. ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์ดํ•ด

์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋…ธ๋“œ ์ ์šฉ ๋™์ž‘์€ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

8.6.3.1.1. ์ปจํ…Œ์ด๋„ˆ์˜ CPU ์š”๊ตฌ ์ดํ•ด

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

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 500m์˜ CPU ์‹œ๊ฐ„์„ ์š”์ฒญํ•˜๊ณ  ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 250m์˜ CPU ์‹œ๊ฐ„์„ ์š”์ฒญํ•œ ๊ฒฝ์šฐ ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ถ”๊ฐ€ CPU ์‹œ๊ฐ„์ด 2:1 ๋น„์œจ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ„์— ๋ถ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œํ•œ์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์ง€์ •๋œ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋งŽ์€ CPU๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. CPU ์š”์ฒญ์€ Linux ์ปค๋„์—์„œ CFS ๊ณต์œ  ์ง€์›์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ CPU ์ œํ•œ์€ Linux ์ปค๋„์—์„œ CFS ํ• ๋‹น๋Ÿ‰ ์ง€์›์„ ์‚ฌ์šฉํ•˜์—ฌ 100ms ์ธก์ • ๊ฐ„๊ฒฉ์œผ๋กœ ์ ์šฉ๋˜์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์€ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.6.3.1.2. ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ ์ดํ•ด

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

8.6.3.2. ์˜ค๋ฒ„์ปค๋ฐ‹ ๋ฐ QoS (Quality of Service) ํด๋ž˜์Šค ์ดํ•ด

์š”์ฒญ์ด ์—†๋Š” pod๊ฐ€ ์˜ˆ์•ฝ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ชจ๋“  pod์—์„œ ์ œํ•œ์˜ ํ•ฉ๊ณ„๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋จธ์‹  ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•˜๋ฉด ๋…ธ๋“œ๊ฐ€ ์˜ค๋ฒ„ ์ปค๋ฐ‹๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ฒ„ ์ปค๋ฐ‹๋œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋…ธ๋“œ์˜ pod๊ฐ€ ํŠน์ • ์‹œ์ ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋…ธ๋“œ๋Š” ๊ฐ pod์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ QoS (Quality of Service) ํด๋ž˜์Šค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Pod๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ์„ธ ๊ฐ€์ง€ QoS ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

ํ‘œ 8.19. QoS (Quality of Service) ํด๋ž˜์Šค
์šฐ์„  ์ˆœ์œ„ํด๋ž˜์Šค ์ด๋ฆ„์„ค๋ช…

1 (๊ฐ€์žฅ ๋†’์Œ)

Guaranteed

๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ œํ•œ ๋ฐ ์š”์ฒญ(์„ ํƒ ์‚ฌํ•ญ)์ด ์„ค์ •๋˜์–ด ์žˆ๊ณ (0์ด ์•„๋‹˜) ๋™์ผํ•œ ๊ฒฝ์šฐ Pod๋Š” Guaranteed ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

2

Burstable

๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์š”์ฒญ ๋ฐ ์ œํ•œ(์„ ํƒ ์‚ฌํ•ญ)์ด ์„ค์ •๋˜์–ด ์žˆ๊ณ (0์ด ์•„๋‹˜) ๋™์ผํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Pod๋Š” Burstable ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

3 (๊ฐ€์žฅ ๋‚ฎ์Œ)

BestEffort

๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ ๋ฐ ์ œํ•œ์ด ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Pod๋Š” BestEffort ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๋Š” ์••์ถ•ํ•  ์ˆ˜ ์—†๋Š” ๋ฆฌ์†Œ์Šค์ด๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋จผ์ € ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

  • Guaranteed ์ปจํ…Œ์ด๋„ˆ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ƒํƒœ์— ์žˆ๋Š” Burstable ์ปจํ…Œ์ด๋„ˆ๋Š” ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๊ณ  ๋‹ค๋ฅธ BestEffort ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์œผ๋ฉด ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • BestEffort ์ปจํ…Œ์ด๋„ˆ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋จผ์ € ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
8.6.3.2.1. Quality of Service (QoS) ๊ณ„์ธต์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์˜ˆ์•ฝ ๋ฐฉ๋ฒ•

qos-reserved ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • QoS ์ˆ˜์ค€์—์„œ pod์— ์˜ˆ์•ฝ๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐฑ๋ถ„์œจ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์˜ˆ์•ฝํ•˜์—ฌ ํ•˜์œ„ OoS ํด๋ž˜์Šค์˜ pod๊ฐ€ ๊ณ ๊ธ‰ QoS ํด๋ž˜์Šค์˜ pod์—์„œ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด qos-reserved ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • qos-reserved=memory=100% ๊ฐ’์€ Burstable ๋ฐ BestEffort QoS ํด๋ž˜์Šค๊ฐ€ ๋” ๋†’์€ QoS ํด๋ž˜์Šค์—์„œ ์š”์ฒญํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด BestEffort ๋ฐ Burstable ์›Œํฌ๋กœ๋“œ์—์„œ OOM์ด ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์ฆ๊ฐ€๋˜์–ด Guaranteed ๋ฐ Burstable ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค์˜ ๋ณด์žฅ ์ˆ˜์ค€์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์šฐ์„ ๋ฉ๋‹ˆ๋‹ค.
  • qos-reserved=memory=50% ๊ฐ’์€ Burstable ๋ฐ BestEffort QoS ํด๋ž˜์Šค๊ฐ€ ๋” ๋†’์€ QoS ํด๋ž˜์Šค์—์„œ ์š”์ฒญํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ ˆ๋ฐ˜์„ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • qos-reserved=memory=0% ๊ฐ’์€ Burstable ๋ฐ BestEffort QoS ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋…ธ๋“œ ์–‘๊นŒ์ง€ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ Guaranteed ์›Œํฌ๋กœ๋“œ๊ฐ€ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์•ก์„ธ์Šคํ•˜์ง€ ๋ชปํ•  ์œ„ํ—˜์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ด ๊ธฐ๋Šฅ์€ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
8.6.3.3. ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ QOS ์ดํ•ด

QoS (Quality of Service) ๋ณด์žฅ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šค์™‘์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋…ธ๋“œ์˜ ๋ฌผ๋ฆฌ์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ดˆ๊ณผ ๊ตฌ๋…ํ•˜์—ฌ Pod ๋ฐฐํฌ ์ค‘์— Kubernetes ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋งŒ๋“œ๋Š” ๋ฆฌ์†Œ์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 2 ๊ฐœ์˜ Guaranteed pod๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด ๊ฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์Šค์™‘ ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ์˜ ์ดˆ๊ณผ ๊ตฌ๋…์œผ๋กœ ์ธํ•ด Pod์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์™‘์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋…ธ๋“œ์—์„œ MemoryPressure๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜์—ฌ Pod๊ฐ€ ์Šค์ผ€์ค„๋ง ์š”์ฒญ์—์„œ ๋งŒ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ Pod๋ฅผ ์ถ”๊ฐ€๋กœ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ Pod๊ฐ€ ๋…ธ๋“œ์— ๋ฐฐ์น˜๋˜์–ด ๊ถ๊ทน์ ์œผ๋กœ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ (OOM) ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

์ค‘์š”

์Šค์™‘์ด ํ™œ์„ฑํ™”๋˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ ์ฒ˜๋ฆฌ ์ œ๊ฑฐ ์ž„๊ณ„ ๊ฐ’์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ ์ฒ˜๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ƒํƒœ์—์„œ Pod๋ฅผ ๋…ธ๋“œ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์ผ์ •์„ ์žฌ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

8.6.3.4. ๋…ธ๋“œ ๊ณผ๋‹ค ํ• ๋‹น ์ดํ•ด

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

๋…ธ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ปค๋„ ์กฐ์ • ๊ฐ€๋Šฅํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ปค๋„์€ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ์ง„๋˜์ง€ ์•Š๋Š” ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‹คํŒจํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ด ๋™์ž‘์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด OpenShift Container Platform์€ vm.overcommit_memory ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์„ค์ •ํ•˜์—ฌ ๊ธฐ๋ณธ ์šด์˜ ์ฒด์ œ ์„ค์ •์„ ์žฌ์ •์˜ํ•˜์—ฌ ์ปค๋„์ด ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ค๋ฒ„ ์ปค๋ฐ‹ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform์€ vm.panic_on_oom ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์‹œ ์ปค๋„์ด ํŒจ๋‹‰ ์ƒํƒœ๊ฐ€๋˜์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ปค๋„์—์„œ OOM (๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ) ์ƒํƒœ์ผ ๋•Œ oom_killer๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํ˜„์žฌ ์„ค์ •์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ sysctl -a |grep commit

์ถœ๋ ฅ ์˜ˆ

#...
vm.overcommit_memory = 0
#...

$ sysctl -a |grep panic

์ถœ๋ ฅ ์˜ˆ

#...
vm.panic_on_oom = 0
#...

์ฐธ๊ณ 

์œ„์˜ ํ”Œ๋ž˜๊ทธ๋Š” ์ด๋ฏธ ๋…ธ๋“œ์— ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผํ•˜๋ฉฐ ์ถ”๊ฐ€ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋‹ค์Œ ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • CPU CFS ํ• ๋‹น๋Ÿ‰์„ ์‚ฌ์šฉํ•˜์—ฌ CPU ์ œํ•œ ๋น„ํ™œ์„ฑํ™” ๋˜๋Š” ์‹คํ–‰
  • ์‹œ์Šคํ…œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฆฌ์†Œ์Šค ์˜ˆ์•ฝ
  • Quality of Service (QoS) ๊ณ„์ธต์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜ˆ์•ฝ
8.6.3.5. CPU CFS ํ• ๋‹น๋Ÿ‰์„ ์‚ฌ์šฉํ•˜์—ฌ CPU ์ œํ•œ ๋น„ํ™œ์„ฑํ™” ๋˜๋Š” ์‹คํ–‰

๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ๋Š” Linux ์ปค๋„์—์„œ CFS (Completely Fair Scheduler) ํ• ๋‹น๋Ÿ‰ ์ง€์›์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ CPU ์ œํ•œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

CPU ์ œํ•œ ์ ์šฉ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ ๋…ธ๋“œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ์— CPU ์š”์ฒญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์š”์ฒญ์€ Linux ์ปค๋„์˜ CFS ๊ณต์œ ๋ฅผ ํ†ตํ•ด ๊ณ„์† ๊ฐ•์ œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์— CPU ์š”์ฒญ์€ ์—†์ง€๋งŒ CPU ์ œํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ CPU ์š”์ฒญ ๊ธฐ๋ณธ๊ฐ’์ด ์ง€์ •๋œ CPU ์ œํ•œ์œผ๋กœ ์„ค์ •๋˜๋ฉฐ Linux ์ปค๋„์˜ CFS ๊ณต์œ ๋ฅผ ํ†ตํ•ด ๊ฐ•์ œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์— CPU ์š”์ฒญ ๋ฐ ์ œํ•œ์ด ๋ชจ๋‘ ์žˆ๋Š” ๊ฒฝ์šฐ Linux ์ปค๋„์˜ CFS ๊ณต์œ ๋ฅผ ํ†ตํ•ด CPU ์š”์ฒญ์ด ๊ฐ•์ œ ์ ์šฉ๋˜๋ฉฐ CPU ์ œํ•œ์€ ๋…ธ๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๊ตฌ์„ฑํ•  ๋…ธ๋“œ ์œ ํ˜•์˜ ์ •์  MachineConfigPool CRD์™€ ์—ฐ๊ด€๋œ ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool <name>

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ oc edit machineconfigpool worker

    ์ถœ๋ ฅ ์˜ˆ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 1
      name: worker

    1
    ๋ ˆ์ด๋ธ”์ด Labels ์•„๋ž˜์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    ์ž‘์€ ์ •๋ณด

    ๋ผ๋ฒจ์ด ์—†์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‚ค/๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ oc label machineconfigpool worker custom-kubelet=small-pods

์ ˆ์ฐจ

  1. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค (CR)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    CPU ์ œํ•œ ๋น„ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•œ ์„ค์ • ์˜ˆ

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: disable-cpu-units 1
    spec:
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 2
      kubeletConfig:
        cpuCfsQuota: false 3

    1
    CR์— ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    2
    ๋จธ์‹  ๊ตฌ์„ฑ ํ’€์—์„œ ๋ผ๋ฒจ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    3
    cpuCfsQuota ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ CR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    $ oc create -f <file_name>.yaml
8.6.3.6. ์‹œ์Šคํ…œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฆฌ์†Œ์Šค ์˜ˆ์•ฝ

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

์ ˆ์ฐจ

pod๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ์Šค์ผ€์ค„๋ง์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋…ธ๋“œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋…ธ๋“œ์˜ ๋ฆฌ์†Œ์Šค ํ• ๋‹น์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

8.6.3.7. ๋…ธ๋“œ์˜ ์˜ค๋ฒ„ ์ปค๋ฐ‹ ๋น„ํ™œ์„ฑํ™”

์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฐ ๋…ธ๋“œ์—์„œ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

๋…ธ๋“œ์—์„œ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ sysctl -w vm.overcommit_memory=0

8.6.4. ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ์ œํ•œ

์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ์ดˆ๊ณผํ•  ์ˆ˜์—†๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ์ œํ•œ๊ณผ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋ณ„ ๋ฆฌ์†Œ์Šค ์ œํ•œ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋˜๋Š” ํŠน์ • ํ”„๋กœ์ ํŠธ์˜ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.6.4.1. ํ”„๋กœ์ ํŠธ์˜ ์˜ค๋ฒ„ ์ปค๋ฐ‹ ๋น„ํ™œ์„ฑํ™”

์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋ณ„ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ค๋ฒ„ ์ปค๋ฐ‹๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

ํ”„๋กœ์ ํŠธ์—์„œ ์˜ค๋ฒ„ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ ๋‹ค์Œ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
        quota.openshift.io/cluster-resource-override-enabled: "false" 1
    # ...
    1
    ์ด ์ฃผ์„์„ false ๋กœ ์„ค์ •ํ•˜๋ฉด ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์˜ค๋ฒ„ ์ปค๋ฐ‹์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

8.6.5. ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

8.7. FeatureGates๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”

๊ด€๋ฆฌ์ž๋Š” Feature Gate ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์„ธํŠธ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8.7.1. FeatureGate ์ดํ•ด

FeatureGate ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค (CR)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํŠน์ • ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ์„ธํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€ ์•Š์€ OpenShift Container Platform ๊ธฐ๋Šฅ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค.

FeatureGate CR์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•œ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • TechPreviewNoUpgrade. ์ด ๊ธฐ๋Šฅ ์„ธํŠธ๋Š” ํ˜„์žฌ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋™์•ˆ ํ…Œ์ŠคํŠธ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ทจ์†Œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ ์„ธํŠธ๋Š” ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์ฃผ์˜

    ํด๋Ÿฌ์Šคํ„ฐ์—์„œ TechPreviewNoUpgrade ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ทจ์†Œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

    ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Microsoft Azure File CSI Driver Operator. Microsoft Azure File Storage์šฉ CSI(Container Storage Interface) ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PV(์˜๊ตฌ ๋ณผ๋ฅจ)๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • CSI ์ž๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง€์›๋˜๋Š” in-tree ๋ณผ๋ฅจ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋™๋“ฑํ•œ CSI(Container Storage Interface) ๋“œ๋ผ์ด๋ฒ„๋กœ ์ž๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์œ„ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

      • AWS(Amazon Web Services) EBS(Elastic Block Storage)
      • OpenStack Cinder
      • Azure Disk
      • Azure File
      • Google Cloud Platform ์˜๊ตฌ ๋””์Šคํฌ(CSI)
      • VMware vSphere
    • Cluster Cloud Controller Manager Operator. in-tree ํด๋ผ์šฐ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์•„๋‹Œ Cluster Cloud Controller Manager Operator๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์œ„ํ•œ ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • Alibaba Cloud
      • AWS(Amazon Web Services)
      • GCP(Google Cloud Platform)
      • IBM Cloud
      • Microsoft Azure
      • Red Hat OpenStack Platform (RHOSP)
      • VMware vSphere
    • ๊ณต์œ  ๋ฆฌ์†Œ์Šค CSI ๋“œ๋ผ์ด๋ฒ„
    • OpenShift Container Platform ๋นŒ๋“œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ CSI ๋ณผ๋ฅจ ์ง€์›
    • ๋…ธ๋“œ์˜ ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

8.7.2. ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ ์„ธํŠธ ํ™œ์„ฑํ™”

OpenShift Container Platform ์›น ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ FeatureGate CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ํŽธ์ง‘ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. OpenShift Container Platform ์›น ์ฝ˜์†”์—์„œ ๊ด€๋ฆฌ โ†’ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค ์ •์˜ ํŽ˜์ด์ง€๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค ์ •์˜ ํŽ˜์ด์ง€์—์„œ FeatureGate๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ •์˜ ์„ธ๋ถ€ ์ •๋ณด ํŽ˜์ด์ง€์—์„œ ์ธ์Šคํ„ด์Šค ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ํด๋Ÿฌ์Šคํ„ฐ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ํด๋ฆญํ•œ ๋‹ค์Œ YAML ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  5. ํŠน์ • ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    ์ฃผ์˜

    ํด๋Ÿฌ์Šคํ„ฐ์—์„œ TechPreviewNoUpgrade ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ทจ์†Œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

    FeatureGate ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค ์ƒ˜ํ”Œ

    apiVersion: config.openshift.io/v1
    kind: FeatureGate
    metadata:
      name: cluster 1
    # ...
    spec:
      featureSet: TechPreviewNoUpgrade 2

    1
    FeatureGate CR์˜ ์ด๋ฆ„์€ cluster์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    2
    ํ™œ์„ฑํ™”ํ•  ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • TechPreviewNoUpgrade๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฒ€์ฆ

๋…ธ๋“œ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ„ ํ›„ ๋…ธ๋“œ์˜ kubelet.conf ํŒŒ์ผ์„ ํ™•์ธํ•˜์—ฌ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์›น ์ฝ˜์†”์˜ ๊ด€๋ฆฌ์ž ๊ด€์ ์—์„œ Compute โ†’ Nodes ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ๋…ธ๋“œ ์„ธ๋ถ€ ์ •๋ณด ํŽ˜์ด์ง€์—์„œ ํ„ฐ๋ฏธ๋„ ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ํ„ฐ๋ฏธ๋„ ์ฐฝ์—์„œ root ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ /host:๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    sh-4.2# chroot /host
  5. kubelet.conf ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    sh-4.2# cat /etc/kubernetes/kubelet.conf

    ์ƒ˜ํ”Œ ์ถœ๋ ฅ

    # ...
    featureGates:
      InsightsOperatorPullingSCA: true,
      LegacyNodeRoleBehavior: false
    # ...

    true ๋กœ ๋‚˜์—ด๋œ ๊ธฐ๋Šฅ์€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ๋‚˜์—ด๋œ ๊ธฐ๋Šฅ์€ OpenShift Container Platform ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

8.7.3. CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ ์„ธํŠธ ํ™œ์„ฑํ™”

OpenShift CLI(oc)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ FeatureGate CR(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค)์„ ํŽธ์ง‘ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • OpenShift CLI(oc)๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ

๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. cluster๋ผ๋Š” FeatureGate CR์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    $ oc edit featuregate cluster
    ์ฃผ์˜

    ํด๋Ÿฌ์Šคํ„ฐ์—์„œ TechPreviewNoUpgrade ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ทจ์†Œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

    FeatureGate ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค ์ƒ˜ํ”Œ

    apiVersion: config.openshift.io/v1
    kind: FeatureGate
    metadata:
      name: cluster 1
    # ...
    spec:
      featureSet: TechPreviewNoUpgrade 2

    1
    FeatureGate CR์˜ ์ด๋ฆ„์€ cluster์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    2
    ํ™œ์„ฑํ™”ํ•  ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • TechPreviewNoUpgrade๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฒ€์ฆ

๋…ธ๋“œ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ„ ํ›„ ๋…ธ๋“œ์˜ kubelet.conf ํŒŒ์ผ์„ ํ™•์ธํ•˜์—ฌ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์›น ์ฝ˜์†”์˜ ๊ด€๋ฆฌ์ž ๊ด€์ ์—์„œ Compute โ†’ Nodes ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ๋…ธ๋“œ ์„ธ๋ถ€ ์ •๋ณด ํŽ˜์ด์ง€์—์„œ ํ„ฐ๋ฏธ๋„ ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ํ„ฐ๋ฏธ๋„ ์ฐฝ์—์„œ root ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ /host:๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    sh-4.2# chroot /host
  5. kubelet.conf ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    sh-4.2# cat /etc/kubernetes/kubelet.conf

    ์ƒ˜ํ”Œ ์ถœ๋ ฅ

    # ...
    featureGates:
      InsightsOperatorPullingSCA: true,
      LegacyNodeRoleBehavior: false
    # ...

    true ๋กœ ๋‚˜์—ด๋œ ๊ธฐ๋Šฅ์€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ 

    ๋‚˜์—ด๋œ ๊ธฐ๋Šฅ์€ OpenShift Container Platform ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

9์žฅ. ๋„คํŠธ์›Œํฌ ์—ฃ์ง€์˜ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ

9.1. ๋„คํŠธ์›Œํฌ ์—ฃ์ง€์—์„œ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ ์‚ฌ์šฉ

๋„คํŠธ์›Œํฌ ์—ฃ์ง€์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์—์„œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋งˆ์Šคํ„ฐ ๋ฐ ์ž‘์—…์ž ๋…ธ๋“œ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์œ„์น˜์— ์žˆ๋Š” ์ž‘์—…์ž ๋…ธ๋“œ์™€ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ๋Š” ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ ์‚ฌ์šฉ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ, ํŠน์ • ๊ตฌ์„ฑ ์„ธ๋ถ€ ์ •๋ณด๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ณ  ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๊ฐ„ํ—์ ์œผ๋กœ ๋Š์–ด์ง€๋ฉฐ ๊ธฐํƒ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ณ„ํšํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œํ•œ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  • OpenShift Container Platform์€ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŠน์ • Kubernetes ์˜์—ญ์—์„œ ๋‹ค๋ฅธ Kubernetes ์˜์—ญ์œผ๋กœ ์›Œํฌ๋กœ๋“œ๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์˜์—ญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํŠน์ • ์œ ํ˜•์˜ ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ ์‹œ์Šคํ…œ ๋ฐ ํ™˜๊ฒฝ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋ก์‹œ ๋ฐ ๋ฐฉํ™”๋ฒฝ์€ ์ด ๋ฌธ์„œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ถ”๊ฐ€ ์ œํ•œ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉํ™”๋ฒฝ ๊ตฌ์„ฑ๊ณผ ๊ฐ™์€ ์ œํ•œ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ด€๋ จ OpenShift Container Platform ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ๊ณผ ๋„คํŠธ์›Œํฌ ์—ฃ์ง€ ๋…ธ๋“œ ๊ฐ„์— L2/L3 ์ˆ˜์ค€ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

9.1.1. ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ ์ถ”๊ฐ€

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

  • ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ๊ณผ ๋ชจ๋“  ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ ๊ฐ„์— ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•˜๋ ค๋ฉด ๊ฒฝ๋กœ ๋˜๋Š” ๊ธฐ๋ณธ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์ œ ์œ„์น˜์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— Ingress VIP๋ฅผ ๋ฐฐ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ํ”„๋กœ๋น„์ €๋‹ ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์ž‘์—…์ž ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค์น˜ ์‹œ ์„ค์น˜ ์‹œ ์„ค์น˜ ๊ด€๋ฆฌ์ž ํ”„๋กœ๋น„์ €๋‹ ํด๋Ÿฌ์Šคํ„ฐ์— ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์„ค์น˜ ์ „์— install-config.yaml ํŒŒ์ผ์˜ ๊ฐ ์ž‘์—…์ž ๋…ธ๋“œ์˜ ์„œ๋ธŒ๋„ท์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. DHCP ์„œ๋ฒ„์—๋Š” ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋Š” ๋กœ์ปฌ ํ”„๋กœ๋น„์ €๋‹ ๋„คํŠธ์›Œํฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฐ€์ƒ ๋ฏธ๋””์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • provisioning ๋„คํŠธ์›Œํฌ์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๋œ ์„ค์น˜ ๊ด€๋ฆฌ์ž ํ”„๋กœ๋น„์ €๋‹ ํด๋Ÿฌ์Šคํ„ฐ์— ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด install-config.yaml ํŒŒ์ผ์—์„œ virtualMediaViaExternalNetwork ํ”Œ๋ž˜๊ทธ๊ฐ€ true ๋กœ ์„ค์ •๋˜์–ด ๊ฐ€์ƒ ๋ฏธ๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋Š” ๋กœ์ปฌ ํ”„๋กœ๋น„์ €๋‹ ๋„คํŠธ์›Œํฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. PXE๊ฐ€ ์•„๋‹Œ ๊ฐ€์ƒ ๋ฏธ๋””์–ด์™€ ํ•จ๊ป˜ ๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ DHCP ์„œ๋ฒ„์˜ ๊ฐ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ ๋ฐ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์˜ ๊ฐ ์„œ๋ธŒ๋„ท์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

9.1.2. ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๋ถ„๋ฆฌ

๋ชจ๋“  ๋…ธ๋“œ๋Š” 10์ดˆ๋งˆ๋‹ค OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์˜ Kubernetes Controller Manager Operator(kube ์ปจํŠธ๋กค๋Ÿฌ)๋กœ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋…ธ๋“œ์˜ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ OpenShift Container Platform์€ ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

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

๊ตฌ์„ฑ๋œ ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ํ›„ kube ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋…ธ๋“œ ์ƒํƒœ๋ฅผ Unhealthy๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋…ธ๋“œ Ready ์กฐ๊ฑด์„ Unknown์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ•ด๋‹น ๋…ธ๋“œ์— ๋Œ€ํ•œ Pod ์˜ˆ์•ฝ์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” NoExecute ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” node.kubernetes.io/unreachable ํ…Œ์ธํŠธ๋ฅผ ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋…ธ๋“œ์˜ Pod๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ 5๋ถ„ ํ›„์— ์ œ๊ฑฐํ•˜๋„๋ก ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

Deployment ์˜ค๋ธŒ์ ํŠธ ๋˜๋Š” StatefulSet ์˜ค๋ธŒ์ ํŠธ์™€ ๊ฐ™์€ ์›Œํฌ๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋น„์ •์ƒ ๋…ธ๋“œ์˜ Pod๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•˜๊ณ  ๊ธฐํƒ€ ๋…ธ๋“œ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ OpenShift Container Platform์€ ๋…ธ๋“œ์˜ Pod ์™ธ๋ถ€๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ๋Š” ์ƒˆ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…์„ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์›Œํฌ๋กœ๋“œ๊ฐ€ ๋น„์ •์ƒ ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์† ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฐ๊ฒฐ ์†์‹ค์˜ ์˜ํ–ฅ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” pod ์ƒ์„ฑ
  • ๋…ธ๋“œ๊ฐ€ ์ค‘๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘ํ•˜๋Š” ์ •์  Pod ์‚ฌ์šฉ
  • Kubernetes ์˜์—ญ์„ ์‚ฌ์šฉํ•˜์—ฌ Pod ์ œ๊ฑฐ ์ œ์–ด
  • Pod ์ œ๊ฑฐ๋ฅผ ์ง€์—ฐํ•˜๊ฑฐ๋‚˜ ๋ฐฉ์ง€ํ•˜๋„๋ก Pod ํ—ˆ์šฉ ์˜ค์ฐจ ๊ตฌ์„ฑ
  • ๋…ธ๋“œ๋ฅผ ๋น„์ •์ƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋„๋ก kubelet ๊ตฌ์„ฑ.

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

9.1.3. ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ์˜ ์ •์ „

์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ์ •์ „๋˜๊ฑฐ๋‚˜ ๊ฐ•์ œ ๋‹ค์‹œ ์‹œ์ž‘๋˜๋ฉด OpenShift Container Platform์€ ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ๋œ ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ํ›„ Kubernetes Controller Manager Operator(kube ์ปจํŠธ๋กค๋Ÿฌ)์™€ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ ๋…ธ๋“œ ์ƒํƒœ๋ฅผ Unhealthy๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋…ธ๋“œ Ready ์กฐ๊ฑด์„ Unknown์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ•ด๋‹น ๋…ธ๋“œ์— ๋Œ€ํ•œ Pod ์˜ˆ์•ฝ์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” NoExecute ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” node.kubernetes.io/unreachable ํ…Œ์ธํŠธ๋ฅผ ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋…ธ๋“œ์˜ Pod๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ 5๋ถ„ ํ›„์— ์ œ๊ฑฐํ•˜๋„๋ก ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ๊ฐ€ ์ „์›์„ ๋ณต๊ตฌํ•˜๊ณ  ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๋ฉด ๋…ธ๋“œ์—์„œ Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์žฌ์‹œ์ž‘ ์ฆ‰์‹œ Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ •์  Pod๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋…ธ๋“œ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ฉด kubelet๋„ ์žฌ์‹œ์ž‘๋˜๊ณ  ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋œ Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ด ๊ธฐ๋ณธ๊ฐ’์ธ 5๋ถ„๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ ๋…ธ๋“œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  node.kubernetes.io/unreachable ํ…Œ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ์—์„œ kubelet์€ ์‹คํ–‰ ์ค‘์ธ Pod๋ฅผ ๋ชจ๋‘ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์ด ํ•ด์ œ๋˜๋ฉด ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํ†ตํ•ด ์ •์ „์˜ ์˜ํ–ฅ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ๋ชฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” pod ์ƒ์„ฑ
  • ๋…ธ๋“œ์™€ ํ•จ๊ป˜ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘ํ•˜๋Š” ์ •์  Pod ์‚ฌ์šฉ
  • Pod ์ œ๊ฑฐ๋ฅผ ์ง€์—ฐํ•˜๊ฑฐ๋‚˜ ๋ฐฉ์ง€ํ•˜๋„๋ก Pod ํ—ˆ์šฉ ์˜ค์ฐจ ๊ตฌ์„ฑ
  • ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋…ธ๋“œ๋ฅผ ๋น„์ •์ƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋„๋ก kubelet ๊ตฌ์„ฑ.

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

9.1.4. ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ ์ „๋žต

์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

๋ฐ๋ชฌ ์„ธํŠธ
๋ฐ๋ชฌ ์„ธํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ์—์„œ Pod๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ๋ฐ๋ชฌ ์„ธํŠธ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ์ • ์กฐ์ • ๋™์ž‘์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ์™€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ๋…ธ๋“œ์˜ Pod๊ฐ€ ๊ณ„์† ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ๋Š” ๋ฐ๋ชฌ ์„ธํŠธ Pod์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  Pod๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณด๊ณ ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ๋ชฌ ์„ธํŠธ Pod๊ฐ€ Running ์ƒํƒœ์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ์—์„œ ํ†ต์‹ ์„ ์ค‘์ง€ํ•˜๋ฉด Pod๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๊ณ  OpenShift Container Platform์—์„œ Pod๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ๋ชฌ ์„ธํŠธ Pod๋Š” tolerationSeconds ๊ฐ’์ด ์—†๋Š” node.kubernetes.io/unreachable ๋ฐ node.kubernetes.io/not-ready ํ…Œ์ธํŠธ์— ๋Œ€ํ•œ NoExecute ํ—ˆ์šฉ ์˜ค์ฐจ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐ๋ชฌ ์„ธํŠธ Pod๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ๋ฐ๋ชฌ ์„ธํŠธ Pod์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ˆ์šฉ ์˜ค์ฐจ ์ถ”๊ฐ€

      tolerations:
        - key: node.kubernetes.io/not-ready
          operator: Exists
          effect: NoExecute
        - key: node.kubernetes.io/unreachable
          operator: Exists
          effect: NoExecute
        - key: node.kubernetes.io/disk-pressure
          operator: Exists
          effect: NoSchedule
        - key: node.kubernetes.io/memory-pressure
          operator: Exists
          effect: NoSchedule
        - key: node.kubernetes.io/pid-pressure
          operator: Exists
          effect: NoSchedule
        - key: node.kubernetes.io/unschedulable
          operator: Exists
          effect: NoSchedule

  • ๋ฐ๋ชฌ ์„ธํŠธ์—์„œ๋Š” ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ์ž‘์—…์ž ๋…ธ๋“œ์—์„œ ์›Œํฌ๋กœ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OpenShift Container Platform ์„œ๋น„์Šค ๋์ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ๋ชฌ ์„ธํŠธ Pod์˜ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ 

OpenShift Container Platform์—์„œ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐ๋ชฌ ์„ธํŠธ์—์„œ๋Š” ๋…ธ๋“œ ์žฌ๋ถ€ํŒ… ํ›„ Pod๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณ ์ • Pod
๋…ธ๋“œ๊ฐ€ ์žฌ๋ถ€ํŒ…๋  ๋•Œ(์˜ˆ: ์ •์ „ ํ›„) Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ •์  Pod๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ Kubelet์€ ๋…ธ๋“œ๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ์ •์  Pod๋ฅผ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ 

์ •์  Pod์—์„œ๋Š” ๋ณด์•ˆ ๋ฐ ๊ตฌ์„ฑ ๋งต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Kubernetes ์˜์—ญ
Kubernetes ์˜์—ญ์€ ์†๋„๋ฅผ ๋Šฆ์ถ”๊ฑฐ๋‚˜ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ Pod ์ œ๊ฑฐ๋ฅผ ์™„์ „ํžˆ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ node.kubernetes.io/unreachable ํ…Œ์ธํŠธ๋ฅผ ์ ์šฉํ•˜๊ณ  ์ดˆ๋‹น 0.1 ๋…ธ๋“œ์˜ ์†๋„๋กœ Pod๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Kubernetes ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” Pod ์ œ๊ฑฐ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์˜์—ญ์ด ์™„์ „ํžˆ ์ค‘๋‹จ๋˜๊ณ  ํ•ด๋‹น ์˜์—ญ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ Ready ์กฐ๊ฑด์ด False ๋˜๋Š” Unknown์ธ ๊ฒฝ์šฐ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ ํ•ด๋‹น ์˜์—ญ์˜ ๋…ธ๋“œ์— node.kubernetes.io/unreachable ํ…Œ์ธํŠธ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„์ ์œผ๋กœ ์ค‘๋‹จ๋œ ์˜์—ญ์˜ ๊ฒฝ์šฐ ๋…ธ๋“œ์˜ 55% ์ด์ƒ์— False ๋˜๋Š” Unknown ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด Pod ์ œ๊ฑฐ ๋น„์œจ์ด ์ดˆ๋‹น 0.01 ๋…ธ๋“œ๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ 50๊ฐœ ๋ฏธ๋งŒ์ธ ์†Œ๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ๋Š” ํ…Œ์ธํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ์ ์šฉํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— ์˜์—ญ์ด ๋„ค ๊ฐœ ์ด์ƒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ ์‚ฌ์–‘์— topology.kubernetes.io/region ๋ผ๋ฒจ์„ ์ ์šฉํ•˜์—ฌ ํŠน์ • ์˜์—ญ์— ๋…ธ๋“œ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ์˜์—ญ์˜ ๋…ธ๋“œ ๋ผ๋ฒจ ์ƒ˜ํ”Œ

kind: Node
apiVersion: v1
metadata:
  labels:
    topology.kubernetes.io/region=east

KubeletConfig ์˜ค๋ธŒ์ ํŠธ

Kubelet์—์„œ ๊ฐ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ์‹œ๊ฐ„์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜จํ”„๋ ˆ๋ฏธ์Šค ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋…ธ๋“œ๋ฅผ Unhealthy ๋˜๋Š” Unreachable ์กฐ๊ฑด์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ํƒ€์ด๋ฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•˜๋ ค๋ฉด node-status-update-frequency ๋ฐ node-status-report-frequency ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ KubeletConfig ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๋…ธ๋“œ์˜ kubelet์€ node-status-update-frequency ์„ค์ •์—์„œ ์ •์˜ํ•˜๋Š” ๋…ธ๋“œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  node-status-report-frequency ์„ค์ •์— ๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ kubelet์€ Pod ์ƒํƒœ๋ฅผ 10์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์ƒํƒœ๋ฅผ 1๋ถ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋…ธ๋“œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด Kubelet์—์„œ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ํด๋Ÿฌ์Šคํ„ฐ์— ์ฆ‰์‹œ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. OpenShift Container Platform์—์„œ๋Š” ๋…ธ๋“œ ๋ฆฌ์Šค ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ(OpenShift Container Platform ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ธฐ๋ณธ ์ƒํƒœ)์—๋งŒ node-status-report-frequency ์„ค์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋ฆฌ์Šค ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ๋…ธ๋“œ๋Š” node-status-update-frequency ์„ค์ •์— ๋”ฐ๋ผ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

kubelet ๊ตฌ์„ฑ์˜ ์˜ˆ

apiVersion: machineconfiguration.openshift.io/v1
kind: KubeletConfig
metadata:
  name: disable-cpu-units
spec:
  machineConfigPoolSelector:
    matchLabels:
      machineconfiguration.openshift.io/role: worker 1
  kubeletConfig:
    node-status-update-frequency: 2
      - "10s"
    node-status-report-frequency: 3
      - "1m"

1
MachineConfig ์˜ค๋ธŒ์ ํŠธ์˜ ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด KubeletConfig ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ ์šฉ๋˜๋Š” ๋…ธ๋“œ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
2
Kubelet์—์„œ ์ด MachineConfig ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๋Š” ๋นˆ๋„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 10s์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด node-status-report-frequency ๊ฐ’์ด ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
3
Kubelet์—์„œ ์ด MachineConfig ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๋นˆ๋„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1m์ž…๋‹ˆ๋‹ค.

node-status-update-frequency ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” node-monitor-grace-period ๋ฐ pod-eviction-timeout ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • node-monitor-grace-period ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๊ฐ€ ๋…ธ๋“œ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ MachineConfig ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ Unhealthy๋กœ ํ‘œ์‹œ๋œ ํ›„ OpenShift Container Platform์—์„œ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ ์›Œํฌ๋กœ๋“œ๋Š” ์ด ์‹œ๊ฐ„ ์ดํ›„ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. node-monitor-grace-period๊ฐ€ ๋งŒ๋ฃŒ๋œ ํ›„ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์‹œ ์ฐธ์—ฌํ•˜๋ฉด Pod๊ฐ€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋…ธ๋“œ์— ์ƒˆ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. node-monitor-grace-period ๊ฐ„๊ฒฉ์€ 40s์ž…๋‹ˆ๋‹ค. node-status-update-frequency ๊ฐ’์€ node-monitor-grace-period ๊ฐ’๋ณด๋‹ค ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • pod-eviction-timeout ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Pod๋ฅผ ์ œ๊ฑฐํ•˜๋„๋ก ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด MachineConfig ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ Unreachable๋กœ ํ‘œ์‹œํ•œ ํ›„ OpenShift Container Platform์—์„œ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐ๋œ Pod๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋‹ค์‹œ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์˜จํ”„๋ ˆ๋ฏธ์Šค์—์„œ Pod๋ฅผ ์ œ๊ฑฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— pod-eviction-timeout์ด ๋งŒ๋ฃŒ๋œ ํ›„ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์‹œ ์ฐธ์—ฌํ•˜๋ฉด ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ Pod๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Pod๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ์— ๋‹ค์‹œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pod-eviction-timeout ๊ธฐ๊ฐ„์€ 5m0s์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ 

node-monitor-grace-period ๋ฐ pod-eviction-timeout ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜์ •์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ—ˆ์šฉ ์˜ค์ฐจ
์˜จํ”„๋ ˆ๋ฏธ์Šค ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ NoExecute ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” node.kubernetes.io/unreachable ํ…Œ์ธํŠธ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ Pod ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ํ–ฅ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NoExecute ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ํ…Œ์ธํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋…ธ๋“œ์—์„œ ์ด๋ฏธ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” Pod์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

  • ํ•ด๋‹น ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” Pod๊ฐ€ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ํ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • ํ—ˆ์šฉ ์˜ค์ฐจ ์‚ฌ์–‘์— tolerationSeconds ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Pod๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • tolerationSeconds ๊ฐ’์ด ์ง€์ •๋œ ํ…Œ์ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Pod๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฐ”์ธ๋”ฉ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด Pod๊ฐ€ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ํ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

node.kubernetes.io/unreachable ๋ฐ node.kubernetes.io/not-ready ํ…Œ์ธํŠธ์— ๋Œ€ํ•ด NoExecute ํšจ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pod ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด Pod ์ œ๊ฑฐ๋ฅผ ์ง€์—ฐํ•˜๊ฑฐ๋‚˜ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pod ์‚ฌ์–‘์˜ ํ—ˆ์šฉ ์˜ค์ฐจ ์˜ˆ

...
tolerations:
- key: "node.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute" 1
- key: "node.kubernetes.io/not-ready"
  operator: "Exists"
  effect: "NoExecute" 2
  tolerationSeconds: 600
...

1
tolerationSeconds ๊ฐ€ ์—†๋Š” NoExecute ํšจ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ Pod๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
2
tolerationSeconds: 600์œผ๋กœ NoExecute ํšจ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ ๋…ธ๋“œ๋ฅผ Unhealthy ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒฝ์šฐ Pod๊ฐ€ 10๋ถ„ ๋™์•ˆ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

OpenShift Container Platform์—์„œ๋Š” pod-eviction-timeout ๊ฐ’์ด ๊ฒฝ๊ณผํ•˜๋ฉด tolerationSeconds ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ ์œ ํ˜•์˜ OpenShift Container Platform ์˜ค๋ธŒ์ ํŠธ
๋ณต์ œ๋ณธ ์„ธํŠธ, ๋ฐฐํฌ, ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ 5๋ถ„ ๋™์•ˆ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋ฉด ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ํ•ด๋‹น Pod๋ฅผ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋‹ค์‹œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ ํŠน์ • ์ˆ˜์˜ Pod๊ฐ€ ์‹คํ–‰๋˜๊ณ  ํ•ด๋‹น Pod์— ์•ก์„ธ์Šคํ•˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ์›Œํฌ๋กœ๋“œ์˜ ๊ฒฝ์šฐ(์˜ˆ: REST API) ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋‹ค์‹œ ์˜ˆ์•ฝํ•˜๋ฉด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ 

์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๋กœ ์ž‘์—…ํ•  ๋•Œ ์›๊ฒฉ ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ํŠน์ • ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์˜ˆ์•ฝ๋˜๋„๋ก ์˜๋„๋œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋…ธ๋“œ์— Pod๋ฅผ ๋‹ค์‹œ ์˜ˆ์•ฝํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํƒœ ์ €์žฅ ์„ธํŠธ๋Š” ์ค‘๋‹จ ๋ฐœ์ƒ ์‹œ ์žฌ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ Pod๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ์ธ์‹ํ•  ๋•Œ๊นŒ์ง€ Pod๋Š” terminating ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ๋ถ„๋ฆฌ์˜ ๊ฒฝ์šฐ OpenShift Container Platform์—์„œ๋Š” ๋™์ผํ•œ ์œ ํ˜•์˜ ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ์— ์˜ˆ์•ฝํ•˜์ง€ ์•Š๋„๋ก ์˜๊ตฌ ๋ณผ๋ฅจ์ด ํ•„์š”ํ•œ Pod๋ฅผ ๋‹ค๋ฅธ ์˜์—ญ์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

๋ฒ•์  ๊ณต์ง€

Copyright ยฉ 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attributionโ€“Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linuxยฎ is the registered trademark of Linus Torvalds in the United States and other countries.
Javaยฎ is a registered trademark of Oracle and/or its affiliates.
XFSยฎ is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQLยฎ is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.jsยฎ is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStackยฎ Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubRedditYoutubeTwitter

์ž์„ธํ•œ ์ •๋ณด

ํ‰๊ฐ€ํŒ, ๊ตฌ๋งค ๋ฐ ํŒ๋งค

์ปค๋ฎค๋‹ˆํ‹ฐ

Redย Hat ๋ฌธ์„œ ์ •๋ณด

Redย Hat์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ๊ฐ์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋œ ์ œํ’ˆ๊ณผ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ํ˜์‹ ํ•˜๊ณ  ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด๋‹ค ํฌ๊ด„์  ์ˆ˜์šฉ์„ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ์šฉ์–ด ๊ต์ฒด

Redย Hat์€ ์ฝ”๋“œ, ๋ฌธ์„œ, ์›น ์†์„ฑ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์–ธ์–ด๋ฅผ ๊ต์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.Redย Hat ๋ธ”๋กœ๊ทธ.

Redย Hat ์†Œ๊ฐœ

Redย Hat์€ ๊ธฐ์—…์ด ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์—์„œ ๋„คํŠธ์›Œํฌ ์—์ง€์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ํ”Œ๋žซํผ๊ณผ ํ™˜๊ฒฝ ์ „๋ฐ˜์—์„œ ๋” ์‰ฝ๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ•ํ™”๋œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ยฉ 2024 Red Hat, Inc.