#쿠버네티스
136 편의 글
Certified Kubernetes Security Specialist (CKS) #4 RBAC 최소 권한 깊이 (Cluster Hardening)
Certified Kubernetes Security Specialist (CKS) 시리즈의 네 번째 글입니다. CKA에서 익힌 RBAC 위에 최소 권한 원칙을 얹어, 과도하게 넓은 Role을 어떻게 찾아내고 좁히는지를 보안 관점에서 깊게 다루겠습니다. wildcard verb/resource의 위험, default ServiceAccount 권한 제거, ClusterRoleBinding 남용을 RoleBinding으로 줄이기, aggregated ClusterRole 주의점, secrets get,pods/exec,escalate,bind,impersonate 같은 위험한 권한을 식별하고, kubectl auth can-i --as로 좁힌 권한을 검증하는 흐름까지 정리하겠습니다.

CI/CD 파이프라인
23장까지 갖춰진 myshop-api는 새 버전이 들어오는 과정에 여전히 사람이 많이 개입합니다. 이번 챕터는 그 과정을 자동화합니다. GitHub Actions에서 OIDC 신뢰로 정적 키 없이 AWS ECR에 컨테이너 이미지를 푸시하고, 매니페스트 repo의 Helm values를 자동 commit 하고, 20장에서 다룬 ArgoCD가 그 변경을 감지해 클러스터로 동기화하는 한 사이클을 정리합니다. PR 승인 게이트, dev / prod 분기, Argo Rollouts 카나리 배포, 이미지 태그 immutability까지 함께 다룹니다.

CNI 깊이
같은 NetworkPolicy 매니페스트가 Calico 위에서는 iptables 룰로, Cilium 위에서는 eBPF 프로그램으로 풀리는 데이터 플레인의 깊이를 다룹니다. K8s 네트워크 모델의 네 조건, CNI 인터페이스의 정체, iptables · IPVS · eBPF 세 데이터 플레인 모델, Calico와 Cilium의 비교, 그리고 CNI 선택의 실전 기준까지 한 사이클로 정리합니다.

CRD와 Operator 패턴
K8s API를 사용자 도메인의 객체로 확장하는 두 축을 다룹니다. CustomResourceDefinition으로 새 객체 종류를 정의하고, controller-runtime 기반의 Operator가 1장에서 본 reconcile loop를 그 객체 위에 걸어 K8s의 선언적 모델을 도메인까지 확장합니다. ownerReference · finalizer · status subresource의 세 표준 패턴과 Kubebuilder · Operator SDK의 빌드 도구까지 한 사이클로 정리합니다.

DB 연동 — RDS · External Secrets
22장에서 외부 노출까지 만든 myshop-api는 데이터 저장소가 없는 빈 껍데기입니다. 이번 챕터는 그 빈 곳을 채웁니다. RDS PostgreSQL을 Terraform으로 띄우고, 마스터 비밀번호를 AWS Secrets Manager에 두고, External Secrets Operator로 그 비밀을 K8s Secret으로 자동 동기화하고, IRSA로 정적 자격 증명 없이 권한을 부여하고, PgBouncer로 커넥션 풀을 얹고, 스키마 마이그레이션을 Helm hook 기반 Job 패턴으로 자동화하는 흐름까지 한 사이클로 정리합니다.

docker-compose에서 k8s로
부록 A — Docker / docker-compose까지 와 본 독자가 K8s로 옮겨갈 때 막히는 일곱 가지 차이를 한 곳에 정리합니다. docker-compose.yml의 각 키가 K8s의 어떤 리소스에 대응되는지 매핑 표로 정리하고, 작은 web + db의 docker-compose.yml을 K8s 매니페스트로 옮기는 마이그레이션 한 사이클을 풀어내고, kompose 자동 변환 도구의 한계와 그 다음 단계를 짚습니다. 책의 마지막 챕터이지만, Docker까지 와 본 독자에게는 출발점이 됩니다.

EKS 클러스터 셋업
AWS EKS 위에 진짜 운영 클러스터를 처음부터 띄우는 흐름을 다룹니다. Terraform으로 VPC · EKS 컨트롤 플레인 · 노드 그룹 · IRSA · 필수 애드온 (VPC CNI · CoreDNS · kube-proxy · EBS CSI)을 한 코드베이스로 선언하고, eksctl의 빠른 셋업 옵션, Karpenter의 노드 오토스케일링, 그리고 첫 점검 · 비용 모델까지 한 사이클로 정리합니다.

GitOps
매니페스트의 source of truth를 git에 두고 클러스터 안의 컨트롤러가 git을 watch 해 자동으로 동기화하는 운영 모델을 다룹니다. push 모델과 pull 모델의 차이, GitOps의 네 원칙, ArgoCD의 Application CRD · App of Apps · Sync Wave, Flux의 GitRepository · Kustomization · HelmRelease, 디렉터리 구조 패턴, 그리고 비밀을 git에 두는 세 가지 표준 도구까지 한 사이클로 정리하며 3부를 마무리합니다.

kubectl 디버깅 패턴
5부 (운영 · 디버깅 · 비용)의 첫 챕터입니다. 운영 클러스터에서 가장 자주 마주치는 사고 (CrashLoopBackOff, OOMKilled, ImagePullBackOff, Pending, Service가 안 닿음)의 진단 트리를 한 곳에 정리합니다. describe · events · logs의 세 명령에서 출발해 kubectl debug의 ephemeral container, 네트워크 진단 패턴, 19장 옵저버빌리티 스택과의 결합까지 신입 SRE의 첫 reference가 되는 매뉴얼로 묶습니다.

RBAC / NetworkPolicy / ResourceQuota
한 클러스터에 여러 팀 · 환경이 같이 사는 멀티테넌트 운영의 격리를 만드는 세 정책 객체를 다룹니다. RBAC의 Role · ClusterRole · ServiceAccount · RoleBinding 모델, NetworkPolicy의 default-deny 패턴과 CNI 의존성, ResourceQuota와 LimitRange의 짝 관계까지 한 사이클로 정리하며 2부를 마무리합니다.

RBAC / ServiceAccount 깊이
14장 RBAC의 기본 위에 운영 클러스터에서 마주치는 깊이를 한 층 더 얹습니다. ClusterRole을 라벨로 합치는 Aggregated ClusterRole, 다른 주체의 권한으로 호출하는 Impersonation, ServiceAccount 토큰이 영구 Secret에서 만료 · audience · rotation을 갖춘 projected token으로 바뀐 흐름, 그리고 EKS의 IRSA · GKE의 Workload Identity로 K8s ServiceAccount를 클라우드 IAM과 묶는 모델까지 한 사이클로 정리합니다.

모니터링·알람
24장까지 갖춰진 myshop-api는 코드부터 배포까지 자동화됐지만, 그 동작을 보지 못하면 운영이 굴러가지 않습니다. 이번 챕터는 EKS 클러스터의 옵저버빌리티 스택을 본격적으로 얹습니다. kube-prometheus-stack으로 Prometheus · Grafana · Alertmanager를 한 번에 설치하고, ServiceMonitor / PrometheusRule로 myshop-api 메트릭과 4 golden signals 알람을 표준화하고, Loki로 로그를, CloudWatch Container Insights로 AWS 결합 메트릭과 장기 보관을 함께 잡고, severity · team 라우팅으로 Slack / PagerDuty의 on-call 흐름까지 한 사이클로 정리합니다.