티스토리 뷰
현재 개인 공부로 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
프로비저닝이 되었으므로 추가적인 설정을 이후 진행해보려 한다. (다음 번에 계속)
'메모 > kubernetes' 카테고리의 다른 글
docker desktop으로 멀티 노드 쿠버네티스 클러스터 구성하기 (0) | 2025.03.22 |
---|---|
쿠버네티스 파드 관련 기본 명령어 (0) | 2025.03.22 |
kubetctl, kubelet 기능 검증 테스트 (0) | 2025.03.08 |
쿠버네티스 주요 구성 요소 (파드 배포 중심) (0) | 2025.02.28 |