반응형
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만 대상으로 수행
- Cluster 모드: 클라이언트 IP가 SNAT 처리되어 노드의 IP로 변환됨
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 쿼리 흐름:
- 컨테이너 /etc/resolv.conf → stub resolver → CoreDNS/kube-dns
- CoreDNS 플러그인 체인 처리
- 권한 DNS 서버(Route 53/Cloud DNS)로 재귀 질의
- 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 |