Ubuntu 22.04 에서 Kubernetes 설치하기 (Without Docker)

By | 2024년 1월 10일
Table of Contents

Ubuntu 22.04 에서 Kubernetes 설치하기 (Without Docker)

Docker 가 없는 상황에서 Kubernetes 를 설치하는 방법을 설명합니다.

아래 내용은 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 에 할당해 줍니다.

모든 인스턴스에 containerd 설치

sudo apt-get update

# 의존성 목록을 반드시 확인하자. 목록이 틀리면 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 -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y containerd.io
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

sudo systemctl restart containerd
sudo systemctl enable containerd

cat /etc/containerd/config.toml | grep SystemdCgroup
sudo systemctl status containerd

containerd 의 정상 설치 확인이 중요합니다.
아래 Kubernetes 의 설치는 다른 것이 없습니다.

모든 인스턴스에 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 에서만 실행합니다.

--control-plane-endpoint, --upload-certs 를 설정해 주면 추가할 노드를 Master 로 조인할 수 있는 명령어를 제공합니다.

sudo kubeadm init
# sudo kubeadm init --control-plane-endpoint "172.31.43.124:6443" --upload-certs

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

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 를 반드시 붙여서 실행해야 합니다.

sudo kubeadm join 172.31.16.157:6443 --token ou08ek.xzjXXXXXXXXXXXXX \
        --discovery-token-ca-cert-hash sha256:6e0305d27b12b3f8b51d8e021138d59227124c2XXXXXXXXXXXXXXXX

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

답글 남기기