Ubuntu 22.04 에서 Kubernetes 설치하기

By | 2024년 1월 9일
Table of Contents

Ubuntu 22.04 에서 Kubernetes 설치하기

k8s 1.24 ( 2022/05 ) 이후
k8s 에서 기본적으로 내부 연결 지원해주던 dockershim 이 제거되어
cri-docker 추가 설치하여 도커를 k8s에 연결하는 작업이 필요

아래 내용은 AWS EC2 를 이용해 Kubernetes 를 설치하는 방법을 설명합니다.

간단히 흐름을 정리해 보면

  • EC2 인스턴스 생성
  • 모든 인스턴스에 준비사항 반영
  • 모든 인스턴스에 도커 설치
  • Control-plane 구성 (master only)
  • Worker node 구성 (worker node only)

이렇게 진행합니다.

기타 Hello, World 앱을 실행시켜 보는 것은 다른 문서에 작성하도록 하겠습니다.

EC2 인스턴스 생성

Ubuntu 22.04 버전을 선택해서 인스턴스를 생성합니다.

Master 에는 t3.small(메모리 2G, CPU 2개, 20G), Node 01 에는 t3.medium(메모리 4G, CPU 2개, 20G)를 설정해 줍니다.

비용은 시간당 100원이 안되므로 생성확인 후 삭제하면 비용발생은 많지 않습니다.

모든 인스턴스에 준비사항 반영

시스템 업데이트

sudo apt update
sudo sed -i "/#\$nrconf{restart} = 'i';/s/.*/\$nrconf{restart} = 'a';/" /etc/needrestart/needrestart.conf
sudo apt -y upgrade

Swap off

AWS EC2 인스턴스는 디폴트로 스왑을 disable 시키므로 필요없기는 하지만 그래도 적어 놓습니다.

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

방화벽 off

sudo ufw disable

커널 파라미터 수정

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

sudo sysctl --system

보안그룹 설정

allow-kubernetes 라는 이름의 보안그룹을 생성합니다.
inbound/outbound 는 설정하지 않습니다.

protect-kubernetes 라는 이름의 보안그룹을 생성합니다.
inbound 에 아래 내용을 설정합니다.

  • 유형 : 모든 TCP
  • 포트범위 : 0 – 65535
  • 소스 : allow-kubernetes

allow-kubernetes, protect-kubernetes 를 모든 master/node 에 할당해 줍니다.

모든 인스턴스에 도커 설치

sudo apt-get update

sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

sudo docker version
sudo systemctl enable docker
sudo systemctl start docker

sudo systemctl enable containerd
sudo systemctl start containerd
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker
# cri-docker Install
VER=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g')
echo $VER
wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.amd64.tgz
tar xvf cri-dockerd-${VER}.amd64.tgz
sudo mv cri-dockerd/cri-dockerd /usr/local/bin/

# cri-docker Version Check
cri-dockerd --version

wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/
sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket

# cri-docker Active Check
sudo systemctl restart docker && sudo systemctl restart cri-docker
sudo systemctl status cri-docker.socket --no-pager
sudo docker info | grep Cgroup
----------------
 Cgroup Driver: systemd
 Cgroup Version: 2

모든 인스턴스에 Kubernetes 설치

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
sudo apt-add-repository -y "deb http://apt.kubernetes.io/ kubernetes-xenial main"

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Control-plane 구성 (master only)

반드시 master 에서만 실행합니다.

# sudo kubeadm init
sudo kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock

아래와 유사한 메시지가 표시되면 메모장같은 곳에 복사해 놓습니다.

kubeadm join 172.31.43.124:6443 --token co2dgc.6tqutxehblku3mpp \
        --discovery-token-ca-cert-hash sha256:af76d7e108915d86b3af4be9a8b3d1e26799de1a96ec75f84e80d7be32b68012

아래 명령을 설정해 줌으로 해서 sudo 없이 kubectl 을 실행할 수 있습니다.

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

# sudo 를 붙이지 않습니다.
kubectl version
---------------------------
Client Version: v1.28.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.5

kubectl get nodes
---------------------------
NAME               STATUS     ROLES           AGE     VERSION
ip-172-31-43-124   NotReady   control-plane   3m40s   v1.28.2

kubectl get pods -n kube-system
---------------------------
NAME                                      READY   STATUS    RESTARTS   AGE
coredns-5dd5756b68-jz8hj                  0/1     Pending   0          2m50s
coredns-5dd5756b68-qg2ll                  0/1     Pending   0          2m50s
etcd-ip-172-31-41-44                      1/1     Running   0          2m53s
kube-apiserver-ip-172-31-41-44            1/1     Running   0          2m53s
kube-controller-manager-ip-172-31-41-44   1/1     Running   0          2m53s
kube-proxy-d8lwv                          1/1     Running   0          2m51s
kube-scheduler-ip-172-31-41-44            1/1     Running   0          2m53s

위에 NotReady/Pending 은 신경쓰지 않아도 됩니다.

Worker node 구성 (worker node only)

아래 명령으로 Worker node 를 등록합니다.

sudo 를 반드시 붙여서 실행해야 합니다.
--cri-socket 을 추가해 주어야 합니다.

sudo kubeadm join 172.31.16.157:6443 --token ou08ek.xzjXXXXXXXXXXXXX \
        --discovery-token-ca-cert-hash sha256:6e0305d27b12b3f8b51d8e021138d59227124c2XXXXXXXXXXXXXXXX \
        --cri-socket unix:///var/run/cri-dockerd.sock

Pod network 애드온 설치 (master only)

# kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
kubectl get nodes
kubectl get pods -n kube-system

답글 남기기