์ตœ์†Œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Kubernetes

๊ธฐ์‚ฌ์˜ ๋ฒˆ์—ญ์€ ๊ณผ์ • ์‹œ์ž‘ ์ „๋‚ ์— ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "DevOps ์‚ฌ๋ก€ ๋ฐ ๋„๊ตฌ".

์ตœ์†Œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Kubernetes

์ด ๊ธ€์„ ์ฝ๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด ์•„๋งˆ๋„ Kubernetes์— ๋Œ€ํ•ด ๋“ค์–ด๋ณด์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒ ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค์…จ๋‚˜์š”?). ํ•˜์ง€๋งŒ Kubernetes๋ž€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ๊ฐ€์š”? ์ด๊ฒƒ โ€œ์‚ฐ์—…์šฉ ์ปจํ…Œ์ด๋„ˆ์˜ ํŽธ์„ฑโ€? ๋˜๋Š” "ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์šด์˜ ์ฒด์ œ"? ์ด๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์†”์งํžˆ ๋งํ•ด์„œ 100% ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๋ถ€๋ฅผ ํŒŒํ—ค์ณ ์—ฌ๋Ÿฌ ์ถ”์ƒํ™” ๊ณ„์ธต ์•„๋ž˜ Kubernetes์—์„œ ์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์žฌ๋ฏธ์‚ผ์•„ ์ตœ์†Œํ•œ์˜ "Kubernetes ํด๋Ÿฌ์Šคํ„ฐ"๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Kubernetes์˜ ์–ด๋ ค์šด ๋ฐฉ๋ฒ•.)

Kubernetes, Linux ๋ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์‹์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๋ชจ๋“  ๋‚ด์šฉ์€ ์—ฐ๊ตฌ/ํ•™์Šต ๋ชฉ์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ํ”„๋กœ๋•์…˜์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

๊ฒ€ํ† 

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

์ตœ์†Œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Kubernetes

์—ฌ๊ธฐ์—๋Š” ์ตœ์†Œ XNUMX๊ฐœ์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ๋ฌด์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Kubernetes๋ผ๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ์š”์†Œ๋Š” ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • Kubelet
  • kube-apiserver(etcd์— ๋”ฐ๋ผ ๋‹ค๋ฆ„ - ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)
  • ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„(์ด ๊ฒฝ์šฐ Docker)

๋ฌธ์„œ์—์„œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋ญ๋ผ๊ณ  ๋งํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(๋ฃจ์Šค., ์˜์–ด.). ์ฒ˜์Œ์—๋Š” Kubelet:

ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํฌ๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋Š” ์–ด๋•Œ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ (์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„)?

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์„ค๊ณ„๋œ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

๋งค์šฐ ์œ ์ตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Docker์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด Docker๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„๊ณผ kubelet ๊ฐ„์˜ ์ฑ…์ž„ ๋ถ„๋ฆฌ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์‹ค์ œ๋กœ ๋งค์šฐ ๋ฏธ๋ฌ˜ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.)

ะ˜ API ์„œ๋ฒ„?

API ์„œ๋ฒ„๋Š” Kubernetes API๋ฅผ ๋…ธ์ถœํ•˜๋Š” Kubernetes ์ œ์–ดํŒ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. API ์„œ๋ฒ„๋Š” Kubernetes ์ œ์–ดํŒ์˜ ํด๋ผ์ด์–ธํŠธ ์ธก์ž…๋‹ˆ๋‹ค.

Kubernetes๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์ง์ ‘ ๋˜๋Š” kubectl์„ ํ†ตํ•ด API์™€ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Kubernetes Kubernetes๋ฅผ ๋งŒ๋“œ๋Š” ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์•Œ๊ณ  ์‚ฌ๋ž‘ํ•˜๋Š”(?) ์‚ฐ๋”๋ฏธ ๊ฐ™์€ YAML์„ ์ž‘๋™ํ•˜๋Š” ์ธํ”„๋ผ๋กœ ๋ฐ”๊พธ๋Š” ๋‘๋‡Œ์ž…๋‹ˆ๋‹ค. API๊ฐ€ ์ตœ์†Œํ•œ์˜ ๊ตฌ์„ฑ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ „์ œ ์กฐ๊ฑด

  • ๋ฃจํŠธ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” Linux ๊ฐ€์ƒ ๋˜๋Š” ๋ฌผ๋ฆฌ์  ๋จธ์‹ (๊ฐ€์ƒ ๋จธ์‹ ์—์„œ Ubuntu 18.04๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).
  • ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ!

์ง€๋ฃจํ•œ ์„ค์น˜

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๋จธ์‹ ์— Docker๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (Docker์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋Š” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด ๋ฉ‹์ง„ ๊ธฐ์‚ฌ). ๊ทธ๋ƒฅ ์„ค์น˜ํ•˜์ž apt:

$ sudo apt install docker.io
$ sudo systemctl start docker

๊ทธ๋Ÿฐ ๋‹ค์Œ Kubernetes ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ "ํด๋Ÿฌ์Šคํ„ฐ"๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. kubelet, ๋‹ค๋ฅธ ์„œ๋ฒ„ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ kubelet. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‹คํ–‰๋œ ํ›„ ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. kubectl.

$ curl -L https://dl.k8s.io/v1.18.5/kubernetes-server-linux-amd64.tar.gz > server.tar.gz
$ tar xzvf server.tar.gz
$ cp kubernetes/server/bin/kubelet .
$ cp kubernetes/server/bin/kubectl .
$ ./kubelet --version
Kubernetes v1.18.5

๊ทธ๋ƒฅ ๋‹ฌ๋ฆฌ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? kubelet?

$ ./kubelet
F0609 04:03:29.105194    4583 server.go:254] mkdir /var/lib/kubelet: permission denied

kubelet ๋ฃจํŠธ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ „์ฒด ๋…ธ๋“œ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋งค์šฐ ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ ./kubelet -h
<ัะปะธัˆะบะพะผ ะผะฝะพะณะพ ัั‚ั€ะพะบ, ั‡ั‚ะพะฑั‹ ั€ะฐะทะผะตัั‚ะธั‚ัŒ ะทะดะตััŒ>
$ ./kubelet -h | wc -l
284

์™€, ์˜ต์…˜์ด ๋„ˆ๋ฌด ๋งŽ์•„์š”! ์šด ์ข‹๊ฒŒ๋„ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค ์ค‘ ๋ช‡ ๊ฐœ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--pod-manifest-path string

์ •์  ํฌ๋“œ์šฉ ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ ๋˜๋Š” ์ •์  ํฌ๋“œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์ ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ผ์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. (์ง€์› ์ค‘๋‹จ๋จ: ์ด ์˜ต์…˜์€ --config ์˜ต์…˜์„ ํ†ตํ•ด Kubelet์— ์ „๋‹ฌ๋œ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์„ค์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”. kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)

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

๋จผ์ € ์ •์  ํฌ๋“œ์šฉ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. kubelet:

$ mkdir pods
$ sudo ./kubelet --pod-manifest-path=pods

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„/tmux ์ฐฝ ๋“ฑ์—์„œ ํฌ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

$ cat <<EOF > pods/hello.yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello
spec:
  containers:
  - image: busybox
    name: hello
    command: ["echo", "hello world!"]
EOF

kubelet ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ๊ณ ๋ฅผ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค! ๋„์ปค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

$ sudo docker ps -a
CONTAINER ID        IMAGE                  COMMAND                 CREATED             STATUS                      PORTS               NAMES
8c8a35e26663        busybox                "echo 'hello world!'"   36 seconds ago      Exited (0) 36 seconds ago                       k8s_hello_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_4
68f670c3c85f        k8s.gcr.io/pause:3.2   "/pause"                2 minutes ago       Up 2 minutes                                    k8s_POD_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_0
$ sudo docker logs k8s_hello_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_4
hello world!

kubelet ๋‚˜๋Š” ํฌ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ฝ๊ณ  ์šฐ๋ฆฌ ์‚ฌ์–‘์— ๋”ฐ๋ผ ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๋ผ๋Š” ๋ช…๋ น์„ Docker์— ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ("์ผ์‹œ ์ค‘์ง€" ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์ด๋Š” Kubernetes ํ•ดํ‚น์ž…๋‹ˆ๋‹ค. ์ด ๋ธ”๋กœ๊ทธ.) Kubelet์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถœ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. busybox ์ง€์ •๋œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์  ํฌ๋“œ๊ฐ€ ์‚ญ์ œ๋  ๋•Œ๊นŒ์ง€ ๋ฌด๊ธฐํ•œ ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์ž์‹ ์„ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ„ฐ๋ฏธ๋„์— ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ€์žฅ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์ƒ๊ฐํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค!

etcd ์‹คํ–‰

์šฐ๋ฆฌ์˜ ๊ถ๊ทน์ ์ธ ๋ชฉํ‘œ๋Š” Kubernetes API๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๋‹ค์Œ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ. Pods ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํ•ด๋‹น ์„ค์ •์„ ๋ฐฐ์น˜ํ•˜์—ฌ ์ตœ์†Œ etcd ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค(์˜ˆ: pods/etcd.yaml):

apiVersion: v1
kind: Pod
metadata:
  name: etcd
  namespace: kube-system
spec:
  containers:
  - name: etcd
    command:
    - etcd
    - --data-dir=/var/lib/etcd
    image: k8s.gcr.io/etcd:3.4.3-0
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data
  hostNetwork: true
  volumes:
  - hostPath:
      path: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data

Kubernetes๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์žˆ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ YAML ํŒŒ์ผ์ด ์ต์ˆ™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ์ ์€ ๋‘ ๊ฐ€์ง€๋ฟ์ž…๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ ํด๋”๋ฅผ ๋งˆ์šดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค /var/lib/etcd ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„ etcd ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์กด๋˜๋„๋ก ํฌ๋“œ์—์„œ(์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด ํฌ๋“œ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๊ฐ€ ์ง€์›Œ์ง€๋ฏ€๋กœ ์ตœ์†Œํ•œ์˜ Kubernetes ์„ค์น˜์—๋„ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์šฐ๋ฆฌ๋Š” ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค hostNetwork: true. ๋‹น์—ฐํžˆ ์ด ์„ค์ •์€ Pod์˜ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ๋Œ€์‹  ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก etcd๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ด๋ ‡๊ฒŒ ํ•˜๋ฉด API ์„œ๋ฒ„๊ฐ€ etcd ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

๊ฐ„๋‹จํ•œ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด etcd๊ฐ€ ์‹ค์ œ๋กœ localhost์—์„œ ์‹คํ–‰ ์ค‘์ด๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ curl localhost:2379/version
{"etcdserver":"3.4.3","etcdcluster":"3.4.0"}
$ sudo tree /var/lib/etcd/
/var/lib/etcd/
โ””โ”€โ”€ member
    โ”œโ”€โ”€ snap
    โ”‚   โ””โ”€โ”€ db
    โ””โ”€โ”€ wal
        โ”œโ”€โ”€ 0.tmp
        โ””โ”€โ”€ 0000000000000000-0000000000000000.wal

API ์„œ๋ฒ„ ์‹œ์ž‘

Kubernetes API ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. --etcd-servers, ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    command:
    - kube-apiserver
    - --etcd-servers=http://127.0.0.1:2379
    image: k8s.gcr.io/kube-apiserver:v1.18.5
  hostNetwork: true

์ด YAML ํŒŒ์ผ์„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. pods, API ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ ์ค‘ curl Kubernetes API๊ฐ€ ์™„์ „ํžˆ ๊ฐœ๋ฐฉ๋œ ์•ก์„ธ์Šค๋กœ ํฌํŠธ 8080์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ธ์ฆ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

$ curl localhost:8080/healthz
ok
$ curl localhost:8080/api/v1/pods
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/pods",
    "resourceVersion": "59"
  },
  "items": []
}

(๋‹ค์‹œ ํ•œ๋ฒˆ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์„ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์„ธ์š”! ๊ธฐ๋ณธ ์„ค์ •์ด ๋„ˆ๋ฌด ์•ˆ์ „ํ•˜์ง€ ์•Š์•„์„œ ์กฐ๊ธˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐœ๋ฐœ๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ๋†€๋ž๊ฒŒ๋„ kubectl์€ ์ถ”๊ฐ€ ์„ค์ • ์—†์ด ์ฆ‰์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

$ ./kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
$ ./kubectl get pod
No resources found in default namespace.

๋ฌธ์ œ

ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ๋ณด๋ฉด ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ ./kubectl get pod -n kube-system
No resources found in kube-system namespace.

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ •์  ํฌ๋“œ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค! ์‹ค์ œ๋กœ kubelet ๋…ธ๋“œ๋Š” ์ „ํ˜€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

$ ./kubectl get nodes
No resources found in default namespace.

๋ฌด์Šจ ์ผ์ด์•ผ? ๋ช‡ ๋‹จ๋ฝ ์ „์„ ๊ธฐ์–ตํ•˜์‹ ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ธํŠธ๋กœ kubelet์„ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— kubelet์€ API ์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ์—ฐ๊ตฌํ•œ ํ›„ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

--kubeconfig string

ํŒŒ์ผ์˜ ๊ฒฝ๋กœ kubeconfig, API ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจ์„ฑ --kubeconfig API ์„œ๋ฒ„ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ์š” --kubeconfig ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ์ž์‹ ๋„ ๋ชจ๋ฅด๊ฒŒ kubelet์„ "์˜คํ”„๋ผ์ธ ๋ชจ๋“œ"๋กœ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. (ํ˜„ํ•™์ ์œผ๋กœ ๋งํ•˜๋ฉด ๋…๋ฆฝํ˜• kubelet์„ "์ตœ์†Œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Kubernetes"๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋งค์šฐ ์ง€๋ฃจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค). "์‹ค์ œ" ๊ตฌ์„ฑ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด kubeconfig ํŒŒ์ผ์„ kubelet์— ์ „๋‹ฌํ•˜์—ฌ API ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šด ์ข‹๊ฒŒ๋„ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค(์ธ์ฆ์ด๋‚˜ ์ธ์ฆ์„œ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—).

apiVersion: v1
kind: Config
clusters:
- cluster:
    server: http://127.0.0.1:8080
  name: mink8s
contexts:
- context:
    cluster: mink8s
  name: mink8s
current-context: mink8s

์ด๊ฒƒ์„ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ €์žฅ kubeconfig.yaml, ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ kubelet ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

$ sudo ./kubelet --pod-manifest-path=pods --kubeconfig=kubeconfig.yaml

(๊ทธ๋Ÿฐ๋ฐ, kubelet์ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ๋•Œ ์ปฌ์„ ํ†ตํ•ด API์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—ฌ์ „ํžˆ ์‹คํ–‰ ์ค‘์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค! Kubelet์€ Docker์™€ ๊ฐ™์€ Pod์˜ "์ƒ์œ„"๊ฐ€ ์•„๋‹ˆ๋ผ "์ปจํŠธ๋กค"์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. daemon.โ€ kubelet์ด ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” kubelet์ด ์ค‘์ง€ํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.)

๋ช‡ ๋ถ„ ์•ˆ์— kubectl ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ํฌ๋“œ์™€ ๋…ธ๋“œ๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

$ ./kubectl get pods -A
NAMESPACE     NAME                    READY   STATUS             RESTARTS   AGE
default       hello-mink8s            0/1     CrashLoopBackOff   261        21h
kube-system   etcd-mink8s             1/1     Running            0          21h
kube-system   kube-apiserver-mink8s   1/1     Running            0          21h
$ ./kubectl get nodes -owide
NAME     STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
mink8s   Ready    <none>   21h   v1.18.5   10.70.10.228   <none>        Ubuntu 18.04.4 LTS   4.15.0-109-generic   docker://19.3.6

์ด๋ฒˆ์—๋Š” ์ •๋ง๋กœ ์ถ•ํ•˜ํ•ด ๋ด…์‹œ๋‹ค(์ด๋ฏธ ์ถ•ํ•˜ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ API๋กœ ์‹คํ–‰๋˜๋Š” ์ตœ์†Œํ•œ์˜ Kubernetes "ํด๋Ÿฌ์Šคํ„ฐ"๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

์šฐ๋ฆฌ๋Š” ์•„๋ž˜์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค

์ด์ œ API๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. nginx ํฌ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx

์—ฌ๊ธฐ์„œ๋Š” ๋‹ค์†Œ ํฅ๋ฏธ๋กœ์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

$ ./kubectl apply -f nginx.yaml
Error from server (Forbidden): error when creating "nginx.yaml": pods "nginx" is
forbidden: error looking up service account default/default: serviceaccount
"default" not found
$ ./kubectl get serviceaccounts
No resources found in default namespace.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” Kubernetes ํ™˜๊ฒฝ์ด ์–ผ๋งˆ๋‚˜ ๋น„์ฐธํ•  ์ •๋„๋กœ ๋ถˆ์™„์ „ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ •์„ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค์–ด ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: default
EOS
serviceaccount/default created
$ ./kubectl apply -f nginx.yaml
Error from server (ServerTimeout): error when creating "nginx.yaml": No API
token found for service account "default", retry after the token is
automatically created and added to the service account

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

์˜ต์…˜์„ ์„ค์ •ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. automountServiceAccountToken ์„œ๋น„์Šค ๊ณ„์ •์˜ ๊ฒฝ์šฐ(์–ด์ฐจํ”ผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ):

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: default
automountServiceAccountToken: false
EOS
serviceaccount/default configured
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   0/1     Pending   0          13m

๋“œ๋””์–ด ํŒŸ์ด ๋“ฑ์žฅํ–ˆ์–ด์š”! ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ์ž…์•ˆ์ž (์Šค์ผ€์ค„๋Ÿฌ)๋Š” Kubernetes์˜ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, Kubernetes API๋Š” ๋†€๋ž๊ฒŒ๋„ "๋ฉ์ฒญํ•˜๋‹ค"๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API์—์„œ Pod๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ด๋ฅผ ๋“ฑ๋กํ•˜์ง€๋งŒ ์–ด๋–ค ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ• ์ง€ ํŒŒ์•…ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Pod๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋…ธ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. nodeName:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
  nodeName: mink8s

(๋ฐ”๊พธ๋‹ค mink8s ๋…ธ๋“œ ์ด๋ฆ„์—.) ์‚ญ์ œํ•˜๊ณ  ์ ์šฉํ•œ ํ›„ nginx๊ฐ€ ์‹œ์ž‘๋˜์–ด ๋‚ด๋ถ€ IP ์ฃผ์†Œ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ ./kubectl delete pod nginx
pod "nginx" deleted
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods -owide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          30s   172.17.0.2   mink8s   <none>           <none>
$ curl -s 172.17.0.2 | head -4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

ํฌ๋“œ ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํฌ๋“œ์—์„œ ์ปฌ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: curl
spec:
  containers:
  - image: curlimages/curl
    name: curl
    command: ["curl", "172.17.0.2"]
  nodeName: mink8s
EOS
pod/curl created
$ ./kubectl logs curl | head -6
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

์ด ํ™˜๊ฒฝ์„ ํŒŒํ—ค์ณ ๋ฌด์—‡์ด ํšจ๊ณผ๊ฐ€ ์žˆ๊ณ  ๋ฌด์—‡์ด ํšจ๊ณผ๊ฐ€ ์—†๋Š”์ง€ ์•Œ์•„๋ณด๋Š” ๊ฒƒ์€ ๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ConfigMap๊ณผ Secret์€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ Service์™€ ๋ฐฐํฌ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์„ฑ๊ณต!

ํฌ์ŠคํŒ…์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ์„œ ์Šน๋ฆฌ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ด๊ฒƒ์ด "Kubernetes"๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด: 45๊ฐœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ, XNUMX๊ฐœ์˜ ๋ช…๋ น์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ "๋‹จ์ง€" XNUMX์ค„์˜ YAML(์•„๋‹™๋‹ˆ๋‹ค) Kubernetes ํ‘œ์ค€์— ๋”ฐ๋ฅด๋ฉด ๊ทธ ์ •๋„) ์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • Pod๋Š” ์ผ๋ฐ˜ Kubernetes API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค(๋ช‡ ๊ฐ€์ง€ ํ•ดํ‚น ํฌํ•จ).
  • ๊ณต์šฉ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฌ๋“œ๋Š” ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋ฉฐ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
  • ๋™์ผํ•œ ๋…ธ๋“œ ๋‚ด์˜ ํฌ๋“œ ๊ฐ„ ๋„คํŠธ์›Œํ‚น์€ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ConfigMap, Secret ๋ฐ ๊ฐ„๋‹จํ•œ ์Šคํ† ๋ฆฌ์ง€ ๋งˆ์šดํŒ…์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Kubernetes๋ฅผ ์ง„์ •์œผ๋กœ ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งŽ์€ ์š”์†Œ๊ฐ€ ์•„์ง ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ํฌ๋“œ ์Šค์ผ€์ค„๋Ÿฌ
  • ์ธ์ฆ/์Šน์ธ
  • ๋‹ค์ค‘ ๋…ธ๋“œ
  • ์„œ๋น„์Šค ๋„คํŠธ์›Œํฌ
  • ํด๋Ÿฌ์Šคํ„ฐ๋ง๋œ ๋‚ด๋ถ€ DNS
  • ์„œ๋น„์Šค ๊ณ„์ •, ๋ฐฐํฌ, ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์™€์˜ ํ†ตํ•ฉ ๋ฐ Kubernetes๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐํƒ€ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ์ปจํŠธ๋กค๋Ÿฌ

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

๋ฌด๋ฃŒ ์›น ์„ธ๋ฏธ๋‚˜์—์„œ ํ•ด๋‹น ๊ณผ์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

๋” ์ฝ์–ด๋ณด๊ธฐ :

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€