Skip to main content

06C. Vagrantfile ์‚ดํŽด๋ณด๊ธฐ

About 6 minKubernetescrashcoursedigitaloceankubernetesminkubekubctl

06C. Vagrantfile ์‚ดํŽด๋ณด๊ธฐ ๊ด€๋ จ

๋ชฉ์ฐจ

์–ธ์ œ๋‚˜ ์ตœ์‹  Kubernetes

Unit 6.3. Vagrantfile ์‚ดํŽด๋ณด๊ธฐ

์–ธ์ œ๋‚˜ ์ตœ์‹  Kubernetes

์ด๋ฒˆ์—๋Š” ์•ž์—์„œ ์‹คํ–‰ํ–ˆ๋˜ Vagrantfile์˜ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–‘์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋ณต์žกํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.boot_timeout = 3000

  config.vm.define "master" do |master|
    master.vm.box = "ubuntu/jammy64"
    master.vm.network "private_network", ip: "192.168.56.10"
    master.vm.hostname = "master"

    master.vm.provider "virtualbox" do |v|
      v.memory = 4096
      v.cpus = 4
    end

    master.vm.provision "0", type: "shell", preserve_order: true, privileged: true, inline: <<-EOC
cat <<-'EOF' >/etc/modules-load.d/kubernetes.conf
br_netfilter
EOF

sudo modprobe br_netfilter

cat <<-'EOF' >/etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

sudo apt update
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update
sudo apt install -y containerd.io

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

sudo systemctl restart containerd
sudo systemctl enable containerd

cat <<-'EOF' >/etc/default/kubelet
KUBELET_EXTRA_ARGS=--node-ip=192.168.56.10
EOF

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

OUTPUT_FILE=/vagrant/join.sh
rm -rf $OUTPUT_FILE
rm -rf /vagrant/.kube
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=192.168.56.10 --apiserver-advertise-address=192.168.56.10
sudo kubeadm token create --print-join-command > $OUTPUT_FILE
chmod +x $OUTPUT_FILE

mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
cp -R $HOME/.kube /vagrant/.kube
cp -R $HOME/.kube /home/vagrant/.kube
sudo chown -R vagrant:vagrant /home/vagrant/.kube
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl completion bash >/etc/bash_completion.d/kubectl
echo 'alias k=kubectl' >>/home/vagrant/.bashrc
    EOC
  end

  (1..3).each do |i|
    config.vm.define "worker#{i}" do |worker|
      worker.vm.box = "ubuntu/jammy64"
      worker.vm.network "private_network", ip: "192.168.56.1#{i}"
      worker.vm.hostname = "worker#{i}"

      worker.vm.provider "virtualbox" do |v|
        v.memory = 2048
        v.cpus = 2
      end

      worker.vm.provision "0", type: "shell", preserve_order: true, privileged: true, inline: <<-EOC
cat <<-'EOF' >/etc/modules-load.d/kubernetes.conf
br_netfilter
EOF

sudo modprobe br_netfilter

cat <<-'EOF' >/etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

sudo apt update
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update
sudo apt install -y containerd.io

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

sudo systemctl restart containerd
sudo systemctl enable containerd

cat <<-'EOF' >/etc/default/kubelet
KUBELET_EXTRA_ARGS=--node-ip=192.168.56.1#{i}
EOF

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
      EOC
    end
  end
end

๋จผ์ € Vagrantfile์˜ ์ฒซ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค(์ฐธ๊ณ ๋กœ Vagrantfile์€ Ruby ์–ธ์–ด๋กœ ์ž‘์„ฑ์ด ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค). Vagrantfile์€ Vagrant.configure("2") do |config|๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ ๊ทธ ์•„๋ž˜์— ๊ฐ์ข… ์„ค์ •์„ ๋„ฃ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "2"๋Š” Vagrant.configure ๋ฒ„์ „ 2๋ผ๋Š” ๋œป์ด๋ฉฐ ๊ฐ€์ƒ๋จธ์‹ ์„ 2๊ฐœ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค.

Vagrant.configure("2") do |config|
  config.vm.boot_timeout = 3000
  • config.vm.boot_timeout: ๊ฐ€์ƒ๋จธ์‹  ๋ถ€ํŒ… ๋Œ€๊ธฐ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์งง๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ถ€ํŒ…์ด ๋๋‚˜๊ธฐ ์ „์— vagrant up ๋ช…๋ น์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ master ๋…ธ๋“œ ์„ค์ • ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. config.vm.define "master" do |master|์œผ๋กœ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ ์ •์˜ํ•˜๊ณ  ๊ทธ ์•„๋ž˜์— ์„ค์ •์„ ๋„ฃ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  config.vm.define "master" do |master|
    master.vm.box = "ubuntu/jammy64"
    master.vm.network "private_network", ip: "192.168.56.10"
    master.vm.hostname = "master"

    master.vm.provider "virtualbox" do |v|
      v.memory = 4096
      v.cpus = 4
    end

master.vm.box: Vagrant๋Š” ๊ฐ€์ƒ๋จธ์‹  ์ด๋ฏธ์ง€๋ฅผ box๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Ubuntu 22.04 ๋ฒ„์ „์ธ "ubuntu/jammy64"๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. master.vm.network: ๋„คํŠธ์›Œํฌ ์„ค์ •์ž…๋‹ˆ๋‹ค. "private_network"๋กœ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ–ˆ๊ณ  master ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋Š” "192.168.56.10"์œผ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. master.vm.hostname: ๊ฐ€์ƒ๋จธ์‹ ์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. master ๋…ธ๋“œ์ด๋ฏ€๋กœ "master"๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. master.vm.provider "virtualbox" do |v|: ์šฐ๋ฆฌ๋Š” ๊ฐ€์ƒ๋จธ์‹  ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ VirtualBox๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์œผ๋ฏ€๋กœ VirtualBox ๊ด€๋ จ ์„ค์ •์„ ํ•ด์ค๋‹ˆ๋‹ค.

  • v.memory: ๊ฐ€์ƒ๋จธ์‹ ์˜ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 4096(4Gi)์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • v.cpus: ๊ฐ€์ƒ๋จธ์‹ ์˜ CPU ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 4๊ฐœ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” provision์ด๋ผ๊ณ  ํ•ด์„œ Vagrant๊ฐ€ ๊ฐ€์ƒ๋จธ์‹ ์„ ์ƒ์„ฑํ•œ ๋’ค ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์˜ ๋‚ด์šฉ์ด ๋งŽ์€๋ฐ, ๋ถ€๋ถ„ ๋ถ€๋ถ„ ๋‚˜๋ˆ ์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

master ๋…ธ๋“œ์˜ provision ์„ค์ •์€ ์ด๋ ‡๊ฒŒ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. master.vm.provision "0", type: "shell", preserve_order: true, privileged: true, inline: <<-EOC์—์„œ "0"์€ provision์˜ ์ด๋ฆ„, "shell"์€ ์…ธ ์Šคํฌ๋ฆฝํŠธ, preserve_order: true๋Š” ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. privileged: true๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ root ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ inline: <<-EOC ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ kubeadm ์‹คํ–‰์— ํ•„์š”ํ•œ ์ปค๋„ ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•˜๊ณ , ์ปค๋„ ์„ค์ •๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

cat <<-'EOF' >/etc/modules-load.d/kubernetes.conf
br_netfilter
EOF

sudo modprobe br_netfilter

cat <<-'EOF' >/etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system
  • br_netfilter: iptables๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ปค๋„ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ๋ถ€ํŒ…ํ•  ๋•Œ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก /etc/modules-load.d/kubernetes.conf ํŒŒ์ผ ์•ˆ์—๋„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  sudo modprobe br_netfilter ๋ช…๋ น์œผ๋กœ br_netfilter ์ปค๋„ ๋ชจ๋“ˆ์„ ์ง€๊ธˆ ์ฆ‰์‹œ ๋กœ๋”ฉํ•ด์ค๋‹ˆ๋‹ค.
  • net.ipv4.ip_forward = 1์€ IPv4 ํฌ์›Œ๋”ฉ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. net.bridge.bridge-nf-call-iptables = 1๊ณผ net.bridge.bridge-nf-call-ip6tables = 1์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์„ ํ˜ธ์ŠคํŠธ์˜ iptables ์„ค์ •์— ๋”ฐ๋ผ ์ œ์–ด๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํŒ…ํ•  ๋•Œ ์„ค์ •๊ฐ’์„ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก /etc/sysctl.d/kubernetes.conf ํŒŒ์ผ ์•ˆ์—๋„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  sudo sysctl --system ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์„ค์ •๊ฐ’์„ ์ง€๊ธˆ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•ด์ค๋‹ˆ๋‹ค.

kubelet ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ด Vagrantfile์—์„œ ์ƒ์„ฑํ•œ VirtualBox ๊ฐ€์ƒ๋จธ์‹ ์€ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ 2๊ฐœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ master.vm.network "private_network", ip: "192.168.56.10"์œผ๋กœ ์ƒ์„ฑํ•œ ๋‘ ๋ฒˆ์งธ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์˜ IP ์ฃผ์†Œ์ธ 192.168.56.10์„ --node-ip์— ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

cat <<-'EOF' >/etc/default/kubelet
KUBELET_EXTRA_ARGS=--node-ip=192.168.56.10
EOF

containerd ์„ค์น˜ ๋ฐ ์„ค์ • ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์ธํ„ฐํŽ˜์ด์Šค(CRI)๋กœ containerd๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

sudo apt update
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update
sudo apt install -y containerd.io

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null <span class="token file-descriptor important">2><span class="token file-descriptor important">&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

sudo systemctl restart containerd
sudo systemctl enable containerd
  • .sudo apt update๋กœ apt ํŒจํ‚ค์ง€ ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๊ณ  sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates๋กœ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • .sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg๋กœ Docker ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•˜๊ณ , sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"๋กœ apt ์ €์žฅ์†Œ ๋ชฉ๋ก์— Docker ์ €์žฅ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ sudo apt update๋กœ apt ํŒจํ‚ค์ง€ ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๊ณ , sudo apt install -y containerd.io๋กœ containerd๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—†์ด sudo apt install -y containerd๋กœ ์šฐ๋ถ„ํˆฌ์— ๋‚ด์žฅ๋œ containerd๋ฅผ ์„ค์น˜ํ•˜๋ฉด kubeadm์ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • .containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1๋กœ containerd ๊ธฐ๋ณธ ์„ค์ •๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด๊ณ , sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml๋กœ SystemdCgroup์„ true๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ Cgroups๋กœ systemd๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • .sudo systemctl restart containerd๋กœ containerd ์„œ๋น„์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์—ฌ ๋ฐ”๋€ ์„ค์ •์„ ๋ฐ˜์˜ํ•ด์ฃผ๊ณ , sudo systemctl enable containerd๋กœ ๋ถ€ํŒ…ํ–ˆ์„ ๋•Œ containerd ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. kubeadm init์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ master ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

OUTPUT_FILE=/vagrant/join.sh
rm -rf $OUTPUT_FILE
rm -rf /vagrant/.kube
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=192.168.56.10 --apiserver-advertise-address=192.168.56.10
sudo kubeadm token create --print-join-command > $OUTPUT_FILE
chmod +x $OUTPUT_FILE
  • OUTPUT_FILE=/vagrant/join.sh์€ kubeadm init ๋ช…๋ น ์‹คํ–‰ ํ›„ ์ถœ๋ ฅ๋˜๋Š” kubeadm join ๋ช…๋ น์„ ์ผ์ผ์ด ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฏ€๋กœ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ํŠนํžˆ /vagrant ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” Vagrant๋กœ ์ƒ์„ฑํ•œ ๋ชจ๋“  ๊ฐ€์ƒ๋จธ์‹ ์—์„œ ๊ณต์œ ํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๋ฉฐ Vagrantfile์ด ์žˆ๋Š” ๋กœ์ปฌ ํด๋”(๋””๋ ‰ํ„ฐ๋ฆฌ)์™€๋„ ๊ณต์œ ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. rm -rf $OUTPUT_FILE๋กœ ์ด์ „ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ , rm -rf /vagrant/.kube๋กœ ์ด์ „ .kube ๋””๋ ‰ํ„ฐ๋ฆฌ๋„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  • .sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=192.168.56.10 --apiserver-advertise-address=192.168.56.10์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ master ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • --pod-network-cidr=10.244.0.0/16: ์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค(CNI)๋กœ flannel์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ --pod-network-cidr๋ฅผ 10.244.0.0/16๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.
    • --control-plane-endpoint=192.168.56.10: ๋กœ์ปฌ ํ™˜๊ฒฝ์ด๋ผ ๋„๋ฉ”์ธ์ด ํ•„์š”์—†์œผ๋ฏ€๋กœ ์ œ์–ด ํ”Œ๋ ˆ์ธ ์—”๋“œํฌ์ธํŠธ๋ฅผ master ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ 192.168.56.10์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • --apiserver-advertise-address=192.168.56.10: apiserver ์ฃผ์†Œ๋„ master ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ 192.168.56.10์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • .kubeadm init ์‹คํ–‰ ํ›„์—๋„ kubeadm join ๋ช…๋ น์ด ๋‚˜์˜ค์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด sudo kubeadm token create --print-join-command > $OUTPUT_FILE๋ฅผ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  chmod +x $OUTPUT_FILE๋กœ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์— ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ”๊นฅ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก .kube ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ์„ค์ •ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ , CNI์ธ >flannel์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  bash ์ž๋™ ์™„์„ฑ ์„ค์ •๊ณผ kubectl์„ k๋กœ ์•ฝ์นญ(alias)์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
cp -R $HOME/.kube /vagrant/.kube
cp -R $HOME/.kube /home/vagrant/.kube
sudo chown -R vagrant:vagrant /home/vagrant/.kube
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl completion bash >/etc/bash_completion.d/kubectl
echo 'alias k=kubectl' >>/home/vagrant/.bashrc
  • .mkdir -p $HOME/.kube๋กœ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— .kube ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config๋กœ /etc/kubernetes/ ์•ˆ์— ์žˆ๋Š” admin.conf๋ฅผ .kube ์•„๋ž˜์— config ํŒŒ์ผ๋กœ ๋ณต์‚ฌํ•ด์ค๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ sudo chown $(id -u):$(id -g) $HOME/.kube/config๋กœ config ํŒŒ์ผ์˜ ์†Œ์œ ์ž์™€ ๊ทธ๋ฃน์„ ํ˜„์žฌ ์‚ฌ์šฉ์ž์™€ ๊ทธ๋ฃน์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค. ์ด๋•Œ $HOME์€ /root์ด๊ณ  ์‚ฌ์šฉ์ž์™€ ๊ทธ๋ฃน์€ root์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์•ผ kubectl์„ ์‹คํ–‰ํ•˜์—ฌ flannel์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€์ƒ๋จธ์‹  ๋ฐ”๊นฅ์—์„œ .kube ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก cp -R $HOME/.kube /vagrant/.kube๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • root๊ฐ€ ์•„๋‹Œ vagrant ์ผ๋ฐ˜ ๊ณ„์ •์—์„œ๋„ kubectl์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก cp -R $HOME/.kube /home/vagrant/.kube์„ ์‹คํ–‰ํ•˜์—ฌ .kube ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  sudo chown -R vagrant:vagrant /home/vagrant/.kube๋กœ ์†Œ์œ ์ž์™€ ๊ทธ๋ฃน์„ vagrant๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • .kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml๋ฅผ ์‹คํ–‰ํ•˜์—ฌ CNI flannel์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. CNI๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” flannel์„ ์„ค์น˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • .kubectl completion bash >/etc/bash_completion.d/kubectl๋ฅผ ์‹คํ–‰ํ•˜์—ฌ bash ์ž๋™ ์™„์„ฑ ์„ค์ •์„ ํ•ด์ฃผ๊ณ , echo 'alias k=kubectl' >>/home/vagrant/.bashrc๋ฅผ ์‹คํ–‰ํ•˜์—ฌ kubectl์„ k๋กœ ์•ฝ์นญ(alias)์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

๋‹ค์Œ์€ worker ๋…ธ๋“œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. worker ๋…ธ๋“œ๋Š” (1..3)์œผ๋กœ 1๋ถ€ํ„ฐ 3๊นŒ์ง€ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ๋…ธ๋“œ 3๊ฐœ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  (1..3).each do |i|
    config.vm.define "worker#{i}" do |worker|
      worker.vm.box = "ubuntu/jammy64"
      worker.vm.network "private_network", ip: "192.168.56.1#{i}"
      worker.vm.hostname = "worker#{i}"

      worker.vm.provider "virtualbox" do |v|
        v.memory = 2048
        v.cpus = 2
      end

      worker.vm.provision "0", type: "shell", preserve_order: true, privileged: true, inline: <<-<span class="token constant">EOC
  • worker.vm.box: master ๋…ธ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Ubuntu 22.04 ๋ฒ„์ „์ธ "ubuntu/jammy64"๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • worker.vm.network: ๋„คํŠธ์›Œํฌ ์„ค์ •์ž…๋‹ˆ๋‹ค. "private_network"๋กœ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ–ˆ๊ณ  worker ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋Š” "192.168.56.1#{i}"๋กœ ์„ค์ •ํ•ด์„œ 11๋ถ€ํ„ฐ 13๊นŒ์ง€ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • worker.vm.hostname: ๊ฐ€์ƒ๋จธ์‹ ์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. "worker#{i}"๋กœ ์„ค์ •ํ•˜์—ฌ worker1๋ถ€ํ„ฐ 3๊นŒ์ง€ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • worker.vm.provider "virtualbox" do |v|: worker ๊ฐ€์ƒ๋จธ์‹ ์˜ VirtualBox ์„ค์ •์ž…๋‹ˆ๋‹ค.
    • v.memory: ๊ฐ€์ƒ๋จธ์‹ ์˜ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 2048(2Gi)์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • v.cpus: ๊ฐ€์ƒ๋จธ์‹ ์˜ CPU ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 2๊ฐœ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • worker.vm.provision: join.sh ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ ๋ถ€๋ถ„, kubeadm init์œผ๋กœ master ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„, flannel์„ ์„ค์น˜ํ•˜๋Š” ๋ถ€๋ถ„, .kube ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณต์‚ฌ ๋ถ€๋ถ„ ๋“ฑ์„ ์ œ์™ธํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๋Š” master์™€ ๋™์ผํ•˜๊ฒŒ containerd์™€ kubeadm์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ Vagrantfile๋กœ ๊ฐ€์ƒ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๋“ค์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. Vagrant ์—†์ด ์ˆ˜๋™์œผ๋กœ ๊ฐ€์ƒ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜๊ณ , ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž…๋ ฅํ•ด๋„ ๋™์ผํ•˜๊ฒŒ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์žฅ์—์„œ๋Š” ์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Nginx ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ์ธ๊ทธ๋ ˆ์Šค๋„ ์„ค์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์ด์ฐฌํฌ (MarkiiimarK)
Never Stop Learning.