Kubeadm - 100-hours-a-week/21-iceT-wiki GitHub Wiki

๊ฐœ์š” (Overview)

๋ณธ ๋ฌธ์„œ๋Š” AWS EC2 ์ธ์Šคํ„ด์Šค ์œ„์— ๊ตฌ์ถ•๋œ ๊ธฐ์กด Docker ๊ธฐ๋ฐ˜ 3ํ‹ฐ์–ด ์•„ํ‚คํ…์ฒ˜(Dev/Prod ํ™˜๊ฒฝ ๋ถ„๋ฆฌ)๋ฅผ Kubeadm์„ ํ™œ์šฉํ•œ
Kubernetes ๋ฉ€ํ‹ฐ ๋…ธ๋“œ ํด๋Ÿฌ์Šคํ„ฐ
๋กœ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๋ช…์„ธ์„œ์ž…๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ , ์ง€์†์ ์ธ ๋ฐฐํฌ ์ž๋™ํ™”, ๊ฐ€์šฉ์„ฑ ํ™•๋ณด, ๋ฆฌ์†Œ์Šค ํƒ„๋ ฅ์„ฑ ๊ฐ•ํ™”๋ฅผ ๋ชฉํ‘œ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชฉ์ : Dev/Prod ํ™˜๊ฒฝ์„ ๊ตฌ๋ถ„ํ•œ K8s ํด๋Ÿฌ์Šคํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธํ”„๋ผ์˜ ์•ˆ์ •์„ฑ, ํ™•์žฅ์„ฑ, ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ๊ตฌ์กฐ ํ™•๋ณด
  • ๊ธฐ์กด ๊ตฌ์„ฑ: Docker ๊ธฐ๋ฐ˜ EC2 3ํ‹ฐ์–ด ์•„ํ‚คํ…์ฒ˜ (Frontend - Backend - MySQL), CodeDeploy ํ™œ์šฉ
  • ํ™•์žฅ ๋ฐฉํ–ฅ:
    • EC2 ์œ„ Kubeadm์œผ๋กœ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ (Master + Worker)
    • CI/CD: ๊ธฐ์กด GitHub + CodeDeploy โ†’ ArgoCD ๊ธฐ๋ฐ˜ GitOps
    • DB๋Š” Kubernetes ์™ธ๋ถ€(EC2 MySQL)๋กœ ๋ถ„๋ฆฌ ์œ ์ง€

์•„ํ‚คํ…์ณ

image image

image

Kubeadm ๋„์ž… ํ•„์š”์„ฑ ํ‰๊ฐ€

1. ํ˜„์žฌ ์„œ๋น„์Šค ๊ตฌ์กฐ ๋ฐ ํ•œ๊ณ„

ํ˜„์žฌ ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค๋Š” AWS EC2 ์ธ์Šคํ„ด์Šค ์œ„์— ๊ตฌ์ถ•๋œ Docker ๊ธฐ๋ฐ˜ 3ํ‹ฐ์–ด ์•„ํ‚คํ…์ฒ˜(Frontend - Backend - MySQL)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, Dev, Stage, Prod ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ฐ ๋…๋ฆฝ๋œ VPC์™€ EC2 ์ธํ”„๋ผ ์ƒ์—์„œ ์šด์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ณ„์ธต์€ Docker Compose ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ฐฐํฌ ์ž๋™ํ™”๋Š” GitHub Actions๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • ์ˆ˜์ง ํ™•์žฅ(Scale-up): EC2 ์ธ์Šคํ„ด์Šค์˜ ์‚ฌ์–‘์„ ๋†’์ž„ (t3.small โ†’ t3.large)
  • ์ˆ˜ํ‰ ํ™•์žฅ(Scale-out): EC2 ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ณ  ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๋ถ™์—ฌ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋‹จ๊ธฐ์ ์œผ๋กœ๋Š” ์œ ํšจํ•˜์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • EC2 ์ธ์Šคํ„ด์Šค๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์•™ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”
  • ์„œ๋น„์Šค ์ƒํƒœ๋ฅผ ๊ฐ์‹œ ๋ถˆ๊ฐ€ํ•˜๊ธฐ์— ์›น UI/CLI๋กœ ์šด์˜์„ ํ•˜๋ฉฐ ๋ฐฐํฌ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•„์š” ๋ฐ ๋กค๋ฐฑ ๊ฐ€๋Šฅ
  • Dev/Prod ํ™˜๊ฒฝ ๊ฐ„ ๋ฐฐํฌ ๊ตฌ์„ฑ ๋ฐ ์ž์› ์ •์ฑ…์„ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›€ โ†’ Helm values, Kustomize๋กœ Dev/Prod ํ™˜๊ฒฝ์— ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ์ ์šฉ
  • ์„œ๋น„์Šค์˜ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํ•„์š”

2. kubeadm ๋„์ž… ํ•„์š”์„ฑ

kubeadm์„ ํ†ตํ•œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋„์ž…์€ ์œ„ ๋ฌธ์ œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์ˆ˜ ๋…ธ๋“œ ํ†ตํ•ฉ ๊ด€๋ฆฌ: Master Node๋ฅผ ํ†ตํ•œ ์ค‘์•™ ์ง‘์ค‘ํ˜• ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ
  • ์ž์› ์ตœ์ ํ™” ๋ฐ ์˜คํ† ์Šค์ผ€์ผ๋ง: HPA(์ˆ˜ํ‰ ์˜คํ† ์Šค์ผ€์ผ๋ง)์™€ ๋ฆฌ์†Œ์Šค ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ ๋Œ€์‘
  • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ(Zero Downtime Deployment): Deployment ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ†ตํ•œ ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ
  • ์„œ๋น„์Šค ๋ณต๊ตฌ ๋ฐ ์…€ํ”„ ํž๋ง(Self-healing): ๋…ธ๋“œ ์žฅ์•  ๋ฐ ํŒŒ๋“œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ž๋™ ๋ณต๊ตฌ
  • ์ผ๊ด€๋œ ๋ฐฐํฌ ํ™˜๊ฒฝ: Helm Chart, Kustomize ๋“ฑ์„ ํ†ตํ•œ Dev/Stage/Prod ํ™˜๊ฒฝ ๊ตฌ์„ฑ ํ‘œ์ค€ํ™”
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‹ˆํ„ฐ๋ง/๋กœ๊น…: Prometheus, Grafana, Fluent Bit ๋“ฑ๊ณผ ์—ฐ๊ณ„ํ•˜์—ฌ ์ƒํƒœ ๊ฐ์‹œ ๋ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์ฒด๊ณ„ ๊ตฌ์ถ•

๋˜ํ•œ kubeadm์€ ํด๋ผ์šฐ๋“œ ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ์ง์ ‘ Kubernetes ํ‘œ์ค€ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด ์„œ๋น„์Šค ํ™•์žฅ์„ฑ ๋ฐ ์ธํ”„๋ผ ๋…๋ฆฝ์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ Deployment DaemonSet HPA
๋ชฉ์  ์•ฑ ๋ฐฐํฌ/๊ด€๋ฆฌ ๋…ธ๋“œ๋งˆ๋‹ค 1๊ฐœ ํ•„์ˆ˜ ํŒŒ๋“œ ๋ฐฐํฌ ํŒŒ๋“œ ์ˆ˜ ์ž๋™ ์Šค์ผ€์ผ๋ง
๋Œ€์ƒ ์„œ๋น„์Šค ์•ฑ (Next.js, Spring ๋“ฑ) ์‹œ์Šคํ…œ ์—์ด์ „ํŠธ (Fluent Bit ๋“ฑ) Deployment ๋ฆฌ์†Œ์Šค ๊ฐ์‹œ
์Šค์ผ€์ผ๋ง ๋ฐฉ์‹ ์ˆ˜๋™ ์„ค์ • (replicas) ๋…ธ๋“œ ์ˆ˜๋งŒํผ ๊ณ ์ • ํŠธ๋ž˜ํ”ฝ ๊ธฐ๋ฐ˜ ์ž๋™ ์กฐ์ •
ํŒŒ๋“œ ์ˆ˜ ๋‚ด๊ฐ€ ์ •ํ•จ (๋˜๋Š” HPA๊ฐ€ ์กฐ์ •) ๋…ธ๋“œ ์ˆ˜์™€ ๊ฐ™์Œ HPA๊ฐ€ ์ž๋™ ์กฐ์ •

Kubeadm ํด๋Ÿฌ์Šคํ„ฐ ์„ค๊ณ„

1. ํด๋Ÿฌ์Šคํ„ฐ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ

  • Master Node (Control Plane)
    • kube-apiserver
    • kube-controller-manager
    • kube-scheduler
    • etcd
  • Worker Node
    • kubelet
    • kube-proxy
    • containerd (์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„)
    • ์„œ๋น„์Šค ํŒŒ๋“œ (Next.js, Spring Boot)
    • ๋ชจ๋‹ˆํ„ฐ๋ง ํŒŒ๋“œ (Prometheus, Grafana, Loki)
    • ๋กœ๊น… ํŒŒ๋“œ (Fluent Bit)

2. ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ๋ฐฉ์‹ ๋ฐ ๋„คํŠธ์›Œํฌ

  • CNI ํ”Œ๋Ÿฌ๊ทธ์ธ: Calico (Pod ๊ฐ„ ํ†ต์‹  ๋ฐ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ๊ด€๋ฆฌ)
  • LoadBalancer: MetalLB๋ฅผ ํ†ตํ•œ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ ๋‚ด ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๊ตฌ์„ฑ
  • Service ํƒ€์ž…: LoadBalancer, ClusterIP ํ˜ผํ•ฉ ์‚ฌ์šฉ

3. ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ ๋‹จ์œ„

  • Deployment
    • Next.js, Spring Boot, Prometheus, Grafana, Loki๋ฅผ ๊ฐ๊ฐ Deployment๋กœ ๋ฐฐํฌ
    • ๊ธฐ๋ณธ Replica ์ˆ˜ 2๊ฐœ (Next.js, Spring Boot), ๋ชจ๋‹ˆํ„ฐ๋ง ๊ณ„์—ด์€ 1๊ฐœ
  • DaemonSet
    • Fluent Bit์„ DaemonSet์œผ๋กœ ๋ฐฐํฌํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— 1๊ฐœ์”ฉ ์„ค์น˜
  • GitOps (ArgoCD)
    • ๋ชจ๋“  ์„œ๋น„์Šค๋Š” Git ์ €์žฅ์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ ์–ธํ˜•(Declarative)์œผ๋กœ ๊ด€๋ฆฌ
    • ArgoCD๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ Git ์ €์žฅ์†Œ ์ƒํƒœ์™€ ๋™๊ธฐํ™”

4. ์Šค์ผ€์ผ๋ง ์ „๋žต

  • Horizontal Pod Autoscaler(HPA) ์ ์šฉ
    • CPU ์‚ฌ์šฉ๋ฅ  50% ์ด์ƒ ์ดˆ๊ณผ ์‹œ Pod ์ถ”๊ฐ€ ์ƒ์„ฑ
    • Metrics Server๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ˆ˜์ง‘
  • Deployment ์„ค์ •
    • Rolling Update ๋ฐฉ์‹์œผ๋กœ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ
    • ์„ค์ • ์˜ˆ์‹œ: maxSurge=1, maxUnavailable=1

5. ์žฅ์•  ๋Œ€์‘ ๋ฐ ์šด์˜ ์ „๋žต

  • Self-healing
    • ํŒŒ๋“œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ReplicaSet์ด ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณต๊ตฌ
  • ๋…ธ๋“œ ์žฅ์•  ๋Œ€์‘
    • ๋…ธ๋“œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์žฌ๋ฐฐ์น˜
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…
    • Prometheus๋กœ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘
    • Grafana๋กœ ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์„ฑ
    • Loki+Fluent Bit์œผ๋กœ ๋กœ๊ทธ ์ˆ˜์ง‘ ๋ฐ ์ค‘์•™ ์ง‘์ค‘ํ™”

6. ๊ธฐ์กด Docker Compose ๋ฐฐํฌ ๊ณ ๋„ํ™”

  • Helm Chart
    • ๊ธฐ์กด Docker Compose ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๋ฅผ Helm Chart๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํŒจํ‚ค์ง•
    • ํ™˜๊ฒฝ ๋ณ„(Dev/Stage/Prod)๋กœ values.yaml์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ผ๊ด€์„ฑ ํ™•๋ณด
  • Kustomize
    • ํ™˜๊ฒฝ ๋ณ„ ์˜ค๋ฒ„๋ ˆ์ด ๊ด€๋ฆฌ(์˜ˆ: dev, prod ์„ค์ • ๋ถ„๋ฆฌ)

7. ๊ธฐํƒ€ ์ฃผ์š” ์„ค์ •

ํ•ญ๋ชฉ ๋‚ด์šฉ
Kubernetes ๋ฒ„์ „ 1.29.x
ํด๋Ÿฌ์Šคํ„ฐ ๋„คํŠธ์›Œํฌ ๋ฒ”์œ„ 192.168.0.0/16
Pod CIDR ์„ค์ • --pod-network-cidr=192.168.0.0/16
API Server ํฌํŠธ 6443
MetalLB Address Pool 192.168.1.240-192.168.1.250
Fluent Bit DaemonSet ๋ฐฐํฌ (๋ชจ๋“  ๋…ธ๋“œ ์ ์šฉ)
โš ๏ธ **GitHub.com Fallback** โš ๏ธ