서비스 메시: Istio, Linkerd
서비스 메시: Istio, Linkerd
1) 서비스 메시는 무엇이며 언제 필요한가
서비스 메쉬는 코드 재 작성없이 서비스 간 엔드-투-엔드 mTLS, 라우팅, 내결함 및 관찰 성을 제공하는 네트워크 데이터/제어 평면 계층입니다.
목표:- 기본 보안 (제로 트러스트, 서비스 아이덴티티, 액세스 정책).
- 교통 관리 (Canary/Blue-Green, A/B, 그림자).
- 신뢰성 (레트라, 타임 아웃, 회로 파괴).
- 관찰 가능성 (메트릭, 로그, 트레일).
- 운영 표준화 (코드로서의 정책, GitOps).
- 다국어 및 mSL 요구 사항이있는 많은 마이크로 서비스.
- 응용 프로그램을 변경하지 않고 고급 라우팅/실험 시나리오가 필요합니다.
- 네트워크 수준에는 감사/정책 요구 사항이 있습니다.
2) Istio vs Linkerd-간단한 비교
3) 아키텍처 및 배포 모델
3. 1 사이드카 메쉬 (클래식)
각 포드는 프록시 사이드카를받습니다.
장점: 성숙도, 전체 L7 제어.
단점: CPU/RAM 오버 헤드, 고갈/디버깅의 복잡성.
3. 2 Istio Ambient Mesh
필요에 따라 노드 + 웨이 포인트 프록시 (L7) 의 ztunnel (L4).
장점: 저렴한 비용과 복잡성, 점진적인 L7 포함.
단점: 웨이 포인트없이 모든 L7 케이스를 사용할 수있는 것은 아닙니다.
4) 정체성 및 mTLS (제로 트러스트)
4. SPIFFE/SPIRE 및 인증서 1 개
각 운동에는 SPIFFE ID: 'spiffe ://cluster' 가 할당됩니다. 로컬/ns/NS/sa/SA '.
인증: 서비스 간 상호 TLS.
키 회전 - 자동으로 (짧은 TTL).
4. 2 Istio (피어 인증 + DestinationRule)
yaml apiVersion: security. istio. io/v1 kind: PeerAuthentication metadata: { name: default, namespace: payments }
spec:
mtls: { mode: STRICT }
apiVersion: networking. istio. io/v1 kind: DestinationRule metadata: { name: payments-dr, namespace: payments }
spec:
host: payments. svc. cluster. local trafficPolicy:
tls: { mode: ISTIO_MUTUAL }
4. 3 Linkerd-mSL 기본값
'linkerd 설치 후 사용 가능' + 'linkerd 주입'.
클러스터-자체 트러스트 앵커, 자동 회전.
5) 교통 관리
5. 1 Istio: VirtualService (노선, 카나리아)
yaml apiVersion: networking. istio. io/v1 kind: VirtualService metadata: { name: payments }
spec:
hosts: ["payments"]
http:
- route:
- destination: { host: payments, subset: v1 } # stable weight: 90
- destination: { host: payments, subset: v2 } # canary weight: 10 retries: { attempts: 2, perTryTimeout: 300ms }
timeout: 2s
DestinationRule (LB/CB):
yaml apiVersion: networking. istio. io/v1 kind: DestinationRule metadata: { name: payments }
spec:
host: payments subsets:
- name: v1 labels: { version: v1 }
- name: v2 labels: { version: v2 }
trafficPolicy:
loadBalancer: { simple: LEAST_CONN }
outlierDetection:
consecutive5xx: 5 interval: 5s baseEjectionTime: 30s maxEjectionPercent: 50
5. 2 Linkerd: 서비스 프로파일 + 트래 피스 플리트
yaml apiVersion: linkerd. io/v1alpha2 kind: ServiceProfile metadata:
name: payments. default. svc. cluster. local spec:
routes:
- name: POST /withdraw condition:
method: POST pathRegex: "/withdraw"
isRetryable: true timeout: 2s apiVersion: split. smi-spec. io/v1alpha2 kind: TrafficSplit metadata: { name: payments }
spec:
service: payments backends:
- service: payments-v1 weight: 90
- service: payments-v2 weight: 10
6) 침입/탈출 및 API 게이트웨이
Istio Gateway (ingress/egress) -들어오는/나가는 트래픽, TLS 종료, mTLS 통과를 제어합니다.
Linkerd는 기존 수입 컨트롤러 (NGINX/Contour/Traefik) 와 함께 작동합니다. 출구-네트워크 정책/출구 게이트웨이 패턴을 통해.
탈출 정책: 도메인 화이트리스트, SNI 정책, 직접 인터넷 금지.
7) 승인 및 정책
7. 1 Istio AuthorizationPolicy (RBAC/ABAC)
yaml apiVersion: security. istio. io/v1 kind: AuthorizationPolicy metadata: { name: allow-withdraw, namespace: payments }
spec:
selector: { matchLabels: { app: payments } }
action: ALLOW rules:
- from:
- source:
principals: ["spiffe://cluster. local/ns/api/sa/gateway"]
to:
- operation:
methods: ["POST"]
paths: ["/withdraw"]
when:
- key: request. auth. claims[role]
values: ["cashout"]
7. 2 링커드 정책 (서버 + 서버 인증)
yaml apiVersion: policy. linkerd. io/v1beta3 kind: Server metadata: { name: payments-server, namespace: payments }
spec:
podSelector: { matchLabels: { app: payments } }
port: 8080 apiVersion: policy. linkerd. io/v1beta3 kind: ServerAuthorization metadata: { name: allow-gateway, namespace: payments }
spec:
server: { name: payments-server }
client:
meshTLS:
identities: [".ns. api. serviceaccount. identity. linkerd. cluster. local"]
8) 관찰 및 원격 측정
8. 1 메트릭
Istio Telemetry API → Prometheus: 'istio _ 요청 _ total', 'istio _ 요청 _ 지속 시간 _ million _ bucket', 'istio _ tcp _ reseed _ bytes _ total'.
Linkerd viz: '요청 _ total', 대기 시간 p50/p95/p99, 'success _ rate'.
8. 2 개의 트레일과 로그
W3C 추적 컨텍스트를 푸시하십시오.
Istio/Envoy → OTLP 달력 OpenTelemetry Collector; Linkerd-사이드카 로거/앱 SDK를 통해.
8. 인스턴스 3 개
추적 점프를 위해 지속 시간 히스토그램에 trace _ id를 추가하십시오.
9) 속도 제한, WAF, 사용자 정의 필터
Istio: 로컬 요금 제한, eksternal 요율 제한 서비스 (Redis) 및 WAF 논리 (Lua/WASM) 에 대한 EnvoyFilter/WASM.
Linkerd: 제한된 기본 지원; 속도 제한 - 수입/게이트웨이 수준에서.
10) 멀티 클러스터
Istio: 동서 게이트웨이, 공유 PKI 또는 트러스트 번들, ServiceEntry, Federation을 통한 서비스 발견.
Linkerd: 'linkerd 멀티 클러스터 링크', 클러스터 당 게이트웨이, 서비스 미러 контролле).
사용 사례: 자산 지역, 교통 현지화, 연합 제로 트러스트.
11) 성능 및 비용
사이드카 메쉬: 포드 당 CPU/RAM 오버 헤드, 대기 시간 증가 (일반적으로 정상 상태에서 홉 당 + 1-3ms).
주변 (Istio): L4의 소비 감소, L7이 시작됩니다.
Linkerd: 경량 프록시는 일반적으로 오버 헤드가 적지 만 L7 기능은 적습니다.
연습: p95/CPU 전후를 측정하고 SLO 게이트를 열화하도록 유지하십시오.
12) 안전
어디서나 mTLS, 짧은 TTL, 자동 회전.
'승인 정책: ALLOW all' 금지에 대한 코드 (OPA/Gatekeeper, Kyverno) 로서의 정책.
비밀-선언문이 아닌 CSI/Vault를 통해.
탈출 제어: 기본적으로 거부되는 명시 적 허용 목록.
환경에 대한 별도의 신뢰 도메인 (prod/stage).
13) 릴리스 및 SLO 게이팅과의 통합
Canary/Blue-Green은 메시 경로로 구현됩니다 (예 참조).
Argo 롤아웃 분석의 메트릭 분석 (Prometheus/SpanMetrics) -연소 율/p95/5xx의 히치 하이킹/롤백.
Grafana의 릴리스 주석: 비교 '버전 = 안정적인' 카나리아 '.
14) 반 패턴
메쉬 "어디서나 한 번에" → 인프라 충격을 포함하십시오.
프록시 → TSDB/로그 스토리지에 과부하가 걸리는 메트릭/로그의 카디널리티를 무시하십시오.
PERMISSIVE/불투명 모드로 mTLS를 영원히 남겨 두십시오.
게이트웨이/응용 프로그램 대신 EnvoyFilter 내에서 복잡한 WAF/비즈니스 로직을 만들어보십시오.
탈출 정책 없음-인터넷 유출/규정 준수 우회.
': 15000' 디버그가있는 프록시가 외부에 열립니다.
15) 구현 점검표 (0-60 일)
0-15 일
모델 선택: 로드 프로파일에 의하여 Sidecar vs Ambient (Istio )/Linkerd.
1-2 중요 서비스에 대한 기본 인증 정책 인 mSL STRICT를 사용하십시오.
기본 경로 (타임 아웃/재 시도), RED/SLO 대시 보드.
16-30 일
카나리아/트래픽 스 플리트, 핫 트랙에서 특이 치 감지/회로 파손.
OTEL 통합: 트레일 + Exemplars; 경고 연소율.
탈출 게이트웨이 및 도메인 화이트리스트; 기본값으로 거부합니다.
31-60 일
다중 클러스터 링크 (필요한 경우), 페더레이션 트러스트.
Code неAuthorizationPolicy/ServerAuthorization으로서의 정책.
게임 데이: 사고 및 경로/정책 롤백 시뮬레이션.
16) 성숙도 지표
mSL (STRICT/자동 회전) 서비스 범위는 서비스의 95% 이상입니다.
카나리아/프로그레시브를 통한 트래픽 비율은 80% 이상으로 방출됩니
기준선의 평균 오버 헤드 p95 <+ 5% (최적화 후).
허가없이 0 개의 출구, 기본 AuthZ를 사용한 100% 서비스.
"일정에서 추적까지" RCA는 2 분 (p50) 입니다.
17) "코드로서의 정치" 의 예
게이트 키퍼 (prod in permISSIVE)
yaml apiVersion: constraints. gatekeeper. sh/v1beta1 kind: K8sIstiomTLSStrict metadata: { name: deny-permissive-prod }
spec:
match:
kinds: [{ apiGroups: ["security. istio. io"], kinds: ["PeerAuthentication"] }]
namespaces: ["prod-"]
parameters:
allowedModes: ["STRICT"]
Kyverno (VS/DR에 필요한 레이블)
yaml apiVersion: kyverno. io/v1 kind: ClusterPolicy metadata: { name: require-mesh-labels }
spec:
rules:
- name: vs-dr-labels match:
any:
- resources:
kinds: ["VirtualService","DestinationRule"]
validate:
message: "owner and service labels required"
pattern:
metadata:
labels:
owner: "?"
service: "?"
18) 운영 팁
버전 정책 및 경로 (semver), GitOps를 통한 프로모션.
프록시 관찰 가능성: 개별 "프록시 채도" 대시 보드 (CPU/heap, retries, 429/503).
카디널리티 예산: '경로', '코드', '대상' -템플릿 만 표시합니다.
네트워크 제한/네임 스페이스 할당량 (NetworkPolicy/LimitRange).
명령 문서: 런북 "mSL 경로/정책/키를 롤백하는 방법".
19) 결론
Istio와 Linkerd는 서비스 간 통신의 안전, 신뢰성 및 가시성을 표준화하는 동일한 작업을 수행하지만 다양한 깊이와 소유 비용으로 수행합니다.
풍부한 L7 기능과 유연한 정책이 필요합니다. Istio를 사용하십시오 (간접비를 줄이려면 Ambient를 고려하십시오).
단순성과 작은 오버 헤드가 필요합니다-Linkerd를 사용하십시오
선택한 메시: 기본적으로 mTLS를 활성화하고, 코드로 라우팅을 관리하고, 메트릭을 트랙과 연관시키고, 출구를 닫고, SLO 게이팅을 릴리스에 추가하십시오. 그런 다음 네트워크 계층은 "블랙 박스" 가되지 않으며 안정성과 변화 속도를위한 예측 가능한 도구가됩니다.