UTM + Ubuntu VM 3대에 만드는 안정적인 Kubernetes 클러스터
1. UTM VM 3대 구성
- UTM에서 Ubuntu 22.04 ARM64 VM
- CPU 2, RAM 4 GB, 디스크 20 GB 이상
- Ubuntu 22.04 ARM64 VM 설치 → 사용자
pcadmin 생성
- SSH 활성화
- master, worker1, worker2 VM 3대 생성
2. Static IP 할당 (각 VM) - 혹시모르니까
# 인터페이스 이름(enp0s1)은 'ip a'로 확인 후 바꿔주세요
sudo tee /etc/netplan/01-static.yaml > /dev/null <<EOF
network:
version: 2
ethernets:
enp0s1:
dhcp4: no
addresses:
- 192.168.64.X/24 # master:7, worker1:8, worker2:10
gateway4: 192.168.64.1
nameservers:
addresses: [8.8.8.8,1.1.1.1]
EOF
sudo netplan apply
ip a # 설정 확인
3. 모든 VM - 공통 사전 작업
# ① swap 비활성화
sudo swapoff -a
sudo sed -i '/ swap /s/^/#/' /etc/fstab
# ② 커널 설정 (bridge & forward)
sudo modprobe br_netfilter
sudo tee /etc/sysctl.d/k8s.conf > /dev/null <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# ③ containerd 설치 & systemd cgroup 활성화
sudo apt update
sudo apt install -y containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
# → 핵심: cgroup 드라이버를 systemd로 맞추기
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
4.모든 VM - kubeadm 도구 설치
# ① Google apt-key 설치
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg \
https://packages.cloud.google.com/apt/doc/apt-key.gpg
# ② Kubernetes apt 소스 추가
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] \
https://apt.kubernetes.io/ kubernetes-xenial main" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
# ③ kubelet, kubeadm, kubectl 설치 & 버전 고정
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
5.Master에서 - kubeconfig, flannel
sudo kubeadm init \
--apiserver-advertise-address=192.168.64.7 \
--pod-network-cidr=10.244.0.0/16
# pcadmin 계정용 kubeconfig 복사
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 워커 조인 명령 출력
kubeadm token create --print-join-command
# Flannel CNI 설치 & 검증
kubectl apply -f \
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
6.Worker 조인
# master에서 복사한 join 커맨드
sudo kubeadm join 192.168.64.7:6443 \
--token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH>
7.kube-proxy CrashLoop 방지 패치
kubectl -n kube-system get daemonset kube-proxy -o yaml \
| sed '/args:/a\ - --nodeport-addresses=primary' \
| kubectl apply -f -
트러블슈팅
| 증상 | 원인 & 해결 |
|---|
| API 서버 곧바로 죽음 | containerd cgroup 불일치 → SystemdCgroup=true 설정 확인 |
| kubectl 연결 refused/timeout | admin.conf 복사(/root/.kube/config 또는 $HOME/.kube/config) 또는 KUBECONFIG 설정 |
| Worker join 실패 | sudo 미사용 또는 이전 join 잔여물 → sudo kubeadm reset -f |
| kube-proxy CrashLoopBackOff | --nodeport-addresses=primary 패치 |