DevOps/Kubernetes

Ubuntu 환경에서 Kubernetes 설치 및 클러스터 구성 가이드

DEBTOLEE 2025. 4. 4. 11:31

서비스가 확장되다 보면 자연스럽게 분산 시스템에 대한 고민이 시작되고, Kubernetes(쿠버네티스) 같은 오케스트레이션 도구에 대한 필요성을 느끼게 됩니다. 이 글에서는 Ubuntu 환경에서 Kubernetes를 설치하고 클러스터를 구성하는 전체 과정을 정리합니다.


🧰 사전 준비: 하드웨어 및 시스템 요구사항

Kubernetes 공식 문서 기준, 노드별 권장 사양은 다음과 같습니다.

마스터 노드 권장 사양

  • CPU: 멀티코어
  • RAM: 8GB 이상
  • 스토리지: SSD 또는 NVMe
  • 네트워크: 기가비트 이더넷 이상

워커 노드 권장 사양

  • CPU: 멀티코어
  • RAM: 4GB 이상

운영 체제는 Ubuntu 20.04 LTS 이상을 권장합니다.


🔥 1. 방화벽 설정 및 필수 패키지 설치

sudo apt update
sudo apt install -y firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
sudo ufw disable

마스터 노드에서 열어야 할 포트:

sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10257/tcp
sudo firewall-cmd --permanent --add-port=10259/tcp
sudo firewall-cmd --reload

워커 노드에서 열어야 할 포트:

sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
sudo firewall-cmd --reload

Kubernetes는 여러 포트를 통해 마스터와 워커 노드 간 통신을 하기 때문에 필수 포트를 미리 열어야 클러스터가 정상적으로 작동합니다.


🚫 2. 스왑 비활성화

Kubernetes는 메모리 스케줄링을 정확히 하기 위해 스왑 공간을 사용하는 것을 허용하지 않습니다.

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

🧭 3. 호스트네임 및 /etc/hosts 파일 설정

DNS 없이도 노드 간 통신이 가능하도록 IP와 호스트명을 연결합니다.

sudo hostnamectl set-hostname master
sudo nano /etc/hosts

예시:

192.168.1.100 master
192.168.1.101 worker1
192.168.1.102 worker2

📦 4. Containerd 설치 및 설정

Kubernetes는 컨테이너 런타임을 필요로 하며, containerd는 공식 지원되는 안정적인 런타임입니다. SystemdCgroup 설정은 필수입니다

sudo apt install -y containerd
sudo systemctl enable containerd
sudo systemctl start containerd

기본 설정 생성 및 수정:

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo nano /etc/containerd/config.toml

SystemdCgroup = false → SystemdCgroup = true로 수정 후 저장

sudo systemctl restart containerd

⚙️ 5. Kubernetes 구성 요소 설치

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

🚀 6. 클러스터 초기화 (마스터 노드)

마스터 노드를 초기화하고 Kubernetes 클러스터의 핵심 컴포넌트를 배포합니다.

sudo kubeadm init --pod-network-cidr=192.168.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

🌐 7. Calico 네트워크 플러그인 설치

Pod 간 통신을 위한 네트워크 계층을 구성합니다. flannel을 많이 사용하는 것 같은데 본 글에서는 규모가 있는 프로젝트를 가상하고 calico를 사용하겠습니다.

주요 목적 단순한 Pod 간 네트워크 연결 고성능 네트워크 + 보안 정책 제공
동작 방식 오버레이 네트워크 (VXLAN 사용) 레이어 3 라우팅 기반 (IP-in-IP 또는 BGP)
보안 기능 (NetworkPolicy) ❌ 제한적 또는 불가 ✅ 완벽 지원 (Kubernetes NetworkPolicy 완벽 호환)
성능 상대적으로 낮음 (VXLAN 터널링 오버헤드) 상대적으로 높음 (터널링 없이 L3 라우팅 가능)
설정 난이도 간단하고 직관적 약간 복잡하지만 유연함
확장성 소규모/중간 규모에 적합 대규모 클러스터에 적합
운영 예시 테스트, 단순 배포 환경 엔터프라이즈, 보안 필수 환경
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

🔗 8. 워커 노드 클러스터 조인

마스터 노드에서 출력된 kubeadm join 명령어를 복사한 후 각 워커 노드에서 실행합니다:

kubeadm join 192.168.1.100:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

✅ 마무리

이제 Kubernetes 클러스터가 완성되었습니다. 다음 단계로 Helm, Ingress Controller, Metrics Server 등을 추가하여 클러스터를 더욱 실무에 맞게 확장할 수 있습니다. 워크로드 배포, 자동화된 운영 환경 구성도 이 기반 위에서 구현 가능합니다.