Ubuntu 환경에서 Kubernetes 설치 및 클러스터 구축

서비스가 확장되면, 컨테이너 기반의 분산 시스템 환경에 대한 필요성이 생깁니다. 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

항목FlannelCalico
주요 목적단순한 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적인 이슈를 어떻게 대응할지 고민해보면 좋을 것 같습니다.

Leave a Comment