서비스가 확장되면, 컨테이너 기반의 분산 시스템 환경에 대한 필요성이 생깁니다. Kubernetes는 그런 요구를 충족시켜주는 강력한 플랫폼입니다. 규모가 커지는 성향의 서비스에는 필수적인 요소로 보입니다

🧰 System Requirements (시스템 요구사항)
According to the official Kubernetes documentation:
Master Node
- CPU: Multi-core
- RAM: At least 8GB
- Storage: SSD or NVMe
- Network: Gigabit Ethernet
Worker Node
- CPU: Multi-core
- RAM: 4GB or more
Ubuntu 20.04 LTS or newer is recommended.
🔥 Step 1: Firewall Setup & Package Installation (방화벽 및 패키지 설치)
방화벽은 노드 간 통신과 외부 접근을 제어하는 중요한 구성 요소입니다. Kubernetes는 여러 포트를 사용하므로, 사전에 방화벽을 설정해 해당 포트를 열어줘야 합니다.
sudo apt update
sudo apt install -y firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
sudo ufw disable
Open required ports on the Master Node:
sudo firewall-cmd --permanent --add-port=6443/tcp # Kubernetes API 서버
sudo firewall-cmd --permanent --add-port=2379-2380/tcp # etcd
sudo firewall-cmd --permanent --add-port=10250/tcp # Kubelet API
sudo firewall-cmd --permanent --add-port=10257/tcp # 컨트롤러 매니저
sudo firewall-cmd --permanent --add-port=10259/tcp # 스케줄러
sudo firewall-cmd --reload
Worker Node ports:
sudo firewall-cmd --permanent --add-port=10250/tcp # Kubelet
sudo firewall-cmd --permanent --add-port=30000-32767/tcp # NodePort 서비스용
sudo firewall-cmd --reload
🚫 Step 2: Disable Swap (스왑 비활성화)
Kubernetes는 노드 리소스 스케줄링 시 정확한 메모리 관리를 위해 swap을 사용하지 않도록 요구합니다.
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
🧭 Step 3: Hostname & Hosts File 설정
클러스터의 각 노드는 고유한 호스트네임이 필요하며, /etc/hosts
를 통해 노드 간 이름 확인이 가능해야 합니다.
sudo hostnamectl set-hostname master
sudo nano /etc/hosts
Example:
192.168.1.100 master
192.168.1.101 worker1
192.168.1.102 worker2
📦 Step 4: Install and Configure Containerd (컨테이너 런타임 설정)
Kubernetes는 컨테이너를 실행하기 위해 Container Runtime이 필요하며, 여기서는 containerd를 사용합니다.
sudo apt install -y containerd
sudo systemctl enable containerd
sudo systemctl start containerd
기본 설정 파일을 생성하고 SystemdCgroup
설정을 활성화해야 Kubernetes와 호환됩니다.
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo nano /etc/containerd/config.toml
Change:
SystemdCgroup = true
설정 반영을 위해 containerd 재시작:
sudo systemctl restart containerd
⚙️ Step 5: Install Kubernetes Components (kubeadm, kubelet, kubectl)
Kubernetes 클러스터를 구성하기 위한 기본 도구인 kubeadm, kubelet, kubectl을 설치합니다.
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo systemctl enable kubelet
🚀 Step 6: Initialize Cluster on Master Node (클러스터 초기화)
마스터 노드에서 클러스터를 초기화합니다. Pod 네트워크를 위한 CIDR 설정도 함께 합니다.
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
초기화 후 kubectl
명령을 사용할 수 있도록 kubeconfig 설정:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
🌐 Step 7: Install Calico Network Plugin (네트워크 플러그인 설치)
클러스터 내 파드 간 통신을 가능하게 하려면 네트워크 플러그인이 필요하며, 여기서는 Calico를 사용합니다.
🆚 Flannel vs Calico
항목 | Flannel | Calico |
---|---|---|
주요 목적 | 단순한 Pod 간 네트워크 연결 | 고성능 네트워크 + 보안 정책 제공 |
동작 방식 | 오버레이 네트워크 (VXLAN 사용) | 레이어 3 라우팅 기반 (IP-in-IP 또는 BGP) |
보안 기능 (NetworkPolicy) | ❌ 제한적 또는 불가 | ✅ 완벽 지원 (Kubernetes NetworkPolicy 완벽 호환) |
성능 | 상대적으로 낮음 (VXLAN 터널링 오버헤드) | 상대적으로 높음 (터널링 없이 L3 라우팅 가능) |
설정 난이도 | 간단하고 직관적 | 약간 복잡하지만 유연함 |
확장성 | 소규모/중간 규모에 적합 | 대규모 클러스터에 적합 |
운영 예시 | 테스트, 단순 배포 환경 | 엔터프라이즈, 보안 필수 환경 |
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
🔗 Step 8: Join Worker Nodes (워커 노드 조인)
워커 노드는 마스터 노드에서 출력된 kubeadm join
명령어를 사용해 클러스터에 참여시킵니다.
kubeadm join 192.168.1.100:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
✅ Final Notes (마무리)
이제 Kubernetes 클러스터가 준비되었습니다. 다음 단계로 Helm, Ingress Controller, Metrics Server 등을 설정해 운영 환경을 확장할 수 있습니다.
노드 개수는 홀수개를 맞춰 가용하는 것이 이슈 대응에 유리할 것이라는 생각이 듭니다. 홀수로 설정하고 각 노드에 대한 HW적인 이슈를 어떻게 대응할지 고민해보면 좋을 것 같습니다.