๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹ค์ „] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹ค์Šต ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ฝ”๋“œ

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2026. 4. 6.

1. Vagrant ๊ฐ€ ํ˜ธ์ถœํ•œ ์ฝ”๋“œ

์ถœ์ฒ˜ : ๊ทธ๋ฆผ์œผ๋กœ์‹œ์ž‘ํ•˜๋Š”์ฟ ๋ฒ„(์กฐํ›ˆ)

 

์ด์ „ ์‹œ๊ฐ„์— Vagrant๋ฅผ ํ†ตํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ž๋™ํ™” ๊ตฌ์ถ•์„ ํ–ˆ๋‹ค.

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Vagrant up์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋“ค์„ ์‚ดํŽด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

 

 

2. ํ˜ธ์ถœ๋œ ์ฝ”๋“œ ๊ตฌ์กฐ

์ถœ์ฒ˜ : ๊ทธ๋ฆผ์œผ๋กœ์‹œ์ž‘ํ•˜๋Š”์ฟ ๋ฒ„(์กฐํ›ˆ)

 

  • Controlplane_node.sh
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ด๋‹ค.
      • kubeadm init
      • API Server / Controller Manager / Scheduler ์ดˆ๊ธฐํ™”
      • kubectl ์‚ฌ์šฉ ์„ค์ •
      • Pod Network ์„ค์น˜ ์ค€๋น„
    • ์˜ˆ์ „ ํ‘œํ˜„์œผ๋กœ๋Š” "๋งˆ์Šคํ„ฐ ๋…ธ๋“œ ์„ค์ • ์Šคํฌ๋ฆฝํŠธ"๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • k8s_env_build.sh
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜ ์ „์— ๊ณตํ†ต ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ด๋‹ค.
      • hostname ์„ค์ •
      • hosts ํŒŒ์ผ ์ˆ˜์ •
      • swap ๋น„ํ™œ์„ฑํ™”
      • ๋ธŒ๋ฆฌ์ง€ ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ์ปค๋„ ์˜ต์…˜ ์„ค์ •
      • ๋ฐฉํ™”๋ฒฝ / SELinux ์กฐ์ •
      • ํ•„์š”ํ•œ ๊ธฐ๋ณธ ๋„๊ตฌ ์„ค์น˜
    • ์ฆ‰, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ OS ํ™˜๊ฒฝ์„ ๋จผ์ € ์ •๋ฆฌํ•˜๋Š” ์—ญํ• ์ด๋‹ค.
  • k8s_pkg_cfg.sh
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ด€๋ จ ํŒจํ‚ค์ง€ ์„ค์น˜์™€ ์„ค์ •์„ ๋‹ด๋‹นํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ด๋‹ค.
      • containerd / Docker ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์„ค์น˜
      • kublet, kubeadm, kubectl ์„ค์น˜
      • ์ €์žฅ์†Œ (repo) ๋“ฑ๋ก
      • ์„œ๋น„์Šค enalbe / start
      • cgroup driver ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ์„ค์ •
    • ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‹ค์ œ๋กœ ๊น”์•„์ฃผ๋Š” ๋‹จ๊ณ„์ด๋‹ค.
  • worker_node.sh
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์›Œ์ปค ๋…ธ๋“œ ๊ตฌ์„ฑ ์Šคํฌ๋ฆฝํŠธ์ด๋‹ค.
      • ์ปจํŠธ๋กคํ”Œ๋ ˆ์ธ์—์„œ ์ƒ์„ฑํ•œ kubeadm join ๋ช…๋ น ์‹คํ–‰
      • ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ๊ฐ€์ž…
      • ํ•„์š”ํ•œ ๋Ÿฐํƒ€์ž„ / ์—์ด์ „ํŠธ ์„ค์ •์„ ํ•œ๋‹ค.
  • Vagrantfile
    • Vagrant ํ™˜๊ฒฝ์˜ ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ์ด๋‹ค. ์ด ํŒŒ์ผ์ด ์‚ฌ์‹ค์ƒ ์ „์ฒด ๊ฐ€์ƒ๋จธ์‹  ๊ตฌ์„ฑ์„ ์ด๊ด„ํ•œ๋‹ค.
      • VM ๊ฐœ์ˆ˜
      • ๊ฐ VM ์ด๋ฆ„
      • CPU / Memory
      • ๋„คํŠธ์›Œํฌ IP
      • ๋ฐ•์Šค(Box) ์ด๋ฏธ์ง€
      • provisioning ์‹œ ์–ด๋–ค .sh ํŒŒ์ผ์„ ์‹คํ–‰ํ• ์ง€๋ฅผ ์ •์˜
    • ์ฆ‰, ์—ฌ๊ธฐ์„œ๋Š” control plane 1๋Œ€ + worker node n๋Œ€๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ํŒŒ์ผ์ด๋‹ค.

 

3.  ์ฝ”๋“œ ๋‚ด์šฉ ํŒŒํ—ค์ณ ๋ณด๊ธฐ

Vagrantfile

1. Vagrantfile - ์ค„๋ฒˆํ˜ธ: 1 - 10

 

  • vi: set ft=ruby : ์ด ํŒŒ์ผ์ด Ruby ๋ฌธ๋ฒ• ํŒŒ์ผ์ด๋ผ๋Š” ๊ฑธ ์•Œ๋ ค์ฃผ๋Š” ์„ค์ •์ด๋‹ค. Vagrantfile์€ ๋‚ด๋ถ€์ ์œผ๋กœ Ruby DSL ์ด๋ผ์„œ ๋ฌธ๋ฒ• ํ•˜์ด๋ผํŒ…์šฉ์ž„
  • N=3 : ์›Œ์ปค ๋…ธ๋“œ ๊ฐœ์ˆ˜ 
    • (1..N).each do | i |
  • k8v_V : ์„ค์น˜ํ•  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „์ด๋‹ค. kubeadm / kubelet / kubectl ์„ค์น˜ํ•  ๋•Œ ์‚ฌ์šฉ๋จ
    • 1.35.0 : ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „
    • -1.1 : ํŒจํ‚ค์ง€ ๋ฆด๋ฆฌ์ฆˆ ๋ฒ„์ „ (apt repo ๊ธฐ์ค€)
  • ctrd_V : containerd ๋ฒ„์ „์ด๋‹ค. (์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„)
    • 2.2.1 : containerd ๋ฒ„์ „
    • ubuntu.22.04~jammy : Ubuntu Jammy์šฉ ํŒจํ‚ค์ง€

 

2. Vagrantfile - ์ค„๋ฒˆํ˜ธ: 12 - 35

 

์ „์ฒด ์‹œ์ž‘ ๋ฐ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ VM ์ •์˜

  • Vagrant.configure("2") do |config| : Vagrant ์„ค์ • ์‹œ์ž‘์ด๊ณ  DSL(Domain Specific Language) ๋ฒ„์ „์ด "2" ๋ผ๋Š” ์˜๋ฏธ
  • config.vm.define "cp-k8s-#{k8s_V[0..5]}" do |cfg| : ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „ ๊ธฐ๋ฐ˜์œผ๋กœ VM ์ด๋ฆ„ ์ž๋™ ์ƒ์„ฑ. ๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ ๋Œ๋ฆด ๋•Œ ๊ตฌ๋ถ„ ํŽธํ•จ
    • |cfg| : ์ด VM์— ๋Œ€ํ•œ ์„ค์ •์„ ๋„ฃ๋Š” ๊ณต๊ฐ„

OS ์ด๋ฏธ์ง€

  • cfg.vm.box = "sysnet4admin/Ubuntu-k8s" : ์‚ฌ์šฉํ•  VM ์ด๋ฏธ์ง€

VirtualBox ๋ฆฌ์†Œ์Šค ์„ค์ •

  • cfg.vm.provider "virtualbox" do |vb| : VirtualBox๋กœ ์‹คํ–‰ํ•  ๋•Œ ์„ค์ •
  • vb.name = "cp-k8s-#{k8s_V[0..5]}(github_SysNet4Admin)" : VirtualBox GUI์—์„œ ๋ณด์ด๋Š” ์ด๋ฆ„
  • vb.cpus = 2
    vb.memory = 2048 : ๋ฆฌ์†Œ์Šค ์ œํ•œ -> CPU: 2์ฝ”์–ด, RAM: ์•ฝ 2GB
  • vb.customize ["modifyvm", :id, "--groups", "/k8s-U#{k8s_V[0..5]}-ctrd-#{ctrd_V[0..2]}(github_SysNet4Admin)"] : ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „ + containerd ๋ฒ„์ „ ๊ธฐ์ค€์œผ๋กœ VM ๊ทธ๋ฃนํ™”. ์ด๋Š” ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ ๋Œ๋ฆด ๋•Œ ๊ด€๋ฆฌ ํŽธํ•จ (์‹ค๋ฌด์—์„œ ์œ ์šฉ)
  • cfg.vm.host_name ="cp-k8s" : VM ๋‚ด๋ถ€ hostname
  • cfg.vm.network "private_network", ip:"192.168.1.10" : ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ํ†ต์‹ ์šฉ IP. ์—ฌ๊ธฐ์„œ๋Š” control plane ๋…ธ๋“œ ip ์ด๋‹ค.
  • cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh" : ๋‚ด PC์—์„œ VM SSH ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ VM 22 ๋ฒˆ ํฌํŠธ๋ฅผ Host 60010์œผ๋กœ ์—ฐ๊ฒฐ
    • ex) ssh vagrant@localhost -p 60010
  • cfg.vm.synced_folder "../data", "/vagrant", disabled: true : ๊ธฐ๋ณธ ๊ณต์œ  ํด๋” ๋น„ํ™œ์„ฑํ™”. ์„ฑ๋Šฅ ๋ฌธ์ œ, ๊ถŒํ•œ ๋ฌธ์ œ ๋“ฑ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹ค์Šต์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ณ  ์‹ค๋ฌด์—์„œ๋„ ์ข…์ข… ๋ˆ๋‹ค.

Provision (VM ์ƒ์„ฑ ํ›„ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ)

  • cfg.vm.provision "shell", path: "k8s_env_build.sh", args: [ N, k8s_V[0..3] ] : swap off, ์ปค๋„ ์„ค์ •, ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ์ฃผ๋กœ ํ•˜๊ณ , args์—์„œ๋Š” N์€ ์›Œ์ปค ๊ฐฏ์ˆ˜, k8s ๋ฒ„์ „ ๋“ฑ OS ํ™˜๊ฒฝ์„ ์…‹ํŒ…ํ•œ๋‹ค.
  • cfg.vm.provision "shell", path: "k8s_pkg_cfg.sh", args: [ k8s_V, ctrd_V, "CP"] : kubeadm / kubelet ์„ค์น˜, containerd ์„ค์น˜, CP -> ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์šฉ ์„ค์ •
    • ์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜ ์ค€๋น„ ์™„๋ฃŒ ์ƒํƒœ
  • # cfg.vm.provision "shell", path: "controlplane_node.sh" : ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ์ด๋‹ค. ํ˜„์žฌ ์ฃผ์„์ด ๋˜์–ด ์žˆ๋Š”๋ฐ ๋’ค์— ์ง์ ‘ ์‹ค์Šตํ•˜๋ฉด์„œ ์‹คํ–‰ํ•  ์˜ˆ์ •์ด๋‹ค.
  • cfg.vm.provision "shell", inline: "git clone https://github.com/... /root/_Lecture_k8s_learning.kit.git" : ์‹ค์Šต ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ -> ์ด๊ฑฐ๋Š” ์›๋ž˜ ๋กœ์ปฌ์— ์ด๋ฏธ ์žˆ๋Š”๋ฐ cp ์•ˆ์—๋„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋กœ clone ํ•จ

 

3. Vagrantfile - ์ค„๋ฒˆํ˜ธ: 41 - 60

  • (1..N).each do |i| : 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ VM ์ƒ์„ฑ
  • config.vm.define "w#{i}-k8s-#{k8s_V[0..5]}" do |cfg| : ์›Œ์ปค ๋…ธ๋“œ VM ์ •์˜
  • cfg.vm.box = "sysnet4admin/Ubuntu-k8s" : OS ์ด๋ฏธ์ง€
  • vb.cpus = 1
    vb.memory = 1024 : ์›Œ์ปค ๋…ธ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ๋„์šฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ์„ ์œ„ํ•ด cp๋ณด๋‹ค ์ž‘์Œ
  • cfg.vm.host_name = "w#{i}-k8s" : hostname
  • cfg.vm.network "private_network", ip: "192.168.1.10#{i}" : IP ์ฃผ์†Œ ์„ค์ •
  • host: "6010#{i}" : SSH ํฌํŠธ ์„ค์ •
  • k8s_env_build.sh : CP ๋ž‘ ๋™์ผ
  • k8s_pkg_cfg.sh ... "W" : W๋Š” worker ์„ค์ •
  • # cfg.vm.provision "shell", path: "worker_nodes.sh" : kubeadm join ์‹คํ–‰ํ•ด์„œ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— ๋ถ™๋Š” ๊ฑฐ์ง€๋งŒ ์ง์ ‘ ์‹ค์Šต์„ ์œ„ํ•ด ์ฃผ์„

 

k8s_env_build.sh

1. k8s_env_build.sh - ์ค„ ๋ฒˆํ˜ธ 1 - 18 (์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜ ์ค€๋น„ ๋‹จ๊ณ„)

 

  • #!/usr/bin/env bash : bash๋กœ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏœ (์Šคํฌ๋ฆฝํŠธ ์‹œ์ž‘ ์„ ์–ธ)
  • export DEBIAN_FORNTEND=noninteractive : apt ์„ค์น˜ํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์š”๊ตฌ x (yes/no ์—†์ด ์ž๋™ ์ง„ํ–‰)
  • swapoff -a : ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ swap ๋ฉ”๋ชจ๋ฆฌ ์ฆ‰์Šค off
  • sed -i.bak -r 's/(.+swap.+)/#\1/' /etc/fstab : ์žฌ๋ถ€ํŒ…ํ•ด๋„ swap ํ•œ ์ผœ์ง€๊ฒŒ ์ฃผ์„ ์ฒ˜๋ฆฌ ์ง„ํ–‰
  • curl -fsSL https://pkgs.k8s.io/core:/stable:/v$2/deb/Release.key \
    | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ์˜ GPG ํ‚ค ๋‹ค์šด๋กœ๋“œ + ๋“ฑ๋ก
    • apt๋Š” ํŒจํ‚ค์ง€ ์„ค์น˜ํ•  ๋•Œ ์‹ ๋ขฐ ๊ฐ€๋Šฅํ•œ ์ €์žฅ์†Œ์ธ์ง€ ๊ฒ€์ฆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”
  • echo \
    "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
    https://pkgs.k8s.io/core:/stable:/v$2/deb/ /" \
    | sudo tee /etc/apt/sources.list.d/kubernetes.list
    • apt๊ฐ€ ์‚ฌ์šฉํ•  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ €์žฅ์†Œ ๋“ฑ๋ก
  • ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” apt ์ž๋™ ๋ชจ๋“œ ์„ค์ • -> swap ์™„์ „ ์ œ๊ฑฐ (k8s ํ•„์ˆ˜ ์กฐ๊ฑด) -> k8s repo GPG ํ‚ค ๋“ฑ๋ก -> k8s apt ์ €์žฅ์†Œ ๋“ฑ๋ก 
    • ์ฆ‰, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜ ์ค€๋น„ ๋‹จ๊ณ„

 

2. k8s_env_build.sh - ์ค„ ๋ฒˆํ˜ธ 20-39 (containerd ์„ค์น˜)

 

  • # add docker-ce repo with containerd
    curl -fsSL \
     https://download.docker.com/linux/ubuntu/gpg \
     -o /etc/apt/keyrings/docker.asc
    • containerd๋Š” Docker ecosystem์—์„œ ์ œ๊ณต
    • Docker ๊ณต์‹ repo์˜ GPG ํ‚ค ๋‹ค์šด๋กœ๋“œ
  • echo \
    "deb [arch=$(dpkg --print-architecture) \
    signed-by=/etc/apt/keyrings/docker.asc] \
    https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
    | tee /etc/apt/sources.list.d/docker.list > /dev/null
    • Docker apt ์ €์žฅ์†Œ ๋“ฑ๋ก
  • # packets traversing the bridge are processed by iptables for filtering
    echo 1 > /proc/sys/net/ipv4/ip_forward
    • IP forwarding ํ™œ์„ฑํ™” (์ปจํ…Œ์ด๋„ˆ -> ์™ธ๋ถ€ ํ†ต์‹  ๊ฐ€๋Šฅํ•˜๊ฒŒ)
  • # enable br_filter for iptables
    modprobe br_netfilter
    • ๋ธŒ๋ฆฟ์ง€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ iptables๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ • (์ด๊ฒŒ ์—†์œผ๋ฉด pod๊ฐ„ ํ†ต์‹ , service routing ๋“ฑ ๊นจ์งˆ ์ˆ˜ ์žˆ์Œ)
  • echo "127.0.0.1 localhost" > /etc/hosts : ๊ธฐ๋ณธ localhost ์„ค์ •
  • echo "192.168.1.10 cp-k8s" >> /etc/hosts : control-plane ๋…ธ๋“œ ์ •์˜
  • for (( i=1; i<=$1; i++ )); do
      echo "192.168.1.10$i wk$i-k8s" >> /etc/hosts
    done 
    • worker ๋…ธ๋“œ๋“ค์„ ์ž๋™ ์ƒ์„ฑ

 

k8s_pkg_cfg.sh

1. k8s_pkg-cfg.sh - ์ค„ ๋ฒˆํ˜ธ 1 - 19 (ํŒจํ‚ค์ง€ ์„ค์น˜ + ์—ญํ• ๋ณ„(NFS) ๋ถ„๊ธฐ + k8s  ๋ฒ„์ „ ๊ณ ์ • ์„ค์น˜)

  • apt-get update : apt๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ํŒจํ‚ค์ง€ ๋ชฉ๋ก ์ตœ์‹ ํ™” (k8s repo, docker repo ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•จ)
  • if [ $3 = 'CP' ]; then
      apt-get install nfs-server nfs-common -y
    elif [ $3 = 'W' ]; then
      apt-get install nfs-common -y
    fi
    • NFS -> Network File System ์„ค์น˜ (๋…ธ๋“œ ์—ญํ• ๋ณ„ ๋ถ„๊ธฐ)
    • NFS : ์ €์žฅ์†Œ 
    • nfs-server : NFS ์„œ๋ฒ„ ์—ญํ•  (๊ณต์œ ํ•ด์ฃผ๋Š” ์ชฝ)
    • nfs-common : NFS ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋Šฅ
  • apt-get install -y kubelet=$1 kubectl=$1 kubeadm=$1 containerd.io=$2
    • kubernetes + containerd ์„ค์น˜

 

 

2. k8s_pkg-cfg.sh - ์ค„ ๋ฒˆํ˜ธ 21 - 33 (containerd ๊ธฐ๋ณธ ์„ค์ • + cgroup)

  • containerd config default > /etc/containerd/config.toml
    • containerd ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ -> containerd์˜ ๋ชจ๋“  ์„ค์ •์ด ๋“ค์–ด๊ฐ€๋Š” ํ•ต์‹ฌ ํŒŒ์ผ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ๋„ ๋™์ž‘ํ•˜์ง€๋งŒ, ์„ค์ • ๋“ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋กœ ๋นผ๋†“์„ ์ˆ˜ ์žˆ์Œ
  • sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
    • kubelet ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ systemd cgroup์„ ์‚ฌ์šฉ
    • ๊ทผ๋ฐ containerd ๊ธฐ๋ณธ๊ฐ’์€ SystemdCgroup = false ์ž„ -> kubelet๊ณผ containerd ์ถฉ๋Œ ๋ฐœ์ƒ
    • kubelet๊ณผ containerd์˜ cgroup driver๋ฅผ ๋งž์ถ”๋Š” ์ž‘์—…
  • cat <<EOF > /etc/crictl.yaml
    runtime-endpoint: unix:///run/containerd/containerd.sock
    image-endpoint: unix:///run/containerd/containerd.sock
    EOF
    • crictl(kubectl)์˜ ํ•˜์œ„ ๋ ˆ๋ฒจ ๋””๋ฒ„๊น… ๋„๊ตฌ ์„ค์ • (๋Ÿฐํƒ€์ž„ ์—ฐ๊ฒฐ). containerd ์†Œ์ผ“ ์ง์ ‘ ์ง€์ •
    • ์ฆ‰, crictl์ด ์–ด๋”” runtime ๋ถ™์„์ง€ ์•Œ๋ ค์ฃผ๋Š” ์„ค์ •
  • systemctl restart containerd ; systemctl enable containerd
    • containerd ์žฌ์‹œ์ž‘, ๋ถ€ํŒ… ์‹œ ์ž๋™ ์‹คํ–‰
  • systemctl enable --now kubelet
    • kubelet ์„œ๋น„์Šค ํ™œ์„ฑํ™” + ์ฆ‰์‹œ ์‹คํ–‰

 

controlplane_node.sh

1. controlplane_node.sh - ์ค„ ๋ฒˆํ˜ธ 1 - 23

  • kubeadm init \
     --token 123456.1234567890123456 --token-ttl 0 \
     --pod-network-cidr=172.16.0.0/16 \
     --apiserver-advertise-address=192.168.1.10 \
     --cri-socket=unix:///run/containerd/containerd.sock
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ + ๋„คํŠธ์›Œํฌ + runtime ์—ฐ๊ฒฐ
  • mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    • kubectl ์ด API ์„œ๋ฒ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •
  • CNI_ADDR="https://raw.githubusercontent.com/.../k8s/CNI"
    kubectl apply -f $CNI_ADDR/172.16_net_calico_v3.26.0.yaml
    • Pod ๋„คํŠธ์›Œํฌ ์ƒ์„ฑ (pod <-> pod ํ†ต์‹  = CNI ๋‹ด๋‹น)
  • kubectl completion bash > /etc/bash_completion.d/kubectl
    • kubectl ๋ช…๋ น์–ด ์ž๋™์™„์„ฑ ์ง€์›
  • alias k='kubectl'
    alias ka='kubectl apply -f'
    complete -F __start_kubectl k
    • alias ์„ค์ • (ํŽธ์˜์„ฑ)

 

2. controlplane_node.sh - ์ค„ ๋ฒˆํ˜ธ 25 - 44

  • cat <<EOF > /usr/local/bin/rerepo-k8s-starter.kit
    #!/usr/bin/env bash
    rm -rf $HOME/_Lecture_k8s_starter_kit
    git clone https://github.com/sysnet4admin/_Lecture_k8s_starter_kit.git $HOME/_Lecture_k8s_starter_kit
    find $HOME/_Lecture_k8s_starter_kit -regex ".*\.\(sh\)" -exec chmod 700 {} \;
    EOF
    chmod 700 /usr/local/bin/rerepo-k8s-starter.kit
    • ์–ธ์ œ๋“ ์ง€ ๋‹ค์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ "๋ฆฌ์…‹ ์Šคํฌ๋ฆฝํŠธ" ์ƒ์„ฑ
    • ์‹ค์Šตํ•˜๋‹ค ๋ณด๋ฉด ํŒŒ์ผ์ด ๊ผฌ์ด๊ฑฐ๋‚˜ ์˜ค๋ฅ˜ ๋“ฑ์ด ๋ฐœ์ƒ -> rerepo-k8s-starter.kit ์‚ฌ์šฉ์œผ๋กœ ์ดˆ๊ธฐ ์ƒํƒœ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
  • git clone https://github.com/yujicai/update-kube-cert.git /tmp/update-kube-cert
    chmod 755 /tmp/update-kube-cert/update-kubeadm-cert.sh
    /tmp/update-kube-cert/update-kubeadm-cert.sh all --cri containerd
    rm -rf /tmp/update-kube-cert
    echo "Wait 30 seconds for restarting the Control-Plane Node..." ; sleep 30
    • ์ฟ ๋ฒ„๋„คํŠธ์Šค๋Š” TLS ์ธ์ฆ์„œ ๊ธฐ๋ฐ˜
    • kubeadm init -> ์ธ์ฆ์„œ ์œ ํšจ๊ธฐ๊ฐ„ ์ œํ•œ ์žˆ์Œ
    • ์ธ์ฆ์„œ๊ฐ€ ๋งŒ๋ฃŒ ๋˜๋ฉด API ์„œ๋ฒ„ ์ ‘๊ทผ ๋ถˆ๊ฐ€, ํด๋Ÿฌ์Šคํ„ฐ ์ฃฝ์Œ
    • ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” kubeadm cert ๊ฐฑ์‹  ์ž๋™ํ™”

 

worker_node.sh

1. worker_node.sh - ์ค„ ๋ฒˆํ˜ธ 1 - 5

  • kubeadm join \
     --token 123456.1234567890123456 \
     --discovery-token-unsafe-skip-ca-verification \
     192.168.1.10:6443
    • worker ๋…ธ๋“œ๋ฅผ control plane์— ๋“ฑ๋ก (join)

์ „์ฒด ์š”์•ฝ

1. k8s_env_build.sh

์—ญํ•  : ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ OS ํŠœ๋‹

  1. swap OFF
  2. /etc/fstab ์ˆ˜์ •
  3. k8s repo ๋“ฑ๋ก
  4. docker repo ๋“ฑ๋ก (containerd์šฉ)
  5. ๋„คํŠธ์›Œํฌ ์„ค์ • (ip_forward, br_netfilter)

 

2. k8s_pkg_cfg.sh

์—ญํ•  : ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹คํ–‰ ์—”์ง„ ์„ค์น˜

  1. apt update
  2. kubelet / kubeadm / kubectl ์„ค์น˜ (๋ฒ„์ „ ๊ณ ์ •)
  3. containerd ์„ค์น˜
  4. containerd config ์ƒ์„ฑ
  5. SystemCgroup=true ์„ค์ •
  6. crictl ์„ค์ •
  7. ์„œ๋น„์Šค ์‹คํ–‰ (containerd, kubelet)

 

3. controlplane_node.sh

์—ญํ•  : ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‡Œ(Control Plane) ์ƒ์„ฑ

  1. kubeadm init
  2. kubectl config ์„ค์ • 
  3. CNI (Calico) ์„ค์น˜
  4. kubectl ์ž๋™ ์™„์„ฑ + alias
  5. ์‹ค์Šต ์ฝ”๋“œ clone
  6. ์ธ์ฆ์„œ ๊ฐฑ์‹ 

 

4. worker_nodes.sh

์—ญํ•  : ์‹ค์ œ workload ๋Œ๋ฆฌ๋Š” ๋…ธ๋“œ ์ถ”๊ฐ€ (์›Œ์ปค ๋…ธ๋“œ ํด๋Ÿฌ์Šคํ„ฐ ์ฐธ์—ฌ)

  1. kubeadm join ์‹คํ–‰
  2. control plane์— ๋“ฑ๋ก
  3. kubelet ์—ฐ๊ฒฐ

๋Œ“๊ธ€