- Published on
EKS STS 엔드포인트 타임아웃 - VPC·NAT·DNS 해결
- Authors
- Name
- 스타차일드
- https://x.com/ETFBITX
서버리스나 EC2에서는 잘 되던 AWS API 호출이, EKS 안에서만 간헐적으로 멈추거나 sts.amazonaws.com 호출에서 타임아웃이 나는 경우가 있습니다. 특히 IRSA(서비스어카운트 기반 AssumeRoleWithWebIdentity), 이미지 풀(간접적으로 ECR 토큰), 외부 시크릿/컨트롤러(Cluster Autoscaler, ExternalDNS, cert-manager 등)가 STS를 자주 때리기 때문에, STS 네트워크 경로가 막히면 클러스터 전체가 연쇄적으로 느려지거나 실패합니다.
이 글은 “STS 엔드포인트 타임아웃”을 VPC(라우팅/보안), NAT(egress), DNS(CoreDNS/프라이빗 DNS) 관점에서 재현 가능한 체크리스트로 정리하고, 가장 안전한 해결책(Interface VPC Endpoint)까지 연결합니다.
관련 EKS 네트워크/운영 이슈를 함께 다룬 글로는 EKS에서 kubectl exec·logs가 안 될 때 진단법, IaC 상태 꼬임이 네트워크 변경과 함께 터질 때 참고할 Terraform EKS 상태 꼬임으로 apply 무한 반복 끊기도 같이 보면 좋습니다.
1) 대표 증상: “STS만” 느리거나 멈춘다
다음 중 하나면 거의 STS 경로 문제입니다.
- Pod 로그에
RequestError: send request failed/context deadline exceeded/i/o timeout - IRSA 사용 Pod에서
AssumeRoleWithWebIdentity가 타임아웃 - AWS SDK가
sts.amazonaws.com또는sts.<region>.amazonaws.com에서만 지연 - 노드/Pod가 프라이빗 서브넷에 있고, 인터넷 egress가 NAT에 의존
- 특정 AZ에 있는 노드에서만 더 자주 발생(= AZ별 NAT/라우팅 차이)
STS는 인증의 관문이라, 여기서 막히면 ECR 토큰 갱신, S3 접근, CloudWatch 로그 전송 등도 같이 줄줄이 영향을 받을 수 있습니다.
2) 먼저 확인: STS 엔드포인트 종류(글로벌 vs 리전)
STS는 기본적으로 글로벌 엔드포인트(sts.amazonaws.com)를 쓰기도 하고, 리전 엔드포인트(sts.ap-northeast-2.amazonaws.com)를 쓰기도 합니다. 기업망/프라이빗 환경에서는 글로벌이 막히고 리전은 되는 케이스가 꽤 있습니다.
- AWS CLI/SDK 설정에서
sts_regional_endpoints = regional로 강제하면 해결되는 경우가 있습니다. - 하지만 EKS에서 “타임아웃”이라면 대개 네트워크 egress 또는 DNS 이슈이므로, 근본 해결은 아래 진단을 따라가야 합니다.
3) 재현/진단: Pod 안에서 DNS → TCP → TLS 순서로 쪼개기
3.1 디버그 Pod 띄우기
kubectl run -it --rm netshoot \
--image=nicolaka/netshoot \
--restart=Never -- bash
3.2 DNS 확인: STS가 어떤 IP로 풀리는지
dig +short sts.amazonaws.com
dig +short sts.ap-northeast-2.amazonaws.com
nslookup sts.amazonaws.com
여기서 체크 포인트:
- 응답이 느리거나 time out: CoreDNS/노드 DNS 경로 문제 가능성
- 사설 IP(10.x/172.16/192.168)로 풀림: VPC Endpoint(PrivateLink) 또는 잘못된 사설 Hosted Zone/Resolver Rule 개입 가능성
- 응답이 매번 바뀌는데 특정 IP에서만 실패: NAT/라우팅/보안그룹이 특정 경로만 막는 경우
3.3 TCP 연결 확인: 443까지 도달하는지
# TCP 레벨 연결 테스트
nc -vz sts.amazonaws.com 443
# TLS 핸드셰이크까지 확인
openssl s_client -connect sts.amazonaws.com:443 -servername sts.amazonaws.com -brief </dev/null
nc가 타임아웃이면 라우팅/NAT/보안그룹/NACL 쪽이 유력openssl에서 인증서 교환 전에 멈추면 네트워크/프록시/MTU 이슈 가능
3.4 HTTP 레벨 확인
curl -I --connect-timeout 3 --max-time 10 https://sts.amazonaws.com/
STS는 루트에 403/404가 나도 “연결 자체는 된다”는 의미입니다. 중요한 건 타임아웃이냐 아니냐입니다.
4) VPC·NAT·라우팅 체크리스트(가장 흔한 원인)
4.1 프라이빗 서브넷의 기본 경로(0.0.0.0/0)가 NAT로 가는지
EKS 노드가 프라이빗 서브넷에 있으면, 해당 서브넷 라우팅 테이블에 다음이 있어야 합니다.
0.0.0.0/0 -> nat-xxxxxxxx
확인:
aws ec2 describe-route-tables \
--filters "Name=association.subnet-id,Values=subnet-xxxx" \
--query 'RouteTables[].Routes'
실수 패턴:
- NAT가 없는 프라이빗 서브넷(인터넷 완전 차단 의도였는데 STS는 필요)
- 라우팅 테이블을 다른 서브넷에 잘못 연결
- 멀티 AZ인데 AZ A 서브넷은 NAT A, AZ B 서브넷은 NAT 없음/다른 NAT
4.2 NAT Gateway 상태 및 포트 고갈(간헐적 타임아웃의 단골)
NAT Gateway는 대규모 동시 연결에서 SNAT 포트 고갈로 드랍이 발생할 수 있습니다. STS 호출이 짧고 잦으면 특히 티가 납니다.
- CloudWatch NATGW 지표 확인:
ErrorPortAllocationPacketsDropCountActiveConnectionCount
가능한 해결:
- AZ별 NAT Gateway 분리(각 프라이빗 서브넷이 “같은 AZ의 NAT”로 나가게)
- 워크로드의 재시도/커넥션 재사용(HTTP keep-alive) 튜닝
- 근본적으로는 STS VPC Endpoint(Interface) 로 NAT를 우회
4.3 NACL/보안그룹에서 443 egress가 막히지 않았는지
- 노드 SG egress가
0.0.0.0/0:443또는 VPC Endpoint SG로 허용되어야 합니다. - NACL은 stateless이므로 **아웃바운드 443 + 인바운드 ephemeral(1024-65535)**가 필요합니다.
간단 점검(개념):
- SG: egress 443 허용?
- NACL: outbound 443 허용 + inbound ephemeral 허용?
5) DNS(CoreDNS/Resolver) 체크리스트
네트워크가 멀쩡해도, DNS가 꼬이면 STS가 “가끔” 터집니다.
5.1 CoreDNS 상태/로그
kubectl -n kube-system get pods -l k8s-app=kube-dns
kubectl -n kube-system logs -l k8s-app=kube-dns --tail=200
이런 로그가 보이면 위험 신호:
- upstream timeout
- SERVFAIL 증가
plugin/errors다수
5.2 CoreDNS가 참조하는 upstream 확인
kubectl -n kube-system get configmap coredns -o yaml
forward . /etc/resolv.conf 형태면 노드의 resolv.conf를 따라가는데, 노드가 사내 DNS/Route53 Resolver로 포워딩하면서 특정 도메인(amazonaws.com)을 잘못 처리하는 케이스가 있습니다.
5.3 VPC Endpoint 사용 시 “Private DNS”와 충돌
Interface VPC Endpoint를 만들면 보통 Private DNS 활성화를 켭니다. 이때 sts.amazonaws.com이 사설 IP로 해석되어 VPC 내부로 라우팅됩니다.
- 의도한 구성이라면 좋습니다(인터넷/NAT 불필요).
- 하지만 중간에 다른 Private Hosted Zone이 amazonaws.com을 덮어쓰면 엉뚱한 IP로 풀릴 수 있습니다.
확인 포인트:
- Route 53 Private Hosted Zone에
amazonaws.com또는sts.amazonaws.com레코드가 있는지 - Resolver Rule이 해당 도메인을 온프레미스 DNS로 포워딩하는지
6) 가장 확실한 해결: STS Interface VPC Endpoint(PrivateLink)
프라이빗 서브넷 EKS에서 STS가 필요하다면, NAT에 기대는 대신 STS용 VPC Endpoint를 만드는 게 가장 안정적입니다.
장점:
- STS 트래픽이 VPC 내부에서 처리되어 NAT 장애/포트 고갈 영향 최소화
- egress 제어가 쉬움(보안그룹으로 제한)
- 네트워크 경로가 단순해져 “간헐 타임아웃”이 크게 줄어듦
6.1 콘솔/CLI로 생성 개념
- 서비스:
com.amazonaws.<region>.sts - 타입: Interface
- 서브넷: EKS 노드가 있는 프라이빗 서브넷들
- 보안그룹: 노드 SG(또는 Pod ENI SG)에서 443로 접근 허용
- Private DNS: 일반적으로 Enable
CLI 예시:
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxxx \
--service-name com.amazonaws.ap-northeast-2.sts \
--vpc-endpoint-type Interface \
--subnet-ids subnet-a subnet-b \
--security-group-ids sg-endpoint \
--private-dns-enabled
엔드포인트 SG 인바운드 예시(노드/Pod CIDR 또는 노드 SG에서 443 허용):
aws ec2 authorize-security-group-ingress \
--group-id sg-endpoint \
--protocol tcp --port 443 \
--source-group sg-nodes
6.2 적용 후 검증
Pod에서 다시 확인합니다.
dig +short sts.ap-northeast-2.amazonaws.com
nc -vz sts.ap-northeast-2.amazonaws.com 443
curl -I https://sts.ap-northeast-2.amazonaws.com/
- DNS가 사설 IP로 풀리고
- 443 연결이 즉시 성공하며
- curl이 지연 없이 응답하면 성공입니다.
7) IRSA를 쓰는 경우 추가 체크(“STS는 되는데 AssumeRole이 실패”)
STS 네트워크가 해결됐는데도 IRSA가 실패한다면, 다음을 같이 봐야 합니다.
- OIDC Provider가 클러스터와 일치하는지
- 서비스어카운트 어노테이션 role-arn이 맞는지
- IAM Role trust policy의
sub조건이 정확한지 - 시간 동기(NTP) 문제로 토큰 검증 실패(드물지만 발생)
다만 이 글의 범위(타임아웃)에서는 대부분 네트워크/DNS가 원인입니다.
8) 운영 팁: “간헐적”일수록 관측을 먼저 붙인다
간헐 타임아웃은 재현이 어렵기 때문에, 다음을 먼저 켜두면 원인 규명이 빨라집니다.
- NAT Gateway CloudWatch 지표 대시보드 (
ErrorPortAllocation,PacketsDropCount) - CoreDNS metrics(프로메테우스 스크랩) 및
SERVFAIL,request_duration_seconds - 노드 서브넷/AZ별 실패율 비교(특정 AZ NAT/라우팅 문제를 빨리 찾음)
EKS에서 네트워크 문제가 다른 형태로 터질 때는 EKS kube-proxy CrashLoopBackOff iptables 오류 해결처럼 “증상은 파편적이지만 원인은 네트워크 계층”인 경우가 많아, 계층별 분해(DNS→TCP→TLS→HTTP)가 가장 효율적입니다.
9) 결론: 해결 우선순위
- Pod에서 DNS/TCP 테스트로 ‘어디서’ 막히는지 분리
- 프라이빗 서브넷이면 라우팅 테이블의 0.0.0.0/0 → NAT 확인
- 간헐이면 NAT 포트 고갈/드랍 지표 확인(AZ별 NAT 분리)
- 장기적으로는 STS Interface VPC Endpoint + Private DNS로 NAT 의존 제거
- DNS가 느리면 CoreDNS/upstream/Resolver Rule/Private Hosted Zone 충돌 점검
이 순서대로 보면, “EKS에서만 STS 타임아웃” 문제는 대부분 1~2시간 내에 원인까지 좁히고, VPC Endpoint로 깔끔하게 종결할 수 있습니다.