☁️ 클라우드

Control Plane

Kubernetes Control Plane (Master Components)

클러스터를 관리하고 제어하는 Kubernetes 컴포넌트 집합. API Server, etcd, Scheduler, Controller Manager로 구성.

📖 상세 설명

Control Plane(컨트롤 플레인)은 Kubernetes 클러스터의 "두뇌" 역할을 하는 컴포넌트 집합입니다. 클러스터의 전체 상태를 관리하고, 워크로드 스케줄링, 이벤트 감지, 원하는 상태(Desired State) 유지 등 핵심 기능을 담당합니다.

Control Plane의 핵심 컴포넌트:

프로덕션 환경에서는 고가용성(HA)을 위해 Control Plane을 3개 이상의 노드에 분산 배치합니다. 특히 etcd는 Raft 합의 알고리즘을 사용하므로 홀수 개(3, 5, 7)로 구성해야 합니다. AWS EKS, GKE, AKS 같은 관리형 서비스는 Control Plane을 자동으로 관리해줍니다.

💻 코드 예제

# Control Plane 컴포넌트 상태 확인

# 클러스터 전체 상태 확인
kubectl cluster-info
# Kubernetes control plane is running at https://api.k8s.company.com:6443
# CoreDNS is running at https://api.k8s.company.com:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

# Control Plane 컴포넌트 상태
kubectl get componentstatuses
# NAME                 STATUS    MESSAGE             ERROR
# scheduler            Healthy   ok
# controller-manager   Healthy   ok
# etcd-0               Healthy   {"health":"true"}

# kube-system 네임스페이스의 Control Plane Pod 확인
kubectl get pods -n kube-system -l tier=control-plane
# NAME                                       READY   STATUS    RESTARTS
# etcd-master-1                              1/1     Running   0
# kube-apiserver-master-1                    1/1     Running   0
# kube-controller-manager-master-1           1/1     Running   0
# kube-scheduler-master-1                    1/1     Running   0

# API Server 엔드포인트 확인
kubectl get endpoints kubernetes -n default
# NAME         ENDPOINTS           AGE
# kubernetes   10.0.0.10:6443      30d

# etcd 클러스터 멤버 확인 (etcd Pod에서 실행)
kubectl exec -it etcd-master-1 -n kube-system -- etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  member list -w table

# etcd 클러스터 상태
kubectl exec -it etcd-master-1 -n kube-system -- etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  endpoint health

# API Server 메트릭 확인 (Prometheus 엔드포인트)
kubectl get --raw /metrics | head -50

# Scheduler가 Pod를 스케줄하는 과정 확인
kubectl get events --field-selector reason=Scheduled -A

# Controller Manager 리더 선출 상태 확인
kubectl get lease -n kube-system kube-controller-manager -o yaml
# kubeadm으로 HA Control Plane 구성

# kubeadm-config.yaml - HA 클러스터 설정
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.0
controlPlaneEndpoint: "k8s-api.company.com:6443"  # Load Balancer VIP
networking:
  podSubnet: "10.244.0.0/16"
  serviceSubnet: "10.96.0.0/12"
apiServer:
  extraArgs:
    audit-log-path: /var/log/kubernetes/audit.log
    audit-log-maxage: "30"
    audit-log-maxbackup: "10"
    audit-log-maxsize: "100"
    enable-admission-plugins: NodeRestriction,PodSecurityPolicy
  certSANs:
  - "k8s-api.company.com"
  - "10.0.0.100"
  - "master-1"
  - "master-2"
  - "master-3"
controllerManager:
  extraArgs:
    bind-address: "0.0.0.0"
    terminated-pod-gc-threshold: "100"
scheduler:
  extraArgs:
    bind-address: "0.0.0.0"
etcd:
  local:
    dataDir: /var/lib/etcd
    extraArgs:
      quota-backend-bytes: "8589934592"  # 8GB
      auto-compaction-retention: "8"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: "10.0.0.11"
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/control-plane

---
# 첫 번째 Control Plane 노드 초기화
sudo kubeadm init --config kubeadm-config.yaml --upload-certs

# 출력된 join 명령어로 다른 Control Plane 노드 추가
# kubeadm join k8s-api.company.com:6443 --token  \
#   --discovery-token-ca-cert-hash sha256: \
#   --control-plane --certificate-key 

# etcd 백업 (정기적으로 실행)
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-$(date +%Y%m%d).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# etcd 백업 검증
etcdctl snapshot status /backup/etcd-20240115.db -w table
# Control Plane 트러블슈팅

# 1. API Server 연결 문제 진단
# 인증서 만료 확인
kubeadm certs check-expiration
# CERTIFICATE                EXPIRES                  RESIDUAL TIME
# admin.conf                 Jan 15, 2025 09:00 UTC   364d
# apiserver                  Jan 15, 2025 09:00 UTC   364d
# apiserver-etcd-client      Jan 15, 2025 09:00 UTC   364d

# 인증서 갱신 (만료 전)
kubeadm certs renew all

# API Server 로그 확인
kubectl logs -n kube-system kube-apiserver-master-1 --tail=100

# crictl로 직접 컨테이너 로그 확인 (kubectl 불가 시)
sudo crictl logs $(sudo crictl ps | grep kube-apiserver | awk '{print $1}')

# 2. Scheduler 문제 진단
# Pending Pod가 스케줄되지 않는 이유 확인
kubectl describe pod  | grep -A 10 Events

# 노드 리소스 상태 확인
kubectl top nodes
kubectl describe node  | grep -A 20 "Allocated resources"

# Scheduler 로그에서 스케줄링 실패 원인 찾기
kubectl logs -n kube-system kube-scheduler-master-1 | grep -i "failed"

# 3. Controller Manager 문제 진단
# ReplicaSet이 Pod를 생성하지 못하는 경우
kubectl logs -n kube-system kube-controller-manager-master-1 | grep -i error

# 컨트롤러별 워크큐 상태 (메트릭)
kubectl get --raw /metrics | grep workqueue

# 4. etcd 문제 진단
# etcd 상태 확인
kubectl exec -it etcd-master-1 -n kube-system -- etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  endpoint status -w table

# etcd 디스크 사용량 확인
kubectl exec -it etcd-master-1 -n kube-system -- etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  endpoint status -w json | jq '.[] | {endpoint: .Endpoint, dbSize: .Status.dbSize}'

# etcd 조각 모음 (디스크 공간 확보)
kubectl exec -it etcd-master-1 -n kube-system -- etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  defrag

# 5. HA 클러스터 리더 확인
# Scheduler 리더
kubectl get lease -n kube-system kube-scheduler -o jsonpath='{.spec.holderIdentity}'

# Controller Manager 리더
kubectl get lease -n kube-system kube-controller-manager -o jsonpath='{.spec.holderIdentity}'

🗣️ 실무에서 이렇게 말하세요

클러스터 장애 대응 중
"kubectl이 응답이 없네요. API Server부터 확인해볼게요. Control Plane 노드에 직접 접속해서 crictl로 컨테이너 상태 보니까 kube-apiserver가 재시작되고 있어요. 인증서가 만료됐을 수도 있으니 kubeadm certs check-expiration으로 확인해봅시다."
면접에서 Kubernetes 아키텍처 질문에
"Control Plane은 4개의 핵심 컴포넌트로 구성됩니다. API Server가 모든 요청의 관문 역할을 하고, etcd에 클러스터 상태가 저장됩니다. Scheduler는 Pod를 적절한 노드에 배치하고, Controller Manager는 Deployment, ReplicaSet 등의 컨트롤러를 실행해서 선언적 상태를 유지합니다. HA 구성 시 etcd는 홀수 개로 배치해야 Raft 합의 알고리즘이 정상 동작합니다."
클러스터 용량 계획 회의에서
"현재 노드가 200개인데 etcd 성능이 병목이 되고 있어요. etcd의 기본 쿼터가 2GB라서 오브젝트가 많아지면 느려집니다. 쿼터를 8GB로 늘리고, SSD 스토리지를 사용해야 해요. 또 API Server 요청이 초당 1000개 넘으면 추가 Control Plane 노드가 필요합니다."

⚠️ 흔한 실수 & 주의사항

단일 Control Plane 노드로 프로덕션 운영

단일 Control Plane은 SPOF(단일 장애점)입니다. 해당 노드가 다운되면 새로운 Pod 생성, 스케줄링, 오토스케일링이 모두 멈춥니다. 프로덕션에서는 최소 3개의 Control Plane 노드로 HA 구성하세요.

etcd 백업 미수행

etcd가 손상되면 클러스터 전체 상태가 유실됩니다. Deployment, Service, ConfigMap 등 모든 오브젝트 정의가 사라집니다. 정기적인 etcd 스냅샷 백업과 복원 테스트는 필수입니다. Velero 같은 도구로 자동화하세요.

올바른 방법: 관리형 Kubernetes 사용

EKS, GKE, AKS 같은 관리형 서비스는 Control Plane을 자동으로 관리해줍니다. HA 구성, 자동 업그레이드, 백업, 모니터링이 기본 제공되어 운영 부담이 크게 줄어듭니다. 직접 Control Plane을 운영해야 하는 특수한 요구사항이 없다면 관리형 서비스를 권장합니다.

🔗 관련 용어

📚 더 배우기