웹사이트 검색

Rocky Linux에서 Kubeadm으로 Kubernetes 클러스터를 설치하는 방법


이 페이지에서

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

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

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

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

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

전제 조건

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

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

시스템 설정

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

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

/etc/hosts 파일 설정

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

Hostname              IP Address        Used as
-------------------------------------------------------
kube-master           192.168.5.10      control-plane
kube-kube-worker1     192.168.5.15      worker node
kube-kube-worker2     192.168.5.16      worker node

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

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

sudo hostnamectl set-hostname kube-master

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

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

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

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

sudo nano /etc/hosts

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

192.168.5.10 kube-master
192.168.5.15 kube-worker1
192.168.5.16 kube-worker2

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

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

ping kube-master -c3
ping kube-worker1 -c3
ping kube-worker2 -c3

방화벽 규칙 구성

Kubernetes는 모든 시스템에서 일부 포트를 열어야 했습니다. 기본 RHEL 기반 시스템에서 Firewalld는 기본 방화벽 애플리케이션입니다. Kubernetes 배포를 위해 방화벽에 일부 포트를 추가합니다.

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

컨트롤 플레인 노드 "kube-master"에서 다음 firewall-cmd 명령을 실행하여 Kubernetes 컨트롤 플레인 포트를 엽니다. 그런 다음 Firewalld 규칙을 다시 로드하고 사용 가능한 규칙 목록을 확인합니다.

sudo firewall-cmd --add-port=6443/tcp --permanent
sudo firewall-cmd --add-port=2379-2380/tcp --permanent
sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=10259/tcp --permanent
sudo firewall-cmd --add-port=10257/tcp --permanent

sudo firewall-cmd --reload
sudo firewall-cmd --list-all

작업자 노드 "kube-worker1" 및 "kube-worker2"에서 다음 firewall-cmd 명령을 실행하여 일부 Kubernetes 작업자 포트를 엽니다. 그런 다음 Firewalld를 다시 로드하고 Firewalld에서 사용 가능한 규칙 목록을 확인합니다.

sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=30000-32767/tcp --permanent

sudo firewall-cmd --reload
sudo firewall-cmd --list-all

SELinux 및 커널 모듈 설정 및 SWAP 비활성화

Kubernetes 서비스 kubelet이 제대로 작동하도록 하려면 기본 SELinux를 "permissive"로 변경하거나 SELinux를 완전히 비활성화할 수 있습니다. 이 예에서는 SELinux 정책을 "enforcing"에서 "permissive"로 변경합니다. 즉, SELinux에서만 알림을 받게 됩니다.

다음 명령을 실행하여 기본 SELinux 정책을 "permissive"로 변경합니다. 그런 다음 SELinux 정책의 현재 상태를 확인하고 확인합니다. SELinux가 여전히 활성화되어 있지만 "permissive" 정책이 적용되어 있어야 합니다.

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sestatus

다음으로 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"를 사용합니다. 따라서 모든 Kubernetes 노드에 containerd를 설치합니다. 그리고 containerd를 설치하는 방법에는 여러 가지가 있으며 가장 쉬운 방법은 Docker 저장소에서 제공하는 미리 빌드된 바이너리 패키지를 사용하는 것입니다.

저장소를 추가하기 전에 아래의 DNF 명령을 실행하여 "dnf-utils" 추가 도구를 설치하십시오.

sudo dnf install dnf-utils

이제 다음 명령을 실행하여 CentOS 기반 시스템용 Docker 리포지토리를 추가합니다.

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

Rocky Linux 시스템에서 리포지토리를 확인하고 확인하려면 다음 명령을 실행하십시오. 그런 다음 새 메타데이터 캐시를 생성합니다. Docker 리포지토리가 Rocky Linux에 추가된 것을 볼 수 있습니다.

sudo dnf repolist
sudo dnf makecache

다음으로 아래 DNF 명령을 사용하여 containerd 패키지를 설치합니다. Y를 입력하여 설치를 확인하고 ENTER를 누르면 설치가 시작됩니다. Docker GPG 키를 가져오라는 메시지가 표시되면 y를 입력하여 추가합니다.

sudo dnf install containerd.io

설치가 완료되면 다음 명령을 실행하여 기본 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 서비스를 시작하고 활성화합니다. 이렇게 하면 시스템 부팅 시 자동으로 실행될 containerd 서비스가 추가됩니다.

sudo systemctl enable --now containerd

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

sudo systemctl is-enabled containerd
sudo systemctl status containerd

Kubernetes 패키지 설치

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

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

다음 명령을 실행하여 RHEL/CentOS 기반 운영 체제용 Kubernetes 리포지토리를 추가합니다.

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

이제 리포지토리 목록을 확인하고 아래 dnf 명령을 사용하여 새 메타데이터 캐시를 생성합니다. 그리고 Rocky Linux 시스템에 Kubernetes 리포지토리가 추가된 것을 볼 수 있습니다.

sudo dnf repolist
sudo dnf makecache

다음으로 다음 dnf 명령을 사용하여 Kubernetes 패키지를 설치합니다. Y를 입력하여 설치를 확인하고 ENTER를 눌러 계속하면 설치가 시작됩니다.

sudo dnf install kubelet kubeadm kubectl --disableexcludes=kubernetes

설치가 완료되면 다음 systemctl 명령을 실행하여 kubelet 서비스를 시작하고 활성화합니다. 그런 다음 kubelet 서비스를 확인하고 모든 노드에서 활성화되고 실행 중인지 확인합니다.

이 서비스는 클러스터를 초기화하거나 노드를 클러스터에 조인할 때 모든 이벤트를 기다리는 기본 Kubernetes 서비스입니다.

sudo systemctl enable --now kubelet

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"인 "kubem-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

다운로드가 완료되면 다음 "kubeadm init" 명령을 실행하여 "kube-master" 서버에서 Kubernetes 클러스터를 초기화합니다. 이 노드 "kube-master"는 클러스터를 처음 초기화하기 때문에 자동으로 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

초기화가 완료되면 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에 대한 전체 정보를 얻으려면 dump - "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 설치에 성공하면 Flannel 포드를 포함하는 Kubernetes의 모든 기본 포드가 실행 중인 것을 볼 수 있습니다.

kubectl get pods --all-namespaces

Kubernetes에 작업자 노드 추가

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

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

kubeadm join 192.168.5.10:6443 --token wlg23u.r5x2nxw2vdu95dvp \
        --discovery-token-ca-cert-hash sha256:71fd28ac2b8108a3d493648a9c702acd2e39a8a0e7efc07326d7b0384c929066

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

다음으로 "kube-worker2" 서버로 이동하고 "kubeadm join" 명령을 실행하여 "kube-worker2"를 Kubernetes에 추가합니다. 무리.

kubeadm join 192.168.5.10:6443 --token wlg23u.r5x2nxw2vdu95dvp \
        --discovery-token-ca-cert-hash sha256:71fd28ac2b8108a3d493648a9c702acd2e39a8a0e7efc07326d7b0384c929066

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

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

kubectl get pods --all-namespaces

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

kubectl get nodes -o wide

결론

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