-
Notifications
You must be signed in to change notification settings - Fork 0
KR_K8s_Operations
somaz edited this page Mar 30, 2026
·
1 revision
etcd는 revision 기반 MVCC로 모든 변경 이력을 저장하여 디스크가 증가한다. Compaction은 오래된 revision을 삭제하고, Defragmentation은 실제 디스크 공간을 회수한다.
- ① etcdctl endpoint status로 DB 크기 확인 →
- ② etcdctl compact로 3시간 이전 revision 삭제 →
- ③ etcdctl defrag로 모든 멤버 defrag →
- ④ etcd_quota_backend_bytes를 8GB로 증설.
--auto-compaction-retention=1h옵션으로 자동 compaction 활성화.
Prometheus로 etcd_mvcc_db_total_size_in_bytes 모니터링한다.
- etcd는 Raft 합의 알고리즘으로 쿼럼(과반수)이 필요하다. 3노드(장애 허용 1), 5노드(장애 허용 2)가 일반적이며, 짝수는 홀수보다 장애 허용이 낮아 비권장이다.
- kube-apiserver는 여러 개 실행하고 LoadBalancer로 분산한다.
- kube-scheduler와 kube-controller-manager는 리더 선출(leader election)로 Active-Standby 구성한다.
- 멀티 AZ 배치 시 etcd는 홀수 AZ에 배치하고, 네트워크 지연이 낮은 AZ를 선택한다.
- etcd 백업은 etcdctl snapshot save로 주기적 실행하고 S3에 저장한다.
- PDB는 자발적 중단(voluntary disruption) 시 최소 가용 Pod 수를 보장한다.
- minAvailable vs maxUnavailable:
minAvailable=2는 항상 2개 이상 유지,maxUnavailable=1은 최대 1개만 중단 허용. - 중요 서비스는
minAvailable=replicas-1로 설정하여 최소한의 중단만 허용한다. Drain 중 PDB 위반 시 Pod가 eviction되지 않아 Drain이 block된다. - 이때
--disable-eviction옵션으로 강제 삭제하거나, PDB를 임시로 수정한다. 클러스터 업그레이드 시 PDB를 고려하여 노드를 순차적으로 Drain한다.
- ① Guaranteed(Requests=Limits) - 최우선 보호,
- ② Burstable(Requests<Limits) - 중간 보호,
- ③ BestEffort(미설정) - 먼저 종료. 메모리 부족 시 OOM Killer가 낮은 QoS 클래스부터 종료한다.
- ① Requests를 실제 사용량 기준으로 설정(VPA 권장값 참고) →
- ② Limits를 여유있게 설정하여 spike 허용 →
- ③ LimitRange로 네임스페이스 기본값 설정 →
- ④ ResourceQuota로 전체 리소스 제한.
- JVM은
-XX:MaxRAMPercentage로 컨테이너 메모리 인식하도록 설정한다.
Cluster Autoscaler는 Node Group 단위로 스케일하며, Pending Pod 감지 후 10초마다 확인하여 느리다.
- 특정 인스턴스 타입만 사용하고, 다운스케일은 10분 후 발생한다.
Karpenter는 Pod 요구사항(CPU, 메모리, GPU)을 보고 최적의 인스턴스를 즉시 프로비저닝한다.
- Spot/On-Demand 혼합, 다양한 인스턴스 타입 자동 선택, Consolidation으로 리소스 최적화, 빠른 스케일(초 단위)을 제공한다.
- 소규모는 CA, 대규모/복잡한 워크로드는 Karpenter를 권장한다.
- Headless Service(clusterIP: None)는 개별 Pod DNS(pod-0.service.namespace.svc.cluster.local)를 제공하여 StatefulSet Pod를 직접 접근한다.
- volumeClaimTemplates는 각 Pod에 독립적인 PVC를 자동 생성하고, Pod 재시작 시 동일한 PVC를 재연결한다.
- Pod 삭제 시 PVC는 보존되며, StatefulSet 삭제 시에도 수동 삭제가 필요하다.
- 순서 보장: pod-0부터 순차 생성, 역순 삭제. podManagementPolicy: OrderedReady(순차) vs Parallel(병렬). partition을 사용한 Canary 업데이트가 가능하다.
- CronJob은 UTC 기준으로 동작하므로 한국 시간(KST, UTC+9) 고려가 필요하다. timeZone 필드(K8s 1.25+)로 명시적 설정 가능하다.
- concurrencyPolicy: Allow(중복 실행 허용), Forbid(이전 Job 완료 전 skip), Replace(이전 Job 종료 후 실행).
- startingDeadlineSeconds는 스케줄 놓쳤을 때 재시도 기한이다. 실패 처리: backoffLimit으로 재시도 횟수 제한,
- restartPolicy: OnFailure로 Pod 재시작. 멱등성 보장이 중요하며, 분산 락(Redis, etcd)으로 중복 실행 방지한다.
- DaemonSet은 모든(또는 특정) 노드에 정확히 1개 Pod를 실행한다.
- updateStrategy: RollingUpdate(순차 업데이트, maxUnavailable로 제어) vs OnDelete(수동 삭제 시 업데이트).
- RollingUpdate는 한 번에 하나씩 업데이트하여 안전하다.
- 노드 선택: nodeSelector(단순), nodeAffinity(고급), tolerations(Taint 허용)를 조합한다.
- 특정 노드 제외는 nodeName AntiAffinity로 설정한다.
- Monitoring Agent(node-exporter), CNI, kube-proxy는 DaemonSet으로 배포하며, 마스터 노드도 포함하려면 Toleration을 추가한다.
- Admission Webhook은 리소스 생성/수정 시 검증/변환을 수행한다.
- Mutating Webhook은 리소스를 수정(sidecar 주입, label 추가)하고, Validating Webhook은 검증(naming 규칙, 보안 정책)한다.
- ① Istio/Linkerd의 sidecar 자동 주입 →
- ② OPA Gatekeeper의 정책 검증 →
- ③ Vault의 Secret 주입 →
- ④ 커스텀 검증(팀별 네임스페이스 규칙). 구현: Webhook 서버(Go/Python) + TLS 인증서 + MutatingWebhookConfiguration/ValidatingWebhookConfiguration 리소스. failurePolicy: Ignore(실패 시 허용) vs Fail(실패 시 거부).
- API Priority & Fairness(APF, K8s 1.20+)는 클라이언트 요청을 분류하여 공정하게 처리한다.
- FlowSchema는 요청을 분류하고, PriorityLevelConfiguration은 동시 실행 수와 큐 길이를 정의한다.
- system-leader-election(높음), workload-high(중간), workload-low(낮음) 등 우선순위를 부여한다.
- Rate Limiting은
--max-requests-inflight(기본 400),--max-mutating-requests-inflight(기본 200)로 제어한다. - 대규모 클러스터에서 List 요청이 API 서버를 과부하시킬 수 있으므로, Informer의 resync period를 늘리고, Pagination을 사용한다.
💡 용어 설명:
- 고급 운영 관련 용어들(etcd, Compaction, Defragmentation, PDB, QoS, StatefulSet, Headless Service, Admission Webhook, API Priority & Fairness 등)에 대한
- 상세한 설명은 문서 상단의 주요 용어 통합 정리 > 고급 운영 섹션을 참고하세요.