웹사이트 검색

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


이 페이지에서

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

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

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

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

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

전제 조건

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

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

시스템 설정

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

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

/etc/hosts 파일 설정

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

Hostname    IP Address        Used as
--------------------------------------------
cplane1     192.168.5.10      control-plane
worker1     192.168.5.25      worker node
worker2     192.168.5.26      worker node

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

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

sudo hostnamectl set-hostname cplane1

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

# setup hostname worker1
sudo hostnamectl set-hostname worker1

# setup hostname worker2
sudo hostnamectl set-hostname worker2

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

sudo nano /etc/hosts

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

192.168.5.10 cplane1
192.168.5.25 worker1
192.168.5.26 worker2

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

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

ping cplane1 -c3
ping worker1 -c3
ping worker2 -c3

UFW 방화벽 구성

Kubernetes는 모든 시스템에서 일부 포트를 열어야 했습니다. 기본 Ubuntu 시스템에서는 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

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

sudo ufw allow "OpenSSH"
sudo ufw enable

컨트롤 플레인 노드 "cplane1"에서 다음 ufw 명령을 실행하여 포트를 엽니다.

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

sudo ufw status

작업자 노드 "worker1" 및 "worker2"에서 다음 ufw 명령을 실행하여 일부 포트를 엽니다.

sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/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 매개변수 목록을 가져와야 하며 방금 "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

컨테이너 런타임 설치: Containerd

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

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

containerd를 설치하는 방법에는 여러 가지가 있으며 가장 쉬운 방법은 Docker 저장소에서 제공하는 미리 빌드된 바이너리 패키지를 사용하는 것입니다.

이제 다음 명령을 실행하여 Docker 리포지토리와 GPG 키를 추가합니다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

아래 명령을 사용하여 우분투 시스템에서 패키지 인덱스를 업데이트하고 새로 고칩니다.

sudo apt update

이제 아래의 apt 명령을 사용하여 containerd 패키지를 설치합니다. 그리고 설치가 시작됩니다.

sudo apt install containerd.io

설치가 완료되면 다음 명령을 실행하여 containerd 서비스를 중지합니다.

sudo systemctl stop containerd

기본 containerd 구성을 백업하고 다음 명령을 사용하여 새로운 새 구성을 생성합니다.

sudo mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
sudo containerd config default > /etc/containerd/config.toml

이제 다음 명령을 사용하여 containerd 구성 파일 "/etc/containerd/config.toml"을 수정합니다.

sudo nano /etc/containerd/config.toml

cgroup 드라이버 "SystemdCgroup = false"의 값을 "SystemdCgroup = true"로 변경합니다. 그러면 containerd 컨테이너 런타임에 대한 systemd cgroup 드라이버가 활성화됩니다.

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

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

그런 다음 다음 systemctl 명령을 실행하여 containerd 서비스를 시작합니다.

sudo systemctl start containerd

마지막으로 아래 명령을 사용하여 containerd 서비스를 확인하고 확인합니다. containerd가 활성화되고 시스템 부팅 시 자동으로 실행되는 것을 볼 수 있습니다. 그리고 containerd 서비스의 현재 상태가 실행 중입니다.

sudo systemctl is-enabled containerd
sudo systemctl status containerd

쿠버네티스 패키지 설치

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

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

일부 패키지 종속성을 설치하려면 다음 apt 명령을 실행하십시오.

sudo apt install apt-transport-https ca-certificates curl -y

이제 다음 명령을 사용하여 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

CNI(컨테이너 네트워크 인터페이스) 플러그인 설치: Flannel

Kubernetes는 Kubernetes용 AWS VPC, Azure CNI, Cilium, Calico, Flannel 등과 같은 다양한 컨테이너 네트워크 플러그인을 지원합니다. 이 예에서는 Kubernetes 배포를 위한 CNI 플러그인으로 Flannel을 사용합니다. 이를 위해서는 Kubernetes 노드에 Flannel의 바이너리 파일을 설치해야 했습니다.

아래 명령을 실행하여 새 디렉터리 "/opt/bin"를 만듭니다. 그런 다음 Flannel의 바이너리 파일을 다운로드합니다.

mkdir -p /opt/bin/
sudo curl -fsSLo /opt/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.19.0/flanneld-amd64

이제 아래 명령을 사용하여 파일의 권한을 변경하여 "flanneld" 바이너리 파일을 실행 가능하게 만드십시오. 이 "flanneld" 바이너리 파일은 Pod 네트워크 애드온을 설정할 때 자동으로 실행됩니다.

sudo chmod +x /opt/bin/flanneld

Kubernetes 컨트롤 플레인 초기화

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

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

lsmod | grep br_netfilter

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

sudo kubeadm config images pull

다운로드가 완료되면 다음 "kubeadm init" 명령을 실행하여 "cplane1" 서버에서 Kubernetes 클러스터를 초기화합니다. 이 노드 "cplane1"은 클러스터를 처음 초기화하기 때문에 자동으로 Kubernetes 제어 평면으로 선택됩니다.

  • 또한 이 예에서는 포드의 네트워크를 Flannel CNI 플러그인의 기본 네트워크 범위인 "10.244.0.0/16"으로 지정합니다.\n
  • "--apiserver-advertise-address"는 Kubernetes API 서버가 실행될 IP 주소를 결정합니다. 이 예제에서는 내부 IP 주소 "192.168.5.10"을 사용합니다.\n
  • 여기서 "--cri-socket" 옵션의 경우 "/run/containerd/containerd.sock"에서 사용할 수 있는 컨테이너 런타임 소켓에 CRI 소켓을 지정합니다. . 다른 Container Runtime을 사용하는 경우 소켓 파일의 경로를 변경하거나 kubeadm이 Container Runtime 소켓을 자동으로 감지하기 때문에 "--cri-socket" 옵션을 제거하면 됩니다.\n

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.5.10 \
--cri-socket=unix:///run/containerd/containerd.sock

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

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

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 컨트롤 플레인이 실행된 후 다음 명령을 실행하여 Flannel Pod 네트워크 플러그인을 설치합니다. 이 명령은 "flanneld" 바이너리 파일을 자동으로 실행하고 일부 flannel 포드를 실행합니다.

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

다음 명령을 사용하여 Kubernetes에서 실행 중인 포드 목록을 확인합니다. Kubernetes 설치에 성공하면 Kubernetes의 모든 기본 포드가 실행 중인 것을 볼 수 있습니다.

kubectl get pods --all-namespaces

Kubernetes에 작업자 노드 추가

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

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

kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
--discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28

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

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

kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
--discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28

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

이제 컨트롤 플레인 서버 cplane1"로 돌아가서 다음 명령을 실행하여 Kubernetes 클러스터에서 실행 중인 모든 포드를 확인합니다. 모든 Kubernetes 구성 요소에 추가 포드가 있는지 확인해야 합니다.

kubectl get pods --all-namespaces

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

kubectl get nodes -o wide

결론

이 자습서 전체에서 세 개의 노드 Ubuntu 22.04 서버가 있는 Kubernetes 클러스터 배포를 완료했습니다. Kubernetes 클러스터는 하나의 컨트롤 플레인과 두 개의 작업자 노드로 실행됩니다. Kubernetes 클러스터의 컨테이너 런타임으로 containerd와 클러스터의 포드 네트워킹을 위한 Flannel 네트워크 플러그인으로 실행됩니다. Kubernetes 클러스터를 완전히 구성했으므로 Kubernetes 클러스터에 애플리케이션 배포를 시작하거나 Kubernetes 대시보드를 설치하여 Kubernetes 환경에 대해 자세히 알아볼 수 있습니다.