본문 바로가기
Kubernetes

Kubernetes Master Node only 설치 방법(1.24 이후 버전)

by 호랑범고래 2023. 5. 24.
반응형

https://blog-james.tistory.com/2

 

Kubernetes Master Node only 설치 방법

kubernetes 환경 구성 시 VM을 이용한 Master Node x1, Worker Node x2 를 기본으로 합니다. 실제 운영 서버가 아닌 가상화 환경이나 테스트 용도의 Bare Meta에 1개의 Node만 구성하여 테스트 할 수 있는 환경을

blog-james.tistory.com

지난 글에서 1.23 이하 버전의 Kubernetes 설치를 다뤘습니다.

 

https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/

 

컨테이너 런타임

참고: Dockershim은 쿠버네티스 릴리스 1.24부터 쿠버네티스 프로젝트에서 제거되었다. 더 자세한 내용은 Dockershim 제거 FAQ를 참고한다. 파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨

kubernetes.io

 

Kubernetes 공식 문서에서도 설명하였듯이 Dockershim이 1.24 릴리즈부터는 포함되지 않는다. Dockershim 삭제 배경에는 위에 그림과 같이 kubelet을 통한 container 관리시 Dockershim -> Docker 두 단계에 걸쳐 처리를 해야하기 때문에 컨테이너 생성이나 유지 성능에 영향을 주게됩니다. 따라서 두 단계에 이르는 처리과정을 하나만으로 처리하게 하여 성능 확보를 하였습니다. 수치상으로는 아래처럼 개선이 있습니다.

Containerd vs Docker Performance

https://kubernetes.io/blog/2018/05/24/kubernetes-containerd-integration-goes-ga/

 

Kubernetes Containerd Integration Goes GA

Kubernetes Containerd Integration Goes GA Authors: Lantao Liu, Software Engineer, Google and Mike Brown, Open Source Developer Advocate, IBM In a previous blog - Containerd Brings More Container Runtime Options for Kubernetes, we introduced the alpha versi

kubernetes.io

Docker가 제거된 후 선택지가 Containerd만이 있는 것이 아닙니다.

Containerd의 등장배경에는 Monolithic한 구조를 가진 Docker에서 Container Runtime만 분리하고자 컨테이너에 관심이 있는 단체들이 모여서 Open Container Initiative를 만들어 컨테이너에 대한 표준을 정하였습니다. containerd는 OCI표준으로 만들어진 Container Runtime이고 Kubernetes에서는 OCI표준을 만족하는 컨테이너를 실행할 수 있는 Container Runtime Intergace를 제공하게 됩니다. 즉 OCI표준을 만족하는 런타임은 돌릴 수 있다는 얘기가 됩니다. https://opencontainers.org/

 

Open Container Initiative - Open Container Initiative

Become a Member Organization and support the Open Container Initiative

opencontainers.org

OCI맴버 중 하나이자 Openshift를 만든 Redhat에서 내놓은 것이 CRI-O입니다.

따라서 선택지가 containerd, CRI-O 이외 Docker를 계속 지원하기 윈한 Mirantis Container Runtime(MCR)이 있습니다. 참고로 Mirantis는 2019년 Docker가 Enterprise부분을 매각한 회사입니다.

 

ContainerD와 CRI-O에 대한 성능 비교는 아래 페이퍼를 참고하시면 도움이 되실 것 같네요.

https://www.scitepress.org/PublishedPapers/2020/93404/93404.pdf

 

다시 본론으로 돌아와서 Kubernetes 1.24 이후 버전의 설치는 이미 설명드린 1.23버전설치된 방식으로 똑같이 설치해도 됩니다.

이미 1.23 버전 설치 설명에서 아래와 같이 docker를 설치하면서 containerd를 설치했기 때문이죠.

sudo apt-get install -y docker-ce docker-ce-cli containerd

 

처음부터 설치 방법을 다시 작성하면 아래와 같습니다.

1.  필수 패키지 설치

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

 

2. Swap Disable

sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab

 

3. 방화벽 비활성화

sudo systemctl stop firewalld
sudo systemctl disable firewalld

 

4. Docker 설치

4.1 Docker GPG Key 추가

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4.2 Docker Repository 등록

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

4.3 Docker 패키지 설치

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

runc에서 systemd cgroup driver를 사용하기 위해 config.toml의 아래 부분을 수정해 줍니다.

위치 /etc/containerd/config.toml 

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

4.4 설치 상태 확인

sudo systemctl status docker

4.5 시스템 시작 시 Docker 실행

sudo systemctl enable docker
sudo systemctl start docker

 

5. Node간의 통신을 위한 네트워크 브릿지 설정 (Optional)

나중에 Worker Node를 추가할 계획이라면 아래 설정을 해놓는 것이 좋다. 이 설정은 Worker Node에도 동일하게 해주어야 합니다.

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

 6. Kubernetes 설치

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
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet=1.27.3-00 kubeadm=1.27.3-00 kubectl=1.27.3-00
sudo apt-mark hold kubelet kubeadm kubectl

https://github.com/kubernetes/kubernetes/releases?page=2 

 

Releases · kubernetes/kubernetes

Production-Grade Container Scheduling and Management - kubernetes/kubernetes

github.com

7. Master Node 초기화

# 마지막 인자값인 사설IP 주소는 시스템에 따라 자유롭게 설정하면 된다.
sudo kubeadm init --pod-network-cidr 10.174.0.0/16
# 일반 유저 일 때
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# Root User 일 경우 추가로 아래 명령어 까지
export KUBECONFIG=/etc/kubernetes/admin.conf

마지막의 kubeadm join ---- 이후의 토큰값은 Worker Node 추가 계획이 있다면 별도로 저장해 두면 좋습니다.

node 상태를 체크해 봅시다.

만약 일반 계정에서 아래와 sudo 명령어 없이 kubectl 명령어 사용시 아래와 같은 오류가 발생하면
error: error loading config file "/etc/kubernetes/admin.conf": open /etc/kubernetes/admin.conf: permission denied
아래 명령어를 입력하면 sudo 없이 사용 가능합니다.
$ export KUBECONFIG=$HOME/.kube/config
kubectl get nodes

Status가 NotReady 상태입니다. kube-system namespace를 확인합니다.

kubectl get all -n kube-system

coredns pod가 Pening상태임을 확인할 수 있습니다.

coredns 활성화를 위해 CNI를 설치해 줍니다.

 

8. CNI(Container Network Interface)

파드 간 통신을 위한 Kubernetes 네트워크 인터페이스 라고 생각하시면 좋을 것 같습니다.

8.1 Calico 설치

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/master/manifests/calico.yaml

모두 설치 이후 pod상태를 확인해봅니다.

kubectl get all -A

 

8.2 Flannel 설치 ( coredns가 여전히 동작하지 않을 시 )

kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

MasterNode의 Status가 Ready로 바뀌었는지 확인힙니다.

9. Control-Plain에 Pod 생성을 위한 Taint 설정

kubectl taint node master node-role.kubernetes.io/master-

10. 동작 확인 테스트

간단한 nginx pod를 만들어 생성에 문제가 없는지 확인해 봅니다.

kubectl run test --image=nginx
kubectl get pod/test

여기까지 설치가 완료 되었습니다.

contarinerd CLI가 ctr, crictl 이 있습니다. docker가 컨테이너 빌드를 지원하는 반면 이 CLI는 빌드지원을 하지 않아 새로운 컨테이너를 생성하려면 다른 Tool을 써야합니다. 다음 시간에는 이에 대한 설명을 진행해보도록 하겠습니다.

 

반응형

'Kubernetes' 카테고리의 다른 글

Kubernetes Master Node only 설치 방법  (0) 2023.01.25