서비스 메시 및 교통 정책
1) 서비스 메시 이유
Service Mesh는 코드를 다시 작성하지 않고 균일 한 기능을 제공하는 동서 트래픽 (서비스 간 통신) 을위한 인프라 계층입니다
기본 보안: mSL, 자동 발급/인증서 회전, 서비스 신원 확인.
교통 정책: L7 라우팅, 카나리아/AV 테스트, 열화 및 안정성.
관찰 가능성: 각 통화의 메트릭, 로그, 흔적, 금 신호.
운영: 모든 언어/프레임 워크에 대한 균일 한 정책.
API 게이트웨이와의 차이점: 게이트웨이 - 남북 경계; 메쉬-클러스터/조직 내 동서. 종종 함께 일하십시오.
2) 아키텍처: 비행기 및 패턴
데이터 비행기: 포드/VM 트래픽을 차단하는 사이드카 프록시 (Envoy/Linkerd-proxy/haprocy).
제어 평면: 구성 (경로, 정책, 인증서) 을 배포하고 상태를 저장하며 서비스 드라이브를 게시합니다.
신원: 일반적으로 SPIFFE ID 및 자동
출입 지점: 경계 흐름을 모니터링하기위한 진입/출구 게이트웨이.
구현 모드: 각 언더의 사이드카; 새로운 구현에서 노드 당/주변 모드.
3) 보안 정책 및 제로 트러스트
1. 기본적으로 mTLS-servis의 서비스 서비스 암호화 및 상호 인증.
2. AuthN/AuthZ:- 권한: CA mesh 'a (SPIFFE) 에서 발행 한 신원 만 신뢰하십시오.
- AuthZ: 선언적인 "누가 어떻게 할 수 있고 어떻게" 규칙 (RBAC/ABAC).
- 허용 된 도메인/서브넷; 탈출구를 통한 강제 탈출.
- 난로에서 직접적인 결과를 차단합니다.
3. 격리 및 탈출 제어:
4. 비밀 회전: 수명이 짧은 인증서, 자동 프록시 재구성.
yaml apiVersion: security. istio. io/v1beta1 kind: PeerAuthentication metadata: { name: default, namespace: istio-system }
spec:
mtls: { mode: STRICT }
Istio (예: gRPC 인벤토리 → 청구 만 허용):
yaml apiVersion: security. istio. io/v1beta1 kind: AuthorizationPolicy metadata: { name: billing-allow, namespace: prod }
spec:
selector: { matchLabels: { app: billing } }
rules:
- from:
- source: { principals: ["spiffe://corp. local/ns/prod/sa/inventory"] }
to:
- operation: { ports: ["8080"], methods: ["POST"], paths: ["/proto. Billing/"] }
4) 교통 정책: 지속성 및 라우팅
4. 타임 아웃 및 후퇴 1 개
시간 초과: 통화시 설정해야합니다 (연결/읽기/전체).
재 시도: dempotent 연산에 대해서만; 백오프 + 지터; 시도 당 타임 아웃을 제한합니다.
yaml apiVersion: networking. istio. io/v1beta1 kind: VirtualService metadata: { name: orders }
spec:
hosts: ["orders"]
http:
- route:
- destination: { host: orders, subset: v1, port: { number: 8080 } }
timeout: 5s retries:
attempts: 2 perTryTimeout: 2s retryOn: "5xx,connect-failure,reset"
4. 2 회로 차단기... 이상 감지
CB: 동시 요청/연결을 제한하여 업스트림을 보호합니다.
이상: 오류/대기 시간에 따라 "나쁜" 인스턴스를 버립니다.
yaml apiVersion: networking. istio. io/v1beta1 kind: DestinationRule metadata: { name: orders }
spec:
host: orders trafficPolicy:
connectionPool:
http: { http1MaxPendingRequests: 1024, maxRequestsPerConnection: 100 }
outlierDetection:
consecutive5xxErrors: 5 interval: 5s baseEjectionTime: 30s maxEjectionPercent: 50
4. 3 카나리아 및 조건 별
가중-트래픽은 v1/v2 가중치로 나뉩니다.
헤더 기반: 플래그/쿠키/테넌트 → 가 새 버전으로 전송됩니다.
세션 친화력: 키별로 해시 (깔끔하게 스케일).
yaml http:
- match: [{ headers: { "x-experiment": { exact: "new" } } }]
route: [{ destination: { host: orders, subset: v2 } }]
- route:
- destination: { host: orders, subset: v1, weight: 90 }
- destination: { host: orders, subset: v2, weight: 10 }
4. 4 결함 주입 및 분해
견고성 테스트 및 SLO에 대한 지연/오류 주입.
yaml fault:
delay: { fixedDelay: 300ms, percentage: { value: 10 } }
abort: { httpStatus: 503, percentage: { value: 1 } }
5) 네트워크 경계: 침입/탈출 및 외부 서비스
게이트웨이 게이트웨이: 메시의 외부 클라이언트를위한 유일한 진입 점; WAF/OIDC/ratelimites와의 통합.
탈출 게이트웨이: 허용 된 호스트 목록, TLS 검사, 원격 측정 기록이있는 중앙 출력.
ServiceEntry: 메시의 일부로 외부 SNI/호스트를 선언합니다 (정책 및 mTLS 원산지가 적용됨).
yaml apiVersion: networking. istio. io/v1beta1 kind: ServiceEntry metadata: { name: payments-external }
spec:
hosts: ["api. payments. com"]
ports: [{ number: 443, name: https, protocol: TLS }]
resolution: DNS location: MESH_EXTERNAL
6) 멀티 클러스터, 멀티 네트워크 및 하이브리드
공유 PKI/트러스트 도메인: 클러스터 간 단일 SPIFFE ID.
엔드 포인트 발견: 지역 간 서비스 공; 지역 우선 순위 및 장애.
구역 격리: 지역별 정책, 한계 및 우선 순위.
메시의 VM: 레거시/Stateful 시스템을 프록시 및 동일한 정책에 연결합니다.
7) 관찰 가능성, SLO 및 운영
다음과 같이 요청합니다.
액세스 로그: 구조적, '추적', '사용자/테넌트', '응답 _ 플래그'.
추적: 샘플링 헤더 자동 분사 (W3C 추적 컨텍스트) 는 홉 레벨에 걸쳐 있습니다.
SLO: 경로에서 p99/오류로 대상을 지정합니다 (서비스 → 서비스).
경고: '5xx' 스파이크, '재설정' 상승, 'exitlier _ ejections', mSL 저하 (핸드 셰이크 실패).
8) 성능 및 비용
사이드카는 송장을 추가합니다 (CPU/RAM/대기 시간). 최적화:- 위력: 필요한 경우 정치를 포함합니다. 어디서나 무거운 필터를 켜지 마십시오.
- 수영장: 경로 (중요/배경) 를 다른 경로와 한계로 나눕니다.
- 프로파일 링: "차가운" 경로의 p99, 원격 측정 량 (속도 제한 로그/트레일).
- 지원되고 적절한 경우 앰비언트/사이드리스 모드를 고려하십시오.
9) 안전 및 준수
최소 필요한 액세스: 방향과 방법을 명시 적으로 허용합니다.
네임 스페이스/테넌트에 대한 정책: 네트워크/인증 경계.
키 회전/AC: 계획 및 비상; 짧은 TTL 인증서.
PII/비밀: 로그/트랙에 마스킹; 와이어/휴식 시간에 암호화.
감사: 누가, 언제, 어떤 정책이 바뀌 었는가; 2 단계 뿌리.
10) K8 계층과의 통합
메시 정책은 NetworkPolicy를 대체하지 않고 보완합니다.
침입/탈출 게이트웨이에서 PodSecurity/PSA를 아래 레벨에서 매달 수 있습니다.
NRA/autoscaling: retrays/CB를 고려하십시오-하중이 변경됩니다.
출시 계획: VirtualService + 자동 SLO 프로모션을 통한 카나리아 가중치.
11) 구현 점검표
- 신뢰 범위가 정의되고 STRICT mTLS가 활성화되었습니다.
- AuthZ 정책 활성화: 누가 어떤 포트/메소드에 있는지.
- 타임 아웃/재 시도 및 특이 치 탐지가 구성되고 demotent 경로가 정의됩니다.
- 카나리아 노선 및 롤백 계획이 등록되어 있습니다. 결함 주입-비 prod에서만.
- 외부 종속성은 출구 게이트웨이 및 ServiceEntry를 통해 파생됩니다.
- 측정, 로그, 추적이 구성됩니다. p99/5xx/CB의 대시 보드 및 경고.
- 테넌트 당 쿼타/제한/네임 스페이스를 사용할 수 있습니다.
- 준비된 런북: 인증서 유출, CA 고장, 업스트림 저하, 질량 503/RESET.
- 다중 클러스터 계획 (공유 PKI, 로컬 우선 순위, DR 시나리오).
- 테스트 일 (게임 일): 드롭 제어 평면, 사이드카 정지, 네트워크 중단, 유독 한 업스트림.
12) 반 패턴
경로 재고 및 SLO → 값 비싼 복잡성없이 "어디서나 한 번에" 메시.
모든 방법에 대한 기본 배상 → 효과 중복 및 트래픽 눈사태.
비활성화 된 mTLS "일시적으로" → 는 영구적으로 유지됩니다.
게이트웨이 → 데이터 유출/설명되지 않은 종속성이없는 탈출.
모든 서비스에 대한 하나의 글로벌 정책 → 잘못된 보안 및 오 탐지.
제로 관찰 가능성: 메쉬를 포함하지만 메트릭/트레일을 수집하지 마십시오-의미를 잃습니다.
13) 빠른 레시피
Linkerd: 서버 별 mTLS 및 정책 활성화
yaml apiVersion: policy. linkerd. io/v1beta1 kind: Server metadata: { name: billing, namespace: prod }
spec:
podSelector: { matchLabels: { app: billing } }
port: 8080 apiVersion: policy. linkerd. io/v1beta1 kind: ServerAuthorization metadata: { name: billing-allow-inventory, namespace: prod }
spec:
server: { name: billing }
client:
meshTLS:
identities: ["inventory. prod. serviceaccount. identity. linkerd. cluster. local"]
영사 (L7 의도 + 스플리터)
hcl
Kind = "service-router"
Name = "orders"
Routes = [{
Match { HTTP { PathPrefix = "/v1" } }
Destination { Service = "orders" }
}]
Kind = "service-splitter"
Name = "orders"
Splits = [
{ Weight = 90, ServiceSubset = "v1" },
{ Weight = 10, ServiceSubset = "v2" }
]
14) FAQ
메쉬는 작은 팀이 필요합니까?
3-5 서비스를 제공하는 경우-더 자주 그렇지 않습니다. 좋은 수입 및 탄력성 라이브러리로 시작하십시오. mSL 기본, 균일 한 정책 및 코드 변경없이 추적이 필요한 경우 메쉬를 연결하십시오.
비용을 통제하는 방법?
중요 경로의 측정 오버 헤드 (CPU/RAM/대기 시간), 불필요한 필터 끄기, 로그/트레일의 양을 줄이고 안전한 곳에 사이드카없이 모드를 사용하십시오.
메쉬 및 수동으로 구성된 프록시를 방해 할 수 있습니까?
예, 그러나 이중 라우팅/중복 배상은 피하십시오. 제어 평면 인 단일 장소가 사실입니다.
더 중요한 것은 보안 또는 성능입니까?
기본값은 보안 (mSL, AuthZ) 입니다. 연결 풀, 특이 치 감지, 대상 경로를 조정하여 성능을 달성합니다.
15) 총계
Service Mesh는 서비스 간 네트워크를 암호화 및 신원, 미세 라우팅 및 탄력성, 원격 측정 및 할당량과 같은 균일 한 정책으로 프로그래밍 가능한 계층으로 전환합니다. 중요한 경로로 시작하고, STRICT mTLS 및 명시 적 AuthZ를 켜고, 타임 아웃/retrays/CB를 설정하고, 탈출을 제어하고, p99 및 5xx를 측정하고, 게임 일을 보냅니다. 그런 다음 메쉬는 놀라움의 원천이 아닌 신뢰성과 릴리스 속도의 증폭기가됩니다.