kiali 通过挂锁图标直观显示服务网格中 mtls 加密链路,但依赖 istio 正确配置 peerauthentication 和 destinationrule; strict 策略、sidecar 注入、fqdn 调用及证书正常是加密生效前提。

Kiali 能直观显示服务网格中 mTLS 加密通信链路,但前提是 Istio 已启用并正确配置了双向 TLS。它本身不开启加密,而是从 Envoy 代理和 Pilot 的配置中识别并渲染 mTLS 状态,关键在底层是否真实生效。
确认 mTLS 已全局或按命名空间启用
Istio 默认安装(如 default profile)已启用 Telemetry v2 和 mTLS strict 模式(1.20+ 版本)。但需验证实际策略:
- 检查 PeerAuthentication 策略:运行
kubectl get peerauthentication -A,若存在STRICT类型且作用域覆盖目标命名空间,则 mTLS 已强制启用 - 若使用
PERMISSIVE或未定义策略,Kiali 图中将显示“unencrypted”或无锁图标,即使服务间有调用也不会标记为加密 - 临时启用 strict 模式示例:
kubectl apply -f - apiVersion: security.istio.io/v1beta1<br>kind: PeerAuthentication<br>metadata:<br> name: default<br> namespace: istio-system<br>spec:<br> mtls:<br> mode: STRICT<br>EOF
拓扑图中识别加密链路的视觉标识
登录 Kiali Graph 页面后,mTLS 状态通过节点连线上的图标和颜色直接体现:
- 每条边(即服务间调用线)右上角出现 挂锁图标 ?,表示该链路当前使用 mTLS 加密
- 若为灰色锁,说明是 mTLS but no traffic;绿色锁表示活跃加密流量;红色叉则代表 mTLS 协商失败(如证书不匹配、时间不同步)
- 鼠标悬停连线 → 查看详情面板 → “Security” 栏明确标注 mTLS: Enabled 或 mTLS: Disabled
- 切换图形类型为 Versioned App 或 Workload 可更精细观察各版本/实例间的加密状态差异
排查常见加密显示异常
即使配置了 strict mTLS,Kiali 仍可能显示“unencrypted”,原因通常不在 Kiali 本身:
-
Sidecar 注入缺失:任一调用方或被调用方 Pod 未注入 istio-proxy,流量绕过 Envoy,无法协商 mTLS —— 检查
kubectl get pod -n <ns> -o wide</ns>是否含两个容器 -
目标规则(DestinationRule)未配置 TLS 设置:即使 PeerAuthentication 启用,若 DestinationRule 中
trafficPolicy.tls.mode未设为ISTIO_MUTUAL,客户端 Sidecar 不会发起 mTLS 请求 -
服务未使用 FQDN 调用:例如用
http://reviews而非http://reviews.default.svc.cluster.local,可能导致 DNS 解析绕过 Istio 服务发现,跳过 mTLS 流程 -
Citadel/Istiod 证书分发异常:检查
istiodPod 日志是否有证书签发失败提示,或执行istioctl authn tls-check验证具体服务的证书状态
结合健康与配置视图交叉验证
单看 Graph 不足以确认加密可靠性,建议联动其他 Kiali 视图:
- 进入 Applications → 选择某服务 → 切换到 Security 子页,查看该应用所有工作负载的 mTLS 兼容性状态(Compatible / Not Compatible)
- 进入 Istio Config → 筛选 PeerAuthentication 和 DestinationRule,确认策略范围、模式及 TLS 字段是否一致生效
- 在 Validation 页面查看是否有红色告警,例如 “DestinationRule missing TLS settings” 或 “PeerAuthentication conflicts with namespace policy”











