ํด๋Ÿฌ์Šคํ„ฐํ‚ท

KlusterKit: Kubernetes ๋ฐฐํฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌ๋œ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํˆดํ‚ท

ํด๋Ÿฌ์Šคํ„ฐํ‚ท

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” Platform9์ด GitHub์˜ Apache v2.0 ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ์„ธ ๊ฐ€์ง€ ๋„๊ตฌ ๋ชจ์Œ์ธ Klusterkit์„ ์˜คํ”ˆ ์†Œ์Šคํ™”ํ•œ๋‹ค๋Š” ์†Œ์‹์„ ๋ฐœํ‘œํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

Klusterkit์—๋Š” Kubernetes ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ ๋˜๋Š” ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. etcdadm, ๋‹จ์ˆœํ™”๋œ etcd ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ CLI.
  2. nodeadm, kubeadm์„ ํ™•์žฅํ•˜๊ณ  kubeadm์— ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ๋ฐฐํฌํ•˜๋Š” ๋…ธ๋“œ ๊ด€๋ฆฌ์šฉ CLI์ž…๋‹ˆ๋‹ค.
  3. CCTL๋Š” Kubernetes ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ Cluster API๋ฅผ ์ฑ„ํƒํ•˜๊ณ  nodeadm ๋ฐ etcdadm์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์€ ๋ฌผ๋ก  ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ๋„ ๊ฐ€์šฉ์„ฑ์ด ๋†’์€ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€ ๋„๊ตฌ๋Š” ํ•จ๊ป˜ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

ํด๋Ÿฌ์Šคํ„ฐํ‚ท ๊ธฐ๋Šฅ

  • ๋‹ค์ค‘ ๋งˆ์Šคํ„ฐ ์ง€์›(HA ํด๋Ÿฌ์Šคํ„ฐ K8s)
  • ์•ˆ์ „ํ•œ etcd ํด๋Ÿฌ์Šคํ„ฐ ์ œ๊ณต ๋ฐ ๊ด€๋ฆฌ.
  • ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กค๋ง ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ ๋กค๋ฐฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ์šฉ CNI์ธ ํ”Œ๋ž€๋„ฌ(vxlan) ๋‹ค๋ฅธ CNI๋ฅผ ์ง€์›ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฟผ๋Ÿผ ์†์‹ค ํ›„ etcd ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐฑ์—… ๋ฐ ๋ณต์›.
  • ์ œ์–ดํŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ์‹œ๊ฐ„ ๋ถ€์กฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Klusterkit ์†”๋ฃจ์…˜ ์•„ํ‚คํ…์ฒ˜

ํด๋Ÿฌ์Šคํ„ฐํ‚ท

๋‚ด๊ฒฐํ•จ์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ์„ ์œ„ํ•ด Klusterkit์€ ๋‹จ์ผ cctl-state.yaml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. cctl CLI๋ฅผ ํ†ตํ•ด ์ด ์ƒํƒœ ํŒŒ์ผ์ด ์žˆ๋Š” ๋ชจ๋“  ์‹œ์Šคํ…œ์—์„œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์šด์˜์ž์˜ ๋žฉํƒ‘์ผ ์ˆ˜๋„ ์žˆ๊ณ  Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ผ๋ถ€์ธ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Cctl์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ CRUD ์ž‘์—…์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์—…์ŠคํŠธ๋ฆผ์—์„œ Cluster-api ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Š” ์‚ฌ์šฉํ•œ๋‹ค SSH ์ œ๊ณต์ž, Platform9์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฒ ์–ด๋ฉ”ํƒˆ ํด๋Ÿฌ์Šคํ„ฐ API ์ œ๊ณต์ž์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฐจ๋ก€๋กœ etcdadm ๋ฐ nodeadm์„ ํ˜ธ์ถœํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Klusterkit ๋ฐ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•:

1 โ€“ go get ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ ๊ฐ€์ง€ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‰ฝ๊ฒŒ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

go get -u github.com/platform9/cctl

go get -u github.com/platform9/nodeadm

go get -u github.com/kubernetes-sigs/etcdadm

2 โ€“ ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฌํ•œ ์‹คํ–‰ ํŒŒ์ผ์„ ํŒจํ‚ค์ง•ํ•˜์—ฌ ๊ณ ๊ฐ€์šฉ์„ฑ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๋Œ€์ƒ ์ปดํ“จํ„ฐ์— ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. nodeadm ๋ฐ etcdadm ํŒŒ์ผ์„ ๋ฒ„์ „ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

cp $GOPATH/bin/nodeadm /var/cache/ssh-provider/nodeadm//

cp $GOPATH/bin/etcdadm /var/cache/ssh-provider/etcdadm//

3 โ€“ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋กœ์ปฌ๋กœ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ nodeadm ๋ฐ etcdadm download ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋„ท ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ปดํ“จํ„ฐ์— ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ๋ฏธ๋ฆฌ ์‰ฝ๊ฒŒ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์šด๋กœ๋“œํ•œ ํ•ญ๋ชฉ(์˜ˆ: systemd์šฉ kubelet ๋ฐ kubelet ๋‹จ์œ„ ํŒŒ์ผ, CNI ์‹คํ–‰ ํŒŒ์ผ, kubeadm ํŒŒ์ผ, Kubernetes๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€, keepalived ์ด๋ฏธ์ง€ ๋ฐ systemd ํŒŒ์ผ, etcd ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ฐ ํ•ด๋‹น ๊ตฌ์„ฑ ํŒŒ์ผ)์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌ๋œ ํ˜ธ์ŠคํŠธ์— ์‰ฝ๊ฒŒ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. cctl, nodeadm ๋ฐ etcdadm์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (์ž์„ธํ•œ ๋‚ด์šฉ์€ ์œ„ํ‚ค).

4 โ€“ ๋ชจ๋“  ๊ฒƒ์ด ์ค€๋น„๋˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€“ ๋จผ์ € ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

$GOPATH/bin/cctl create credential --user root --private-key ~/.ssh/id_rsa

โ€“ ๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. โ€“help๋Š” ์ง€์›๋˜๋Š” ์˜ต์…˜ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

$GOPATH/bin/cctl create cluster --pod-network 192.168.0.0/16 --service-network 192.169.0.0/24

โ€“ ๋งˆ์ง€๋ง‰์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์ฒซ ๋ฒˆ์งธ ๋จธ์‹ ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

$GOPATH/bin/cctl create machine --ip $MACHINE_IP --role master

๋” ๋งŽ์€ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”. GitHub์˜.

์ถœ์ฒ˜ : habr.com

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