본문 바로가기
[DevOps]/Kubernetes

쿠버네티스 설치 및 노드 연결 완벽 정리 (Oracle Linux or Ubuntu, containerd, flannel)

by 팡펑퐁 2024. 12. 19.
728x90
🤓 테스트 환경
Kubernetes : 1.32v
Master Node : Oracle linux 8.8
Worker Node : Ubuntu 20.04.6 LTS

 

🥸 구성

  • 작업 순서대로 설명합니다.
  • 각 작업에서 상세 설명 및 주의 사항을 함께 전달합니다.
  • 그대로 따라 하시면 큰 어려움 없이 설치 및 연결할 수 있도록 구성하였습니다.

🫡 실습 전 이해하기

0. 쿠버네티스를 설치하기 위해서는 최소 두 대의 서버가 필요합니다.

1. 실습 전 각 서버의 기본적인 운영체제에 대한 정보 확인이 필요합니다.

2. 컨테이너 런타임을 설치해야합니다.

3. kubeadm, kubelet, kubectl과 같은 쿠버네티스 클러스터 관리 도구를 설치해야 합니다.

  • kubeadm은 쿠버네티스를 설치하고 관리하는 도구입니다.
  • kubelet은 각 노드의 에이전트이며 노드 내 Pod와 Container 등을 관리합니다.
  • kubectl은 사용자가 클러스터를 제어할 수 있도록 도와주는 명령줄 인터페이스(CLI) 도구입니다.
  • 설치에 따른 운영체제 별 설치 및 설정 방법이 상이합니다.

4. CNI 플러그인을 설치합니다.

5. Master Node와 Worker Node를 연결합니다.

6. Test Pod를 띄워봅니다.

 

[1] 리눅스 기본 작업

🫥  각 서버의 운영 체제 확인하기

$ cat /etc/os-release

# Master Node 용 서버 출력 내용
NAME="Oracle Linux Server"
VERSION="8.8"
...

# Worker Node 용 서버 출력 내용
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
...
  • Master Node로 설정할 서버 운영체제를 확인합니다.
  • 리눅스 운영체제는 실행 및 연결과는 무관하지만 운영체제의 종류마다 설치 방법이 상이할 수 있으므로 맨 처음에 확인하여 숙지합니다.

 

오라클 리눅스(Oracle Linux)

  • Red Hat Enterprise Linux(RHEL)를 기반으로 한 배포판입니다.
  • RPM 패키지 관리 시스템과 yum/dnf 패키지 관리 도구를 사용합니다.

 

우분투(Ubuntu)

  • 데비안(Debian)을 기반으로 한 배포판입니다.
  • APT 패키지 관리 시스템과 DEB 패키지 포맷을 사용합니다.

 

🫥  각 서버의 hostname 변경하기

# hostname 변경하기
$ sudo hostnamectl set-hostname <호스트 네임>

# hostname 출력하기
$ hostname
  • hostname을 변경하는 이유는 kube-api가 hostname을 기반으로 통신하기 때문입니다.
  • node 간의 연결 관계를 명확하게 표시하기 위해 hostname을 지정해 주는 것이 좋습니다.

 

🫥  방화벽 설정

< Chat-GPT >
< Chat-GPT >

## Oracle Linux
# 기존 방화벽 리스트 확인
sudo firewall-cmd --zone=public --list-all

# 적용
sudo firewall-cmd --reload

## masternode
# kubernetes api server
sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp

# etcd server
sudo firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp

# kubelet api
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp

# kube-scheduler
sudo firewall-cmd --permanent --zone=public --add-port=10259/tcp

# kube-controller-manager
sudo firewall-cmd --permanent --zone=public --add-port=10257/tcp

## worker node
# kubelet api
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp

# nodeport services
sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp

## masternode & worker node 둘 다
# CNI Plugin flannel
sudo firewall-cmd --permanent --zone=public --add-port=8472/udp



## Ubuntu의 경우 아래 명령어 참고
# 기존 방화벽 리스트 확인
sudo ufw status

# 포트번호 위 참고
sudo ufw allow <port>/tcp
sudo ufw allow <port>:<port>/tcp

# 적용
sudo ufw reload
  • 방화벽이 있는 환경에서는 따로 포트를 개방해야 합니다.
  • 리눅스 운영체제 별 방화벽 설정이 상이하므로 참고하시길 바랍니다.
  • 클라우드 서비스를 사용 중이라면 가상 네트워크 설정에서 트래픽 허용을 열어주셔야 합니다.

[2] 컨테이너 런타임 설치

🫥 도커 설치

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

 

Install

Learn how to choose the best method for you to install Docker Engine. This client-server application is available on Linux, Mac, Windows, and as a static binary.

docs.docker.com

  • 파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨테이너 런타임을 설치해야 합니다.
  • 쿠버네티스는 Containerd, CRI-O 등 컨테이너 런타임을 지원합니다.
  • 저는 컨테이너 런타임으로 가장 흔하게 사용되는 Docker를 설치했습니다.(사실 이미 사용 중입니다)
  • 설치는 링크를 타고 들어가 각 운영체제에 맞는 설치 과정을 진행하면 됩니다.
  • 참고로 Oracle linux의 경우 아래의 설치 과정을 보시면 됩니다.
  • Ubuntu의 경우 아래의 설치 과정을 보시면 됩니다.

 

🚨 그런데, 여기서 주의할 점이 있습니다.

 

🫥 CRI

  • 쿠버네티스는 컨테이너 런타임과 상호작용하기 위해 CRI(Container Runtime Interface)라는 표준 인터페이스를 사용합니다.
  • 그런데, 쿠버네티스는 1.24 버전 이후로 Docker를 직접 지원하지 않습니다(즉, Docker 자체는 Kubernetes와 호환되지 않습니다)
  • 쿠버네티스 1.24 버전 이상에서 Docker를 사용하려면 cri-dockerd라는 어댑터를 새로 추가해야만 쿠버네티스에서 도커를 런타임으로 사용할 수 있습니다.
  • 그러나, 성능과 호환성에서 권장되지 않습니다.
  • 따라서, contaierd나 CRI-O를 CRI로 사용하는 것이 좋습니다.

 

🫥 도커 엔진과 Containerd

  • 저의 경우 회사와 집에서 이미 도커를 사용하고 있습니다.
  • 그리고 이 글을 보고 계신 많은 분들 역시 이미 도커를 사용중일 것으로 생각됩니다.
  • 도커 엔진은 내부적으로 containerd를 사용하여 컨테이너를 실행하고 관리합니다. 즉, 도커 자체가 containerd를 기반으로 동작합니다.
  • 따라서 도커를 설치하면 containerd도 자동으로 설치되고 실행됩니다.
  • 쿠버네티스는 기본적으로 containerd와 호환되므로, 도커 설치 후 쿠버네티스를 containerd 기반으로 사용할 수 있습니다.

 

📚 관련 공식 문서

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

 

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.32. If

kubernetes.io

 

 

🫥 IPv4를 포워딩하여 iptables가 브리지 된 트래픽을 보게 하기

# overlay와 br_netfilter 모듈 로드, 재부팅 시에도 설정 적용하려면 설정파일 만들어야함
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

# 적용
sudo modprobe overlay
sudo modprobe br_netfilter

# 적용 확인
sudo lsmod | grep br_netfilter

# 출력
br_netfilter           xxxxx  0

# sysctl 파라미터 설정, 재부팅 시에도 설정 적용하려면 설정파일 만들어야함
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 파라미터 적용하기
sudo sysctl --system
  • 이 작업은 Kubernetes 클러스터의 네트워크 기능이 제대로 동작하도록 필요한 커널 모듈을 로드하고, 커널 파라미터를 설정하여 네트워크 필터링 및 IP 포워딩 기능을 활성화하는 설정입니다.

 

overlay와 br_netfilter 모듈 로드

  • overlay: Kubernetes에서 컨테이너 네트워킹을 위한 네트워크 드라이버입니다.
  • br_netfilter: 브리지 네트워크에서 iptables 필터링을 활성화하기 위해 필요한 모듈입니다.
  • 이 두 모듈을 /etc/modules-load.d/k8s.conf 파일에 추가하고 modprobe 명령어로 로드하여 Kubernetes의 네트워킹 기능이 정상적으로 작동하게 만듭니다.

sysctl 파라미터 설정

  • net.bridge.bridge-nf-call-iptables: Kubernetes 네트워킹에서 iptables 규칙을 적용하기 위해 설정합니다.
  • net.bridge.bridge-nf-call-ip6tables: IPv6의 경우도 동일한 네트워크 필터링을 적용하도록 설정합니다.
  • net.ipv4.ip_forward: 컨테이너 간 통신을 위해 IP 포워딩을 활성화합니다.

sysctl --system

  • 위에서 설정한 커널 파라미터를 즉시 적용하기 위해 sysctl --system 명령어를 실행합니다. 이 명령어는 커널 파라미터를 재부팅 없이 즉시 적용됩니다.

 

📚 관련 공식 문서

https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes//#필수-요소들-설치-및-구성하기

 

컨테이너 런타임

참고: Dockershim은 쿠버네티스 릴리스 1.24부터 쿠버네티스 프로젝트에서 제거되었다. 더 자세한 내용은 Dockershim 제거 FAQ를 참고한다. 파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨

kubernetes.io

 

🫥 docker daemon.json

$ sudo vi /etc/docker/daemon.json

# 아래 내용 저장
{  
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

# 도커 재시작
$ sudo systemctl restart docker

# 확인
$ sudo docker info
Storage Driver: overlay2
...
 Cgroup Driver: systemd
  • containerd는 Docker의 런타임 라이브러리로 동작하기 때문에 Docker 설정을 수정하여 Cgroup Driver를 systemd로 변경하면 Kubernetes 환경에서의 호환성과 안정성을 보장할 수 있습니다.
    • systemd는 Kubernetes 1.20 이후 권장되는 보다 안정적이고 일관된 Cgroup Driver입니다.
  • 현재 설정 상태를 확인하기 위해 sudo docker info 명령어를 실행하면, 변경 전에는 Cgroup Driver: cgroupfs로 표시됩니다.
    • 이를 systemd로 변경하려면 Docker의 설정 파일을 수정해야 하며, 초기에는 해당 설정 파일(`/etc/docker/daemon.json`)이 존재하지 않을 수 있습니다.
    • 따라서, 이 파일을 새로 생성하거나 편집하여 아래와 같이 설정을 추가합니다.

 

🫥  containerd systemd cgroup 드라이버 구성

$ containerd config default | sudo tee /etc/containerd/config.toml

$ sudo vi /etc/containerd/config.toml

# 찾아서 flase -> true로 변경
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
    
# 재시작
$ sudo systemctl restart containerd
  • 이 작업은 containerd가 systemd를 cgroup driver로 사용하도록 명시하는 것입니다.
  • 최초의 기본값으로 진행하면 클러스터 설치 후 문제가 발생할 가능성이 있기 때문에 위 명령어를 통해 초기 설정을 하고 필요한 부분만 바꿉니다.

[3] 리눅스 종류별 설정

‼️ 시간이 지나 공식문서가 업데이트가 되면 설치 방법이 달라질 수 있으므로 반드시 공식문서를 확인하시길 바랍니다. 

 

🧤 Debian 기반(Ubuntu 등)

$ sudo apt-get install -y apt-transport-https ca-certificates curl gpg
  • 이 명령어는 apt를 통해 HTTPS를 사용하여 패키지를 다운로드하고, 필요한 인증서와 도구를 설치합니다.
  • apt-transport-https: HTTPS 프로토콜을 통해 APT 패키지를 다운로드할 수 있게 해 줍니다.
  • ca-certificates: 안전한 HTTPS 연결을 위해 필요한 인증서들을 설치합니다.
  • curl: URL을 통해 데이터를 전송하는 도구입니다.
  • gpg: GPG 키 관리를 위한 도구로, 패키지의 서명을 확인하는 데 사용됩니다.

 

🫥 Kubernetes 저장소의 GPG 키 다운로드

## Ubuntu 22.04 이전 버전에는 /etc/apt/keyrings가 존재하지 않기 때문에 직접 생성하고 진행해야한다.
# sudo mkdir -p -m 755 /etc/apt/keyrings
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  • Kubernetes 저장소의 GPG 키를 다운로드하여 시스템에 저장합니다.

 

🫥 Kubernetes의 APT 패키지 저장소 추가

$ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
  • Kubernetes의 APT 패키지 저장소를 시스템에 추가합니다.
  • 이 저장소에서 Kubernetes 관련 패키지를 다운로드할 수 있도록 /etc/apt/sources.list.d/ 디렉터리에 kubernetes.list 파일을 생성합니다.

 

🫥 kubeadm, kubelet, kubectl 설치

# 리눅스 패키지를 업데이트 합니다.
$ sudo apt-get update

# Kubernetes 클러스터를 구성하기 위해 필요한 3가지 주요 패키지인 kubelet, kubeadm, kubectl을 설치합니다.
$ sudo apt-get install -y kubelet kubeadm kubectl

# kubelet, kubeadm, kubectl 패키지들을 자동 업데이트에서 제외시켜, 업데이트나 업그레이드 중에 해당 패키지가 변경되지 않도록 합니다.
$ sudo apt-mark hold kubelet kubeadm kubectl
  • kubelet
    • 클러스터의 각 노드에서 실행되는 Kubernetes의 주요 컴포넌트입니다.
    • Kubernetes의 Pod을 실행하고 관리합니다.
  • kubeadm
    • Kubernetes 클러스터를 초기화하거나 설정하는 도구입니다.
    • 클러스터의 Control Plane 구성, 노드 추가 등을 쉽게 처리할 수 있습니다.
  • kubectl
    • Kubernetes를 관리하기 위한 CLI 도구입니다.
    • Kubernetes 클러스터와 상호작용하며 리소스 관리, 상태 확인 등을 수행합니다.

 

🫥 kubelet 활성화와 설치 확인으로 넘어가세요.


⛑️ RedHat 기반(Oracle Linux, CentOS 등)

🫥 SELinux 비활성화

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

 

SELinux와 컨테이너 런타임의 충돌

  • SELinux(Security-Enhanced Linux)는 파일, 프로세스, 네트워크 등에 대해 강력한 접근 제어를 제공하는 보안 메커니즘입니다.
  • 쿠버네티스에서 컨테이너 런타임은 일반적으로 컨테이너 내부와 외부 간의 리소스(파일 시스템, 네트워크 등)를 공유합니다.
  • SELinux가 활성화되어 있으면, 컨테이너 런타임이 이러한 공유 리소스에 접근하려 할 때 권한 거부 오류가 발생할 수 있습니다.
    • Pod에서 공유 볼륨을 사용하는 경우 SELinux의 보안 컨텍스트가 충돌하여 파일 시스템에 접근하지 못하는 문제가 발생할 수 있습니다.
    • 네트워크 플러그인(CNI)이나 kubelet이 SELinux 정책에 의해 차단될 가능성도 있습니다.

 

🫥 스왑 비활성화

## 일시적 비활성화하기(이건 재부팅 시 초기화되므로 아래 자동 비활성화를 사용하자)
# 스왑 상태 확인
$ free -h

# 스왑 일시적 비활성화
$ sudo swapoff -a

# 스왑 상태 재확인
$ free -h

# 출력
Swap:            0B          0B          0B

######################################################################
## 자동 비활성화
# 부팅 시 자동으로 비활성화하는 것이 좋다.
$ sudo vi /etc/fstab

# 주석처리 하기
# /.swapfile    none    swap    sw,comment=cloudconfig  0       0

# 시스템 재부팅
$ sudo reboot

# 스왑 상태 재확인
$ free -h

# 출력
Swap:            0B          0B          0B
  • kubelet은 기본적으로 노드에서 스왑 메모리가 활성화되어 있는 경우 실행을 거부하거나 오류를 발생시킬 수 있습니다.
  • 스왑(Swap)이란?
    • 스왑은 물리적 메모리(RAM)가 부족할 때 디스크의 특정 공간을 임시로 사용하여 메모리를 보조하는 기능입니다.
    • 하지만 Kubernetes는 안정성과 성능 이유로 스왑 사용을 허용하지 않습니다. 스왑이 활성화되어 있으면 Kubernetes 클러스터 초기화 시 오류가 발생합니다.

 

📚 관련 공식 문서 

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

 

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.32. If

kubernetes.io

 

 

🫥 kubeadm, kubelet, kubectl 설치

Kubernetes Repository 설정

$ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
  • Kubernetes의 공식 패키지 저장소를 설정합니다.
  • Kubernetes 설치와 관련된 패키지를 시스템에서 쉽게 관리할 수 있도록 저장소를 등록하는 단계입니다.
  • exclude: 특정 패키지가 기본적으로 설치되지 않도록 제외합니다.(여기선 kubelet, kubeadm, kubectl 등 제외)
  • exclude를 설정하는 이유는
    1. 저장소 충돌 방지: 의도하지 않은 저장소나 오래된 패키지에서 설치되는 것을 방지합니다.
    2. 업데이트 통제: 자동 업데이트로 인해 호환성 문제가 발생하지 않도록 예방합니다.
    3. 수동 관리 강제: 명시적으로만 설치/업데이트하도록 관리의 명확성을 제공합니다.

 

Kubernetes 구성 요소 설치

# 리눅스 패키지를 업데이트합니다.
$ sudo dnf update

$ sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  • 이 단계에서 Kubernetes 클러스터를 구성하는 데 필요한 핵심 구성 요소들을 설치합니다.
  • kubelet
    • 클러스터의 각 노드에서 실행되는 Kubernetes의 주요 컴포넌트입니다.
    • Kubernetes의 Pod을 실행하고 관리합니다.
  • kubeadm
    • Kubernetes 클러스터를 초기화하거나 설정하는 도구입니다.
    • 클러스터의 Control Plane 구성, 노드 추가 등을 쉽게 처리할 수 있습니다.
  • kubectl
    • Kubernetes를 관리하기 위한 CLI 도구입니다.
    • Kubernetes 클러스터와 상호작용하며 리소스 관리, 상태 확인 등을 수행합니다.
  • --disableexcludes=kubernetes
    • exclude 된 패키지를 강제로 설치할 수 있도록 설정합니다.
    • 특정 저장소(Kubernetes 공식 저장소)에서만 패키지를 가져오도록 강제하며, 관리자가 의도적으로 작업을 수행했음을 보장합니다.

[4] kubelet 활성화와 설치 확인

🫥 kubelet 활성화

$ sudo systemctl enable --now kubelet
  • kubelet 서비스를 부팅 시 자동 시작되도록 설정하고, 즉시 시작하도록 하는 명령어입니다.

 

kubelet 확인

$ sudo systemctl status kubelet
  • 이 명령어를 실행하면 kubelet이 activiting 상태임을 확인할 수 있습니다.
  • 아직 kubeadm을 초기화하지 않아 계속 실행 시도 중인 상태인 것입니다.

[5] master, worker node 연결

🫥 master node

kubeadm 초기화(CNI 플러그인에 따른 옵션)

# flannel
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 출력
$ kubeadm join ***.***.***.***:6443 --token <토큰값>

# 아래 명령어로 리셋하고 다시할 수도 있음
$ sudo kubeadm reset
  • 10.244.0.0/16은 Flannel CNI(Container Network Interface) 플러그인을 사용할 때 일반적으로 권장되는 기본 값입니다.
    • Flannel은 가장 기본적인 CNI 플러그인으로 알려져 있습니다.
  • CNI 플러그인은 Kubernetes 클러스터 내에서 Pod 간의 네트워크를 설정하고, 이 CIDR 범위는 각 Pod에 할당될 IP 주소 범위를 정의합니다.
  • 맨 마지막에 worker node에 입력하여 클러스터에 연결할 수 있는 join 명령문이 나오므로 이를 복사해 둡니다.

 

kubectl 명령어를 사용할 수 있게 변경

$ mkdir -p $HOME/.kube
# reset 후 재입력하는 경우에는 yes로 입력하면 됨
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

## k8s 치트시트
# 탭으로 자동 검색 도와줌 예를 들어 -n kube-system을 k만 입력하고 tab하면 자동으로 채워짐
$ echo "source <(kubectl completion bash)" >> ~/.bashrc

# kubectl 대신 k만 입력해도 됨
$ echo "alias k=kubectl" >> ~/.bashrc
$ echo "complete -o default -F __start_kubectl k" >> ~/.bashrc

# 적용
$ source ~/.bashrc

# 위 명령을 수행한 후 파드를 조회해보자.
$ kubectl get po -A or k get po -A
  • 성공적으로 설치되었다면 위 명령어를 입력한 후 파드를 조회시 정상적으로 조회될 것입니다.

 

$ k get po -A
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-xxxxxxxxx-xxxxxx             0/1     Pending   0          4m19s
kube-system   coredns-xxxxxxxxx-xxxxxx             0/1     Pending   0          4m19s
kube-system   etcd-host-name                       1/1     Running   0          4m26s
kube-system   kube-apiserver-host-name             1/1     Running   0          4m26s
kube-system   kube-controller-manager-host-name    1/1     Running   0          4m26s
kube-system   kube-proxy-xxxxx                     1/1     Running   0          4m19s
kube-system   kube-scheduler-host-name             1/1     Running   0          4m26s
  • coredns의 경우 CNI 플러그인을 설치해야 Pending에서 벗어날 수 있습니다.

 

 

CNI 플러그인(flannel) 설치

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • flannel은 기본 기능에 충실한 가장 간단한 구조입니다.

 

🫥 worker node

masternode와 연결

# 마스터 노드에서 kubeadm init을 통해 나온 join 명령문을 복사해서 실행
kubeadm join ***.***.***.***:6443 --token <토큰값>
  • 이때 연결이 되지 않는다면 방화벽을, 클라우드의 경우 가상 네트워크 설정까지 쿠버네티스 관련 포트가 열려있는지 확인해 봅니다.

 

masternode에서 연결 확인

$ kubectl get nodes
NAME      STATUS   ROLES           AGE     VERSION
master    Ready    control-plane   2m11s   v1.32.0
worker    Ready    <none>          20s     v1.32.0

 


[6] testPod 띄워보기

$ kubectl run testpod --image=nginx
pod/testpod created

$ kubectl get po
NAME      READY   STATUS    RESTARTS   AGE
testpod   1/1     Running   0          8s

 

 

 

참고

https://github.com/kubernetes/website/commit/f73647531dcdade2327412253a5f839781d57897/

https://diamond-goose.tistory.com/65

https://nginxstore.com/blog/kubernetes/쿠버네티스-설치-방법-vm-환경-튜토리얼/#2-4

https://yes-admit.tistory.com/123

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

728x90