Service Mesh 技能用于通过 Istio 或 Linkerd 实施服务间通信管理,涵盖 mTLS、流量整形、可观测性和策略执行。
适用场景
- 使用自动 mTLS 保护微服务通信。
- 实施金丝雀部署、流量拆分或 A/B 测试。
- 在不修改应用代码的情况下加入熔断、重试和超时。
- 获得服务级可观测性(延迟、错误率、请求量)。
- 在服务之间执行授权策略。
前置条件
- Kubernetes 集群(1.26+),已配置 kubectl。
- 已安装 Helm 3(用于部分安装方式)。
- 足够的集群资源(Istio 控制平面约需 2GB RAM)。
- Istio:需安装 istioctl CLI。
- Linkerd:需安装 linkerd CLI。
Istio 安装 使用 istioctl 安装:
下载 istioctl
curl -L https://istio.io/downloadIstio | sh - cd istio-* export PATH=$PWD/bin:$PATH
使用生产配置安装
istioctl install --set profile=default -y
或使用演示配置(包含所有插件,适合学习)
istioctl install --set profile=demo -y
验证安装
istioctl verify-install
检查运行组件
kubectl get pods -n istio-system
启用 Sidecar 注入:
为命名空间启用自动 Sidecar 注入
kubectl label namespace default istio-injection=enabled
验证标签
kubectl get namespace default --show-labels
重启现有 Pod 以注入 Sidecar
kubectl rollout restart deployment -n default
检查 Sidecar 状态
kubectl get pods -n default -o jsonpath='{range .items[]}{.metadata.name}{" containers: "}{range .spec.containers[]}{.name}{" "}{end}{"\n"}{end}'
安装可观测性插件:
安装 Kiali、Prometheus、Grafana、Jaeger
kubectl apply -f samples/addons/prometheus.yaml kubectl apply -f samples/addons/grafana.yaml kubectl apply -f samples/addons/jaeger.yaml kubectl apply -f samples/addons/kiali.yaml
等待 rollout
kubectl rollout status deployment/kiali -n istio-system
访问仪表盘
istioctl dashboard kiali istioctl dashboard grafana istioctl dashboard jaeger
流量管理 VirtualService(路由规则)示例为金丝雀部署的流量拆分,支持基于请求头的路由(x-canary: true)和基于百分比的流量拆分(stable 90、canary 10),并配置 timeout 与 retries。
DestinationRule(子集与连接策略)配置连接池(TCP maxConnections、HTTP 请求限制)、离群检测(consecutive5xxErrors、interval、baseEjectionTime、maxEjectionPercent)以及 stable/canary 子集。
Gateway(入口流量)将服务暴露给外部流量,支持 HTTPS(SIMPLE 模式、credentialName 引用 Kubernetes secret)、HTTP 到 HTTPS 重定向,并配合 VirtualService 绑定网关。
mTLS 配置
- 集群级严格 mTLS:在 istio-system 命名空间设置 PeerAuthentication,mtls.mode 为 STRICT。
- 每命名空间宽松 mTLS:迁移期间允许明文与 mTLS 并存,mtls.mode 为 PERMISSIVE。
- 验证 mTLS 状态可使用 istioctl x describe pod、istioctl proxy-config cluster 查看 tlsContext,以及 istioctl authn tls-check。
授权策略 通过 AuthorizationPolicy 实现,例如仅允许 frontend 服务账户调用 API 的 GET/POST /api/*,并用 DENY 规则拒绝其他流量。注意默认拒绝时需先添加显式 ALLOW 规则。
熔断 通过 DestinationRule 配置连接池(maxConnections、http1MaxPendingRequests、http2MaxRequests、maxRetries)与离群检测(consecutive5xxErrors、interval、baseEjectionTime、maxEjectionPercent)。
Linkerd 安装
安装 Linkerd CLI
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh export PATH=$HOME/.linkerd2/bin:$PATH
验证集群前置条件
linkerd check --pre
安装 Linkerd CRD
linkerd install --crds | kubectl apply -f -
安装 Linkerd 控制平面
linkerd install | kubectl apply -f -
验证安装
linkerd check
向命名空间注入 Sidecar
kubectl get deploy -n my-app -o yaml | linkerd inject - | kubectl apply -f -
或为命名空间添加注解以自动注入
kubectl annotate namespace my-app linkerd.io/inject=enabled
查看实时流量仪表盘
linkerd viz install | kubectl apply -f - linkerd viz dashboard
Linkerd 流量拆分(SMI) 通过 TrafficSplit 资源,指定 service 与 backends(含权重),例如 stable 900、canary 100。
调试
- Istio:istioctl proxy-config routes/clusters/listeners,istioctl analyze 分析配置问题,istioctl proxy-config log 调整代理调试日志级别。
- Linkerd:linkerd viz stat/top/edges 查看代理统计与流量。
故障排查
- Sidecar 未注入:缺少命名空间标签,添加 istio-injection=enabled 标签并重启 Pod。
- 服务间 503 错误:mTLS 不匹配(一侧为明文),迁移期间将 PeerAuthentication 设为 PERMISSIVE。
- 安装网格后延迟升高:Sidecar 资源限制过低,在网格配置中增加 Sidecar CPU/内存限制。
- VirtualService 未路由:缺少 DestinationRule 子集,创建匹配的子集标签。
- upstream connect error:熔断触发,检查离群检测设置、提高阈值。
- 授权策略阻断一切:默认拒绝且无匹配的允许规则,先添加显式 ALLOW 规则再 DENY-all。
- Kiali 显示 "Unknown" 流量:调用方服务缺少 Sidecar,为所有通信服务注入 Sidecar。
相关技能 load-balancing(Kubernetes 之外的 L4/L7 负载均衡)、reverse-proxy(入口级代理)、ai-inference-service-mesh(ML 工作负载的网格模式)、dns-management(网格入口网关的 DNS)。