ServiceMesh - Istio - Week9-1
32 minute read
Ambient Mesh
- 사이드카 프록시 대신 인프라에 통합된 데이터플레인을 사용하는 새로운 Istio 데이터플레인 모드
- 핵심 기능 유지: 제로 트러스트 보안, 원격 측정, 트래픽 관리 기능 그대로 보존
- 기본 구조: L4 Proxy(ztunnel)와 L7 Proxy(waypoint) 기능 분리
기존 사이드카 방식의 제약사항
- 침입성(간섭): 포드 사양 수정 필요, 설치/업그레이드 시 애플리케이션 포드 재시작 필요
- 리소스 활용도 저하: 개별 포드의 최악 상황 고려한 CPU/메모리 예약으로 인한 과도한 리소스 예약
-
트래픽 차단: 트래픽 캡처 및 HTTP 처리의 높은 컴퓨팅 비용, 일부 애플리케이션 중단 가능
Ambient Mesh 아키텍처
두 개 레이어 분리
- 보안 오버레이: 라우팅과 제로 트러스트 보안 처리
- Traffic Mgmt: TCP Routing
- Security
- mTLS tunneling
- Simple authorization policies
- Observability: TPC metrics & logging
- L7 프로세싱 레이어: 필요시 활성화하여 모든 Istio 기능 액세스
- Traffic Mgnt
- HTTP routing & load balancing
- Circuit breaking
- Rate limiting
- fault injection
- Retry
- Timeouts, …
- Security: Rich authorization policies
- Observability
- HTTP metrics
- Access Logging
- Tracing
- Traffic Mgnt
주요 구성요소
-
ztunnel: 각 노드에서 실행되는 공유 에이전트, 제로 트러스트 터널 역할 - 기본 기능: mTLS, 원격 분석, 인증, L4 권한 부여 제공 - 효율성: L7 처리 없이 사이드카보다 훨씬 효율적 - 공유 인프라: 복잡성과 리소스 비용 감소로 공유 인프라로 제공 적합
-
waypoint proxy: L7 처리가 필요할 때 배포되는 Envoy 기반 프록시 - 역할: 네임스페이스의 워크로드에 대한 L7 처리 담당 - 배포: 일반 Kubernetes 포드로 자동 확장 가능 - 확장성: 실시간 트래픽 수요에 따른 동적 확장
HBONE 프로토콜
- 정의: HTTP Based Overlay Network Encapsulation
- 동작: HTTP CONNECT 메서드를 통한 표준 HTTP 터널링
- 기술 스택: TCP 상위 HTTP/2, TLS 상호 인증 및 암호화
-
포트: TCP 15008 포트 사용
통신 흐름
통신 시나리오
(공통) Istio CNI DaemonSet 활용
- 파드 트래픽을 ztunnel로 리디렉션
- 호스트 네트워크 네임스페이스와 ztunnel 파드 내부에 iptables 설정
Ambient → Sidecar
- foo NS는 ambient mode 활성화:
istio.io/dataplan-mode=ambient
- bar NS는 sidecar mode 활성화:
istio-injection: enabled
- (1,2,3): sleep 파드에서 bar NS의 httpbin 목적지로 요청 -> istio CNI DaemonSet에 의해서 설정된 iptables에 따라, 요청 트래픽이 istioout -> (Geneve Tunnel) -> pistoout 전달
- (4,5): pistoout은 iptables rule을 통해 파드 내의 eth0 인터페이스에 port 15001로 redirect
- (6): ztunnel 파드는 목적지 httpbin 정보를 기반으로 전달 -> 노드 B eth0
- (7): 요청 트래픽은 httpbin 파드 내의 iptables rule을 통해 port 15006로 redirect되고 이후 목적지 httpbin 파드에 도착
Sidecar → Ambient
- foo NS는 sidecar mode 활성화:
istio-injection: enabled
-
bar-1, bar-2 NS는 ambient mode 활성화:
istio.io/dataplane-mode=ambient
- Sidecar mode sleep -> ambient mode httpbin(waypoint proxy disabled)
- (1,2): sleep 파드는 Sidecar Proxy에 iptables rule에 의해 15001 포트로 redirect 됨
- (3) 목적지 httpbin 파드는 waypoint proxy disabled로 목적지 파드가 있는 워커 노드 B로 전달됨
- (4,5,6): veth httpbin <-> httpbin 파드 내 eth0과 device pair 관계이지만, iptables rule에 의해 가로채어 istioin -> pistioin device로 전달
- (7,8): ztunnel 파드 내에 iptables rule에 의해 port 15008 redirect
- (9): 최종적으로 httpbin파드로 전달
- Sidecar mode sleep -> ambient mode helloworld(waypoint proxy enabled)
- (1,2): sleep 파드는 Sidecar Proxy에 iptables rule에 의해 15001 포트로 redirect 됨
- (3): 목적지 helloworld 파드는 waypoint proxy disabled로 목적지 파드가 있는 워커 노드 C(port 15008)로 전달됨
- (4): waypoint 파드는 control plane을 통해 받은 라우팅 정보로 helloworld 파드가 있는 워커노드 D로 전달됨
- (5~10): httpbin 파드 내부 과정과 동일
설계 원칙
로컬 노드에서 L7 처리 분리 이유
- 보안: Envoy의 비멀티테넌트 특성으로 인한 보안 우려
- 리소스 효율성: L4 처리는 L7 대비 적은 CPU/메모리 사용
- 대체 가능성: 잘 정의된 상호 운용성 계약으로 다른 구현체 대체 가능
추가 홉에 대한 성능 고려사항
- 네트워크 지연시간의 주원인은 L7 처리, 네트워크 자체 아님
- 사이드카의 두 단계 L7 처리를 하나로 통합
- 제로 트러스트만 필요시 L7 처리 비용 완전 절감
리소스 오버헤드 개선
- 예측 가능성: 더 적고 예측 가능한 리소스 요구사항
- 공유 리소스: ztunnel의 노드 공유로 워크로드당 예약 대폭 감소
- 동적 확장: waypoint proxy의 실시간 트래픽 수요 기반 확장
보안 특성
- 격리된 보안: 애플리케이션 손상시에도 ztunnel과 waypoint proxy의 정책 적용 유지
- 제한된 공격 표면: ztunnel의 L4 전용 제한으로 취약점 노출 영역 감소
- 노드별 키 접근: ztunnel은 해당 노드 워크로드 키에만 접근
- 서비스 계정 제한: waypoint proxy를 하나의 서비스 계정으로 제한 가능
기존 사이드카와의 호환성
- 상호 운용성: 단일 메시에서 사이드카와 ambient 모드 혼합 사용 가능
- 기능 제한 없음: 혼합 사용시에도 시스템 기능이나 보안 속성 제한 없음
- 지속 지원: 사이드카는 규정 준수나 성능 튜닝이 필요한 사용자에게 여전히 유용
점진적 도입 방식
- 단계별 전환: 메시 없음 → 보안 오버레이 → 완전한 L7 처리로 네임스페이스별 전환
- 선택적 활성화: 필요에 따라 L7 기능 선택적 활성화
- 원활한 상호 운용: 서로 다른 레이어의 워크로드 간 원활한 통신
Rust-Based Ztunnel for Istio Ambient Service Mesh
Ztunnel
- Istio 앰비언트 메시를 위해 특별히 설계된 노드별 프록시 (제로 트러스트 터널)
- 앰비언트 메시 내에서 워크로드를 안전하게 연결하고 인증
- 핵심 기능: mTLS, 인증, L4 권한 부여, 원격 측정 제공
- 설계 원칙: HTTP 트래픽 종료나 HTTP 헤더 파싱 없이 동작
- 트래픽 전달: 웨이포인트 프록시로 트래픽을 효율적이고 안전하게 전송
- 리소스 최적화: 모든 쿠버네티스 워커 노드에서 실행되므로 작은 리소스 사용량 유지 필수
- 설계 목표: 워크로드에 미치는 영향을 최소화하면서 서비스 메시의 보이지 않는 부분으로 동작
Ztunnel Architecture
주요 구성요소
- xDS Client: Istiod 제어 평면에서 구성 정보 수신
- CA Client: 공동 배치된 모든 워크로드를 위한 mTLS 인증서 관리 및 제공
- L4 Policy enforcement: L4 레벨 정책 시행
- L4 Telemetry: L4 원격 측정 (메트릭 및 로그) 제공
동작 방식
- 시작 시: 서비스 계정 토큰을 사용하여 Istiod 제어 평면에 안전하게 연결
- TLS 연결 후: xDS 클라이언트로서 ztunnel 전용 xDS 구성 수신
- 트래픽 처리: 공동 배치된 모든 워크로드의 인바운드/아웃바운드 트래픽 처리 (메시 외부 일반 텍스트 또는 메시 내부 HBONE)
- 관리 기능: 디버깅 정보가 포함된 관리 서버 제공
Envoy를 재사용하지 않는 이유
Envoy의 한계
- 초기 구현
- 2022년 9월 발표 당시 ztunnel은 Envoy 프록시로 구현
- Istio의 사이드카, 게이트웨이, 웨이포인트 프록시가 모두 Envoy 사용
- 사용 사례 차이: 사이드카 프록시나 인그레스 게이트웨이와 장단점, 요구사항, 사용 사례가 크게 다름
- 불필요한 기능: Envoy의 풍부한 L7 기능 세트와 확장성이 ztunnel에서는 필요 없음
- 구현의 어려움: Envoy를 ztunnel 요구사항에 맞게 변형하는 것이 어려움
전용 Ztunnel 구축
설계 가설
- 단일 사용 사례 집중: 처음부터 단일 목적으로 설계하면 더 간단하고 성능이 뛰어난 솔루션 개발 가능
- 단순성 추구: ztunnel을 단순하게 만들기로 한 명확한 결정이 핵심
- 적용 범위: 많은 기능과 통합을 가진 게이트웨이 재작성에는 적용되지 않는 논리
두 가지 주요 영역
- 구성 프로토콜: ztunnel과 Istiod 간의 구성 프로토콜
- 런타임 구현: ztunnel의 런타임 구현
Configuration Protocol (설정 프로토콜)
기존 xDS의 문제점
- xDS 프로토콜: Envoy 프록시가 구성에 사용하는 핵심 프로토콜
- 확장성 문제: 사이드카에서 1개 포드를 가진 단일 서비스가 약 350줄의 xDS 생성
- Envoy 기반 ztunnel: 훨씬 더 나쁜 상황, 일부 영역에서 N^2 확장 속성 사용
전용 구성 프로토콜
- 목표: 필요한 정보만 효율적인 형식으로 포함
- 단일 포드 표현 예시:
name: helloworld-v1-55446d46d8-ntdbk
namespace: default
serviceAccount: helloworld
node: ambient-worker2
protocol: TCP
status: Healthy
waypointAddresses: []
workloadIp: 10.244.2.8
canonicalName: helloworld
canonicalRevision: v1
workloadName: helloworld-v1
workloadType: deployment
이점
- 전송 방식: xDS 전송 API 사용하지만 커스텀 ambient 전용 타입 활용
- 로직 이동: Envoy 구성 대신 프록시에 로직 푸시 가능
- mTLS 예시: Envoy에서는 각 서비스마다 대규모 TLS 설정 필요, ztunnel에서는 단일 열거형으로 선언
- 대규모 확장: 10만 개 포드 메시에서 구성이 엄청나게 줄어 CPU, 메모리, 네트워크 비용 절감
Runtime Implementation (런타임 구현)
HTTPS 터널링의 제약
- 기본 동작: ztunnel은 HTTPS 터널을 사용하여 사용자 요청 전달
- Envoy의 한계: 터널링 지원하지만 구성 모델이 요구사항에 제한적
- 복잡한 요구사항:
- 여러 계층의 요청 (터널 자체와 사용자 요청)
- 로드 밸런싱 후 포드별 정책 적용 필요
- 연결당 필터를 4번 반복해야 하는 문제
- 메모리 최적화: Envoy의 “자기 자신에게 요청 전송” 최적화에도 여전히 복잡하고 비용이 높음
자체 구현의 이점
- 제약 조건 고려: 처음부터 제약 조건을 고려한 설계 가능
- 설계 유연성: 모든 설계 측면에서 더 큰 유연성 확보
- 맞춤형 요구사항: 스레드 간 연결 공유, 서비스 계정 간 격리 등 구현 가능
Rust 기반 Ztunnel
언어 선택 과정
- 목표: 빠르고 안전하며 가벼운 ztunnel 구현
- Go 기반
- Go 기반 버전이 성능 및 설치 공간 요구사항 미충족
- C++
- Envoy 일부 재사용하는 C++ 구현도 검토
- C++ 제외 이유: 메모리 안전성 부족, 개발자 경험 문제, 업계의 Rust 선호 추세
- Rust 선택
- 성공 사례: 고성능, 저리소스 애플리케이션, 특히 네트워크 애플리케이션에서 탄탄한 실적
- 핵심 라이브러리:
- Tokio: 비동기 런타임, 생태계 표준
- Hyper: HTTP 라이브러리, 생태계 표준
- 검증된 기술: 광범위한 실전 테스트를 거친 라이브러리들
- 개발 용이성: 고성능 비동기 코드 작성 용이
Workload xDS Configuration (워크로드 xDS 구성)
- 디버깅 용이성: 이해하고 디버깅하기 매우 쉬운 구성
- 확인 방법:
- ztunnel 포드에서
localhost:15000/config_dump
요청 istioctl pc workload
명령 사용
- ztunnel 포드에서
- 주요 구성 요소
- 워크로드 (workloads): 워크로드 정보
- 정책 (policies): 정책 정보
메시 포함 전 워크로드 구성 예시
{
"workloads": {
"10.244.2.8": {
"workloadIp": "10.244.2.8",
"protocol": "TCP", // 메시 외부 상태
"name": "helloworld-v1-cross-node-55446d46d8-ntdbk",
"namespace": "default",
"serviceAccount": "helloworld",
"workloadName": "helloworld-v1-cross-node",
"workloadType": "deployment",
"canonicalName": "helloworld",
"canonicalRevision": "v1",
"node": "ambient-worker2",
"authorizationPolicies": [],
"status": "Healthy"
}
}
}
앰비언트 포함 후 변화
- 레이블링: 네임스페이스에
istio.io/dataplane-mode=ambient
레이블 적용 - 프로토콜 변경:
protocol
값이TCP
에서HBONE
으로 변경 - 의미: ztunnel이 해당 포드의 모든 통신을 HBONE으로 업그레이드
{
"workloads": {
"10.244.2.8": {
"workloadIp": "10.244.2.8",
"protocol": "HBONE",
...
}
정책 구성 예시
{
"policies": {
"default/hw-viewer": {
"name": "hw-viewer",
"namespace": "default",
"scope": "WorkloadSelector",
"action": "Allow",
"groups": [
[
[
{
"principals": [{ "Exact": "cluster.local/ns/default/sa/sleep" }]
}
]
]
]
}
}
}
정책 적용 후 워크로드 업데이트
- 참조 추가: 워크로드 구성에 권한 부여 정책 참조 추가
- 예시:
"authorizationPolicies": ["default/hw-viewer"]
{
"workloads": {
"10.244.2.8": {
"workloadIp": "10.244.2.8",
...
"authorizationPolicies": [
"default/hw-viewer"
],
}
...
}
L4 Telemetry (L4 원격 측정)
로그 기능
- 이해 용이성: ztunnel 로그가 매우 이해하기 쉬움
-
로그 예시:
2023-02-15T20:40:48.628251Z INFO inbound{id=4399fa68cf25b8ebccd472d320ba733f peer_ip=10.244.2.5 peer_id=spiffe://cluster.local/ns/default/sa/sleep}: ztunnel::proxy::inbound: got CONNECT request to 10.244.2.8:5000
- 로그 정보: 소스 포드 IP(
peer_ip
)와 목적지 포드 IP를 포함한 HTTP Connect 요청 표시
메트릭 제공
- 접근 경로:
localhost:15020/metrics
API - 호환성: 사이드카에서 노출하는 것과 동일한 레이블 사용
- 메트릭 범위: 전체 TCP 표준 메트릭 세트 제공
메트릭 예시
istio_tcp_connections_opened_total{
reporter="source",
source_workload="sleep",
source_workload_namespace="default",
source_principal="spiffe://cluster.local/ns/default/sa/sleep",
destination_workload="helloworld-v1",
destination_workload_namespace="default",
destination_principal="spiffe://cluster.local/ns/default/sa/helloworld",
request_protocol="tcp",
connection_security_policy="mutual_tls"
...
} 1
시각화
- 도구 요구사항: Prometheus와 Kiali 설치 필요
- UI 접근: Kiali UI에서 메트릭 쉽게 확인 가능
- 대시보드: Kiali 대시보드에서 ztunnel이 제공하는 L4 원격 측정 표시
Istio Ambient Waypoint Proxy Made Simple
Waypoint Proxy
- 목적지 지향적인 새로운 waypoint proxy로 단순성과 확장성 제공
- 아키텍처 분리
- Ambient는 Istio 기능을 보안 오버레이 계층과 레이어 7 처리 계층으로 분할
- Envoy 기반의 선택적 구성 요소로 관리하는 워크로드에 대한 L7 처리 담당
- 2022년 최초 Ambient 출시 이후 waypoint 구성, 디버깅, 확장성 간소화를 위한 상당한 변경 작업 수행
Waypoint Proxy Architecture
기본 특성
- 기반 기술: 사이드카와 마찬가지로 Envoy 기반
- 동적 구성: Istio를 통해 애플리케이션 구성을 지원하도록 동적으로 구성
- 실행 범위: 네임스페이스별(기본값) 또는 서비스 계정별로 실행
- 독립성: 애플리케이션 포드 외부에서 실행되어 애플리케이션과 독립적으로 설치, 업그레이드, 확장 가능
- 비용 절감: 운영 비용 절감 효과
배포 방법
- 선언적 배포: Kubernetes Gateway 리소스나
istioctl
명령 사용 - Gateway 리소스 예시:
$ istioctl experimental waypoint generate
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: namespace
spec:
gatewayClassName: istio-waypoint
listeners:
- name: mesh
port: 15008
protocol: HBONE
- 자동 관리: Istiod가 리소스를 모니터링하고 해당 waypoint 배포를 자동으로 배포 및 관리
소스 프록시 구성을 대상 프록시로 전환
기존 사이드카 아키텍처의 문제점
정책 분리
- 트래픽 셰이핑: 요청 라우팅, 트래픽 이동, 오류 주입 등은 소스(클라이언트) 프록시에서 구현
- 보안 정책: 대부분의 보안 정책은 목적지(서버) 프록시에서 구현
발생하는 문제들
- Scaling (스케일링)
- 각 소스 사이드카는 메시 내 다른 모든 목적지에 대한 정보 필요 (다항식 스케일링 문제)
- 목적지 구성 변경 시 모든 사이드카에 동시 알림 필요
- Debugging (디버깅)
- 정책 시행이 클라이언트와 서버 사이드카로 분리되어 문제 해결 시 시스템 동작 이해 어려움
- Mixed environments (혼합 환경)
- 모든 클라이언트가 메시에 속하지 않는 시스템에서 일관되지 않은 동작
- 메시가 아닌 클라이언트는 카나리아 롤아웃 정책을 준수하지 않아 예상치 못한 트래픽 분산 발생
- Ownership and attribution (소유권 및 귀속)
- 이상적으로는 하나의 네임스페이스에 작성된 정책이 동일한 네임스페이스에서 실행되는 프록시 작업에만 영향을 미쳐야 함
- 현재 모델에서는 정책이 각 사이드카에 의해 분산되고 적용됨
Ambient의 해결책
- 목적지 중심: 모든 정책이 목적지 waypoint에 의해 적용
- 게이트웨이 역할: waypoint는 네임스페이스(기본 범위) 또는 서비스 계정으로의 게이트웨이 역할
- 트래픽 제어: 네임스페이스로 들어오는 모든 트래픽이 waypoint를 통과하도록 강제
- 정책 적용: waypoint가 해당 네임스페이스에 대한 모든 정책 적용
- 구성 단순화: 각 waypoint는 자체 네임스페이스의 구성만 알면 됨
확장성 개선 시각화
간단한 예시 (2개 네임스페이스, 각각 2개 배포)
사이드카 모델
- 구성량: 4개 워크로드 × 4개 구성 세트 = 총 16개 구성 배포
- 변경 영향: 구성 하나 변경 시 모든 구성 업데이트 필요
Waypoint 모델
- 구성량: 2개 waypoint 프록시만 필요 (각 네임스페이스당 1개)
- 구성 감소: 전송되는 구성의 총량이 25%로 감소
대규모 확장 예시
- 조건: 각 네임스페이스를 25개 배포(각각 10개 포드)로 확장, 고가용성을 위해 각 waypoint 배포를 2개 포드로 구성
구성 배포 | 네임스페이스 1 | 네임스페이스 2 | 총 |
---|---|---|---|
사이드카 | 25가지 구성 × 250개 사이드카 | 25가지 구성 × 250개 사이드카 | 12,500 |
waypoint | 25가지 구성 × 2개 waypoint | 25가지 구성 × 2개 waypoint | 100 |
waypoint/사이드카 | 0.8% | 0.8% | 0.8% |
- 리소스 절약: 제어 플레인과 데이터 플레인 모두의 리소스 사용량(CPU, RAM, 네트워크 대역폭) 감소
- 기존 방법 비교: 현재 사용자는
exportTo
나 Sidecar API 신중한 사용으로 유사한 개선 가능하지만, ambient 모드에서는 이러한 작업이 불필요 - 확장 용이성: 확장이 훨씬 수월해짐
목적지에 Waypoint Proxy가 없는 경우
-
설계 가정과 한계
- 기본 가정: 대부분의 구성이 서비스 소비자가 아닌 서비스 생산자에 의해 가장 잘 구현
- 예외 상황: 제어할 수 없는 대상에 대한 트래픽 관리 구성이 필요한 경우
- 일반적 예시: 외부 서비스(예: example.com)에 대한 향상된 복원력 연결 (시간 초과 추가 등)
-
개발 중인 해결책
- 진행 상황: 커뮤니티에서 활발하게 개발 중인 영역
- 설계 방향:
- 트래픽이 egress gateway로 라우팅되는 방식 설계
- 원하는 정책으로 egress gateway를 구성하는 방법 설계
Waypoint 구성 심층 분석
전제 조건
- 가이드 완료: 환경 시작 가이드와 제어 트래픽 섹션 완료 가정
- 설정 상태: bookinfo-reviews 서비스 계정에 대한 waypoint proxy 배포, 90% 트래픽을 reviews v1로, 10%를 reviews v2로 유도
Listener 구성 확인
$ istioctl proxy-config listener deploy/bookinfo-reviews-istio-waypoint --waypoint
LISTENER CHAIN MATCH DESTINATION
envoy://connect_originate ALL Cluster: connect_originate
envoy://main_internal inbound-vip|9080||reviews.default.svc.cluster.local-http ip=10.96.104.108 -> port=9080 Inline Route: /*
envoy://main_internal direct-tcp ip=10.244.2.14 -> ANY Cluster: encap
... (추가 항목들)
envoy://connect_terminate default ALL Inline Route:
동작 방식
- 포트 15008: Istio의 기본 인바운드 HBONE 포트
- HBONE 종료: waypoint proxy가 HBONE 연결을 종료하고 main_internal listener에게 요청 전달
- 정책 적용: AuthorizationPolicy와 같은 워크로드 정책 적용
Internal Listener
- 정의: 시스템 네트워크 API를 사용하지 않고 사용자 공간 연결을 허용하는 Envoy 리스너
- –waypoint 플래그: main_internal listener, filter chains, chain matches, destinations의 세부 정보 표시
IP 주소 정보
- 10.96.104.108: reviews의 서비스 VIP
- 10.244.x.x: reviews의 v1/v2/v3 포드 IP
- 확인 방법:
kubectl get svc,pod -o wide
명령 사용
Cluster 구성 확인
$ istioctl proxy-config clusters deploy/bookinfo-reviews-istio-waypoint
SERVICE FQDN PORT SUBSET DIRECTION TYPE DESTINATION RULE
agent - - - STATIC
connect_originate - - - ORIGINAL_DST
encap - - - STATIC
kubernetes.default.svc.cluster.local 443 tcp inbound-vip EDS
main_internal - - - STATIC
prometheus_stats - - - STATIC
reviews.default.svc.cluster.local 9080 http inbound-vip EDS
reviews.default.svc.cluster.local 9080 http/v1 inbound-vip EDS
reviews.default.svc.cluster.local 9080 http/v2 inbound-vip EDS
reviews.default.svc.cluster.local 9080 http/v3 inbound-vip EDS
sds-grpc - - - STATIC
xds-grpc - - - STRICT_DNS
zipkin - - - STRICT_DNS
특징
- 제한된 클러스터: 인프라용 클러스터 외에는 동일한 서비스 계정에서 실행되는 서비스와 포드를 위한 클러스터만 생성
- 아웃바운드 없음: 다른 곳에서 실행되는 서비스나 포드를 위한 클러스터는 생성되지 않음
- 자동 필터링: exportTo 구성 없이도 불필요한 클러스터에 대해 인식하지 않음
Route 구성 확인
$ istioctl proxy-config routes deploy/bookinfo-reviews-istio-waypoint
NAME DOMAINS MATCH VIRTUAL SERVICE
encap * /*
inbound-vip|9080|http|reviews.default.svc.cluster.local * /* reviews.default
default
특징
- 선택적 인식: Sidecar 리소스나 exportTo 구성 없이도 관련 없는 라우트에 대해 인지하지 못함
- 예시: productpage로 라우팅하기 위한 ingress gateway 구성을 배포했지만 reviews waypoint는 이를 인식하지 않음
상세 Route 정보
$ istioctl proxy-config routes deploy/bookinfo-reviews-istio-waypoint --name "inbound-vip|9080|http|reviews.default.svc.cluster.local" -o yaml
주요 구성 요소
- 가중치 기반 라우팅: 90% 트래픽을 v1 reviews로, 10%를 v2 reviews로 유도
- 기본 설정: Istio의 기본 재시도 및 타임아웃 구성 포함
- 정책 전환 확인: 트래픽 및 복원력 정책이 소스에서 목적지 지향 waypoint로 전환됨을 확인
Endpoint 구성 확인
$ istioctl proxy-config endpoints deploy/bookinfo-reviews-istio-waypoint
ENDPOINT STATUS OUTLIER CHECK CLUSTER
127.0.0.1:15000 HEALTHY OK prometheus_stats
127.0.0.1:15020 HEALTHY OK agent
envoy://connect_originate/ HEALTHY OK encap
envoy://connect_originate/10.244.1.6:9080 HEALTHY OK inbound-vip|9080|http/v2|reviews.default.svc.cluster.local
... (reviews 관련 엔드포인트들)
특징
- 서비스 제한: default 및 istio-system 네임스페이스에 다른 서비스들이 있음에도 reviews 외의 서비스와 관련된 엔드포인트는 없음
- 자동 격리: 관련 없는 서비스들로부터 자동으로 격리됨
Ambient Mode Security Deep Dive
- Istio의 새로운 앰비언트 모드: Istio를 위한 사이드카 없는 데이터 플레인이자 앰비언트 메시 패턴의 참조 구현
- 주요 과제 해결: 운영 간소화, 더 광범위한 애플리케이션 호환성, 인프라 비용 절감, 성능 향상
- 설계 원칙: 보안이나 기능을 희생하지 않으면서도 운영, 비용, 성능에 대한 우려사항들을 신중하게 균형 있게 고려
- 보안 경계 변화: 앰비언트 메시 구성 요소가 애플리케이션 포드 외부에서 실행됨에 따라 보안 경계가 더 나은 방향으로 변화
Ambient Mesh 아키텍처
- 계층화된 구조: 전송 보안 및 라우팅을 담당하는 보안 오버레이, 필요한 네임스페이스에 L7 기능 추가 옵션
- 보안 오버레이: 노드 공유 구성 요소인 ztunnel로 구성, L4 원격 측정 및 mTLS를 담당, DaemonSet으로 배포
- L7 계층: waypoint proxy에 의해 제공, ID/워크로드 유형별로 배포되는 전체 L7 Envoy 프록시
- 데이터 플레인에서 애플리케이션 분리
- 보안 오버레이 계층의 구성 요소는 CNI의 구성 요소와 유사
- 운영의 단순성이 보안에 더 좋음
- 다중 테넌트 L7 프록시 피하기
- 사이드카는 여전히 일류 지원 배포
데이터 플레인에서 애플리케이션 분리
복잡성과 취약성
- 복잡성과 취약성: 복잡성은 취약성을 야기하며, 엔터프라이즈 애플리케이션은 매우 복잡하고 취약성에 취약
- 공격 대상: 복잡한 비즈니스 로직, OSS 라이브러리, 버그가 있는 내부 공유 라이브러리 등 사용자 애플리케이션 코드가 주요 공격 대상
- 침해 시 노출: 애플리케이션 침해 시 메모리에 마운트되거나 저장된 자격 증명, 비밀, 키가 공격자에게 노출
사이드카 vs Ambient 모델
- 사이드카 모델: 애플리케이션 침해 시 사이드카 및 관련 ID/키 자료의 점유 포함
- Ambient 모델: 애플리케이션과 동일한 포드에서 실행되는 데이터 플레인 구성 요소가 없으므로 애플리케이션 침해가 비밀 접근으로 이어지지 않음
Envoy 보안 특성
- 강화된 인프라: Envoy는 엄격한 보안 검사를 거치는 매우 강화된 인프라, 중요 환경에서 대규모 운영 (예: Google 네트워크)
- 취약점 관리: 강력한 CVE 프로세스를 통해 취약점을 식별하고 신속하게 수정하여 광범위한 영향 전에 고객에게 배포
- 복잡성과 취약점: Envoy 프록시의 가장 복잡한 부분은 L7 처리, 역사적으로 Envoy 취약점 대부분이 L7 처리 스택에 위치
L4/L7 기능 분리의 이점
- 선택적 사용: mTLS만 사용하는 경우 CVE 위험이 높은 완전한 L7 프록시 배포 위험을 감수할 필요 없음
- 제한된 노출: 사이드카 배포에서는 기능의 일부만 사용해도 모든 프록시 채택 필요, ambient 모드에서는 안전한 오버레이 제공 후 필요에 따라 L7 레이어만 추가하여 노출 제한
- 분리된 실행: L7 구성 요소는 애플리케이션과 완전히 분리되어 실행되므로 공격 경로를 제공하지 않음
CNI 구성 요소와 유사한 보안 오버레이
공유 인프라 특성
- DaemonSet 실행: L4 구성 요소는 DaemonSet 또는 노드당 하나씩 실행
- 공유 인프라: 특정 노드에서 실행 중인 모든 포드에 대한 공유 인프라
- 민감도 수준: CNI 에이전트, kube-proxy, kubelet, Linux 커널과 같은 노드의 다른 공유 구성 요소와 동일한 수준에서 처리 필요
Ztunnel 동작 방식
- 트래픽 리디렉션: 워크로드에서 발생하는 트래픽이 ztunnel로 리디렉션
- 워크로드 식별: ztunnel이 워크로드를 식별하고 mTLS 연결에서 해당 워크로드를 나타내는 올바른 인증서 선택
자격 증명 관리
- 고유한 자격 증명: ztunnel은 각 포드에 대해 고유한 자격 증명 사용
- 제한된 발급: 자격 증명은 포드가 현재 노드에서 실행 중인 경우에만 발급
- 공격 범위 제한: 손상된 ztunnel의 공격 범위가 해당 노드에 현재 예약된 포드의 자격 증명만 유출되도록 보장
- 클러스터 자격 증명 사용 안함: ztunnel은 클러스터 전체 또는 노드별 자격 증명을 사용하지 않음 (유출 시 클러스터의 모든 애플리케이션 트래픽 즉시 침해 가능)
사이드카 모델과의 비교
- 공유 특성: ztunnel은 공유되며, 침해 시 노드에서 실행 중인 애플리케이션의 ID가 유출될 수 있음
- CVE 가능성 감소: 공격 표면이 크게 줄어들기 때문에 (L4 처리만) CVE 발생 가능성이 Istio 사이드카보다 낮음
- L7 처리 없음: ztunnel은 L7 처리를 전혀 하지 않음
- 사이드카 CVE 영향: L7로 인해 공격 표면이 더 넓은 사이드카의 CVE는 침해된 특정 워크로드에만 국한되지 않으며, 메시의 모든 워크로드에 반복될 가능성 높음
운영의 단순성
유지 관리의 중요성
- 핵심 인프라: Istio는 유지 관리가 필수인 핵심 인프라
- 제로 트러스트 구현: 애플리케이션을 대신하여 제로 트러스트 네트워크 보안의 핵심 원칙 구현
- 패치 배포: 일정에 따라 또는 필요에 따라 패치를 배포하는 것이 매우 중요
플랫폼 vs 애플리케이션 주기
- 플랫폼 팀: 애플리케이션과는 상당히 다른 예측 가능한 패치 또는 유지 관리 주기
- 애플리케이션: 새로운 기능이 필요할 때, 일반적으로 프로젝트의 일부로 업데이트
- 애플리케이션 변경 특성: 예측이 매우 어렵고, 시간이 많이 소요되며, 안전한 보안 관행에 적합하지 않음
- 분리의 이점: 보안 기능을 플랫폼의 일부로 유지하고 애플리케이션과 분리하는 것이 더 나은 보안 태세 구축에 도움
업그레이드 복잡성
- 사이드카 운영: 사이드카의 침습적 특성으로 인해 더욱 복잡 (사이드카 주입/배포 설명자 변경, 애플리케이션 재시작, 컨테이너 간 경합 조건 등)
- 사이드카 업그레이드: 애플리케이션이 다운되지 않도록 조정해야 하는 롤링 재시작과 계획 수립 필요
- Ambient 업그레이드:
- ztunnel 업그레이드를 일반적인 노드 패치 또는 업그레이드와 동시 진행 가능
- waypoint proxy는 네트워크의 일부이므로 필요에 따라 애플리케이션에 완전히 투명하게 업그레이드 가능
다중 테넌트 L7 프록시 피하기
L7 처리의 복잡성
- 복잡성 비교: HTTP 1/2/3, gRPC, 헤더 구문 분석, 재시도 구현, 데이터 플레인에서 Wasm 및/또는 Lua를 사용한 커스터마이징과 같은 L7 프로토콜 지원이 L4 지원보다 훨씬 더 복잡
- 더 많은 코드: 이러한 동작을 구현하기 위한 코드(루아나 와즘과 같은 사용자 지정 코드 포함)가 훨씬 더 많음
- 취약점 잠재력: 복잡성이 취약점의 잠재력으로 이어질 수 있음
- CVE 가능성: CVE는 이러한 L7 기능 영역에서 발견될 가능성이 더 높음
Ambient 모드의 접근법
- L7 처리 분리: 여러 ID에 걸쳐 프록시에서 L7 처리를 공유하지 않음
- 전용 프록시: 각 신원(쿠버네티스의 서비스 계정)은 사이드카에서 사용하는 모델과 매우 유사한 전용 L7 프록시(waypoint proxy) 보유
- 다중 테넌시 문제: 여러 신원과 그들의 독특한 복잡한 정책 및 맞춤화를 동시에 찾으려는 시도는 공유 자원에 많은 변동성을 추가하여 기껏해야 불공정한 비용 귀속, 최악의 경우 완전한 대리 타협 초래
사이드카는 여전히 first-class 지원 배포
-
지속적인 지원
- 일부 사람들은 사이드카 모델과 알려진 보안 경계에 익숙하며 그 모델을 유지하기를 원함
- first-class: Istio에서 사이드카는 메시의 first-class citizen이며 플랫폼 소유자는 사이드카를 계속 사용할 수 있음
- 혼합 지원: 플랫폼 소유자가 사이드카 모드와 ambient 모드를 모두 지원하고자 하는 경우 지원 가능
- 상호 운용성
- ambient 데이터 플레인이 있는 워크로드는 사이드카가 배치된 워크로드와 기본적으로 통신 가능
- 미래 전망
- 사람들이 ambient 모드의 보안 자세를 더 잘 이해하게 되면서, 특정 최적화를 위해 사이드카가 사용되는 Istio의 선호되는 데이터 플레인 모드가 될 것으로 확신
first-class citizen
완전한 지원: 시스템에서 모든 기능과 특권을 완전히 지원받는 요소
제약 없음: 다른 요소들과 동등한 수준의 기능과 권한을 가짐
차별 없는 대우: 시스템 내에서 차별받지 않고 동등하게 취급됨
=> sidecar 모드가 ambient 모드 도입 후에도 완전히 동등한 지원을 받는 정식 배포 방식
=> 사용자들이 안심하고 계속 사용할 수 있고, 지속적으로 지원받을 수 있다는 의미
Maturing Istio Ambient: Compatibility Across Various Kubernetes Providers and CNIs
서비스 메시와 CNI의 복잡한 관계
- 서비스 메시는 모든 Kubernetes 클러스터에 사양을 준수하는 기본 CNI 구현이 있어야 하며, 그 위에 있어야 함
- 기본 CNI 구현은 클라우드 제공업체(AKS, GKE, EKS 모두 자체 배송) 또는 Calico, Cilium과 같은 타사 CNI 구현에 의해 제공 가능
서비스 메시 동작 전제조건
- 기능적 CNI 필요성: 기본적으로 mTLS를 사용한 안전한 포드 트래픽과 서비스 메시 계층의 고급 인증 및 권한 부여 정책 적용 전에 기능적 CNI 구현이 가능한 Kubernetes 클러스터 필요
- 네트워킹 경로: 기본 네트워킹 경로가 설정되어 패킷이 클러스터 내에서 한 포드에서 다른 포드(그리고 한 노드에서 다른 노드로)로 이동할 수 있어야 함
CNI 구현의 복잡성과 충돌
- 병렬 실행: 때로는 동일한 클러스터 내에서 두 개의 기본 CNI 구현을 병렬로 실행할 수도 있음 (클라우드 제공업체 구현 + 타사 구현)
- 호환성 문제: 각 CNI 구현이 내부적으로 사용할 수 있는 매우 다양한 메커니즘으로 인해 호환성 문제, 이상한 동작, 축소된 특징 세트, 일부 비호환성 문제 발생
Istio 프로젝트의 접근법
- 자체 CNI 구현 없음: 배송을 하지 않거나 자체 기본 CNI 구현을 요구하지 않거나, 심지어 “선호되는” CNI 구현을 요구하지 않기로 결정
- 광범위한 지원: 가능한 한 가장 넓은 CNI 구현 생태계와의 CNI 체인을 지원
- 최대 호환성: 관리형 오퍼링과의 최대 호환성, 공급업체 간 지원, 더 넓은 CNCF 생태계와의 구성 가능성 보장
앰비언트 알파에서의 트래픽 리디렉션
istio-cni 구성 요소 역할
- 사이드카 모드: 선택적인 구성 요소로, 일반적으로 포드를 메시에 배포하는 사용자에게
NET_ADMIN
및NET_RAW
기능의 요구 사항 제거 - 앰비언트 모드: 필수 구성 요소
- 구성 요소 성격: 기본 CNI 구현이 아니며, 클러스터에 이미 존재하는 기본 CNI 구현을 확장하는 노드 에이전트
알파 버전 트래픽 리디렉션 메커니즘
- 구성 과정: 포드가 앰비언트 메시에 추가될 때마다 istio-CNI 구성 요소가 노드 수준의 네트워크 네임스페이스를 통해 포드 노드에서 실행되는 ztunnel과 포드 간의 모든 들어오고 나가는 트래픽에 대한 트래픽 리디렉션 구성
- 주요 차이점: 사이드카 메커니즘과 앰비언트 알파 메커니즘의 차이는 후자의 경우 포드 트래픽이 포드 네트워크 네임스페이스에서 벗어나 공동 위치한 ztunnel 포드 네트워크 네임스페이스로 리디렉션
- 경유 경로: 호스트 네트워크 네임스페이스를 통과하며, 이곳에서 대부분의 트래픽 리디렉션 규칙이 구현됨
알파 메커니즘의 한계 발견
- 테스트 결과: 여러 실제 쿠버네티스 환경에서 자체 기본 CNI를 사용하여 더 광범위하게 테스트한 결과, 호스트 네트워크 네임스페이스에서 포드 트래픽을 캡처하고 리디렉션하는 것이 요구 사항을 충족하지 못함이 판명
- 접근법의 한계: 다양한 환경에서 일반적인 방식으로 목표를 달성하는 것이 이 접근 방식으로는 불가능
근본적인 문제점
- 충돌 지점: 호스트 네트워크 네임스페이스에서 트래픽 리디렉션하는 것이 클러스터의 기본 CNI 구현이 트래픽 라우팅/네트워킹 규칙을 구성해야 하는 바로 그 지점과 동일
- 피할 수 없는 충돌:
- 기본 CNI 구현의 기본 호스트 수준 네트워킹 구성이 Istio의 CNI 확장에서 호스트 수준의 주변 네트워킹 구성을 방해하여 트래픽 중단 및 기타 충돌 발생
- 사용자가 기본 CNI 구현에 의해 네트워크 정책을 시행하도록 배포한 경우, Istio CNI 확장이 배포될 때 네트워크 정책이 시행되지 않을 수 있음
대안 접근법의 한계
- 사례별 설계: 일부 주요 CNI 구현을 위해 사례별로 문제를 설계할 수는 있지만, 보편적인 CNI 지원에 지속 가능하게 접근할 수는 없음
- eBPF 고려: eBPF를 고려했지만, 현재로서는 임의의 eBPF 프로그램을 안전하게 체인/확장할 수 있는 표준화된 방법이 없어 동일한 기본 문제를 가질 수 있음을 깨달음
- 비 eBPF CNI: 이 접근 방식으로는 여전히 비 eBPF CNI를 지원하는 데 어려움을 겪을 가능성
과제 해결: 새로운 솔루션 개발
새로운 접근법의 필요성
- 충돌 불가피성: 노드의 네트워크 네임스페이스에서 임의의 종류의 리디렉션을 수행하면 호환성 요구 사항을 위반하지 않는 한 피할 수 없는 충돌 발생
- 사이드카 모델에서의 영감: 사이드카 모드에서는 사이드카와 애플리케이션 포드 간의 트래픽 리디렉션을 구성하는 것이 간단 (둘 다 포드의 네트워크 네임스페이스 내에서 작동)
- 아이디어: 사이드카를 모방하고 애플리케이션 포드의 네트워크 네임스페이스에서 리디렉션을 구성하는 것
기술적 혁신
- Linux 소켓 API 활용: 하나의 네트워크 네임스페이스에서 실행되는 Linux 프로세스가 다른 네트워크 네임스페이스 내에서 리스닝 소켓을 생성하고 소유할 수 있다는 Linux 소켓 API의 기본 기능 발견
- 아키텍처 변경: 이를 작동시키고 모든 포드 라이프사이클 시나리오를 다루기 위해 ztunnel과 Istio-CNI 노드 에이전트에 아키텍처 변경 필요
검증과 기여
- 프로토타입 제작: 새로운 접근 방식이 접근할 수 있는 모든 Kubernetes 플랫폼에서 작동하는지 충분히 검증
- 업스트림 기여: 모든 주요 클라우드 제공업체 및 CNI와 호환되도록 처음부터 구축된 인팟 트래픽 리디렉션 메커니즘을 업스트림에 기여하기로 결정
핵심 혁신 요약
- 네트워크 네임스페이스 제공: 포드의 네트워크 네임스페이스를 공동 위치한 ztunnel에 제공
- 포드 외부 실행: ztunnel이 포드 네트워크 네임스페이스 내부에서 리디렉션 소켓을 시작하면서 포드 외부에서 실행
- 사이드카 유사성: ztunnel과 애플리케이션 포드 간의 트래픽 리디렉션이 오늘날 사이드카 및 애플리케이션 포드와 매우 유사한 방식으로 이루어짐
- CNI 투명성: 노드 네트워크 네임스페이스에서 작동하는 모든 Kubernetes 기본 CNI에서는 엄격히 보이지 않음
- 네트워크 정책 호환: 네트워크 정책이 CNI가 eBPF를 사용하든 iptables를 사용하든 충돌 없이 모든 Kubernetes 기본 CNI에 의해 계속 시행되고 관리 가능
인팟 트래픽 리디렉션
패킷 흐름과 문제점
- 패킷 경로: 앰비언트 메시에서 포드가 생성한 패킷이 소스 포드를 떠나 노드의 호스트 네트워크 네임스페이스에 들어간 다음, 인터셉트되어 해당 노드의 ztunnel로 리디렉션되어 목적지 포드로 프록시
- 근본적 문제: 많은 CNI 구현이 존재하며, Linux에서 패킷이 한 네트워크 네임스페이스에서 다른 네트워크 네임스페이스로 이동하는 방식을 구성할 수 있는 근본적으로 다양하고 호환되지 않는 방법들이 많음
다양한 CNI 구현 방식
- 터널 사용: 터널을 사용하거나, 네트워크를 오버레이하거나, 호스트 네트워크 네임스페이스를 통과하거나, 우회
- 네트워킹 스택: Linux 사용자 공간 네트워킹 스택을 통과하거나, 이를 건너뛰고 커널 공간 스택에서 패킷을 왕복
- 구현 다양성: 모든 가능한 접근 방식에 대해 CNI 구현이 있을 가능성이 높음
호환성 문제들
- 작동하지 않는 CNI: 호스트 네트워크 네임스페이스 패킷 리디렉션에 의존하기 때문에, 패킷을 호스트 네트워크 네임스페이스를 통해 라우팅하지 않는 CNI는 다른 리디렉션 구현 필요
- 규칙 충돌: 호스트 수준의 규칙이 상충되는 경우 피할 수 없고 잠재적으로 해결할 수 없는 문제 발생
- 복잡한 질문들:
- CNI를 가로채는 것이 먼저인가, 아니면 나중에 가로채는 것인가?
- 어떤 CNI는 하나, 아니면 다른 CNI를 수행하면 깨질까?
- 네트워크 정책은 호스트 네트워크 네임스페이스에서 시행되어야 하므로 어디서 언제 시행되나?
- 모든 인기 있는 CNI를 특수하게 구분하기 위해 많은 코드가 필요한가?
새로운 Istio Ambient 트래픽 리디렉션 모델
새로운 모델의 동작 방식
포드 감지 및 이벤트 처리
- 포드 감지: istio-CNI 노드 에이전트가 네임스페이스에
istio.io/dataplane-mode=ambient
라벨이 붙은 Kubernetes 포드(기존 또는 새로 생성된) 감지
새로운 포드 처리
- CNI 플러그인 트리거: 앰비언트 메시에 추가해야 하는 새로운 포드가 시작되면, CRI에 의해 CNI 플러그인(istio-cni 에이전트에 의해 설치 및 관리됨)이 트리거됨
- 포드 이벤트 푸시: 플러그인이 노드의 istio-cni 에이전트에 새로운 포드 이벤트를 푸시하고 에이전트가 리디렉션을 성공적으로 구성할 때까지 포드 시작을 차단
- 조기 설정: CRI가 Kubernetes 포드 생성 과정에서 CNI 플러그인을 가능한 한 빨리 호출하기 때문에, 초기 컨테이너와 같은 것에 의존하지 않고 시작 중에 트래픽이 빠져나가지 않도록 충분히 일찍 트래픽 리디렉션 설정 가능
기존 포드 처리
- 동적 추가: 이미 실행 중인 포드가 앰비언트 메시에 추가되면 새로운 포드 이벤트가 트리거됨
- API 감시: istio-CNI 노드 에이전트의 Kubernetes API 감시기가 이를 감지하면 리디렉션도 동일한 방식으로 구성
리디렉션 구성 과정
- 네트워크 네임스페이스 진입: istio-cni 노드 에이전트가 포드의 네트워크 네임스페이스에 들어가 포드 네트워크 네임스페이스 내부에 네트워크 리디렉션 규칙을 설정
- 패킷 가로채기: 포드에 들어오고 나가는 패킷을 가로채서 잘 알려진 포트(15008, 15006, 15001)에서 노드 로컬 ztunnel 프록시 인스턴스로 투명하게 리디렉션
Ztunnel 통신 및 설정
- Unix 도메인 소켓 통신: istio-cni 노드 에이전트가 유닉스 도메인 소켓을 통해 노드 ztunnel에 포드의 네트워크 네임스페이스(15008, 15006, 15001) 내부에 로컬 프록시 리스닝 포트를 설정해야 한다고 알림
- 파일 설명자 제공: ztunnel에 포드의 네트워크 네임스페이스를 나타내는 저수준 리눅스 파일 설명자를 제공
Linux 소켓 API 활용
- 일반적 방식: 소켓은 리눅스 네트워크 네임스페이스 내에서 실제로 실행되는 프로세스에 의해 생성
- 혁신적 방식: 생성 시점에 대상 네트워크 네임스페이스가 알려져 있다고 가정하면 리눅스의 저수준 소켓 API를 활용하여 한 네트워크 네임스페이스에서 실행되는 프로세스가 다른 네트워크 네임스페이스에서 리스닝 소켓을 생성할 수 있음
Ztunnel 내부 처리
- 전용 프록시 인스턴스: node-local ztunnel이 내부적으로 새로운 프록시 인스턴스와 리스닝 포트 세트를 스핀업하여 새로 추가된 포드 전용으로 만듦
- 메시 추가 완료: 인팟 리디렉션 규칙이 적용되고 ztunnel이 청취 포트를 설정하면 이전과 마찬가지로 네트워크에 포드가 추가되고 노드-로컬 ztunnel을 통해 트래픽이 흐르기 시작
트래픽 흐름 다이어그램
보안 특성
- mTLS 암호화: 포드가 앰비언트 메시에 성공적으로 추가되면, 메시의 포드 간 트래픽은 Istio와 마찬가지로 기본적으로 mTLS로 완전히 암호화
- 암호화된 트래픽: 트래픽이 암호화된 트래픽으로 포드 네트워크 네임스페이스에 들어오고 나감
- 투명한 기능: 주변 메시의 모든 포드가 메쉬 정책을 적용하고 트래픽을 안전하게 암호화할 수 있는 기능을 가지고 있는 것처럼 보이지만, 포드에서 실행 중인 사용자 애플리케이션은 이러한 기능을 인식하지 못함
혼합 트래픽 처리
- 암호화된 트래픽: 새 모델에서 주변 메시의 포드 간 암호화된 트래픽 흐름
- 평문 트래픽: 메쉬 외부에서 암호화되지 않은 평문 트래픽도 필요한 경우 처리하고 정책을 시행 가능
- pod의 모든 트래픽은 로컬 ztunnel을 통해 “hairpins”처럼 연결
- hairpins
- 패킷이 같은 인터페이스나 경로를 통해 들어왔다가 다시 나가는 현상
- 트래픽이 마치 U자 모양의 헤어핀처럼 같은 지점을 거쳐 방향을 바꾸는 것
- pod의 모든 네트워크 트래픽이 ztunnel을 경유하여 U턴 하듯이 처리된다는 의미
- hairpins
- 모든 redirectino은 pod 내에서 발생하며, 호스트 측에서는 아무것도 발생하지 않음
- 실제로 sidecar를 추가하지 않아도 CNI는 이전의 sidecar처럼 보인다.
최종 결과
- 포드 내부 처리: 새로운 앰비언트 캡처 모델의 최종 결과는 모든 트래픽 캡처와 리디렉션이 포드의 네트워크 네임스페이스 내부에서 발생
- 사이드카 모방: 노드, CNI 및 기타 모든 것에 대해 포드 내부에 사이드카 프록시가 있는 것처럼 보임 (비록 포드에서 사이드카 프록시가 전혀 실행되지 않더라도)
CNI 관점에서의 투명성
- CNI 임무: CNI 구현의 임무는 패킷을 포드로 주고 받는 것
- 설계상 특성: 설계상으로나 CNI 사양에 따라 그 이후에는 패킷이 어떻게 될지 신경 쓰지 않음
호환성 개선
- 충돌 자동 제거: 이 접근 방식은 다양한 CNI 및 네트워크 정책 구현과의 충돌을 자동으로 제거
- 광범위한 호환성: 모든 주요 CNI에서 모든 주요 관리 쿠버네티스 제품과의 Istio 앰비언트 메시 호환성을 크게 향상
I feedback.
Let me know what you think of this article in the comment section below!
Let me know what you think of this article in the comment section below!
comments powered by Disqus