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错误
- 用HTTP协议访问时,sidecar直接将明文HTTP请求转发到后端HTTPS端口,触发
- 证书挂载位置错误。负责发起mTLS连接的是Pod内的
istio-proxysidecar容器,而非业务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
相关产品推荐
相关产品推荐

