귀찮게하기/DevOps-SRE

클러스터 외부에서 Istio Service Mesh 파드 접근 흐름

게임이 더 좋아 2025. 5. 16. 23:19
반응형
728x170

1. 클라이언트 요청 및 DNS 쿼리

  • 클라이언트가 curl, 브라우저 등으로 service.example.com 요청 전송
  • DNS 쿼리 수행: 권한 DNS 서버로부터 A/AAAA 레코드 응답 수신
    • AWS: Amazon Route 53 권한 네임서버
    • GCP: Google Cloud DNS 권한 네임서버

 

2. 클라우드 로드밸런서(LB) 처리

  • 외부 로드밸런서로 TCP 트래픽 수신
  • L4 포워딩: 클라우드 로드밸런서가 수신한 TCP 세션을 Kubernetes 노드의 NodePort로 전달하는 과정
    • 이 과정을 통해 외부에서 들어온 연결이 특정 노드 포트로 ‘전환’되어 Service 트래픽이 클러스터 내부로 유입됨
    • Session Handoff 단계에서 클라이언트와 백엔드 노드 간의 연결 매핑 및 소스·대상 포트 정보가 유지되어 지속적인 트래픽 흐름 보장
  • externalTrafficPolicy 설정:
    • Cluster 모드: 클라이언트 IP가 SNAT 처리되어 노드의 IP로 변환됨
      • 장점: 노드 외부 헬스체크나 로깅 시 일관된 소스 IP 사용 가능
      • 단점: 실제 클라이언트 IP 정보 손실, 애플리케이션 로그에서 원본 클라이언트 식별 불가
    • Local 모드: 원본 클라이언트 IP 보존 및 로드밸런서 헬스체크가 노드 로컬 Pod만 대상으로 수행

 

3. Kubernetes 노드 및 kube-proxy 매핑

  • kube-proxy 역할
    • API 서버의 Service와 Endpoint 리소스 변경 감시 후 호스트 OS의 NAT 또는 IPVS 룰을 프로그래밍하여 클러스터 네트워크 트래픽을 적절한 Pod로 전달
  • NodePort → ClusterIP 매핑:
    • iptables 모드: KUBE-SERVICES 체인에서 NodePort로 수신된 패킷을 ClusterIP VIP로 DNAT 적용
    • IPVS 모드: IPVS 가상 서버 생성 후 스케줄러로 실제 Endpoint 선택
  • ClusterIP → Endpoint 매핑:
    • iptables 모드: KUBE-POSTROUTING 체인에서 VIP로 수신된 패킷을 실제 Endpoint Pod IP로 DNAT 후 포워딩
    • IPVS 모드: 가상 서버에 연결된 실제 서버 리스트에서 선택된 서버로 전달
  • 세션 및 SNAT 설정: externalTrafficPolicy, sessionAffinity 설정에 따라 Source IP 보존 또는 SNAT 수행
  • 로드밸런싱 알고리즘: IPVS 사용 시 round-robin, leastconn 등 다양한 스케줄러 활용

 

4. DNS 서비스 해석 및 트래픽 매핑: CoreDNS vs kube-dns

대부분 클러스터에서 기본 DNS 애드온으로 CoreDNS 사용

CoreDNS(기본, Kubernetes v1.11+):

  • 플러그인 아키텍처(kubernetes, forward, cache, rewrite)
  • Go 기반, 경량화 및 확장성

kube-dns(v1.13 이전):

  • SkyDNS, dnsmasq, kube-dns-server 조합, 복잡도 증가

DNS 쿼리 흐름:

  1. 컨테이너 /etc/resolv.conf → stub resolver → CoreDNS/kube-dns
  2. CoreDNS 플러그인 체인 처리
  3. 권한 DNS 서버(Route 53/Cloud DNS)로 재귀 질의
  4. ClusterIP VIP 반환

트래픽 매핑: kube-proxy가 VIP를 Pod IP로 DNAT, CoreDNS 캐시로 응답 최적화

 

5. Istio IngressGateway Service 전달

  • Kubernetes Service 역할: ClusterIP VIP로 istio-ingressgateway Pod에 트래픽 분산
  • Selector: app=istio-ingressgateway로 대상 Pod 선택
  • 세션 지속성: sessionAffinity로 클라이언트 세션 보존
  • 외부 트래픽 정책: externalTrafficPolicy로 IP 보존 여부 결정
  • 헬스체크: LB의 /healthz 경로 및 포트 매칭 검증

 

6. IngressGateway Envoy Proxy 처리

Envoy Listener 초기화: TCP 포트에서 HTTP/TCP 리스닝 설정

Filter Chain 구성:

  • TLS Termination: Gateway 리소트에 TLS 설정 시 Envoy가 SSL 종료 수행
  • HTTP Connection Manager: HTTP 메시지 디코딩, 호스트·경로 기반 필터링 적용

Gateway 리소트 매칭:

  • Gateway 객체의 servers 항목과 요청 헤더 비교

VirtualService 매칭 및 라우팅:

  • VirtualService의 http.match 조건 검사
  • 조건 일치 시 route.destination으로 트래픽 전달 우선순위 결정

Envoy 필터 동작:

  • HeaderManipulator Filter: 요청에 x-request-id, x-envoy-internal, x-forwarded-for 등 헤더 추가
  • Authentication Filter: Authorization 헤더 검사 및 검증
  • RateLimit Filter: API 호출량 제어 
  • Fault Injection / Retry: 장애 테스트 또는 재시도 정책 적용

Cluster 선택 및 연결:

  • route.destination.host에 매핑된 Envoy 클러스터 조회
  • 클러스터 로드밸런싱 정책 따라 업스트림 엔드포인트 선택

Envoy 통계 및 로그:

  • Admin API를 통해 요청 처리 통계 및 로그 레벨 조정 가능
  • istio_requests_total, istio_request_duration_seconds 메트릭 기록

 

  •  

7. 애플리케이션 컨테이너 요청 처리. 애플리케이션 컨테이너 요청 처리

  • Sidecar가 애플리케이션 컨테이너 포트로 최종 요청 전달
  • 애플리케이션에서 Header·Body 수신 및 로그 기록

 

 

8. 응답 반환 경로

  • 애플리케이션 → Sidecar → IngressGateway → LB → 클라이언트 순으로 응답 전송
  • Envoy 응답 헤더 삽입
  • 클라이언트 curl -v 또는 브라우저 개발자도구로 확인

 

 


배경지식

1. FQDN, 정규화 도메인 이름

  • 정의: 루트(.)까지 포함한 전체 도메인 경로
  • 역할: DNS 계층 구조에서 정확한 리소스 식별 지원

CNAME 및 Delegation

  • CNAME: 별칭 레코드를 통한 도메인 간 매핑
  • Delegation: 네임스페이스 위임으로 도메인 관리 분산
  •  

NAT(DNAT)

  • 정의: Destination NAT, 패킷의 목적지 IP 주소를 변환하는 네트워크 주소 변환 방식
  • 활용: Service ClusterIP로 향하는 트래픽을 실제 Pod IP로 전달
  • 이유: 단일 가상 IP 뒤에 여러 Pod를 transparent라우팅하기 위함

 

iptables

  • 정의: Linux 커널 네트워크 패킷 필터링 및 NAT 구현을 위한 사용자 공간 유틸리티
  • 체인과 테이블: nat 테이블의 PREROUTING, POSTROUTING 체인에서 DNAT/SNAT 규칙 적용
  • 이유: kube-proxy가 복잡한 트래픽 매핑을 커널 공간에서 수행하여 오버헤드 최소화

 

IPVS

  • 정의: IP Virtual Server, Linux 커널 레벨에서 IP 로드밸런싱 제공
  • 구성요소: 가상 서버와 실제 서버 리스트, 다양한 스케줄링 알고리즘
  • 이유: 대규모 트래픽 환경에서 높은 처리량과 낮은 지연으로 Service 로드밸런싱 제공

 


요약

클라이언트
  ↓ DNS 쿼리 (권한 DNS 서버: Route 53 / Cloud DNS)
로드밸런서 (ELB / GCLB)
  ↓ L4 포워딩 (NodePort)
쿠버네티스 노드
  ↓ kube-proxy (iptables/ipvs)
ClusterIP 서비스 VIP
  ↓ CoreDNS 조회
Istio IngressGateway Envoy
  ↓ (VirtualService 라우팅)
사이드카 Envoy
  ↓ (DestinationRule 적용)
애플리케이션 컨테이너
728x90
반응형
그리드형

'귀찮게하기 > DevOps-SRE' 카테고리의 다른 글

Kubernetes Pod 스케줄링 정복  (3) 2025.05.28
Pod와 ServiceAccount의 관계  (0) 2025.05.14
Redis에 대한 오해  (0) 2025.04.23
DevOps - istio(2)  (1) 2025.04.12
[Kubernetes] RBAC  (0) 2025.04.05