服务网格将流量管理、安全策略和可观测性从应用代码中解耦到Sidecar代理层。Istio基于Envoy构建Sidecar,通过xDS协议下发配置,实现细粒度的流量治理。Istio的流量管理能力覆盖请求路由、负载均衡、熔断重试、灰度发布等场景,mTLS加密通信则为服务间调用提供身份认证和传输安全。
Istio安装与Sidecar注入
Istio通过istioctl安装,选择minimal profile可以减少不必要的组件。安装后通过Namespace标签开启自动Sidecar注入:
# 下载istioctl
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.22.0
export PATH=$PWD/bin:$PATH
# 安装Istio(minimal profile)
istioctl install --set profile=minimal -y
# 验证安装
kubectl get pods -n istio-system
# 为namespace开启自动注入
kubectl label namespace default istio-injection=enabled
# 重启已有Pod使其注入Sidecar
kubectl rollout restart deployment -n default
注入Sidecar后,每个Pod会新增一个istio-proxy容器。验证Sidecar是否正常运行:
# 查看Pod容器列表,应包含istio-proxy
kubectl get pods -n default -o jsonpath='{.items[*].spec.containers[*].name}'
# 查看Sidecar代理状态
kubectl exec -it <pod-name> -c istio-proxy -- pilot-agent request GET /ready
VirtualService流量路由与灰度发布
VirtualService定义请求路由规则,支持基于URI、Header、权重的流量分发。以下配置实现10/90的灰度发布流量切分:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-service
namespace: default
spec:
hosts:
- "my-service.default.svc.cluster.local"
http:
- name: canary
match:
- headers:
x-canary:
exact: "true"
route:
- destination:
host: my-service
subset: v2
- name: primary
route:
- destination:
host: my-service
subset: v1
port:
number: 8080
weight: 90
- destination:
host: my-service
subset: v2
port:
number: 8080
weight: 10
retries:
attempts: 3
perTryTimeout: 2s
retryOn: 5xx,reset,connect-failure
timeout: 5s
对应的DestinationRule定义subset和负载均衡策略:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: my-service
namespace: default
spec:
host: my-service
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 50
maxRequestsPerConnection: 10
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 30s
maxEjectionPercent: 50
subsets:
- name: v1
labels:
version: "1"
- name: v2
labels:
version: "2"
熔断器与异常驱逐配置
outlierDetection实现被动健康检查:当某个Pod连续返回5个5xx错误时,Istio将该Pod从负载均衡池中驱逐30秒。connectionPool控制并发连接上限,防止慢节点拖垮整个集群。
# 查看某个服务的upstream健康状态
kubectl exec -it <pod-name> -c istio-proxy -- pilot-agent request GET /clusters | grep my-service
# 输出示例:
# my-service.default.svc.cluster.local::8080::cx_active::0
# my-service.default.svc.cluster.local::8080::cx_connect_fail::0
# my-service.default.svc.cluster.local::8080::rq_total::15234
# my-service.default.svc.cluster.local::8080::health_flags::healthy
health_flags为healthy表示正常,unhealthy表示被驱逐。被驱逐的实例在baseEjectionTime后会自动恢复,无需人工干预。
mTLS双向认证配置
Istio的mTLS通过SPIFFE证书自动管理,每个Sidecar持有由Istio CA签发的证书,服务间通信自动协商TLS。mTLS策略通过PeerAuthentication定义:
# 全局强制mTLS(PERMISSIVE模式逐步迁移,STRICT模式强制)
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
# 对特定端口使用PERMISSIVE(兼容未注入Sidecar的服务)
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: legacy-service
namespace: default
spec:
selector:
matchLabels:
app: legacy-service
mtls:
mode: PERMISSIVE
验证mTLS是否生效,通过istioctl检查证书链:
# 检查Sidecar之间的mTLS状态
istioctl authn tls-check <pod-name>.default
# 输出示例:
# HOST:PORT STATUS SERVER CLIENT
# my-service.default.svc.cluster.local OK mTLS mTLS
# 查看Sidecar证书详情
kubectl exec -it <pod-name> -c istio-proxy -- openssl s_client -connect 127.0.0.1:15000 -showcerts
AuthorizationPolicy授权规则
mTLS提供传输层加密和身份认证,AuthorizationPolicy在此基础上实现细粒度的访问控制——限制哪些服务可以调用哪个接口:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: api-access-control
namespace: default
spec:
selector:
matchLabels:
app: my-service
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/default/sa/frontend"]
to:
- operation:
methods: ["GET", "POST"]
paths: ["/v1/api/*"]
- {}
流量镜像与故障注入测试
流量镜像是安全的线上验证手段——将生产流量复制到新版本而不影响真实响应。故障注入则用于验证系统的容错能力:
# 流量镜像:将100%流量复制到v2(v2的响应被丢弃)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: mirror-test
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
subset: v1
weight: 100
mirror:
host: my-service
subset: v2
mirrorPercentage:
value: 100.0
---
# 故障注入:对10%的请求注入500ms延迟
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: fault-test
spec:
hosts:
- my-service
http:
- fault:
delay:
percentage:
value: 10.0
fixedDelay: 500ms
route:
- destination:
host: my-service
Istiod配置下发监控
Istiod通过xDS协议向Sidecar推送配置。配置下发延迟或失败会导致流量规则不生效。监控关键指标:
# 查看Sidecar与Pilot的xDS同步状态
istioctl proxy-status
# 输出示例:
# NAME NAMESPACE CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION
# my-service.default default Kubernetes SYNCED SYNCED SYNCED SYNCED istiod-xxx 1.22.0
# 查看Sidecar完整配置dump
kubectl exec -it <pod-name> -c istio-proxy -- pilot-agent request GET /config_dump > config_dump.json
# 检查Envoy拒绝的配置
kubectl logs -n istio-system <istiod-pod> | grep "rejected"
SYNCED表示配置已同步,NOT SENT表示Sidecar尚未接收。如果大量Sidecar显示STALE,检查Istiod内存和CPU资源是否不足。
服务网格的价值在于将基础设施逻辑从应用代码中剥离。Istio的Sidecar模式虽然增加了一层代理开销(通常2-3ms延迟),但换来了统一的流量治理和安全能力。生产部署中建议根据服务规模调整Sidecar资源限制,并持续监控xDS推送延迟。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/fu-wu-wang-ge-istio-shi-zhan-liu-liang-zhi-li-gui-ze-yu/