You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Istio配置DestinationRule访问网格外遗留服务mTLS异常问题

问题根因

你当前配置存在三个核心问题,直接导致测试失败:

  • 未将网格外的legacy服务注册到Istio服务注册表,DestinationRule规则完全不生效。mymtls-app位于未注入sidecar的legacy命名空间,属于网格外服务,默认情况下Istio sidecar会直接透传发往该服务的流量,不会应用你配置的mTLS发起规则:
    • 用HTTP协议访问时,sidecar直接将明文HTTP请求转发到后端HTTPS端口,触发Client sent an HTTP request to an HTTPS server错误
    • 用HTTPS协议访问时,TLS握手由业务容器内的curl进程直接发起,完全绕过sidecar的mTLS配置,因curl未携带合法客户端证书,触发服务端返回的bad certificate错误
  • 证书挂载位置错误。负责发起mTLS连接的是Pod内的istio-proxy sidecar容器,而非业务sleep容器,你将证书仅挂载到sleep容器内部,sidecar完全无法读取证书、私钥和CA文件,即使规则生效也无法完成mTLS握手。
  • 配置存在证书混用风险:你在DestinationRule中配置的客户端证书文件名为server.cert/server.key,属于服务端证书命名规则,mTLS客户端必须使用带客户端认证扩展密钥用法的专属客户端证书,否则会被服务端直接拒绝。
正确实现步骤

1. 调整证书挂载配置,让sidecar可读取证书

将存储mTLS证书的Secret同时挂载到istio-proxy sidecar容器的可访问路径下,推荐使用Istio sidecar注入注解实现,无需手动修改自动注入的sidecar配置,在sleep pod对应的Deployment模板metadata中添加如下注解:

annotations:
  sidecar.istio.io/userVolume: '[{"name":"legacy-mtls-certs","secret":{"secretName":"legacy-mtls-secret"}}]'
  sidecar.istio.io/userVolumeMount: '[{"name":"legacy-mtls-certs","mountPath":"/etc/istio/mtls-legacy","readOnly":true}]'

注意确认证书文件对sidecar运行的1337 UID可读,业务容器不需要访问该目录也可正常通信。

2. 创建ServiceEntry注册网格外legacy服务

在mesh-apps命名空间创建ServiceEntry,将legacy服务纳入Istio服务管理范围,让DestinationRule可以正确匹配对应流量:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: legacy-mymtls-app
  namespace: mesh-apps
spec:
  hosts:
  - mymtls-app.legacy.svc.cluster.local
  ports:
  - number: 8443
    name: https-mtls
    protocol: HTTPS
  resolution: DNS
  endpoints:
  - address: mymtls-app.legacy.svc.cluster.local
    ports:
      https-mtls: 8443

3. 修正DestinationRule配置

调整证书路径为sidecar内的挂载路径,确认客户端证书、私钥、CA文件与实际Secret内的文件名一致:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: originate-mtls
  namespace: mesh-apps
spec:
  host: mymtls-app.legacy.svc.cluster.local
  trafficPolicy:
    portLevelSettings:
    - port:
        number: 8443
      tls:
        mode: MUTUAL
        clientCertificate: /etc/istio/mtls-legacy/client.crt
        privateKey: /etc/istio/mtls-legacy/client.key
        caCertificates: /etc/istio/mtls-legacy/ca.pem
        sni: mymtls-app.legacy.svc.cluster.local

4. 功能验证

配置生效后,直接在业务容器内用HTTP协议发起请求即可,不需要指定HTTPS协议,TLS握手和mTLS认证流程完全由sidecar自动处理:

kubectl exec sleep-37893-foobar -c sleep -- curl http://mymtls-app.legacy.svc.cluster.local:8443/hello
排错注意事项
  • 禁止在业务容器内用HTTPS协议访问目标服务,否则TLS握手由业务进程直接发起,会绕过sidecar的mTLS规则
  • 提前验证客户端证书有效性:确认证书由legacy服务信任的CA签发,且包含TLS Web Client Authentication扩展密钥用法
  • 提前验证服务端证书有效性:确认legacy服务的证书由你配置的ca.pem信任的CA签发,证书SAN包含配置的SNI域名mymtls-app.legacy.svc.cluster.local
  • 可以通过istioctl pc cluster sleep-37893-foobar.mesh-apps --fqdn mymtls-app.legacy.svc.cluster.local -o yaml命令查看sidecar是否正确加载了mTLS配置

内容的提问来源于stack exchange,提问作者CppNoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:24:20