EKS Istio istiod Sidecar Injection 장애 트러블슈팅
배경: EKS 환경에서 Argo Workflows exit-handler 실행 중 istiod webhook 호출 실패로 Pod 생성이 중단되는 장애 발생. Istio sidecar injection과 완료형 워크로드 간의 구조적 충돌을 분석하고 해결 방안을 정리한다.
에러 메시지
failed calling webhook "namespace.sidecar-injector.istio.io":
Post "https://istiod.istio-system.svc:443/inject?timeout=10s":
no endpoints available for service "istiod"
발생 흐름: Argo Workflow Pod 생성 → Istio MutatingWebhook 호출 → istiod 엔드포인트 없음 → Pod 생성 실패
istiod란?
Istio 서비스 메시의 컨트롤 플레인 데몬. 이전에 분리되어 있던 Pilot(서비스 디스커버리/라우팅), Citadel(mTLS 인증서), Galley(설정 검증)를 단일 바이너리로 통합한 것이다.
핵심 역할:
- VirtualService, DestinationRule 등 CRD를 Envoy 설정으로 변환
- 서비스 간 자동 mTLS 인증서 발급
- K8s 서비스/엔드포인트 감시 → 사이드카에 전파
- Pod에 Envoy 사이드카 자동 주입 (MutatingWebhook)
원인 분석
직접 원인: istiod 엔드포인트 부재
| 가능성 | 설명 | 확인 방법 |
|---|---|---|
| istiod Pod 다운/재시작 | OOM, 노드 이슈, 업그레이드 등 | kubectl get pods -n istio-system -l app=istiod |
| Readiness probe 실패 | Pod는 있으나 Ready 아님 | kubectl describe pod -n istio-system -l app=istiod |
| HPA 0으로 스케일다운 | 리소스 부족 시 발생 가능 | kubectl get hpa -n istio-system |
| 노드 리소스 부족 | istiod 스케줄링 실패 | kubectl get events -n istio-system --sort-by=.lastTimestamp |
| 서비스/네임스페이스 손상 | 드물지만 istio-system 자체 문제 | kubectl get svc istiod -n istio-system |
EKS 특유 이슈: 보안그룹 포트 15017
EKS에서는 API Server → 노드 간 포트 15017이 보안그룹에서 막혀있으면 webhook 호출이 실패한다. 이는 EKS의 관리형 컨트롤 플레인 구조 때문에 발생하는 고유 이슈다.
구조적 원인: Argo Workflows + Istio 충돌
Argo 공식 문서에서도 이 조합의 문제를 명시한다:
Sidecars are injected outside of the view of the workflow controller, which has no awareness of them. You will minimize problems by not using Istio with Argo Workflows.
완료형 워크로드(Job, Workflow)는 작업 완료 후 Pod가 종료되어야 하지만, Istio sidecar(Envoy)는 자체 종료되지 않아서 Pod가 Completed로 전환되지 않는 근본적 충돌이 있다.
즉시 점검 순서
# 1단계: istiod 상태 확인
kubectl get pods -n istio-system -l app=istiod
kubectl get endpoints istiod -n istio-system
# 2단계: 최근 이벤트 확인
kubectl get events -n istio-system --sort-by='.lastTimestamp' | tail -20
# 3단계: istiod 로그
kubectl logs -n istio-system -l app=istiod --tail=50
# 4단계: webhook 설정 확인
kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml
# 5단계: EKS 보안그룹 (포트 15017)
# AWS 콘솔 → EKS 클러스터 → 노드 보안그룹 인바운드 규칙 확인
해결 방안
임시 우회: 사이드카 주입 비활성화
워크플로우에 사이드카가 불필요한 경우:
# Pod 레벨
metadata:
labels:
sidecar.istio.io/inject: "false"
# 네임스페이스 레벨
# kubectl label namespace <workflow-ns> istio-injection=disabled --overwrite
근본 해결: istiod 고가용성 확보
- replicas 2개 이상 운영
- PodDisruptionBudget 설정 (최소 1개 유지)
- Webhook
failurePolicy를Fail→Ignore로 변경 (사이드카 없이라도 Pod 생성 허용, 단 메시 기능 손실)
장기 해결: 아키텍처 분리
Argo Workflow 네임스페이스는 Istio injection을 비활성화하고, 서비스 메시가 필요한 서비스와 워크플로우를 네임스페이스 단위로 분리하는 것이 권장된다.
Member discussion