Skip to main content

10. Cluster Administration

CKA 시험의 55%(Architecture 25% + Troubleshooting 30%)를 차지하는 핵심 영역


1. 클러스터 업그레이드

1.1 업그레이드 순서

flowchart LR
CP1["1. Control Plane<br/>업그레이드"] --> W1["2. Worker 노드 1<br/>drain → upgrade → uncordon"]
W1 --> W2["3. Worker 노드 2"] --> WN["4. ... 반복"]

1.2 Control Plane 업그레이드

# 1. kubeadm 업그레이드
apt-mark unhold kubeadm
apt-get update && apt-get install -y kubeadm=1.30.0-*
apt-mark hold kubeadm

# 2. 업그레이드 계획 확인
kubeadm upgrade plan

# 3. 업그레이드 적용
kubeadm upgrade apply v1.30.0

# 4. kubelet, kubectl 업그레이드
apt-mark unhold kubelet kubectl
apt-get install -y kubelet=1.30.0-* kubectl=1.30.0-*
apt-mark hold kubelet kubectl
systemctl daemon-reload && systemctl restart kubelet

1.3 Worker 노드 업그레이드

# 1. 노드 drain (Pod를 다른 노드로 이동)
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data

# 2. kubeadm, kubelet 업그레이드
kubeadm upgrade node
apt-get install -y kubelet=1.30.0-* kubectl=1.30.0-*
systemctl daemon-reload && systemctl restart kubelet

# 3. 노드 복귀
kubectl uncordon <node>

⚠️ 한 번에 하나의 마이너 버전만 업그레이드. 1.28 → 1.30은 안 됨. 1.28 → 1.29 → 1.30 순서로.


2. etcd 백업/복원

CKA에서 자주 출제되는 주제.

# 백업
ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-snapshot.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

# 복원
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-snapshot.db \
--data-dir=/var/lib/etcd-restored

# etcd Static Pod 매니페스트에서 data-dir 변경
vim /etc/kubernetes/manifests/etcd.yaml
# volumes.hostPath.path를 /var/lib/etcd-restored로 변경

3. 인증서 관리

# 인증서 만료일 확인
kubeadm certs check-expiration

# 인증서 갱신 (모든 인증서)
kubeadm certs renew all

# 갱신 후 Control Plane 컴포넌트 재시작
# (Static Pod이므로 매니페스트 파일을 잠시 이동하면 자동 재시작)

K8s 인증서 기본 유효기간: 1년. 자동 갱신이 설정되어 있지 않으면 수동으로 갱신해야 함.


4. 노드 관리

# 스케줄링 비활성화 (새 Pod 배치 방지)
kubectl cordon <node>

# 기존 Pod 축출 + 스케줄링 비활성화
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data

# 스케줄링 재활성화
kubectl uncordon <node>
명령기존 Pod새 Pod
cordon유지❌ 배치 안 됨
drain축출❌ 배치 안 됨
uncordon✅ 배치 가능

5. 트러블슈팅

5.1 Pod 문제

상태원인확인
Pending리소스 부족, nodeSelector 불일치, PVC 미바인딩kubectl describe pod → Events
ImagePullBackOff이미지 없음, Registry 인증 실패, 네트워크이미지 이름/태그 확인, docker pull 테스트
CrashLoopBackOff앱 크래시, 설정 오류, 리소스 부족kubectl logs, kubectl logs --previous
Error컨테이너 비정상 종료kubectl describe pod → Exit Code
Evicted노드 리소스 부족 (메모리/디스크)노드 상태 확인, requests/limits 조정

5.2 노드 문제

상태원인확인
NotReadykubelet 중단, 네트워크 문제, 디스크 가득systemctl status kubelet, journalctl -u kubelet
MemoryPressure메모리 부족kubectl describe node, free -h
DiskPressure디스크 부족df -h

5.3 Service/네트워크 문제

# DNS 확인
kubectl run test --rm -it --image=busybox -- nslookup <service-name>

# Service → Pod 연결 확인
kubectl get endpoints <service-name>

# kube-proxy 상태
kubectl logs -n kube-system -l k8s-app=kube-proxy

# CNI 상태
kubectl get pods -n kube-system | grep -E "calico|cilium|flannel"

5.4 트러블슈팅 플로우

flowchart TD
Issue["문제 발생"]
Issue --> PodCheck{"Pod 상태?"}
PodCheck -->|"Pending"| Describe["kubectl describe pod<br/>→ Events 확인"]
PodCheck -->|"CrashLoop"| Logs["kubectl logs<br/>kubectl logs --previous"]
PodCheck -->|"Running<br/>but 접근 불가"| SvcCheck{"Service?"}
SvcCheck --> Endpoints["kubectl get endpoints<br/>→ Pod 연결 확인"]
SvcCheck --> DNS["nslookup <service><br/>→ DNS 확인"]
SvcCheck --> Ingress_Check["kubectl describe ingress<br/>→ 규칙 확인"]

다음 글

→ #11 Helm & Package Management