본문 바로가기

전체 글152

Karpenter가 예고 없이 노드를 교체할 때 - Drift 동작과 NodeClass 사고 2건 Karpenter를 운영하면서 실제로 겪은 사고 2건을 정리합니다. 하나는 아무도 배포하지 않았는데 새벽에 노드가 전부 순차 교체된 사건이고, 다른 하나는 노드가 재시작된 뒤 신규 노드가 아예 생성되지 않던 사건입니다. 둘 다 원인은 Karpenter의 정상 동작 원리 안에 있었습니다.사건 1 - 새벽에 노드가 전부 순차 교체됨증상배포도, 스케일 이벤트도 없었는데 워커 노드들이 하나씩 삭제되고 새 노드로 교체됨서비스 순단은 없었지만 노드 이름과 인스턴스가 전부 바뀌어 있었음로그 확인Karpenter 로그를 보면 교체 사유가 명시되어 있습니다 — "reason":"drifted"{"level":"INFO","message":"disrupting nodeclaim(s) via replace, terminat.. 2026. 8. 27.
NAT Gateway 비용 절감 실전 - 일 150TB 트래픽을 100GB로 줄인 3단계 라이브 게임 서비스의 AWS 청구서에서 NAT Gateway 데이터 처리 비용이 비정상적으로 커진 것을 발견하고,트래픽 경로를 3단계로 손봐서 일 $9,000 수준이던 NAT 전송 비용을 $10 미만으로 줄인 기록입니다.AS-IS / TO-BE 트래픽 경로와 비용 변화NAT Gateway 요금 구조NAT Gateway는 두 가지 축으로 과금됩니다 (요금표)시간당 요금 — 떠 있기만 해도 나감 (도쿄 기준 $0.062/h)데이터 처리 요금 — NAT를 통과하는 트래픽 GB당 과금 (도쿄 기준 $0.062/GB)시간당 요금은 예측 가능하지만, 데이터 처리 요금은 경로 설계에 따라 폭발합니다GB당 $0.062 × 일 150TB ≒ 일 $9,300 — 실제로 벌어진 일입니다여기에 NAT Gateway가 다른 가.. 2026. 8. 26.
IAM Roles Anywhere 도입기 - IDC 서버에서 액세스 키 없이 AWS 호출하기 IAM Roles Anywhere?AWS 밖의 워크로드(IDC/온프레미스 서버)가 X.509 인증서로 인증해서 STS 임시 자격증명을 받는 서비스 (공식 소개 문서)장기 IAM 액세스 키 없이 AWS API를 호출할 수 있습니다자격증명은 기본 1시간(최대 12시간)이고 갱신은 공식 헬퍼가 자동으로 처리AWS 안에서 도는 워크로드(EC2/EKS/Lambda)는 대상이 아닙니다 → 인스턴스 프로파일이나 IRSA가 정답왜 도입했나IDC의 Jenkins가 ECS 배포를 해야 하고, FTP 서버가 S3에 파일을 올려야 하는 요구가 꾸준히 발생가장 쉬운 답은 IAM User 액세스 키 발급이지만 두 가지 문제가 있습니다만료가 없다 — 한 번 발급되면 폐기 전까지 영원히 유효추적이 안 된다 — 키가 서버 설정, 스크.. 2026. 8. 26.
EKS DNS 안정화 - NodeLocal DNSCache 도입 검증기 배경 — 왜 DNS를 건드렸나게임 런칭을 앞둔 EKS 클러스터에서 DNS를 사전 튜닝하기로 했습니다. CoreDNS가 Fargate 위에 떠 있는 구성이었는데, 이 구조에는 세 가지 잠재 리스크가 있습니다네트워크 지연 — 모든 DNS 질의가 네트워크를 건너 Fargate 상의 CoreDNS까지 가야 함conntrack 경합 — 짧은 시간에 몰리는 DNS UDP 패킷이 노드의 conntrack 테이블 입력 과정에서 경합(race)을 일으켜 패킷 드랍 발생 가능. 애플리케이션에서 간헐적으로 보이는 "DNS 5초 지연"의 주범입니다 — 드랍된 UDP 질의는 resolver 타임아웃(기본 5초)만큼 기다렸다가 재시도되기 때문부하 집중 — 클러스터 전체 질의가 소수의 CoreDNS 파드에 몰려, CoreDNS 장.. 2026. 8. 26.
EBS 기본 암호화 전사 적용하다 Karpenter를 멈춘 이야기 배경 — 무엇을 하려고 했나조직 전체 계정에 EBS 볼륨 암호화를 강제하는 거버넌스를 배포하는 작업이었습니다 (EBS 기본 암호화 공식 문서)구성은 3단으로 설계했습니다SCP — 미암호화 볼륨 생성(ec2:Encrypted = false)을 조직 차원에서 거부Config 규칙 + 자동 교정 — 계정별 EbsEncryptionByDefault를 켬계정 기본 암호화(EbsEncryptionByDefault) — 켜져 있으면 암호화를 지정하지 않아도 볼륨이 암호화됨일부 테스트 OU에서 문제없이 돌던 것을 수십 개 계정으로 확대하는 배포였습니다사전 점검 — 그리고 그 맹점확대 전 점검은 이렇게 했습니다: 전체 Terraform 코드에서 encrypted = false 리터럴을 검색 → 0건 → 안전하다고 판단이.. 2026. 8. 26.
EKS 노드가 안 늘어날 때 의심할 것 (2) - 서브넷 IP 고갈과 AZ 쏠림 이 글은1편 (vCPU 서비스 쿼터)에 이어, EKS 노드/파드가 안 늘어나는 또 다른 범인 — 서브넷 IP 고갈을 다룹니다한 QA 클러스터에서 실제로 겪은 사건 기준입니다: 한쪽 AZ 서브넷의 가용 IP가 0개가 되면서 신규 파드도, 신규 노드도 못 뜨는 상태증상파드가 IP를 못 받아 기동 실패, 해당 AZ에는 Karpenter가 신규 노드도 프로비저닝하지 못함흥미로운 점: 다른 AZ 서브넷에는 IP가 45개나 남아 있었습니다 → 용량 부족이 아니라 배치의 문제한쪽 AZ만 고갈된 구조 - 노드 쏠림·warm pool·인프라 ENI가 겹친 결과원인 — 하나가 아니라 네 개가 겹쳤다1. 서브넷이 애초에 작았다파드용 서브넷이 AZ당 /26(가용 59개)뿐 — VPC 하나를 pub/pri/db × 2AZ로 잘.. 2026. 8. 26.
EKS 노드가 안 늘어날 때 의심할 것 (1) - vCPU 서비스 쿼터 증상파드가 Pending 상태로 계속 쌓이는데 새 노드가 안 뜹니다Karpenter(또는 Cluster Autoscaler)는 분명 NodeClaim을 만들려고 시도 중노드그룹 설정도, 서브넷도, 인스턴스 타입도 다 정상으로 보임QA 환경 여러 개가 한 AWS 계정을 공유하는 구성에서 특히 자주 발생합니다kubectl get pods -A --field-selector=status.phase=Pendingkubectl get nodeclaims # Karpenter — 계속 생성 시도만 반복흔한 오답들원인을 찾을 때 보통 이 순서로 헤매게 됩니다서브넷 IP 고갈? → aws ec2 describe-subnets로 확인해보면 여유 있음인스턴스 타입 재고 부족(ICE)? → 다른 AZ도 마찬가지NodeP.. 2026. 8. 26.
StackSet 관리 리소스를 수동 삭제하면 생기는 일 - SUCCEEDED 뒤에 숨는 배포 실패 어떤 상황인가CloudFormation StackSet(또는 Control Tower CfCT)으로 수십 개 계정에 IAM Role 같은 표준 리소스를 배포해 운영하는 환경누군가 그 리소스를 콘솔이나 CLI로 직접 삭제하면, 그 순간에는 아무 일도 일어나지 않습니다문제는 다음 배포 때 터집니다 — 그것도 겉으로는 성공한 것처럼 보이는 형태로증상다음 배포(UPDATE)에서 해당 계정만 이런 에러로 실패합니다The role with name xxx-standard-role cannot be found.(Status Code: 404, HandlerErrorCode: NotFound)그런데 파이프라인과 StackSet operation은 SUCCEEDED로 표시됩니다StackSet에는 실패 허용치(failur.. 2026. 8. 26.
IAM Identity Center 로그인 실패, CloudTrail 어디를 봐야 하나 상황사용자가 "로그인이 안 된다"고 문의 — AWS 액세스 포털에서 "인증실패, 로그인 자격증명을 올바르게 입력했는지 확인하세요"IAM Identity Center(구 AWS SSO) 환경이라면 로그인 시도 기록은 CloudTrail에 남습니다 (공식 문서)그런데 어느 이벤트를 봐야 하는지가 문서만 봐서는 전혀 직관적이지 않습니다 — 실제로 조사하면서 두 번 틀렸던 과정을 정리합니다주의할 점 1 — Authenticate 이벤트만 보면 "기록이 없다"고 오판한다처음에는 당연히 Authenticate 이벤트를 조회했습니다 → 해당 사용자 기록 0건"CloudTrail에 안 남는구나"라고 결론 내릴 뻔했지만 오판이었습니다Authenticate는 로그인에 성공했을 때만 기록됩니다 → 실패한 사용자는 여기 나올.. 2026. 8. 26.
Claude Code 서브에이전트 설계 패턴 5가지 서브에이전트가 왜 필요한가Claude Code의 서브에이전트는 독립된 컨텍스트에서 실행되는 보조 에이전트입니다 (공식 문서)메인 세션에서 전부 처리하지 않고 위임하는 이유는 세 가지컨텍스트 분리 — 파일 수십 개를 읽는 작업을 위임하면 그 내용이 메인 대화를 채우지 않고, 결과 요약만 돌아옵니다병렬성 — 독립적인 작업 여러 개를 동시에 돌릴 수 있음권한 최소화 — 에이전트마다 쓸 수 있는 도구를 제한 가능. 리뷰어에게는 읽기 도구만 주는 식작성자와 검증자를 분리할 수 있다는 것이 실무에서 가장 큰 가치입니다 — 코드를 쓴 컨텍스트가 그 코드를 검증하면 같은 맹점을 공유하게 됩니다정의 파일 해부서브에이전트는 마크다운 파일 하나로 정의합니다. 프로젝트용은 .claude/agents/, 개인 전역용은 ~/.c.. 2026. 8. 26.