Kubernetes

멀티 마스터 쿠버네티스 클러스터 구성 방법

사실 나도 모름 2023. 12. 31. 20:46

구성 순서

  1. 개요 및 준비 환경
  2. 컨테이너 런타임 설치
  3. kubeadm, kubelet, kubectl 설치
  4. 로드밸런서 생성
  5. 고가용성 클러스터 생성
  6. 마스터 join
  7. CNI 설치
  8. 워커 노드 join
  9. 기타 추가 설정

1. 개요 및 준비 환경

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/

 

Options for Highly Available Topology

This page explains the two options for configuring the topology of your highly available (HA) Kubernetes clusters. You can set up an HA cluster: With stacked control plane nodes, where etcd nodes are colocated with control plane nodes With external etcd no

kubernetes.io

스택형 etcd 토폴로지

https://kubernetes.io/images/kubeadm/kubeadm-ha-topology-stacked-etcd.svg

 

위와 같은 토폴로지로 구성 예정 ( 메모리 리소스가 부족해서 Worker Node는 2대로만 구성할 예정 )

만약 일반적인 싱글 마스터 쿠버네티스 클러스터를 구성하고 싶다면 4, 6번 과정은 제외하고 5번에서 kubeadm init 명령으로 변경해서 실행하면 됨

 

 

VMware 및 VirtualBox를 통해 Ubuntu 20.04 LTS 이미지로 가상머신 6개 생성

  • Master 3대 (쿼럼 이슈로 인해 반드시 홀수대로 구성해야 함)
  • Worker Node 2대
  • LoadBalancer 1대

CPU 2코어 이상

메모리 3GB 이상

 

 

각 가상 머신의 IP 설정 (원한다면 변경 가능. 단, /etc/hosts파일에 입력할 내용을 지정한 IP로 수정해서 입력)

192.168.108.130 ~ 132  :  master1 ~ 3

192.168.108.133 ~ 134  :  node1 ~ 2

192.168.108.135            :  lb

 

 

공통

/etc/hosts 파일을 수정하여 노드간 이름으로 통신가능하게 설정

아래 명령 실행

# /etc/hosts

cat <<EOF | sudo tee -a /etc/hosts
192.168.108.130 master1 master1.example.com
192.168.108.131 master2 master2.example.com
192.168.108.132 master3 master3.example.com
192.168.108.133 node1 node1.example.com
192.168.108.134 node2 node2.example.com
192.168.108.135 lb lb.example.com
EOF

 

 

 


2. 컨테이너 런타임 설치 - LoadBalancer를 제외한 모든 노드에 실행

 

containerd 런타임 설치

 

 

 

https://docs.docker.com/engine/install/ubuntu/

 

Install Docker Engine on Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

 

 

 

충돌하는 모든 패키지 제거

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

 

 

Docker apt저장소를 설정

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

 

 

Docker 패키지 최신 버전 설치

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

 

 

설치가 잘 되었는지 확인

sudo docker run hello-world

 

 

 

 


3. kubeadm, kubelet, kubectl 설치 - LoadBalancer를 제외한 모든 노드에 실행

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

 

Installing kubeadm

This page shows how to install the kubeadm toolbox. For information on how to create a cluster with kubeadm once you have performed this installation process, see the Creating a cluster with kubeadm page. This installation guide is for Kubernetes v1.29. If

kubernetes.io

 

현재 23.12.31(일) 기준 가장 최신 버전으로 설치

kubeadm 1.29

 

※ 사전 준비 사항

1. 머신당 2GB 이상의 RAM(더 적으면 앱을 위한 공간이 거의 남지 않음)
2. CPU 2개 이상.
3. 모든 노드에 대한 고유한 호스트 이름, MAC 주소 및 product_uuid
4. 특정 포트를 열기 위한 방화벽 해제
5. 스왑 해제
6. containerd 파일 내용 기본값으로 변경
# 방화벽 해제
sudo systemctl disable --now ufw

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

# containerd 파일 기본값 변경
containerd config default > /etc/containerd/config.toml
sudo systemctl restart containerd



 

 

Kubernetes apt 저장소를 사용하는 데 필요한 패키지 색인 및 설치 패키지를 업데이트.

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

 

 

Kubernetes 패키지 저장소의 공개 서명 키를 다운로드.

모든 저장소에 동일한 서명 키가 사용되므로 URL의 버전을 무시할 수 있음.

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

 

 

Kubernetes apt 저장소를 추가

다른 버전으로 설치할 경우 URL의 v1.29를 원하는 버전으로 변경

# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

 

 

패키지 인덱스를 업데이트 후 kubelet, kubeadm 및 kubectl을 설치하고 해당 버전을 고정.

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

 

 

 

 

 


4. 로드밸런서 생성 - LoadBalancer에만 실행

sudo apt update
sudo apt install haproxy
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org  # 파일 백업용

 

 

설치 완료 후 vi에디터나 nano에티터를 통해 /etc/haproxy/haproxy.cfg 파일 수정

# /etc/haproxy/haproxy.cfg
frontend k8s_frontend
    bind *:6443
    mode tcp
    default_backend k8s_masters

backend k8s_masters
    mode tcp
    option tcp-check
    option tcplog
    balance leastconn
    server master1 192.168.108.130:6443 check
    server master2 192.168.108.131:6443 check
    server master3 192.168.108.132:6443 check

 

 

데몬 재실행

sudo systemctl restart haproxy
sudo systemctl enable haproxy

 

 

 

 


5. 고가용성 클러스터 생성 - Master1 노드에서만 실행

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

 

Creating Highly Available Clusters with kubeadm

This page explains two different approaches to setting up a highly available Kubernetes cluster using kubeadm: With stacked control plane nodes. This approach requires less infrastructure. The etcd members and control plane nodes are co-located. With an ex

kubernetes.io

 

 

control plane 초기화 (master1에서만 입력)

sudo kubeadm init --control-plane-endpoint "lb.example.com:6443" --upload-certs

 

 

kubectl 명령을 사용할 수 있도록 다음 명령 실행

control-plane 초기화 후 출력된 세가지 명령 중 하나다.

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

 

 

 

 


6. 마스터 join - Master1 을 제외한 모든 Master 노드에서 실행

master들을 join하기 위해 입력해야 하는 명령

초기화를 진행한 master1을 제외한 나머지 마스터들에게 입력

클러스터 생성 단계에서 control-plane 초기화 후 출력된 세가지 명령 중 하나다.

kubeadm join lb.example.com:6443 --token [해시값] \
         --discovery-token-ca-cert-hash sha256:[해시값] \
         --control-plane --certificate-key [해시값]

CNI가 설치되지 않아서 NotReady상지만 노드 정보에서 출력됨

 

kubectl 명령을 사용하기 위해 입력해야 하는 명령 (보통 마스터에 입력한다.)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
워커 노드도 kubectl 명령을 쓰고 싶다면 다음 명령 입력 (워커 노드 join 완료 후)

apt-get install openssh-server
sudo sed -i.bak -e '/^#PermitRootLogin prohibit-password/{n;s/.*/&\nPermitRootLogin yes/}' /etc/ssh/sshd_config
sudo systemctl restart sshd

mkdir -p $HOME/.kube
scp master1:/etc/kubernetes/admin.conf $HOME/.kube/config  # fingerprint 지문에 yes입력 후 root 비밀번호 입력
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

 

 

 

 


7. CNI 설치 - Master1 노드에서만 실행

https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-50-nodes-or-less

 

Install Calico networking and network policy for on-premises deployments | Calico Documentation

Install Calico networking and network policy for on-premises deployments.

docs.tigera.io

 

 

ProjectCalico에서 제공하는 Calico CNI를 사용

curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml -O
kubectl apply -f calico.yaml

 

 

coredns와 calico 파드들이 완전히 Running 상태가 될 때까지 대기

watch kubectl get pods -n kube-system

위와 같이 완료될 때까지 기다린다.

 

 

CNI 설치가 완료되었으면 다음과 같이 모든 마스터 노드들이 Ready 상태가 되어야 한다.

kubectl get nodes

Ready

 

 

 

 


8. 워커 노드 join - 모든 Worker Node 에서 실행

Worker Node들을 join하기 위해 입력해야 하는 명령

클러스터 생성 단계에서 control-plane 초기화 후 출력된 세가지 명령 중 하나다.

kubeadm join lb.example.com:6443 --token [해시값] \
         --discovery-token-ca-cert-hash sha256:[해시값]

다음과 같이 되면 완료

워커 노드도 kubectl 명령을 쓰고 싶다면 다음 명령 입력 (워커 노드 join 완료 후)

(master1 에서만 실행)
apt-get install openssh-server
sudo sed -i.bak -e '/^#PermitRootLogin prohibit-password/{n;s/.*/&\nPermitRootLogin yes/}' /etc/ssh/sshd_config
sudo systemctl restart sshd

(각 Worker Node에서 실행)
mkdir -p $HOME/.kube
scp master1:/etc/kubernetes/admin.conf $HOME/.kube/config  # fingerprint 지문에 yes입력 후 root 비밀번호 입력
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

 

 

 

 


9. 기타 추가 설정

tab키를 통해 명령어 자동 완성 기능을 추가하고 싶으면 각 노드에 다음과 같이 입력한다.

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

 

kubectl 뿐 아니라 kubeadm도 자동 완성 기능을 쓰고 싶다면 다음과 같이 입력한다.

source <(kubeadm completion bash)
echo "source <(kubeadm completion bash)" >> ~/.bashrc

 

 

이제 멀티 마스터 쿠버네티스 클러스터 생성이 완료되었고 이제 CLI나 yaml 파일을 통해 쿠버네티스 운영이 가능하다.

 

 


 

 

ubuntu 22.04 버전에서 kubeadm 1.29버전을 설치하고 싶으면 아래 링크를 참조한다.

https://hbayraktar.medium.com/how-to-install-kubernetes-cluster-on-ubuntu-22-04-step-by-step-guide-7dbf7e8f5f99

 

How to Install Kubernetes Cluster on Ubuntu 22.04 (Step-by-Step Guide)

Introduction

hbayraktar.medium.com

 

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - 로깅과 모니터링(2)  (0) 2024.01.02
Kubernetes 기초 - 로깅과 모니터링(1)  (0) 2024.01.02
Kubernetes 기초 - Secret  (0) 2023.12.23
Kubernetes 기초 - ConfigMap  (0) 2023.12.23
Kubernetes 기초 - Label(4)  (0) 2023.12.22