Kubernetes에서의 좌충우돌: Control Plane 프로비저닝
Source: Dev.to
Google Kubernetes Engine(GKE)과 같은 관리형 플랫폼을 사용할 때는 플랫폼이 대신 처리해 주기 때문에 신경 쓸 필요가 없는 일들이 많이 있습니다. 하지만 그 단순한 겉면 아래에서 어떤 메커니즘이 작동하고 있는지 생각해 본 적이 있나요? 아마도 직접 해볼 수 있는 방법이나 최소한 시도해 볼 방법이 궁금했을지도 모릅니다.
제가 이 프로젝트를 시작한 동기는 간단했습니다. 직접 해보면서 쿠버네티스의 핵심을 진정으로 이해하고 싶었기 때문입니다. 관리형 서비스의 추상화를 넘어, 저는 레이어를 하나씩 벗겨 핵심 구성 요소를 살펴보기로 했습니다. 이 방법은 표준 Google Compute Engine(GCE) 가상 머신을 설정하고, 모든 구성 요소를 수동으로 설치·설정하며, 네트워킹을 직접 연결하는 과정을 포함합니다. 이러한 의도적인 직접 작업은 효과적인 문제 해결, 최적화 및 자체 클러스터를 더 잘 이해하는 데 필요한 기본 지식을 쌓는 데 도움이 됩니다.
전제 조건
- Google Cloud Platform (GCP) 계정.
- 로컬 머신에 설치되고 인증된 gcloud CLI.
Step 1 – Provision the Base Instance
우리는 “시드” 또는 기본 인스턴스를 만드는 것부터 시작합니다. 이 VM은 모든 필수 소프트웨어를 설치하는 기반이 되며, Kubernetes 노드/VM이 어떻게 구성되는지에 대한 명확한 템플릿을 제공합니다. E2 시리즈는 GCP에서 가장 비용 효율적인 VM을 제공하므로, Kubernetes 컨트롤 플레인에 적합한 성능‑대‑비용 균형을 위해 자주 선택됩니다. 우리는 Kubernetes가 최소 2 vCPU와 2 GB RAM을 편안히 실행하기 때문에 e2-standard-2 머신 타입을 사용합니다.
gcloud compute instances create k8s-seed \
--zone=us-central1-a \
--machine-type=e2-standard-2 \
--image-project=ubuntu-os-cloud \
--image-family=ubuntu-2204-lts \
--boot-disk-size=50GB
생성된 후, 머신에 SSH 접속합니다:
gcloud compute ssh k8s-seed --zone=us-central1-a
Step 2 – Configure the OS
Kubernetes는 기본 Linux OS에 대한 특정 요구 사항이 있습니다. 커널 모듈을 로드하고 네트워크 설정을 조정하여 Kubernetes가 트래픽을 올바르게 조작할 수 있도록 해야 합니다.
1. Load Kernel Modules
이 모듈들은 Kubernetes가 Pod와 Service의 네트워크 트래픽을 조작할 수 있게 해 줍니다.
cat /dev/null
2. Install containerd
sudo apt-get update
sudo apt-get install -y containerd.io
3. Configure systemd Cgroups
Kubernetes는 systemd를 cgroup 드라이버로 사용할 것을 권장합니다.
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
단계 4 – Kubernetes 도구 설치
이제 “빅 쓰리”를 설치합니다:
- kubeadm – 부트스트래퍼.
- kubelet – 노드 에이전트.
- kubectl – CLI.
# Add Kubernetes repo
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
# Install
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
이제 기본 VM이 준비되어 추가 Kubernetes 부트스트래핑(예: kubeadm init으로 컨트롤 플레인 초기화)을 수행할 수 있습니다. 남은 단계—네트워킹 설정, 워커 노드 조인, 그리고 파드 네트워크 배포—를 진행하여 원시 GCE VM에서 완전하게 작동하는 자체 관리 Kubernetes 클러스터를 구축하십시오.
단계 5 – 클러스터 초기화
이 시점에서, 우리의 “시드” 머신은 완전히 준비되었습니다. 이제 이를 사용하여 컨트롤 플레인을 초기화합니다.
1. Init 실행
우리는 선택한 네트워킹 플러그인(Calico)과 호환되는 pod 네트워크 CIDR을 지정합니다.
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
2. Kubectl 구성
새 클러스터에 대해 명령을 실행하려면:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Step 6 – 네트워킹 설치 (Calico)
노드들은 컨테이너 네트워크 인터페이스(CNI)가 설치될 때까지 통신할 수 없습니다. 우리는 Calico를 사용할 것입니다.
Calico는 캡슐화나 오버레이 없이 배포함으로써 고성능 네트워킹을 제공하고, 유연한 네트워크 정책 적용을 위한 분산 방화벽을 제공합니다.
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml
kubectl get nodes를 실행하세요; 1분 이내에 노드가 Ready 상태로 전환되는 것을 확인할 수 있습니다.
GKE만 사용했다면 어떨까요?
우리가 방금 한 작업을 이해하려면, 단일 Google Kubernetes Engine (GKE) 명령 하나로 완전 관리형, 프로덕션 수준의 동등한 환경을 구축할 수 있다는 점을 기억하세요:
gcloud container clusters create k8s-easy \
--zone us-central1-a \
--machine-type e2-standard-2 \
--num-nodes 3
이 한 줄 명령은 제어 플레인을 프로비저닝하고(구글이 관리), 워커 노드를 생성하며, 네트워킹을 구성하고, 인증을 설정합니다. 일부를 수동으로 구축함으로써, 이제 이러한 구성 요소들이 어떻게 함께 작동하는지 이해하게 된 것입니다.
다음 단계는?
축하합니다! 이제 처음부터 기능적인 Kubernetes 제어 플레인을 성공적으로 구축했습니다.
클러스터를 “다소 어려운 방법”으로 구축함으로써 관리형 서비스의 사용자 수준을 넘어 현대 컨테이너화된 애플리케이션을 조정하는 구성 요소들을 이해하게 되었습니다. 이 기반은 프로덕션‑급 Kubernetes 환경을 문제 해결하고, 최적화하며, 확장하는 데 핵심입니다.
다음 단계:
- 기존 클러스터에 워커 노드를 추가하세요.
- Calico를 사용한 고급 네트워킹 정책을 탐색하세요.
- 영구 스토리지, 모니터링 및 로깅 솔루션을 구현하세요.
- RBAC, 감사 로깅 및 네트워크 정책으로 제어 플레인을 강화하세요.
참고: 우리는 apt-mark hold를 사용하여 자동 업데이트가 클러스터를 손상시키는 것을 방지합니다.