웹사이트 검색

Debian 11에서 Kubeadm으로 Kubernetes 클러스터를 설정하는 방법


이 페이지에서

  1. 전제 조건
  2. 시스템 설정
  3. /etc/hosts 파일 설정
  4. UFW 방화벽 설정\n
  5. 커널 모듈 활성화 및 SWAP 비활성화\n
  6. 컨테이너 런타임 설치: CRI-O
  7. Kubernetes 패키지 설치
  8. Kubernetes 컨트롤 플레인 초기화\n
  9. Kubernetes에 작업자 노드 추가
  10. Kubernetes 클러스터에 Nginx 포드 배포
  11. 결론

Kubernetes 또는 k8s는 컨테이너화된 애플리케이션의 배포, 관리 및 확장을 자동화하는 컨테이너 오케스트레이션을 위한 오픈 소스 플랫폼입니다. Kubernetes는 Google에서 만든 컨테이너 오케스트레이션이며 이제 오픈 소스 프로젝트가 되어 최신 애플리케이션 배포 및 컴퓨팅 플랫폼의 표준이 되었습니다.

Kubernetes는 최신 컨테이너 배포 시대를 위한 솔루션입니다. 서비스 검색 및 로드 밸런싱, 스토리지 오케스트레이션, 자동화된 롤아웃 및 롤백, 자가 치유 서비스, 암호 및 구성 관리를 제공합니다. Kubernetes는 비용 효율적인 클라우드 네이티브 개발을 지원합니다.

이 튜토리얼에서는 다음을 수행하여 Kubernetes 클러스터를 설정합니다.

  • setup /etc/hosts 파일, 커널 모듈 활성화 및 SWAP 비활성화를 포함하는 시스템 설정.\n
  • Kubernetes 및 CNI 플러그인(Calico)에 필요한 일부 포트를 추가하여 UFW 방화벽을 설정합니다.\n
  • CRI-O를 Kubernetes용 컨테이너 런타임으로 설치합니다.\n
  • kubelet, kubeadm, kubectl과 같은 Kubernetes 패키지 설치.
  • 컨트롤 플레인 노드 1개 초기화 및 작업자 노드 2개 추가.\n

전제 조건

이 자습서를 완료하려면 다음 요구 사항이 필요합니다.

  • 3개 이상의 Debian 11 서버.
  • 루트/관리자 권한이 있는 루트가 아닌 사용자.\n

시스템 설정

Kubernetes 배포를 위한 패키지 설치를 시작하기 전에 Kubernetes 배포에 필요한 모든 시스템을 설정해야 합니다. 여기에는 다음 구성이 포함됩니다.

  1. 올바른 /etc/hosts 파일 설정: 각 서버 호스트 이름은 올바른 IP 주소로 확인되어야 합니다. 이 작업은 여러 가지 방법으로 수행할 수 있지만 가장 쉽고 간단한 방법은 모든 서버에서 /etc/hosts 파일을 사용하는 것입니다.\n
  2. UFW 방화벽 설정: 프로덕션 환경의 경우 컨트롤 플레인과 작업자 노드 모두에서 방화벽을 활성화하는 것이 항상 권장됩니다. Kubernetes 제어 평면, 작업자 노드 및 CNI 플러그인 Calico에 대한 UFW 방화벽을 설정합니다.\n
  3. 커널 모듈 활성화: Kubernetes를 사용하려면 Linux 시스템의 일부 커널 모듈을 활성화해야 합니다. iptables가 브리지된 트래픽을 볼 수 있도록 하려면 커널 모듈 "overlay" 및 "br_netfilter"가 필요합니다.\n
  4. SWAP 비활성화: 이것은 필수 사항이며 컨트롤 플레인과 작업자 노드 모두에서 모든 Kubernetes 노드에서 SWAP를 비활성화해야 합니다. 그렇지 않으면 kubelet 서비스가 문제와 함께 실행됩니다.\n

/etc/hosts 파일 설정

이 첫 번째 단계에서는 모든 서버에서 시스템 호스트 이름과 /etc/hosts 파일을 설정합니다. 이 데모에서는 다음 서버를 사용합니다.

Hostname        IP Address        Used as
--------------------------------------------
k8s-master      192.168.5.10      control-plane
k8s-worker1     192.168.5.115     worker node
k8s-worker2     192.168.5.116     worker node

아래의 hostnamectl 명령을 실행하여 각 서버에서 시스템 호스트 이름을 설정하십시오.

컨트롤 플레인 노드의 경우 다음 명령을 실행하여 시스템 호스트 이름을 "k8s-master"로 설정합니다.

sudo hostnamectl set-hostname k8s-master

Kubernetes 작업자 노드의 경우 다음 hostnamectl 명령을 실행합니다.

# setup hostname k8s-worker1
sudo hostnamectl set-hostname k8s-worker1

# setup hostname k8s-worker2
sudo hostnamectl set-hostname k8s-worker2

그런 다음 다음 명령을 사용하여 모든 서버에서 /etc/hosts 파일을 편집합니다.

sudo nano /etc/hosts

파일에 다음 구성을 추가합니다. 각 호스트 이름이 올바른 IP 주소를 가리키는지 확인하십시오.

192.168.5.10 k8s-master
192.168.5.115 k8s-worker1
192.168.5.116 k8s-worker2

완료되면 파일을 저장하고 닫습니다.

마지막으로 각 호스트 이름에 대해 ping 명령을 실행하면 /etc/hosts 파일에 정의된 올바른 IP 주소를 가리킬 것입니다.

ping k8s-master -c3
ping k8s-worker1
ping k8s-worker2 -c3

UFW 방화벽 설정

Kubernetes는 모든 시스템에서 일부 포트를 열어야 했습니다. 기본 Ubuntu 시스템에서는 UFW 방화벽이 기본 방화벽으로 사용됩니다. 모든 Debian 시스템에 UFW 방화벽을 설치하고 Kubernetes 배포를 위한 일부 UFW 규칙을 추가합니다.

Kubernetes 컨트롤 플레인의 경우 다음 포트를 열어야 합니다.

Protocol  Direction Port Range  Purpose Used By
-----------------------------------------------
TCP       Inbound   6443        Kubernetes API server All
TCP       Inbound   2379-2380   etcd server client API  kube-apiserver, etcd
TCP       Inbound   10250       Kubelet API Self, Control plane
TCP       Inbound   10259       kube-scheduler  Self
TCP       Inbound   10257       kube-controller-manager Self

Kubernetes 작업자 노드의 경우 다음 포트를 열어야 합니다.

Protocol  Direction Port Range  Purpose Used By
--------------------------------------------------
TCP       Inbound   10250       Kubelet API Self, Control plane
TCP       Inbound   30000-32767 NodePort Services†  All

이 예제에서는 Calico를 CNI(Container Network Interface) 플러그인으로 사용합니다. 따라서 아래에서 몇 가지 추가 포트를 엽니다.

Protocol  Direction          Port Range  Purpose Used By
-------------------------------------------------------
TCP       Bidirectional      179         Calico networking (BGP)
UDP       Bidirectional      4789        Calico networking with VXLAN enabled
TCP       Incoming           2379        etcd datastore
UDP       Bidirectional      4789        flannel networking (VXLAN)

다음 apt 명령을 사용하여 Debian 서버에 UFW 패키지를 설치합니다. Y를 입력하여 설치를 확인하고 ENTER를 누르면 설치가 시작됩니다.

sudo apt install ufw

다음으로 아래 명령을 사용하여 방화벽에 OpenSSH 애플리케이션을 추가합니다. 그런 다음 UFW 방화벽을 활성화하십시오. 확인 메시지가 표시되면 "y"를 입력하여 UFW 방화벽을 활성화하고 실행합니다.

sudo ufw allow "OpenSSH"
sudo ufw enable

컨트롤 플레인 노드 "k8s-master"에서 다음 ufw 명령을 실행하여 포트를 엽니다. 그런 다음 UFW 규칙을 확인하고 확인합니다.

Kubernetes 컨트롤 플레인에 대한 방화벽 규칙입니다.

sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 10257/tcp

Calico CNI 플러그인의 방화벽 규칙.

sudo ufw allow 179/tcp
sudo ufw allow 4789/udp
sudo ufw allow 4789/tcp
sudo ufw allow 2379/tcp

sudo ufw status

작업자 노드 "k8s-worker1" 및 "k8s-worker2"에서 다음 ufw 명령을 실행하여 일부 포트를 엽니다. 그런 다음 UFW 방화벽 규칙을 확인하십시오.

Kubernetes 작업자 노드에 대한 방화벽 규칙.

sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp

Kubernetes 작업자 노드의 Calico에 대한 방화벽 규칙.

sudo ufw allow 179/tcp
sudo ufw allow 4789/udp
sudo ufw allow 4789/tcp
sudo ufw allow 2379/tcp
sudo ufw status

커널 모듈 활성화 및 SWAP 비활성화

Kubernetes는 커널 모듈 "overlay" 및 "br_netfilter"를 모든 서버에서 활성화해야 했습니다. 이렇게 하면 iptbales가 브리지된 트래픽을 볼 수 있습니다. 또한 포트 포워딩을 활성화하고 SWAP를 비활성화해야 합니다.

다음 명령을 실행하여 커널 모듈 "overlay" 및 "br_netfilter"를 활성화합니다.

sudo modprobe overlay
sudo modprobe br_netfilter

영구적으로 만들려면 아래 명령을 사용하여 "/etc/modules-load.d/k8s.conf"에 구성 파일을 만듭니다. 이렇게 하면 Linux 시스템이 시스템 부팅 중에 커널 모듈을 활성화할 수 있습니다.

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

다음으로 다음 명령을 사용하여 필요한 systemctl 매개변수를 생성합니다.

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

재부팅 없이 새 sysctl 구성을 적용하려면 아래 sysctl 명령을 사용하십시오. 시스템의 기본 sysctl 매개변수 목록을 가져와야 하며 방금 "k8s.conf" 파일에 추가한 sysctl 매개변수를 가져와야 합니다.

sudo sysctl --system

SWAP를 비활성화하려면 "/etc/fstab" 파일의 SWAP 구성에 대해 설명해야 합니다. 이 작업은 sed(스트림 편집기)를 통해 단일 명령을 사용하거나 /etc/fstab 파일을 수동으로 편집하여 수행할 수 있습니다.

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

또는

sudo nano /etc/fstab

다음으로 아래 명령을 사용하여 현재 세션에서 SWAP를 끕니다. 그런 다음 "free -m" 명령을 사용하여 SWAP가 꺼져 있는지 확인하십시오. SWAP에 "0" 값이 표시되어야 합니다. 이는 이제 비활성화되었음을 의미합니다.

sudo swapoff -a
free -m

컨테이너 런타임 설치: CRI-O

Kubernetes 클러스터를 설정하려면 포드가 실행될 수 있도록 모든 서버에 컨테이너 런타임을 설치해야 합니다. containerd, CRI-O, Mirantis Container Runtime 및 Docker Engine(cri-dockerd를 통해)과 같은 Kubernetes 배포에 여러 컨테이너 런타임을 사용할 수 있습니다.

이 데모에서는 Kubernetes 배포를 위한 컨테이너로 "CRI-O"를 사용합니다. 따라서 모든 서버, 컨트롤 플레인 및 작업자 노드에 CRI-O를 설치합니다.

CRI-O를 설치하기 전에 아래의 apt 명령을 실행하여 기본 패키지 "gnupg2" 및 "apt-transport-https"를 설치하십시오. Y를 입력하여 설치를 확인하고 ENTER를 누르십시오.

sudo apt install gnupg2 apt-transport-https

이제 CRI-O 설치를 위한 새 환경 변수를 만듭니다. 값이 \Debian_11\인 변수 \$OS\와 값이 \1.24\인 변수 \$VERSION\. 이 예에서는 "Debian_11" 시스템용 CRI-O 컨테이너 v1.24(현재 버전)를 설치합니다.

export OS=Debian_11
export VERSION=1.24

다음 명령을 실행하여 Debian 11 시스템용 CRI-O 리포지토리를 추가합니다.

echo "deb [signed-by=/usr/share/keyrings/libcontainers-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb [signed-by=/usr/share/keyrings/libcontainers-crio-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

다음 명령을 실행하여 CRI-O 리포지토리에 대한 GPG 키를 추가합니다.

mkdir -p /usr/share/keyrings
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-archive-keyring.gpg
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-crio-archive-keyring.gpg

이제 시스템 리포지토리를 업데이트하고 아래 명령을 사용하여 패키지 인덱스를 새로 고칩니다. CRI-O 저장소가 Debian 11 서버에 추가된 것을 볼 수 있습니다.

sudo apt update

CRI-O 컨테이너 런타임을 설치하려면 다음 apt 명령을 실행합니다. Y를 입력하여 설치를 확인하고 ENTER를 누르면 CRI-O 설치가 시작됩니다.

sudo apt install cri-o cri-o-runc cri-tools

설치가 완료되면 아래 명령을 사용하여 CRI-O 구성 "/etc/crio/crio.conf"을 편집합니다.

sudo nano /etc/crio/crio.conf

"[crio.network]" 섹션에서 "network_dir" 및 "plugin_dir" 옵션의 주석을 제거하십시오.

# The crio.network table containers settings pertaining to the management of
# CNI plugins.
[crio.network]

# The default CNI network name to be selected. If not set or "", then
# CRI-O will pick-up the first one found in network_dir.
# cni_default_network = ""

# Path to the directory where CNI configuration files are located.
network_dir = "/etc/cni/net.d/"

# Paths to directories where CNI plugin binaries are located.
plugin_dirs = [
        "/opt/cni/bin/",
]

완료되면 파일을 저장하고 닫습니다.

다음으로 아래 명령을 사용하여 CRI-O 브리지 구성 "/etc/cni/net.d/100-crio-bridge.conf"을 편집합니다.

sudo nano /etc/cni/net.d/100-crio-bridge.conf

사용자 지정 서브넷을 사용하여 IP 주소의 기본 서브넷을 변경합니다. 이 서브넷 IP 주소는 Kubernetes 클러스터의 포드에 사용됩니다. 또한 서브넷 IP 주소가 CNI 플러그인의 IP 주소 구성과 일치하는지 확인해야 합니다.

이 예에서는 Kubernetes 클러스터의 Pod에 대해 서브넷 IP 주소 "10.42.0.0/24"를 사용합니다.

...
        "ranges": [
            [{ "subnet": "10.42.0.0/24" }],
            [{ "subnet": "1100:200::/24" }]
        ]
...

완료되면 파일을 저장하고 닫습니다.

그런 다음 다음 systemctl 명령을 실행하여 CRI-O 서비스를 다시 시작하고 새 변경 사항을 적용합니다.

sudo systemctl restart crio

마지막으로 CRI-O 서비스가 시스템 부팅 시 실행되도록 활성화합니다. 그런 다음 CRI-O 서비스 상태를 확인하고 확인하십시오. 그러면 CRI-O 서비스가 활성화되고 현재 상태가 실행 중임을 확인할 수 있습니다.

sudo systemctl enable crio
sudo systemctl status crio

Kubernetes 패키지 설치

CRI-O 컨테이너 런타임을 설치했습니다. 이제 모든 Debian 시스템에 Kubernetes 패키지를 설치합니다. 여기에는 쿠버네티스 클러스터를 부트스트래핑하기 위한 kubeadm, 쿠버네티스 클러스터의 주요 구성 요소인 kubelet, 쿠버네티스 클러스터를 관리하기 위한 명령줄 유틸리티인 kubectl이 포함됩니다.

이 예에서는 Kubernetes에서 제공하는 리포지토리를 사용하여 Kubernetes 패키지를 설치합니다. 따라서 모든 Debian 시스템에 Kubernetes 리포지토리를 추가합니다.

다음 명령을 실행하여 Kubernetes 리포지토리 및 GPG 키를 추가합니다.

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

Ubuntu 리포지토리 및 패키지 인덱스를 업데이트하고 새로 고칩니다.

sudo apt update

업데이트가 완료되면 다음 apt 명령을 사용하여 Kubernetes 패키지를 설치합니다. Y를 입력하여 설치를 확인하고 ENTER를 눌러 계속하면 설치가 시작됩니다.

sudo apt install kubelet kubeadm kubectl

설치가 완료되면 다음 명령을 실행하여 현재 버전의 Kubernetes 패키지를 고정합니다. 이렇게 하면 Kubernetes 패키지가 자동으로 업데이트되지 않고 Kubernetes 패키지 간의 버전 왜곡이 방지됩니다.

sudo apt-mark hold kubelet kubeadm kubectl

Kubernetes 컨트롤 플레인 초기화

Kubernetes 클러스터 배포를 위한 모든 종속성 및 요구 사항을 완료했습니다. 이제 컨트롤 플레인 노드를 처음으로 초기화하여 Kubernetes 클러스터를 시작합니다. 이 예에서 Kubernetes 컨트롤 플레인은 IP 주소가 "192.168.5.10"인 "k8s-master" 서버에 설치됩니다.

컨트롤 플레인 노드를 초기화하기 전에 다음 명령을 실행하여 "br_netfilter" 커널 모듈이 활성화되었는지 확인하십시오. 명령에서 출력을 얻는다면 "br_netfilter" 모듈이 활성화되었음을 의미합니다.

lsmod | grep br_netfilter

그런 다음 다음 명령을 실행하여 Kubernetes 클러스터에 필요한 이미지를 다운로드하십시오. 이 명령은 coredns, kube-api 서버, etcd, kube-controller, kube-proxy 및 pause 컨테이너 이미지와 같은 Kubernetes 클러스터 생성에 필요한 모든 컨테이너 이미지를 다운로드합니다.

sudo kubeadm config images pull

다운로드가 완료되면 아래 "crictl" 명령을 실행하여 "k8s-master" 서버에서 사용 가능한 이미지 목록을 확인하십시오. Kubernetes 클러스터를 만드는 데 사용할 이미지 목록이 표시되어야 합니다.

sudo crictl images

그런 다음 다음 "kubeadm init" 명령을 실행하여 "k8s-master" 서버에서 Kubernetes 클러스터를 초기화합니다. 이 "k8s-master" 노드는 클러스터를 처음 초기화하기 때문에 자동으로 Kubernetes 컨트롤 플레인으로 선택됩니다.

또한 이 예에서는 포드의 네트워크를 CRI-O 브리지 구성 "/etc/cni/net.d/100과 동일한 서브넷인 "10.42.0.0/24"로 지정합니다. -crio-bridge.conf".
"--apiserver-advertise-address"는 Kubernetes API 서버가 실행될 IP 주소를 결정합니다. 이 예는 내부 IP 주소 "192.168.5.10"을 사용합니다.
여기서 "--cri-socket" 옵션의 경우 "/var/run/crio/crio.sock 에서 사용할 수 있는 CRI-O 컨테이너 런타임 소켓에 CRI 소켓을 지정합니다. \. 다른 컨테이너 런타임을 사용하는 경우 소켓 파일의 경로를 변경하거나 kubeadm이 컨테이너 런타임을 감지하기 때문에 "--cri-socket" 옵션을 제거할 수 있습니다. 자동으로 소켓.

sudo kubeadm init --pod-network-cidr=10.42.0.0/24 \
--apiserver-advertise-address=192.168.5.10 \
--cri-socket=unix:///var/run/crio/crio.sock

다음은 "k8s-master" 서버에서 Kubernetes 클러스터를 초기화할 때의 출력입니다.

초기화가 완료되면 Kubernetes 자격 증명 설정 및 Pod 네트워크 애드온 배포, 추가 방법에 대한 몇 가지 중요한 출력 메시지와 함께 "Your Kubernetes control-plane has initialised successful!"과 같은 메시지를 볼 수 있습니다. Kubernetes 클러스터에 대한 작업자 노드.

"kubectl" 도구로 Kubernetes 클러스터 관리를 시작하기 전에 Kubernetes 자격 증명을 설정해야 합니다. 다음 명령을 실행하여 Kubernetes 자격 증명을 설정합니다.

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

이제 "kubectl" 명령을 사용하여 Kubernetes 클러스터와 상호 작용할 수 있습니다. 다음 "kubectl" 명령을 실행하여 Kubernetes 클러스터 정보를 확인하십시오. 그리고 Kubernetes 컨트롤 플레인과 coredns가 실행되는 것을 볼 수 있습니다.

kubectl cluster-info

Kubernetes에 대한 전체 정보를 얻으려면 덤프 옵션을 사용할 수 있습니다. 즉, "kubectl cluster-info dump"입니다.

Kubernetes가 실행된 후 Kubernetes 클러스터에 대한 Calico CNI 플러그인을 설정합니다. 다음 명령을 실행하여 Calico 매니페스트 파일 "calico.yaml"을 다운로드합니다. 그런 다음 nano 편집기를 사용하여 "calico.yaml" 파일을 편집합니다.

curl https://docs.projectcalico.org/manifests/calico.yaml -O
nano calico.yaml

구성 "CALICO_IPV4POOL_CIDR"의 주석을 제거하고 네트워크 서브넷을 "10.42.0.0/24"로 변경합니다. 이 서브넷 구성은 "kubeadm init" 명령을 사용하여 Kubernetes를 초기화하는 동안 CRI-O 브리지 구성 및 "--pod-network-cidr" 구성과 동일한 서브넷이어야 합니다.

...
            - name: CALICO_IPV4POOL_CIDR
              value: "10.42.0.0/24"
...

완료되면 파일을 저장하고 닫습니다.

그런 다음 아래의 "kubectl" 명령을 실행하여 사용자 지정 매니페스트 파일 "calico.yaml"을 사용하여 Calico CNI 플러그인을 배포합니다. 이 명령은 Calico CNI 플러그인에 대한 여러 Kubernetes 리소스를 생성합니다. 또한 Calico 이미지를 다운로드하고 Calico용 새 포드를 생성합니다.

sudo kubectl apply -f calico.yml

이제 아래의 kubectl 명령을 실행하여 Kubernetes 클러스터에서 사용 가능한 포드를 확인하십시오. "calico-node-xxx" 및 "calico-kube-controller-xxx"라는 두 개의 추가 Pod가 표시되어야 합니다.

kubectl get pods --all-namespaces

Kubernetes에 작업자 노드 추가

"k8s-master" 서버에서 Kubernetes 컨트롤 플레인을 초기화한 후 작업자 노드 "k8s-worker1" 및 "k8s-worker2"를 Kubernetes 클러스터에 추가합니다.

"k8s-worker1" 서버로 이동하고 아래 "kubeadm join" 명령을 실행하여 "k8s-worker1"을 Kubernetes 클러스터에 추가합니다. 다른 토큰과 ca-cert-hash가 있을 수 있습니다. 컨트롤 플레인 노드를 초기화할 때 출력 메시지에서 이 정보의 세부 정보를 볼 수 있습니다.

kubeadm join 192.168.5.10:6443 --token dbgk8h.nwzqqp1v5aqif5fy \
        --discovery-token-ca-cert-hash sha256:7a543a545585358b143ce3e8633a8d673b6f628c5abc995939a58606c6dd219c

다음 출력에서 "k8s-worker1" 서버가 Kubernetes 클러스터에 가입되어 있음을 확인할 수 있습니다.

그런 다음 "k8s-worker2" 서버로 이동하고 "kubeadm join" 명령을 실행하여 "k8s-worker2"를 Kubernetes 클러스터에 추가합니다.

kubeadm join 192.168.5.10:6443 --token dbgk8h.nwzqqp1v5aqif5fy \
        --discovery-token-ca-cert-hash sha256:7a543a545585358b143ce3e8633a8d673b6f628c5abc995939a58606c6dd219c

프로세스가 완료되면 동일한 출력 메시지가 표시됩니다.

이제 컨트롤 플레인 서버 k8s-master"로 돌아가 다음 명령을 실행하여 Kubernetes 클러스터에서 실행 중인 모든 포드를 확인합니다. 모든 네임스페이스의 모든 Kubernetes 구성 요소에 대한 추가 포드가 있어야 합니다.

kubectl get pods --all-namespaces

또는

kubectl get pods -o wide --all-namespaces

마지막으로 아래의 kubectl" 명령을 사용하여 Kubernetes 클러스터에서 사용 가능한 모든 노드를 확인하고 확인합니다. cplane1" 서버가 Kubernetes 컨트롤 플레인으로 실행되고 "k8s-worker1" 및 "k8s- worker2" 서버가 작업자 노드로 실행 중입니다.

kubectl get nodes -o wide

Kubernetes 클러스터에 Nginx 포드 배포

다음 명령을 실행하여 Nginx 웹 서버에 대한 새 배포를 만듭니다. 이 예에서는 두 개의 복제본이 있는 "nginx:alpine" 이미지를 기반으로 새 Nginx 포드를 생성합니다.

kubectl create deployment nginx --image=nginx:alpine --replicas=2

이제 다음 kubectl 명령을 사용하여 Nginx 배포를 노출할 새 서비스 유형 "NodePort"를 만듭니다. 이 명령은 "NodePort" 유형으로 "nginx"라는 이름의 새 Kubernetes 서비스를 생성하고 포드에 대해 포트 "80"을 노출합니다.

kubectl create service nodeport nginx --tcp=80:80

그런 다음 다음 kubectl 명령을 실행하여 Kubernetes 클러스터에서 실행 중인 포드 목록을 확인합니다. 그리고 두 개의 Nginx 포드가 실행되는 것을 볼 수 있습니다.

kubectl get pods

이제 다음 명령을 사용하여 Kubernetes에서 사용 가능한 서비스 목록을 확인하십시오. Kubernetes 호스트에서 포트 "80" 및 포트 "31277"을 노출한 "nginx" 서비스 유형 NodePort가 표시되어야 합니다. 서비스 NodePort는 항상 30000-32767 범위 사이의 포트를 노출합니다.

kubectl get svc

Nginx 배포에 액세스하려면 아래 curl 명령을 실행하세요.

curl k8s-worker1:31277
curl k8s-worker2:31277

아래는 \k8s-worker1\ 노드의 index.html 소스 코드 출력입니다.

그리고 아래는 \k8s-worker2\ 노드의 index.html 코드입니다.

결론

이 자습서를 통해 3개의 노드와 Debian 11 서버가 있는 Kubernetes 클러스터 배포를 완료했습니다. Kubernetes 클러스터는 하나의 컨트롤 플레인과 두 개의 작업자 노드로 실행됩니다. Kubernetes 클러스터의 컨테이너 런타임으로 CRI-O와 클러스터의 포드 네트워킹을 위한 Calico CNI 플러그인으로 실행됩니다. 또한 Kubernetes 클러스터 내부에 Nginx 웹 서버를 성공적으로 배포했습니다.

Kubernetes 클러스터를 완전히 구성했으므로 Kubernetes 클러스터에 애플리케이션 배포를 시작하거나 Kubernetes 대시보드를 설치하여 Kubernetes 환경에 대해 자세히 알아볼 수 있습니다.