웹사이트 검색

kubeadm을 사용하여 우분투에 Kubernetes 클러스터 설치


이 가이드에서는 Ubuntu Linux에서 작동하는 3노드 Kubernetes 클러스터를 설치하고 설정하는 단계를 안내합니다. Kubernetes는 컨테이너화된 애플리케이션의 배포, 관리 및 확장을 자동화하는 데 사용되는 오픈 소스 컨테이너 오케스트레이션 시스템입니다.

이 기사에서는 다음의 과정을 자세히 소개합니다:

  • 쿠버네티스 노드 준비하기
  • 저장소 설정
  • 컨테이너 런타임 엔진 설치
  • 쿠버네티스 구성 요소 설치
  • 클러스터 부트스트랩
  • 쿠버네티스를 위한 네트워킹 플러그인 설치
  • 새 작업 노드를 클러스터에 추가하기

시작해요!

궁극의 우분투 데스크톱 핸드북

전문가처럼 Ubuntu를 마스터하세요 - 아름다운 데스크탑 커스터마이징부터 강력한 터미널 자동화까지. 작업 공간을 완벽하게 제어하고 싶은 개발자, 시스템 관리자, 파워 유저에게 완벽합니다.

1단계: 시스템 다이어그램

이 설정은 다음 다이어그램을 기반으로 합니다:

다음 단계로 진행하기 전에 시스템 호스트 이름을 설정합시다:

마스터 노드에서:

아래와 같이 호스트 이름을 설정하세요:

sudo hostnamectl set-hostname k8s-master.example.com

워커 노드 01에서:

hostnamectl 명령어를 사용하여 호스트 이름을 설정하세요.

sudo hostnamectl set-hostname k8s-node-01.example.com

워커 노드 02에서:

Kubernetes 워커 노드 02의 호스트 이름도 설정하세요.

sudo hostnamectl set-hostname k8s-node-02.example.com

각 호스트에 올바른 호스트명이 설정되면, 각 노드에 설정된 값들을 입력하십시오.

$ sudo vim /etc/hosts
192.168.2.2 k8s-master.example.com    k8s-master
192.168.2.3 k8s-node-01.example.com  k8s-node-01
192.168.2.4 k8s-node-02.example.com  k8s-node-02

새로 설정한 호스트 이름을 사용하려면 로그아웃했다가 다시 로그인하세요.

exit||logout

2단계: 관리자 사용자 생성

Kubernetes 특정 설정을 하기 전에, 모든 의존성이 충족되는지 확인합시다. 여기서는 시스템 업데이트를 수행하고 Kubernetes 사용자를 생성할 것입니다.

모든 노드에서 시스템 패키지를 최신 버전으로 업데이트하세요:

sudo apt update && sudo apt upgrade -y
[ -e /var/run/reboot-required ] && sudo reboot

Kubernetes 클러스터를 관리할 사용자를 추가하세요:

sudo useradd -s /bin/bash -m k8s-admin
sudo passwd k8s-admin
sudo usermod -aG sudo k8s-admin
echo "k8s-admin ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/k8s-admin

만약 k8s-admin 사용자로 sudo 명령을 실행할 때 sudo 비밀번호 입력을 선호한다면, 마지막 줄은 무시해도 됩니다. sudo에 비밀번호 프롬프트가 없는지 테스트할 수 있습니다:

$ su - k8s-admin
k8s-admin@k8s-master:~$ sudo su -
root@k8s-master:~# exit

모든 것이 좋아 보입니다. 이제 Docker 엔진 설치를 진행합시다.

3단계: Containerd 설치

Kubernetes는 컨테이너를 실행하기 위해 컨테이너 런타임 엔진이 필요합니다. 이 글에서는 컨테이너 엔진으로 Containerd를 사용할 것입니다.

Docker가 설치되어 있지 않은지 확인하세요. 설치되어 있다면 제거하세요.

sudo apt remove docker docker-engine docker.io

의존성 설치:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common

Docker 저장소 GPG 키 가져오기:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

도커 엔진을 설치하세요.

sudo apt update && sudo apt install containerd.io

서비스가 자동으로 시작됩니다.

$ systemctl status containerd.service
● containerd.service - containerd container runtime
   Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
   Active: active (running) since  Sun 2024-07-14 21:22:30 UTC; 34min ago
     Docs: https://containerd.io
  Process: 4265 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
 Main PID: 4270 (containerd)
    Tasks: 8
   CGroup: /system.slice/containerd.service
           └─4270 /usr/bin/containerd

설치된 버전도 확인할 수 있습니다:

containerd --version

4단계: 쿠버네티스 구성 요소 설치

종속 도구를 설치하세요.

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

설치하려는 Kubernetes 버전을 설정하세요.

k8s_ver=1.30

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

curl -fsSL https://pkgs.k8s.io/core:/stable:/v${k8s_ver}/deb/Release.key | \
 sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/k8s.gpg

공식 Kubernetes APT 저장소를 추가합니다.

echo "deb https://pkgs.k8s.io/core:/stable:/v${k8s_ver}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

apt 패키지 인덱스 업데이트:

sudo apt update

쿠버네티스 구성 요소 설치

Kubernetes 마스터 구성 요소인 kubectl, kubelet, kubernetes-cni 및 kubeadm을 설치합니다:

sudo apt install kubectl kubelet kubeadm kubernetes-cni

모든 패키지 바이너리가 파일 시스템에 있는지 확인하십시오.

$ which kubelet
/usr/bin/kubelet

$ which kubeadm
/usr/bin/kubeadm

스왑이 켜져 있으면 끄세요.

sudo swapoff -a
sudo sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab

필요한 모듈을 불러옵니다.

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

런타임에 로드하려면 다음을 실행하세요:

sudo modprobe overlay
sudo modprobe br_netfilter

또한 sysctl 설정도 구성하세요.

sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

구성을 불러옵니다.

sudo sysctl --system

containerd를 구성하고 서비스를 재시작하세요

sudo mkdir -p /etc/containerd
sudo containerd config default|sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

kubelet 서비스를 활성화하세요

sudo systemctl enable kubelet

5단계: k8s 컨트롤 플레인 부트스트랩

이 섹션에서 실행될 모든 명령어는 마스터 노드에서 실행해야 합니다. Kubernetes 워커 노드에서는 어떤 명령어도 실행하지 마세요. Kubernetes 마스터 구성 요소는 클러스터의 제어 평면을 제공합니다 – API 서버, 스케줄러, 컨트롤러 매니저. 이들은 클러스터에 대한 글로벌 결정을 내리며, 예를 들어 스케줄링을 하거나 클러스터 이벤트를 감지하고 대응하는 일을 합니다.

Kubernetes 기본 이미지를 다운로드하여 containerd가 잘 작동하는지 확인하세요.

$ sudo kubeadm config images pull
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.30.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.30.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.30.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.30.2
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.11.1
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.12-0

여러 CRI 소켓이 있는 경우, --cri-socket을 사용하여 하나를 선택하세요:

# Containerd
sudo kubeadm config images pull --cri-socket unix:///run/containerd/containerd.sock

# For CRI-O
sudo kubeadm config images pull --cri-socket unix:///var/run/crio/crio.sock

부트스트랩(단일 컨트롤 플레인 노드) – 공유 엔드포인트 없음

DNS 엔드포인트를 사용하지 않고 클러스터를 부트스트랩하려면 다음을 실행하세요:

sudo sysctl -p
sudo kubeadm init \
  --pod-network-cidr=172.24.0.0/16 \
  --cri-socket unix:///run/containerd/containerd.sock

공유 엔드포인트(DNS 이름을 사용한 제어 평면 API)로 부트스트랩

이는 여러 개의 제어 평면 노드에 이상적입니다.

클러스터 엔드포인트 DNS 이름을 설정하거나 /etc/hosts 파일에 레코드를 추가하세요.

$ sudo vim /etc/hosts
172.29.20.5 k8s-cluster.computingforgeeks.com

클러스터 생성:

sudo sysctl -p
sudo kubeadm init \
  --pod-network-cidr=172.24.0.0/16 \
  --upload-certs \
  --control-plane-endpoint=k8s-cluster.computingforgeeks.com

장소 :

  • k8s-cluster.computingforgeeks.com은 k8s 컨트롤 플레인 노드를 위한 LB IP를 가리킵니다.

모든 것이 잘되면, 다음에 무엇을 해야 하는지에 대한 지침과 함께 성공 메시지를 받게 될 것입니다:

---
Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.2.2:6443 --token 9y4vc8.h7jdjle1xdovrd0z --discovery-token-ca-cert-hash sha256:cff9d1444a56b24b4a8839ff3330ab7177065c90753ef3e4e614566695db273c

마스터 서버에서 k8s-admin 사용자에 대한 접근 권한 구성

k8s-admin으로 전환하고 클러스터 정보가 포함된 Kubernetes 설정 파일을 복사하세요.

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

클러스터 정보를 확인하여 배포를 검증하세요.

$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.2.2:6443
CoreDNS is running at https://192.168.2.2:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

단계 6: CNI 플러그인 설치

이 가이드에서는 Calico를 사용할 것입니다. 다른 지원되는 네트워크 플러그인을 선택할 수도 있습니다.

연산자 및 사용자 정의 리소스 파일을 다운로드하세요. 최신 버전은 릴리스 페이지를 참조하세요.

최신 버전을 받아보세요:

VERSION=$(curl --silent "https://api.github.com/repos/projectcalico/calico/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

설치 리소스를 다운로드하세요.

curl -O https://raw.githubusercontent.com/projectcalico/calico/${VERSION}/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/${VERSION}/manifests/custom-resources.yaml 

먼저 클러스터에 오퍼레이터를 설치하세요.

k8s-admin@k8s-master:~$ kubectl create -f tigera-operator.yaml
namespace/tigera-operator created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/apiservers.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/imagesets.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/installations.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/tigerastatuses.operator.tigera.io created
serviceaccount/tigera-operator created
clusterrole.rbac.authorization.k8s.io/tigera-operator created
clusterrolebinding.rbac.authorization.k8s.io/tigera-operator created
deployment.apps/tigera-operator created

Calico IP 풀도 업데이트합시다.

sed -ie 's/192.168.0.0/172.24.0.0/g' custom-resources.yaml

그런 다음 매니페스트 구성을 적용합니다.

k8s-admin@k8s-master:~$  kubectl create -f custom-resources.yaml
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created

Calico Pod이 실행 상태가 될 때까지 기다리세요.

k8s-admin@k8s-master:~$ kubectl get pods --all-namespaces
NAMESPACE          NAME                                             READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-5476c484c4-rmmts                1/1     Running   0          37s
calico-apiserver   calico-apiserver-5476c484c4-z9phf                1/1     Running   0          37s
calico-system      calico-kube-controllers-6945f87bd4-2xwx4         1/1     Running   0          80s
calico-system      calico-node-tkwtv                                1/1     Running   0          80s
calico-system      calico-typha-65f575c9fc-xx8m8                    1/1     Running   0          81s
calico-system      csi-node-driver-kngdn                            2/2     Running   0          80s
kube-system        coredns-5dd5756b68-77x77                         1/1     Running   0          11m
kube-system        coredns-5dd5756b68-plpd6                         1/1     Running   0          11m
kube-system        etcd-k8s-master.example.com                      1/1     Running   0          11m
kube-system        kube-apiserver-k8s-master.example.com            1/1     Running   0          11m
kube-system        kube-controller-manager-k8s-master.example.com   1/1     Running   0          11m
kube-system        kube-proxy-bxq4x                                 1/1     Running   0          11m
kube-system        kube-scheduler-k8s-master.example.com            1/1     Running   0          11m
tigera-operator    tigera-operator-94d7f7696-xls25                  1/1     Running   0          3m20s

노드가 이제 준비 상태여야 합니다.

k8s-admin@k8s-master:~$ kubectl get nodes
NAME                     STATUS   ROLES           AGE   VERSION
k8s-master.example.com   Ready    control-plane   20m   v1.30.2

단계 7: 워커 노드 설정

Kubernetes 클러스터가 초기화되고 마스터 노드가 온라인 상태가 되면 워커 노드 구성을 시작합니다. 노드는 Kubernetes에서 작업을 수행하는 머신으로, 가상 머신(VM)일 수도 있고 물리 머신일 수도 있습니다. 각 노드는 마스터에 의해 관리되며, 파드를 실행하는 데 필요한 서비스—도커, kubelet, kube-proxy—를 갖추고 있습니다.

1) Containerd 런타임이 설치되어 있는지 확인(설명됨)

이 문서에서 제공하는 단계를 사용하여 containerd를 설치하세요

2) Kubernetes 저장소 추가(다룸)

Kubernetes 패키지를 위한 저장소가 시스템에 추가되었는지 확인하십시오.

3) 쿠버네티스 구성 요소 설치(4단계)

Kubernetes 저장소를 추가한 후, 다음을 사용하여 구성 요소를 설치하세요:

sudo apt install kubelet kubeadm kubectl kubernetes-cni

4) 노드를 클러스터에 연결하기:

Kubernetes 클러스터를 초기화한 후 제공된 join 명령어를 사용하세요. 명령어를 출력하려면 다음을 사용하면 됩니다:

kubeadm token create --print-join-command

완료되면, 마스터에서 노드 상태를 확인하세요:

k8s-admin@k8s-master:~$ kubectl get nodes
NAME          STATUS    ROLES     AGE       VERSION
k8s-master    Ready     master    35m       v1.30.2
k8s-node-01   Ready     <none>    2m        v1.30.2
k8s-node-02   Ready     <none>    1m        v1.30.2

단계 8: Kubernetes 설정 검증

테스트 네임스페이스를 생성합니다:

$ kubectl create namespace test
namespace/test created

테스트 애플리케이션 배포

kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080

기존 배포 보기:

$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           1m

실행 중인 파드 보기

$ kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m

리소스를 정리하려면 다음을 실행하세요:

kubectl delete deployment hello-node

9단계: kubectl 자동 완성 구성

kubectl 명령어에 대한 셸 자동완성을 활성화하세요. kubectl은 자동완성 기능을 지원하여 입력을 많이 줄일 수 있습니다! 현재 세션에서 셸 자동완성을 활성화하려면 다음을 실행하세요:

source <(kubectl completion bash)

kubectl 자동 완성을 프로필에 추가하려면, 향후 셸에서 자동으로 로드되도록 다음 명령을 실행하세요:

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

zsh를 사용하고 있다면 ~/.zshrc 파일을 편집하고 kubectl 자동 완성을 활성화하기 위해 다음 코드를 추가하세요:

if [ $commands[kubectl] ]; then
source <(kubectl completion zsh)
fi

또는 Oh-My-Zsh를 사용할 때, ~/.zshrc 파일을 편집하고 plugins= 줄에 kubectl 플러그인을 포함하도록 업데이트하세요.

source <(kubectl completion zsh)

컨테이너 메트릭을 위한 Top 명령도 관련 있습니다

쿠버네티스 마스터리 교육 자료:

  • 최고의 쿠버네티스 학습서

결론

우리는 Ubuntu LTS 서버에 3노드 Kubernetes 클러스터를 성공적으로 배포했습니다. 다음 가이드에서는 Kubernetes HA, Kubernetes 모니터링, 외부 스토리지 구성 방법 등 더 멋진 내용들을 다룰 예정입니다. 계속 지켜봐 주세요!