Post

Kubernetes 클러스터 구성 및 방법

실제 멀티 노드 k8s 클러스터 운영을 위한 시스템 초기 설정, containerd 구성, 네트워크 조정 방법

Kubernetes 클러스터 구성 및 방법

필수 조건

  • Linux 기반 운영체제 (예: Ubuntu, CentOS)
  • 각 노드에 2GB 이상의 RAM, 2개 이상의 CPU
  • 노드 간 네트워크 통신 가능
  • 고유한 호스트네임, MAC 주소, product_uuid

현재 클러스터 아키텍처

노드아키텍처설명
masterx86_64클러스터 제어 플레인 (API 서버 등) 실행
workers (2개)ARM64 (aarch64)실제 파드를 실행하는 노드

각 노드별 설치해야 하는 도구

구성 요소masterworkers
containerd
kubelet
kubeadm
kubectl✅ (선택. 디버깅 시 유용)
helm✅ (선택. 패키지 배포 시)❌ (필요 없음. 배포는 보통 master에서 수행)

구성 요소 설명

구성 요소설명
containerd컨테이너를 실행하기 위한 런타임
kubelet각 노드에서 파드(Pod)를 실제로 실행하는 컴포넌트
kubeadm마스터 노드를 초기화하고, 워커 노드를 클러스터에 조인시키는 CLI 도구
kubectl클러스터 리소스를 제어할 수 있는 커맨드라인 도구
helmKubernetes 애플리케이션을 간편하게 배포할 수 있게 도와주는 패키지 매니저

클러스터 구축 (공통)

1. 패키지 설치를 위한 저장소 추가

1
2
3
4
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
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
sudo apt-get update

2. 시스템 환경 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Swap 비활성화
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

# 네트워크 모듈 및 설정
sudo modprobe br_netfilter
echo "br_netfilter" | sudo tee /etc/modules-load.d/k8s.conf

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

sudo sysctl --system
sudo sysctl -w net.ipv4.ip_forward=1

3. containerd 설정

  • k8s와 systemd(시스템 서비스 매니저) 간에 cgroup driver 연동 방식을 지정
    • cgroup: 리눅스에서 CPU, 메모리, 디스크, 네트워크 등의 시스템 자원을 프로세스 단위로 제한하거나 추적, 분리할 수 있게 해주는 기능
    • cgroup driver: k8s가 리눅스의 cgroup 기능을 어떤 방식으로 사용할지 지정하는 인터페이스 또는 연동 방식
  • SystemdCgroup = truesystemd를 사용하는 시스템에 맞춤
1
2
3
4
5
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/^SystemdCgroup *=.*/SystemdCgroup = true/' /etc/containerd/config.toml

sudo systemctl restart containerd

클러스터 구축 (노드 별)

컨트롤 플레인 노드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# current version: 1.33
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl containerd
sudo apt-mark hold kubelet kubeadm kubectl containerd

# 클러스터 초기화 (Flannel 기준 CIDR): Pod들이 사용할 가상 네트워크 대역을 지정
# Flannel은 10.244.0.0/16 사용
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

## kubectl 설정
# kubectl 설정 디렉토리 생성
mkdir -p $HOME/.kube

# 관리자 kubeconfig 복사
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 파일 소유권 사용자에게 변경
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 리소스 생성 (Flannel CNI 설치)
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

Flannel: Pod 간 네트워크 통신을 위한 CNI (Container Network Interface) 플러그인 중 하나

현재까지 생성되는 것들

경로설명
/etc/kubernetes/클러스터 인증서, kubelet config 등
/etc/containerd/config.tomlcontainerd 런타임 설정
$HOME/.kube/configkubectl 인증정보
/etc/cni/net.d/CNI 네트워크 구성파일 (flannel 설치 후 생김)

워커 노드

1
2
3
4
5
6
7
8
9
10
11
12
# current version: 1.33
sudo apt-get update
sudo apt-get install -y kubelet kubeadm containerd
sudo apt-mark hold kubelet kubeadm containerd

# 토큰 관리 (필요 시)
kubeadm token list                           # 현재 토큰 확인
kubeadm token create --print-join-command    # 새 조인 명령 생성
# kubeadm token delete <token-id>            # (옵션) 필요 시 토큰 수동 삭제

# 워커 노드 조인
kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>
This post is licensed under CC BY 4.0 by the author.