VNC / KVM 설치 후 VM 3개 만들고 Kubernetes 클러스터 설치.
macvlan은 포기.
WiFi 환경에서 VM 외부 통신이 불안정해서 libvirt default NAT 사용.
VM 구성.
k8s-master
192.168.122.10
4 core
8GB
50GB
k8s-worker1
192.168.122.11
4 core
8GB
50GB
k8s-worker2
192.168.122.12
4 core
8GB
50GB
Ubuntu Server ARM64 ISO 준비.
mkdir -p ~/iso
cd ~/iso
wget https://cdimage.ubuntu.com/releases/24.04.4/release/ubuntu-24.04.4-live-server-arm64.iso
virt-manager로 VM 생성.
Memory 8192 MB
CPU 4
Storage 50 GB
Network default NAT
인터페이스 확인.
ip link show
Ubuntu VM 기본 인터페이스는 enp1s0.
고정 IP 설정.
sudo tee /etc/netplan/99-static.yaml > /dev/null << 'EOF'
network:
version: 2
ethernets:
enp1s0:
dhcp4: false
addresses: [192.168.122.10/24]
routes:
- to: default
via: 192.168.122.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
EOF
sudo chmod 600 /etc/netplan/99-static.yaml
sudo netplan apply
worker는 주소만 변경.
192.168.122.11
192.168.122.12
SSH 키 설정.
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ''
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
sudo NOPASSWD 설정.
echo "ubuntu ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ubuntu
sudo chmod 440 /etc/sudoers.d/ubuntu
모든 노드 공통.
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
커널 모듈.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
sysctl.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
containerd 설치.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
Kubernetes 패키지 설치.
sudo mkdir -p /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
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable kubelet
master 초기화.
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.122.10 \
--control-plane-endpoint=192.168.122.10
kubectl 설정.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Flannel 설치.
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
worker join.
sudo kubeadm join 192.168.122.10:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
검증.
kubectl get nodes -o wide
kubectl get pods --all-namespaces
nginx 테스트.
kubectl create deployment nginx-test --image=nginx
kubectl expose deployment nginx-test --port=80 --type=NodePort
NODEPORT=$(kubectl get svc nginx-test -o jsonpath='{.spec.ports[0].nodePort}')
curl http://192.168.122.10:$NODEPORT
문제 확인용.
kubectl describe pod <pod-name>
kubectl get events --all-namespaces --sort-by='.lastTimestamp'
sudo systemctl status containerd
sudo journalctl -u containerd -f
sudo systemctl status kubelet
sudo journalctl -u kubelet -f
초기화.
sudo kubeadm reset -f
sudo rm -rf /etc/cni/net.d
sudo rm -rf ~/.kube
worker 초기화.
sudo kubeadm reset -f
sudo rm -rf /etc/cni/net.d