Control Plane
Kubernetes Control Plane (Master Components)
클러스터를 관리하고 제어하는 Kubernetes 컴포넌트 집합. API Server, etcd, Scheduler, Controller Manager로 구성.
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}'
단일 Control Plane은 SPOF(단일 장애점)입니다. 해당 노드가 다운되면 새로운 Pod 생성, 스케줄링, 오토스케일링이 모두 멈춥니다. 프로덕션에서는 최소 3개의 Control Plane 노드로 HA 구성하세요.
etcd가 손상되면 클러스터 전체 상태가 유실됩니다. Deployment, Service, ConfigMap 등 모든 오브젝트 정의가 사라집니다. 정기적인 etcd 스냅샷 백업과 복원 테스트는 필수입니다. Velero 같은 도구로 자동화하세요.
EKS, GKE, AKS 같은 관리형 서비스는 Control Plane을 자동으로 관리해줍니다. HA 구성, 자동 업그레이드, 백업, 모니터링이 기본 제공되어 운영 부담이 크게 줄어듭니다. 직접 Control Plane을 운영해야 하는 특수한 요구사항이 없다면 관리형 서비스를 권장합니다.