Container Orchestration


Container Orchestration ์ด๋ž€ ๋ณต์žกํ•œ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋กœ K8s ๊ฐ€ ์ฃผ๋กœ ์“ฐ์ธ๋‹ค.

  • Cluster = Master Node ๊ฐ€ ์ค‘์•™์ œ์–ด, ๋‹ค์ˆ˜์˜ Worker Node ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ด๋ฃจ์–ด ์„œ๋กœ ํ†ต์‹ ํ•˜๋ฉฐ ์ž‘๋™
  • State = Desired State ์„ ์–ธ ์‹œ ๊ด€๋ฆฌ์ž์˜ ๊ฐœ์ž… ์—†์ด ์ž๋™์œผ๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€
  • Scheduling = Container ๋ฅผ ๋ฐฐ์น˜ํ•  ์ ํ•ฉํ•œ Worker Node ๋ฅผ ์ฐพ์•„ ๋ฐฐํฌ
  • Rollout Rollback = ๋ฐฐํฌ ๋ฒ„์ „๊ด€๋ฆฌ
  • Service Discovery = ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ์กฐํšŒ
  • Volume = NFS, EBS ๋“ฑ ๋‹ค์–‘ํ•œ ์Šคํ† ๋ฆฌ์ง€ ๋งˆ์šดํŒ…

K8s Architecture


K8s ๋Š” Master Node ์™€ Worker Node ์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

Master Node ๋Š” Worker Node ๋“ค์„ Manage, Plan, Schedule, Monitor ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ Component ๋“ค์„ ๊ฐ€์ง„๋‹ค.

  • kube-apiserver
  • controller manager
  • etcd cluster
  • kube-scheduler

Worker Node ๋Š” Containerized Application ์ด ์‹คํ–‰๋˜๋Š” Node ๋กœ, ์ด๋ฅผ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ Component ๋“ค์„ ๊ฐ€์ง„๋‹ค.

  • Container Runtime
  • kubelet
  • kube-proxy

Docker vs containerd


  • 2013๋…„ Docker ์ถœํ˜„์œผ๋กœ ์ธํ•œ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ  ๋ถ€์ƒ ์ดํ›„ ํƒ€ ๊ฒฝ์Ÿ์‚ฌ ์—ญ์‹œ ๊ฐ์ž Container Runtime ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์ด๋กœ ์ธํ•ด ํ‘œ์ค€ํ™”๊ฐ€ ํ•„์š”ํ•ด์กŒ๋‹ค. 2016๋…„ Docker ์™€ CoreOS ๊ฐ€ ์ฃผ์ถ•์œผ๋กœ imagespec ๊ณผ runtimespec ๋“ฑ์„ ํฌํ•จํ•œ Open Container Initiative, OCI ๋ฅผ ์ถœ๋ฒ”ํ•˜์—ฌ Container Runtime ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์žฌ์ •ํ–ˆ๋‹ค. ์ดํ›„ OCI ์ŠคํŽ™์— ๋งž์ถฐ ๊ฐ ๊ธฐ์—…๋“ค์ด Container Runtime ์„ ๋ฐœ์ „์‹œ์ผฐ๊ณ , Docker ์˜ ๊ฒฝ์šฐ OCI ํ‘œ์ค€์— ๋งž์ถฐ ๊ฐœ๋ฐœํ•œ Container Runtime ์ด runc ์ด๋‹ค.
  • K8s ์˜ ๊ฒฝ์šฐ ์ดˆ์ฐฝ๊ธฐ์—” Docker ๋งŒ์„ ์œ ์ผํ•œ Container Runtime ์œผ๋กœ ์ง€์›ํ–ˆ์—ˆ๋Š”๋ฐ, OCI ๋“ฑ์žฅ ์ดํ›„ ๋‹ค์–‘ํ•œ Container Runtime ๋“ค์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ๊ฐ Container Runtime ์— ๋”ฐ๋ผ kubelet ์ด ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋”ฐ๋กœ ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผํ•˜๋Š” ์–ด๋ ค์›€์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ด๋Ÿฐ kubelet ์œ ์ง€๋ณด์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ๋™์‹œ์— ๋‹ค์–‘ํ•œ Container Runtime ๋“ค์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด kubelet ์—์„œ Container Runtime ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ธ Container Runtime Interface, CRI ๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ๋œ๋‹ค.
  • ์ดˆ์ฐฝ๊ธฐ Docker ๋Š” monolithic ํ•œ ๊ตฌ์กฐ๋กœ Docker Daemon ํ•˜๋‚˜์—์„œ Docker Client, Docker API, Container Runtime, Image Build ๋“ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ์ด๋Š” kubelet ์ด Docker ์˜ Container Runtime ์„ ์‚ฌ์šฉํ•  ๋•Œ CRI ํ‘œ์ค€์— ๋ถ€ํ•ฉํ•˜๋Š” dockershim ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ–ˆ๋‹ค.
  • ์ดํ›„ K8s ์˜ dockershim ์ง€์›์ด ์ค‘์ง€๋˜๊ณ , containerd ๊ฐ€ Docker ์—์„œ ๋ถ„๋ฆฌ๋˜๋ฉด์„œ, CRI ์ŠคํŽ™์— ๋งž์ถ”๊ธฐ ์œ„ํ•œ cri plugin ๋“ฑ์„ containerd ๋‚ด๋ถ€์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ containerd ๋„ kubelet ์— ์˜ํ•ด ๊ด€๋ฆฌ๋  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค.
  • runc ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹ค์งˆ์ ์ธ ์ฃผ์ฒด๋ผ๋ฉด, containerd ๋Š” ํ•œ ๋‹จ๊ณ„ ์œ„์—์„œ ์ด๋ฏธ์ง€ ์ €์žฅ, ๋„คํŠธ์›Œํ‚น, ์Šค๋ƒ…์ƒท ๋ฐ ๊ธฐํƒ€ ๊ด€๋ฆฌ ์ž‘์—… ๋“ฑ์˜ ๊ธฐ๋Šฅ๋“ค์„ ํฌํ•จํ•œ ๊ณ ์ˆ˜์ค€์˜ Container Runtime ์œผ๋กœ, ๋‚ด๋ถ€์ ์œผ๋กœ runc ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— OCI ์™€ CRI ํ‘œ์ค€์„ ๋ชจ๋‘ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” Container Runtime ์ด ๋œ ๊ฒƒ์ด๋‹ค.
  • We can use the 2 CLIs below instead of Docker to work with K8s
    • nerdctl = for general purpose from the containerd community
    • crictl = for debugging from the K8s community (works with all CRI-compatible container runtimes)

ETCD


  • ETCD is a distributed reliable key-value store that is Simple, Secure & Fast
  • K8s ์˜ ๋ชจ๋“  ์ƒํƒœ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • Key-Value ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ณ ๊ฐ€์šฉ์„ฑ ํ™•๋ณด
  • TTL, watch ๋“ฑ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์ œ๊ณต

Kube-API Server


  • ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์กฐํšŒ
  • etcd ์™€ ์œ ์ผํ•˜๊ฒŒ ํ†ต์‹ ํ•˜๋Š” ๋ชจ๋“ˆ
  • REST API ํ˜•ํƒœ๋กœ ์ œ๊ณต
  • ์š”์ฒญ์— ๋Œ€ํ•œ ๊ถŒํ•œ ์ฒดํฌ
  • ์ˆ˜ํ‰์  ํ™•์žฅ ๊ฐ€๋Šฅ
  • kubeadm ์œผ๋กœ ์„ค์น˜ํ•  ๊ฒฝ์šฐ Pod ์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋œ๋‹ค.
  1. Authenticate User
  2. Validate Request
  3. Retrieve data
  4. Update ETCD
  5. Scheduler
  6. Kubelet

Kube Controller Manager


  • ๋‹ค์–‘ํ•œ Controller ๊ฐ€ ์กด์žฌ
    • A controller is a process that continuously monitors the state of the components within the system and works towards bringing the whole system to the desired functioning state
    • Replication Controller, Node Controller, Endpoint Controller, โ€ฆ
    • ๋Š์ž„ ์—†์ด ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๊ณ  ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€
    • ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰

Installing Kube Controller Manager

wget https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-controller-manager
  • kubeadm ์œผ๋กœ ์„ค์น˜ํ•  ๊ฒฝ์šฐ Pod ์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋œ๋‹ค.

Kube Scheduler


  • kube-scheduler ๋Š” ์ƒ์„ฑ ์š”์ฒญ๋œ Pod ๊ฐ€ ์–ด๋А Node ์— ๋ฐฐํฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. Node ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ Pod ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฒดํฌํ•˜์—ฌ ์ ์ ˆํ•œ Node ๋ฅผ ์ฐพ๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•  ๋ฟ Pod ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์€ kubelet ์ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

How does it work?

  • Pod ์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์—ฌ๋ถ„์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Node ๋ฅผ ํ™•์ธํ•˜๊ณ  Pod ๊ฐ€ ๋ฐฐ์น˜๋œ ํ›„ ๋‚จ์€ ๋ฆฌ์†Œ์Šค๋Ÿ‰์„ ๊ธฐ์ค€์œผ๋กœ ์ˆœ์œ„๋ฅผ ๋งค๊ฒจ ์Šค์ผ€์ฅด๋ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Installing Kube Scheduler

wget https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-scheduler
  • kubeadm ์œผ๋กœ ์„ค์น˜ํ•  ๊ฒฝ์šฐ Pod ์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋œ๋‹ค.

Kubelet


kubelet ์€ Master Node ์˜ kube-apiserver ๋กœ ๋ถ€ํ„ฐ Container ์ƒ์„ฑ ์š”์ฒญ์„ ๋ฐ›์•„ Worker Node ์— ์„ค์น˜๋œ Container Runtime ์„ ์ด์šฉํ•ด Container ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. kubelet ์€ ์ž์‹ ์ด ์œ„์น˜ํ•œ Node ์™€ ์ƒ์„ฑํ•œ Pod ๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์ฃผ๊ธฐ์ ์œผ๋กœ kube-apiserver ์™€ ์†Œํ†ตํ•œ๋‹ค.

Installing Kubelet

wget https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kubelet

kubeadm ์œผ๋กœ K8s Cluster ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ kubelet ์€ ์„ค์น˜๋˜์ง€ ์•Š์œผ๋‹ˆ ์ˆ˜๋™์œผ๋กœ Worker Node ์— kubelet ์„ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋•Œ๋ฌธ์— kubelet ์€ ๋‹ค๋ฅธ Component ๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ Pod ์ด ์•„๋‹Œ Node ์˜ ํ”„๋กœ์„ธ์Šค๋กœ์„œ ์‹คํ–‰๋œ๋‹ค.

Kube Proxy


  • ๋„คํŠธ์›Œํฌ ํ”„๋ก์‹œ์™€ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์—ญํ• ์„ ํ•˜๋ฉฐ K8s Cluster ์— ๋ฐฐํฌ๋œ ๋ชจ๋“  Pod ๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•œ๋‹ค.
  • Pod ํ˜•ํƒœ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— kubectl get pods ๋กœ ์กฐํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ๋ณ„๋„์˜ ํ”„๋ก์‹œ ํ”„๋กœ๊ทธ๋žจ ๋Œ€์‹  iptables ๋˜๋Š” IPVS ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค.

References