티스토리 뷰

현재 개인 공부로 kubernetes 세팅부터 진행 중이다. EKS, GKE 같은 걸로 하면 쉽게 쿠버네티스 환경이 구축되지만, 생각보다 비용이 나와 해보고 싶은 걸 다 하긴 부담스럽다. 그래서 대학생 때 봤던 "컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커" 책을 참고하여 복습 겸 이것저것 시도해보려 한다. 

https://m.yes24.com/Goods/Detail/102099414

 

컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 예스24

실무에 바로 적용할 수 있는 컨테이너 인프라 환경 기술!IT 자원을 효율적으로 빠르게 사용할 수 있는 방법으로 컨테이너 환경이 거론되었으나 그동안 관리가 어렵고 복잡해서 상용되기 어려웠

m.yes24.com

 

해당 책에는 CentOS 7을 이용해 vagrant로 쿠버네티스 환경을 세팅할 수 있도록 Vagrantfile과 shell을 제공한다. 분명 나도 책을 거의 다 봤었고, 정상 동작했던 기억이 있는데, CentOS 7이 EOS 되면서 에러를 하나 해결하면 또 뭐가 안 되고, 또 뭐가 안 되고 그래서 그냥 ubuntu로 환경 구성 + shell도 내가 만들고 싶은데로 만들어 본다. 


환경 :

OS : Mac 12.7.6 (10년된 고물 맥이다. 슬슬 타자가 잘 안 쳐지는 거 같지만..... 맥북 화이팅)

VM : Virtualbox 7.0.14

Vagrant : 2.4.3

kubernetes : 1.29

docker : 26.1.3

 

기본 Vagrantfile은 책 참고 + 쉘은 여기저기 찾아본 결과이다. 

 

초기 디렉토리 구조는 다음과 같다. 

├── Vagrantfile

├── common.sh

├── data

├── master.sh

└── worker.sh

 

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
    # number of worker nodes
    N = 3
  
    # k8s master
    config.vm.define "m-k8s" do |cfg|
      # vm os 및 리소스 설정
      cfg.vm.box = "ubuntu/focal64"
      cfg.vm.provider "virtualbox" do |vb|
        vb.name = "m-k8s-vm"
        vb.cpus = 2
        vb.memory = 2048
        # virtualbox group 지정
        vb.customize ["modifyvm", :id, "--groups", "/k8s-SM"]
      end 
      # vm host name 설정
      cfg.vm.host_name = "m-k8s"
      # 마스터 노드 private network 설정 
      cfg.vm.network "private_network", ip: "192.168.1.10"
      # local 60010 -> vm 22 로 ssh 접속 (id: "ssh" 설정으로 로컬에서만 접속할 수 있도록 구성. 실행 후, .vagrant 디렉토리에 private key 저장됨)
      cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"
      # 워커 노드 가입을 위한 shell 저장을 위해 로컬의 data 디렉토리를 공유 디렉토리로 지정. 실제 vm 내의 vagrant 디렉토리와 동기화됨 
      cfg.vm.synced_folder "./data", "/vagrant"
      # common.sh, master.sh 실행
      cfg.vm.provision "shell", path: "./common.sh"
      cfg.vm.provision "shell", path: "./master.sh"
    end
  
    # Add nodes
  
    # k8s workers
    (1..N).each do |i|
      config.vm.define "w#{i}-k8s" do |cfg|
        cfg.vm.box = "ubuntu/focal64"
        cfg.vm.provider "virtualbox" do |vb|
          vb.name = "w#{i}-k8s-vm"
          vb.cpus = 2
          vb.memory = 1024
          # 마스터와 동일한 virtualbox group으로 지정
          vb.customize ["modifyvm", :id, "--groups", "/k8s-SM"]
        end 
        cfg.vm.host_name = "w#{i}-k8s"
        cfg.vm.network "private_network", ip: "192.168.1.10#{i}"
        cfg.vm.network "forwarded_port", guest: 22, host: "6010#{i}", auto_correct: true, id: "ssh"
        cfg.vm.synced_folder "./data", "/vagrant"
        # common.sh, worker.sh 실행
        cfg.vm.provision "shell", path: "./common.sh"
        cfg.vm.provision "shell", path: "./worker.sh"
      end
    end 
  end

 

common.sh

#!/bin/bash
set -e

echo "===== 공통 설정 시작: $(hostname) ====="

# 시스템 업데이트 및 업그레이드
sudo apt-get update -y
sudo apt-get upgrade -y

# 스왑 비활성화
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

# Docker 설치 및 실행
sudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

# 필수 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl

# Kubernetes 저장소 추가 및 kubeadm, kubelet, kubectl 설치
# kubernetes repo 변경으로 인한 조치 추가
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update -y
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# sysctl 설정: Kubernetes 네트워크 트래픽을 위한 설정
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

echo "===== 공통 설정 완료: $(hostname) ====="

 

master.sh

#!/bin/bash
set -e

if [ "$(hostname)" != "m-k8s" ]; then
  echo "이 스크립트는 master 노드에서만 실행되어야 합니다."
  exit 1
fi

echo "===== Master 노드 설정 시작: $(hostname) ====="

# Kubernetes master 초기화
sudo kubeadm init --apiserver-advertise-address=192.168.1.10 --pod-network-cidr=10.244.0.0/16

# kubectl 등 사용자 명령어를 위한 kubeconfig 설정
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# kubectl 적용을 위한 환경 변수 설정 
echo 'export KUBECONFIG=$HOME/.kube/config' >> $HOME/.bashrc
source $HOME/.bashrc

# flannel 네트워크 적용
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# worker 노드를 위한 join 명령어 생성 및 공유 폴더에 저장
# --ttl 0 : 기본 토큰 만료 24시간 대신 만료 없음으로 설정 
# --print-join-command : kubeadm join api-server <ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
# 위 join 명령어를 join_command.sh에 저장 및 워커에서도 해당 쉘 사용하여 가입 
sudo touch /vagrant/join_command.sh
sudo kubeadm token create --ttl 0 --print-join-command > /vagrant/join_command.sh
chmod +x /vagrant/join_command.sh

echo "===== Master 노드 설정 완료 ====="

 

worker.sh

#!/bin/bash
set -e

if [ "$(hostname)" = "m-k8s" ]; then
  echo "이 스크립트는 worker 노드에서만 실행되어야 합니다."
  exit 1
fi

echo "===== Worker 노드 설정 시작: $(hostname) ====="

# master에서 생성한 join 명령어 파일이 생성될 때까지 대기
while [ ! -f /vagrant/join_command.sh ]; do
  echo "master에서 join 명령어를 기다리는 중..."
  sleep 5
done

# 클러스터 가입 실행
sudo bash /vagrant/join_command.sh

echo "===== Worker 노드 설정 완료 ====="

 

위 내용으로 프로비저닝 구성 후, vagrant up으로 프로비저닝을 시킨다. 

 

이후, vagrant ssh m-k8s로 kubectl get nodes로 아래와 같이 정상적으로 노드들이 클러스터에 가입됨을 확인할 수 있다. 

NAME     STATUS   ROLES           AGE   VERSION
m-k8s    Ready    control-plane   41m   v1.29.14
w1-k8s   Ready    <none>          37m   v1.29.14
w2-k8s   Ready    <none>          31m   v1.29.14
w3-k8s   Ready    <none>          26m   v1.29.14

 

프로비저닝이 되었으므로 추가적인 설정을 이후 진행해보려 한다. (다음 번에 계속)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함