10.3 服務網格:Istio 無侵入治理與 mTLS#
10.2 節管「南北流量」(進出集群),本節管「東西流量」(服務互調)。不改一行業務程式碼,加上可觀測、可控、可信的治理層。
邊車模式:每個 Pod 配一個保鏢#
服務網格(Service Mesh) 的核心是邊車(Sidecar):給每個業務 Pod 自動注入一個 Envoy 代理,所有進出流量都經它轉發。業務只管調 http://pay:80,治理(重試、熔斷、加密、可觀測)全由邊車完成。
flowchart TD
subgraph POD1[Pod order]
B1[order 容器] <--> E1[Envoy 邊車]
end
subgraph POD2[Pod pay]
B2[pay 容器] <--> E2[Envoy 邊車]
end
E1 <==mTLS 加密==> E2
ISTIOD[istiod<br/>控制面下發規則] -.xDS.-> E1 & E2# 安裝並啟用自動注入(以 istioctl 為例)
istioctl install --set profile=default -y
kubectl label namespace default istio-injection=enabled
kubectl apply -f deployment.yaml # 重建 Pod 即帶邊車
kubectl get pods -o jsonpath='{.items[0].spec.containers[*].name}'
這呼應 5.4 節:以前限流熔斷要埋 Sentinel SDK,現在零侵入,換語言也照樣治理。
mTLS:預設就加密#
網格內服務間預設開啟 mTLS:身份認證 + 流量加密,防止內網竊聽與偽造。這是零信任的基礎。
# peerauthn.yaml:整個命名空間強制 mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls: { mode: STRICT }
kubectl apply -f peerauthn.yaml
istioctl authn tls-check order-pod # 驗證是否生效
流量治理:VirtualService + DestinationRule#
# vs-dr.yaml:金絲雀 5% + 熔斷,可直接 apply
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: order
spec:
hosts: [order]
http:
- match: [{ headers: { x-canary: { exact: "true" } } }]
route: [{ destination: { host: order, subset: v2 } }]
- route:
- destination: { host: order, subset: v1 }
weight: 95
- destination: { host: order, subset: v2 }
weight: 5
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: order
spec:
host: order
subsets:
- name: v1
labels: { version: v1 }
- name: v2
labels: { version: v2 }
trafficPolicy:
connectionPool: { tcp: { maxConnections: 100 }, http: { h2UpgradePolicy: DEFAULT } }
outlierDetection: # 熔斷:連續 5 錯就逐出 30s,呼應 5.4 節
consecutive5xxErrors: 5
interval: 10s
baseEjectionTime: 30s
kubectl apply -f vs-dr.yaml
# 按 Header 灰度驗證
curl -H "x-canary: true" http://order/
kubectl exec deploy/order -- curl -s http://order/ # 觀察 95/5 分流
治理能力一覽#
| 能力 | 傳統做法(第五章) | 網格做法 |
|---|---|---|
| 負載均衡 | SDK(Ribbon) | 邊車自動完成 |
| 熔斷限流 | 埋 Sentinel | DestinationRule / 註解 |
| 灰度發布 | 人工切 Nginx | VirtualService 權重 |
| 可觀測 | 各服務打日誌 | 自動產出三金指標 + Trace(13.2 節) |
| 加密 | 手配 TLS | mTLS 預設開啟 |
代價是資源與複雜度:每個 Pod 多一個邊車(約幾十 MB + 0.1 核),小集群別硬上。
本章小結#
- 服務網格 = 邊車代理 + 控制面,治理東西流量。
- 注入無侵入,mTLS 預設加密,零信任落地。
- VirtualService 管路由(灰度),DestinationRule 管策略(熔斷、連接池)。
- 呼應 5.4 節三板斧,但從 SDK 埋點升級為平台能力。
- 儲存與配置這類「狀態」問題,交給 10.4 節。
想一想#
- 邊車模式的最大優點(無侵入)與最大代價(資源/複雜度)各是什麼?小團隊該上 Istio 嗎?
- VirtualService 與 10.2 節 Ingress 的分工有何不同?一個請求同時經過兩者時順序是?
- mTLS STRICT 模式開啟後,未注入邊車的舊服務會發生什麼?如何平滑遷移?