kubernetes
글 16편, 메모 0개
Istio 서비스 메시 6주 스터디 — 주차별 실습 기록
Istio를 실무에 도입하기 전에 6주 동안 스터디하며 로컬 클러스터에 직접 띄워 실습했습니다. KinD와 Bookinfo 예제로 트래픽 라우팅·복원력·mTLS·관찰성·컨트롤 플레인까지, 주차별로 확인한 것들을 정리합니다.
FluxCD 무한 reconcile — ignoreDifferences
FluxCD는 Git 상태로 되돌리고 HPA는 부하에 맞춰 바꾸고, 둘이 같은 replicas 필드를 두고 계속 싸웁니다. ignoreDifferences로 그 필드만 FluxCD 관리에서 뺍니다.
FluxCD vs ArgoCD — 역할 분리
둘 다 GitOps 도구지만 하나는 UI가 아예 없고 하나는 UI가 전부라, 자동으로 반영돼야 하는 인프라는 FluxCD에 두고 사람이 보고 롤백하는 앱은 ArgoCD에 맡겨 층을 나눕니다.
nginx Ingress vs ALB Ingress — L7과 L4
nginx Ingress는 클러스터 안에서 라우팅하고, ALB Ingress는 클러스터 밖 AWS 인프라가 합니다. 그리고 Ingress 스펙 자체가 L7 전용이라 NLB(L4)는 Service로 노출합니다.
Vault UI 503 — 서비스 등록 endpoints 비어 있음
vault-active 서비스가 Active 파드를 못 찾고 있었습니다. 파드에 vault-active=true 라벨을 붙이는 건 service_registration 설정인데, 그게 빠져 있었습니다.
ARC — 쿠버네티스 위의 GitHub Actions 셀프호스트 러너
self-hosted 러너가 개수 고정이라 job이 대기했습니다. ARC로 옮기니 job마다 파드가 뜨고 사라지는데, 통신 방향이 K8s→GitHub 단방향이라 내부망에서도 됩니다.
PVC Pending의 세 원인 — EBS CSI · IRSA · hostPort
EBS CSI 컨트롤러가 자격증명을 못 얻어 볼륨을 못 만들었습니다. IRSA를 붙였더니 이번엔 컨트롤러 자체가 Pending이 됐고, 원인은 hostPort였습니다.
Fluentd OOM — 메모리 버퍼 vs 파일 버퍼
버퍼가 메모리에 무제한으로 쌓이는 구성이었습니다. 파일 버퍼로 바꾸고 상한을 걸었는데, 배포 과정에서 다섯 번 막혔습니다.
Vault Secrets Operator refreshAfter — HMAC 기반 변경 감지
30초마다 Vault를 읽는데 부하가 문제되지 않았습니다. hmacSecretData가 값이 같으면 Kubernetes Secret을 건드리지 않아서, 진짜 비용이 드는 쪽이 안 돌아갑니다.
Terraform ForceNew — 가용 영역(AZ) 추가에 클러스터 전체 재생성
클라우드 관리형 쿠버네티스에서 가용 영역(AZ)을 하나 늘리려고 네트워크 모듈에 추가했더니, terraform plan이 클러스터와 노드풀을 전부 replace했습니다. 모듈이 모든 서브넷을 클러스터에 넘겨서, 서브넷 목록 변경이 ForceNew를 건드렸습니다.
과금 지표 vs 파드 런타임 상태
사용량 로그에 '컨테이너 실행 중'이 찍혀 있어 정상이라 봤는데, 실제 파드는 볼륨을 못 붙여 ContainerCreating에서 멈춰 있었습니다. 그 지표는 요청 시점에 쓰이는 값이지 파드가 떠 있다는 뜻이 아니었습니다.
Postgres initdb 실패 — 볼륨 루트의 lost+found
Postgres 파드가 CrashLoopBackOff에 빠졌습니다. 이미지도 권한도 문제가 아니었고, EBS 볼륨을 데이터 디렉토리에 직접 마운트하면서 생긴 lost+found가 initdb의 빈 디렉토리 검사를 통과 못 시켰습니다.
RWO PVC 교착 — 삭제 순서와 Multi-Attach
야간 백업 Job과 사용자 재시작이 같은 RWO 볼륨을 두고 부딪혀 파드가 몇 시간씩 멈췄습니다. pvc-protection 파이널라이저, Multi-Attach, 그리고 볼륨은 지워졌는데 살아남은 Deployment까지 겹친 문제.
CronJob JWKS 유실 — 이미지에 없는 도구와 set -e
게이트웨이에서 JWT 검증이 kid not found로 실패했습니다. JWKS를 갱신하는 CronJob이 python3으로 문자열을 가공했는데, kubectl 이미지엔 python3이 없었고 set -e가 없어서 스크립트가 빈 값으로 ConfigMap을 덮었습니다.
cgroup v1 vs v2 — PSI와 메모리 압력
쿠버네티스 requests/limits는 cgroup으로 구현됩니다. v1은 리소스별로 트리가 쪼개져 있고, v2는 하나로 통합되면서 PSI가 생겨 OOM으로 죽기 전에 메모리 압력을 감지할 수 있습니다.
FailedAttachVolume — 삭제된 EBS 볼륨 복구
잘 쓰던 파드가 갑자기 안 떴습니다. PV가 가리키는 EBS 볼륨이 실제로는 삭제돼 있었고, 볼륨은 InvalidVolume.NotFound였습니다. 새 볼륨을 만들어 PV를 재생성해 복구했습니다.