Kubernetes - ChoDragon9/posts GitHub Wiki

์ฐธ๊ณ ์ž๋ฃŒ ๋ธ”๋กœ๊ทธ

๊ณต์‹๋ฌธ์„œ ํ•œ๊ธ€

์ •๋ฆฌ ํ•„์š”

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€?

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌ/ํ™•์žฅํ•˜๊ณ  ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”Œ๋žซํผ์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ํ”ํžˆ ์ผ€์ด์ธ (k8s) ๋˜๋Š” ํ๋ธŒ(kube)๋ผ๊ณ  ์ค„์—ฌ์„œ ๋ถ€๋ฅธ๋‹ค.

ํŠน์ง•

  • ์„œ๋น„์Šค๋ฉ”์‹œ(Istio, linkerd), CI(Tekton, Spinnaker), ์ปจํ…Œ์ด๋„ˆ ์„œ๋ฒ„๋ฆฌ์Šค(Knative), ๋จธ์‹ ๋Ÿฌ๋‹(kubeflow)์ด ๋ชจ๋‘ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ™˜๊ฒฝ์—์„œ ๋Œ์•„๊ฐ„๋‹ค.
  • ๋‹ค์–‘ํ•œ ๋ฐฐํฌ๋ฐฉ์‹
    • Deployment: ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์–‘ํ•œ ์ „๋žต์œผ๋กœ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ
    • StatefulSets: ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ณ  ํ˜ธ์ŠคํŠธ ์ด๋ฆ„๊ณผ ๋ณผ๋ฅจ์„ ์ผ์ •ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ˆœ์„œ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ
    • DaemonSet: ๋กœ๊ทธ๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ
    • Job, CronJob: ๋ฐฐ์น˜์„ฑ ์ž‘์—…
  • Ingress ์„ค์ •
    • ๋‹ค์–‘ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•˜๋‚˜์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ ์„œ๋น„์Šคํ•˜๊ธฐ ์œ„ํ•ด Ingress๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • Label & Namespace
    • ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ(system, default)์™ธ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

๋‹จ์ 

  • ๋ณต์žกํ•˜๊ณ  ์ดˆ๋ฐ˜์— ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • YAML ์„ค์ • ํŒŒ์ผ์€ ๋„ˆ๋ฌด ๋งŽ๊ณ  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ์‰ฝ์ง€ ์•Š๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ณธ ๊ฐœ๋…

Desired State

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ Desired state - ์›ํ•˜๋Š” ์ƒํƒœ๋ผ๋Š” ๊ฐœ๋…์ด๋‹ค. ์›ํ•˜๋Š” ์ƒํƒœ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฐ”๋ผ๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์›น์„œ๋ฒ„๊ฐ€ ๋„์–ด ์žˆ์œผ๋ฉด ์ข‹์œผ์ง€, ๋ช‡ ๋ฒˆ ํฌํŠธ๋กœ ์„œ๋น„์Šคํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉด์„œ ๊ด€๋ฆฌ์ž๊ฐ€ ์„ค์ •ํ•œ ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ ค๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐœ๋… ๋•Œ๋ฌธ์— ๊ด€๋ฆฌ์ž๊ฐ€ ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ์ง์ ‘์ ์ธ ๋™์ž‘์„ ๋ช…๋ นํ•˜์ง€ ์•Š๊ณ  ์ƒํƒœ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ด์ค˜. ๊ทธ๋ฆฌ๊ณ  80 ํฌํŠธ๋กœ ์˜คํ”ˆํ•ด์ค˜."๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•œ ๋ช…๋ น์ด๊ณ  "80ํฌํŠธ๋ฅผ ์˜คํ”ˆํ•œ nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ 1๊ฐœ ์œ ์ง€ํ•ด์ค˜"๋Š” ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์„ ์–ธํ•œ ๊ฒƒ์ด๋‹ค.

๋ช…๋ น๊ณผ ์„ ์–ธ์€ CLI ๋ช…๋ น์–ด์—์„œ๋„ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

docker run # ๋ช…๋ น
kubectl create # ์ƒํƒœ ์ƒ์„ฑ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ํ•ต์‹ฌ์€ ์ƒํƒœ์ด๋ฉฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ค ์ƒํƒœ๊ฐ€ ์žˆ๊ณ  ์–ด๋–ป๊ฒŒ ์ƒํƒœ๋ฅผ ์„ ์–ธํ•˜๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

Kubernetes Object

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์ƒ์„ ์˜ค๋ธŒ์ ํŠธ๋กœ ์ •์˜ํ•œ๋‹ค.

Pod

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

ReplicaSet

Pod์„ ์—ฌ๋Ÿฌ ๊ฐœ(ํ•œ ๊ฐœ ์ด์ƒ) ๋ณต์ œํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. Pod๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐœ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ReplicaSet์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ReplicaSet์˜ ๊ตฌ์„ฑ์€ ๋ณต์ œํ•  ๊ฐœ์ˆ˜, ๊ฐœ์ˆ˜๋ฅผ ์ฒดํฌํ•  ๋ผ๋ฒจ ์„ ํƒ์ž, ์ƒ์„ฑํ•  Pod์˜ ์„ค์ •๊ฐ’ ๋“ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ง์ ‘์ ์œผ๋กœ ReplicaSet์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” Deployment๋“ฑ ๋‹ค๋ฅธ ์˜คํ”„์ ํŠธ์— ์˜ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

Service

๋„คํŠธ์›Œํฌ์™€ ๊ด€๋ จ๋œ ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. Pod์„ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ Pod์„ ๋ฐ”๋ผ๋ณด๋Š” ๋‚ด๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋„ ์‚ฌ์šฉํ•œ๋‹ค. ๋‚ด๋ถ€ DNS์— ์„œ๋น„์Šค ์ด๋ฆ„์„ ๋„๋ฉ”์ธ์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ์—ญํ• ๋„ ํ•œ๋‹ค.

Volume

์ €์žฅ์†Œ์™€ ๊ด€๋ จ๋œ ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. ํ˜ธ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  EBS๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Object Spec - YAML

์˜ค๋ธŒ์ ํŠธ์˜ ๋ช…์„ธ๋Š” YAML ํŒŒ์ผ๋กœ ์ •์˜ํ•œ๋‹ค. YAML ํŒŒ์ผ์— ์˜ค๋ธŒ์ ํŠธ์˜ ์ข…๋ฅ˜์™€ ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

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

apiVersion: v1
kind: Pod
metadata:
    name: example
spec:
    containers:
    - name: busybox
      image: busybox:1.25
์š”๊ตฌ๋˜๋Š” ํ•„๋“œ

์ŠคํŽ™ ์ƒ์„ธ ์„ค๋ช…

  • apiVersion: ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ๋ฒ„์ „
  • kind: ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์ง€
  • metadata
    • name: ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์œ ์ผํ•˜๊ฒŒ ๊ตฌ๋ถ„์ง€์–ด ์ค„ ๋ฐ์ดํ„ฐ. ์ด๋ฆ„, UID ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์ธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํฌํ•จ.
  • spec

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฐฐํฌ๋ฐฉ์‹

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋‹ค์–‘ํ•œ ์˜ค๋ธŒ์ ํŠธ์— ๋ผ๋ฒจ์„ ๋ถ™์—ฌ ์ •์˜(YAML)ํ•˜๊ณ  API ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์•„ํ‚คํ…์ฒ˜

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ค‘์•™(Master)์— API ์„œ๋ฒ„์™€ ์ƒํƒœ ์ €์žฅ์†Œ๋ฅผ ๋‘๊ณ  ๊ฐ ์„œ๋ฒ„(Node)์˜ ์—์ด์ „ํŠธ(Kubelet)์™€ ํ†ต์‹ ํ•˜๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ์ด๋‹ค.

๋งˆ์Šคํ„ฐ-๋…ธ๋“œ ๊ตฌ์กฐ

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