
Kubernetes 1.30 버전을 Ubuntu 24.04 LTS 에 설치해보며 이 과정중에 발생했던 에러도 함께 살펴보겠습니다.
Kubernetes 설치 실습을 하기 위한 조건은 아래와 같습니다.
우분투를 업데이트 합니다
sudo apt update && sudo apt upgrade -y
Swap을 Disable 합니다.
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
그리고 Reboot시 이 설정은 초기화 되므로 다시 설정해주어야 합니다.
만약 하지 않는다면 이후에 kubeadm init 시 아래 에러 메시지와 함께 설치를 실패합니다.
Please disable Swap!
swap이 적용되었는지 확인하는 방법은 아래 명령어를 입력 후 출력이 없으면 비활성화된 상태 = 정상 입니다.
swapon --show
커널 파라미터를 추가합니다.
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
변경사항을 load하는 명령어
sudo sysctl --system
잘 적용되었는지 확인하는 명령어는 아래와 같습니다.
lsmod | grep -E 'overlay|br_netfilter'
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.ipv4.ip_forward
sysctl net.bridge.bridge-nf-call-ip6tables
Containerd를 설치하고 그와 관련된 의존성을 설치합니다.
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
그리고 설치된 containerd와 패키지를 업데이트 합니다.
sudo apt update
sudo apt install -y containerd.io
Systemd를 Cgroup으로 사용하여 containerd를 구성합니다.
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
containerd를 재시작 및 활성화를 합니다.
sudo systemctl restart containerd
sudo systemctl enable containerd
Kubernetes Repository를 추가합니다.
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
마지막으로 Kubernetes CLuster를 초기화 해줍니다.
sudo kubeadm init
그러면 아래와 같이 initialized successfully 가 나오게 됩니다.

이후 log에도 나온 것 처럼 cluster에서 이 master node를 사용하기 위해서는 아래 명령어를 추가적으로 입력해야 합니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
master node가 잘 동작하는지 확인하는 명령어는 nodes를 확인하는 것입니다.
kubectl get nodes
만약 Master node와 Worker node를 따로 구성한다면 worker Node에 아래 kubeadm join를 추가적으로 수행해야 합니다.
아래에 적힌 join 명령어는 예시이며 최초로 kubeadm init 을 성공하게되면 가장 아래에 나오는 부분을 복사하여 붙여넣기를 해야합니다.
kubeadm join 138.197.184.45:6443 --token 72ww2b.6orffywqcf5s4p2z \
--discovery-token-ca-cert-hash sha256:aafb79cdd45a6e3b3fac01fb3efba0817360b01f90a4b6c3f11567108a36ba67
pod와 cluster 사이에서의 통신을 위해 네트워크 플러그인을 설치합니다.
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
최종적으로 확인합니다.
kubectl get pods -n kube-system
kubectl get nodes
Nginx 를 배포 테스트를 해봅니다.
kubectl run nginx --image=nginx
그리고 containerd, kubelet 설정 확인은
sudo systemctl status containerd
sudo systemctl status kubelet
sudo kubeadm init
명령어 이후
E0420 24114 memcache.go:265 couldn't get current server API group list: GET "https://192.168.0.100:6443/api?timeout=32s": connect: connection refused
에러 발생
이는 kube-apiserver에 연결하려 했지만 API 서버가 열려 있지 않아서 실패한 것 입니다.
아래 순서로 체크하였습니다.
sudo systemctl status kubelet 으로 kubelet 상태 확인sudo journalctl -u kubelet -f 로 로그 확인sudo swapoff -a 명령어sudo crictl ps | grep kube-apiserver 로 api server 동작확인sudo crictl ps | grep kube-apiserver 을 하니 아래와 같이 warn 발생
warn0000 runtime connect using default endpoints [unix"///run/containerd/containerd.sock ... as the default settings are now deprecated, you should set the endpoint instaed.
warn000 image connect using default endpoints: [unix:///run/containerd/containerd.sock ... as the default settings are now deprecared, you should set the endpoint instaed.
위 에러가 발생하여 이전에 hosts 관련 변경사항이 원인이 되는 것 같아 수정해주었습니다.
127.0.0.1 localhost j[onghunserver -> 추가]
...
그래도 실패하였습니다. 알고 보니 sudo iptables -F 는 영구적인 삭제가 아니고 현재 메모리에 있는 데이터에 대해 삭제된 것이고 이후 reboot 시에는 다시 이전에 저장되었던 내용들을 reload해오고 있었습니다.
iptables에 저장되어있던 기본 정책은 허용한 port 이외에는 모두 DROP 하고 있었습니다. 그래서 api server port가 DROP 되어있어 연결에 실패하였던 것 같습니다.