SuperAPI AI 工具集

service-mesh

部署与运维

查看项目

更新于 10-15 12:53

技能介绍

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)。