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 노드 문제
| 상태 | 원인 | 확인 |
|---|---|---|
| NotReady | kubelet 중단, 네트워크 문제, 디스크 가득 | 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