Published on

Ubuntu 22.04 에 Kubernetes 설치하기. (kubeadm)

Authors
  • Name
    Twitter

Overview

Ubuntu 22.04에 kubernetes 설치하는 방법을 알아보겠습니다. 서버는 master node 1대, worker node 2대로 구성합니다. kubernetes를 설치 과정은 크게 2가지 작업으로 나누어 볼 수 있습니다.

  1. Container Runtime 설치
  2. cri-dockerd 설치
  3. Kubernetes 설치 with cubeadm

Container Runtime으로 아래 4가지 중 하나를 선택할 수 있습니다.

컨테이너 런타임 설명 자세히 보기

Container Runtime (Docker) install

쿠버네티스 홈페이지에서 지원하는 Container Runtime 중 도커 엔진으로 결정.

설치전, 포트 열려있는지 확인.

nc 127.0.0.1 6443

Uninstall Old Version

아래 명령어로, 혹시나 미리 설치되었을 docker 관련 파일들을 삭제해줍니다.

sudo apt-get remove docker docker-engine docker.io containerd runc

Set up the repository

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

install docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Docker 설치 확인

sudo docker run hello-world

아래와 같은 메시지가 나오면 정상 설치된 것임.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

cri-dockerd 설치

kubernetes로 엔진으로 docker를 사용하려면 cir-dockerd 어댑터를 반드시 설치해야한다. cir-dockerd 문서를 참조.

su - 를 입력하여, 아래 명령어를 root 권한으로 실행해준다.

git clone https://github.com/Mirantis/cri-dockerd.git
# Run these commands as root
###Install GO###
wget https://storage.googleapis.com/golang/getgo/installer_linux
chmod +x ./installer_linux
./installer_linux
source ~/.bash_profile

cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket

아래와 같은 메시지가 나오면, 정상적으로 설치된 것이다.

Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service/etc/systemd/system/cri-docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/cri-docker.socket/etc/systemd/system/cri-docker.socket.

아래 명령어로, kubeadm을 설치한다.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

su - 로 root 권한을 획득한 뒤, master node에서 아래 명령어를 실행한다.

kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock --pod-network-cidr=10.244.0.0/16

만약 init 과정중 아래와 같은 명령어가 나온다면, 이 블로그 를 참조하여 docker를 재시작 해주고, kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock 명령어로 깔끔하게 초기화해준뒤 다시 kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock 을 실행한다.

he HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error

kubelet은 swap이 on 되어있으면 start 하지 못한다. 따라서 master와 worker node에서 sudo swapoff -a 명령어로 swap을 off시켜준다. 그리고, 재부팅 시에도 해당 내용 반영을 위해 sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 명령어로 /etc/fstab 파일의 swap 부분을 주석처리 해준다.

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

kubeadm init 실행시 아래와 같은 문구가 나오면 정상설치된 것이다.

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.219.110:6443 --token 0yrk20.i10d95793j5d9z9a \
	--discovery-token-ca-cert-hash sha256:b1ff8a6681b2fa13029892xxxxxxxxxxxxxxxxx

아래 명령어로 네트워크 add-on 설치를 진행합니다. 다양한 add-on 중에 flannel이 가장 많이 사용되는 것 같아 이 add-on을 선택했습니다.

wget https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

worker node에서 join을 진행합니다.

kubeadm join 192.168.219.110:6443 --token 0yrk20.i10d95793j5d9z9a \
    --discovery-token-ca-cert-hash sha256:b1ff8a6681b2fa13029892xxxxxxxxxxxxxxxxx \
    --cri-socket unix:///var/run/cri-dockerd.sock

master node에서 kubectl get nodes를 입력하면 아래와 같이 worker node의 상태가 ready인 것을 확인할 수 있습니다.

$kubectl get nodes
NAME                              STATUS   ROLES           AGE   VERSION
master          Ready    control-plane   15m   v1.26.0
node1           Ready    <none>          32s   v1.26.0
node2           Ready    <none>          32s   v1.26.0

kubernetes open /run/flannel/subnet.env: no such file or directory 라는 메시지와 함께 pod가 생성되지 않고 hang이 걸리는 현상이 있었다. 해결방법을 참조하여 해결했다. 모든 worker node에 /run/flannel/subnet.env 파일을 아래와 같은 내용으로 생성해준다.

/run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

이상으로, kubeadm을 이용한 ubuntu에 kubernetes 설치하는 방법에 대한 포스팅을 마치겠습니다. 감사합니다.

kube flannel pod가 CrashLoopBackOff 상태인 경우 solution 을 참조하여 kubectl patch node <nodename> -p '{"spec":{"podCIDR":"10.244.0.0/16"}}' 을 실행.

kube-flannel   kube-flannel-ds-fg8lc             0/1     CrashLoopBackOff

이후 발생한이슈는 https://potato-yong.tistory.com/150 참고하여 해결.

metrics-server deployment에서 --kubelet-insecure-tls 추가 및 spec.template.spec에 hostNetwork: true 추가를 통해 해결.

root@cubi01:~# kubectl top node cubi01
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
cubi01   234m         5%     8696Mi          55%
root@cubi01:~# kubectl top node cubi02
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
cubi02   46m          1%     6730Mi          42%

reference