Kubernetes 클러스터 구성 및 방법
실제 멀티 노드 k8s 클러스터 운영을 위한 시스템 초기 설정, containerd 구성, 네트워크 조정 방법
Kubernetes 클러스터 구성 및 방법
필수 조건
- Linux 기반 운영체제 (예: Ubuntu, CentOS)
- 각 노드에 2GB 이상의 RAM, 2개 이상의 CPU
- 노드 간 네트워크 통신 가능
- 고유한 호스트네임, MAC 주소, product_uuid
현재 클러스터 아키텍처
| 노드 | 아키텍처 | 설명 |
|---|---|---|
| master | x86_64 | 클러스터 제어 플레인 (API 서버 등) 실행 |
| workers (2개) | ARM64 (aarch64) | 실제 파드를 실행하는 노드 |
각 노드별 설치해야 하는 도구
| 구성 요소 | master | workers |
|---|---|---|
containerd | ✅ | ✅ |
kubelet | ✅ | ✅ |
kubeadm | ✅ | ✅ |
kubectl | ✅ | ✅ (선택. 디버깅 시 유용) |
helm | ✅ (선택. 패키지 배포 시) | ❌ (필요 없음. 배포는 보통 master에서 수행) |
구성 요소 설명
| 구성 요소 | 설명 |
|---|---|
| containerd | 컨테이너를 실행하기 위한 런타임 |
| kubelet | 각 노드에서 파드(Pod)를 실제로 실행하는 컴포넌트 |
| kubeadm | 마스터 노드를 초기화하고, 워커 노드를 클러스터에 조인시키는 CLI 도구 |
| kubectl | 클러스터 리소스를 제어할 수 있는 커맨드라인 도구 |
| helm | Kubernetes 애플리케이션을 간편하게 배포할 수 있게 도와주는 패키지 매니저 |
클러스터 구축 (공통)
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 = true로systemd를 사용하는 시스템에 맞춤
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.toml | containerd 런타임 설정 |
$HOME/.kube/config | kubectl 인증정보 |
/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.