아래 스크립트는 쿠버네티스를 세팅하기 위해 만든 스크립트다.
아래 스크립트 내용을 복사하여 init.sh로 생성하고 권한을 부여해 실행한다.
아래 과정을 이전에 만든 모든 노드에서 실행한다.
#!/bin/bash
sudo apt update
sudo apt install netfilter-persistent -y
sudo iptables -X
sudo iptables -F
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo netfilter-persistent save
sudo netfilter-persistent reload
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
sudo apt install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install containerd.io -y
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
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/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.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
chmod +x init.sh
./init.sh
control-plane으로 사용될 노드에만 아래 명령어를 통해 init을 수행한다.
1. control-plane 노드가 Home(PC)인 경우
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=$(ip -4 addr show wg0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}') \
--apiserver-cert-extra-sans=$(curl -s ifconfig.me)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-cert-extra-sans=$(curl -s ifconfig.me)
init 수행이 완료되면 생성되는 join 명령어는 복사해 기록해두자.
만약 분실 혹은 만료된 경우에는 아래 명령어를 사용하여 다시 획득할 수 있다.
sudo kubeadm token create --print-join-command --kubeconfig /etc/kubernetes/admin.conf
그리고 kubeconfig를 사용할 수 있도록 설정해줘야 한다.
mkdir -p ~/.kube
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
sudo -E chown $(id -u):$(id -g) ~/.kube/config
그 후 생성된 join 명령어를 다른 worker 노드에서 실행하고 control-plane에서 kubectl get node 명령어를 사용하면 노드를 확인할 수 있다.

아직 네트워크 인터페이스를 설정하기 이전이라 Status가 NotReadt 상태다.
HomeLAB 구성하기 -2 에서 만든 gateway도 마찬가지로 위의 스크립트를 실행하고, Control-Plane Node init 단계에서 생성된 join 명령어를 사용하여 노드를 join 한다.

gateway 노드는 oracle cloud에 있는 VMdl gateway로, 나머지 노드들은 온프레미스 환경에서 동작하고 있다.
프리티어 gateway 노드는 스펙이 낮은편이라, 어플리케이션 파드가 구동되는 경우 지나치게 느려져 비정상적으로 동작할 수 있기에 taint를 활용해 스케줄링이 되지 않도록 설정한다.
kubectl taint node gateway gateway=true:NoExecute
kubelet은 default network interface의 IP를 이용해 노드 IP로 활용하게 된다.
VPN 인터페이스의 IP를 사용할 수 있도록 config를 수정하고, 노드를 재시작한다.
아래 스크립트를 모든 노드에서 실행한다.
ip_address=$(ip -4 addr show wg0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
sudo sed -i "s|\(Environment=\"KUBELET_CONFIG_ARGS=[^\"]*\)|\1 --node-ip=${ip_address}|" /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo systemctl daemon-reload
sudo systemctl restart kubelet
위 과정을 실행하면 같은 네트워크 대역으로 통일할 수 있다.

# CPU 아키텍처 확인
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
ARCH="amd64"
elif [ "$ARCH" = "aarch64" ]; then
ARCH="arm64"
fi
# 최신 버전 다운로드
curl -fsSLO "https://github.com/derailed/k9s/releases/latest/download/k9s_$(uname -s)_${ARCH}.tar.gz"
# 압축 해제 및 설치
tar -xzf k9s_*.tar.gz k9s
sudo mv k9s /usr/local/bin/
# 설치 확인
k9s version