Istio注入Sidecar后Pod间HTTPS通信失败求助
问题描述
我创建了两个命名空间,一个开启Istio Sidecar注入,另一个未开启。在两个命名空间中均通过以下YAML部署简单Nginx服务器:
apiVersion: v1 kind: Service metadata: name: software-upgrader labels: app: software-upgrader service: software-upgrader spec: ports: - name: http port: 25301 selector: app: software-upgrader --- apiVersion: apps/v1 kind: Deployment metadata: name: software-upgrader spec: selector: matchLabels: app: software-upgrader version: v1 template: metadata: labels: app: software-upgrader version: v1 spec: containers: - image: gcr.io/mesh7-public-images/scalability/nginx imagePullPolicy: IfNotPresent name: software-upgrader resources: limits: cpu: 20m memory: 32Mi requests: cpu: 20m memory: 32Mi
随后按照HTTPS服务器部署步骤在两个命名空间部署HTTPS服务器,从其他Pod发起curl请求测试:未注入Sidecar的Pod请求返回200 OK,而注入Sidecar的Pod请求返回错误:
curl: (56) OpenSSL SSL_read: error:1409445C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required, errno 0 command terminated with exit code 56
请问是否需要创建ServiceEntry或VirtualService才能让注入Istio的同命名空间Pod间实现HTTPS通信?
解答
不需要创建ServiceEntry或VirtualService来实现同命名空间下注入Sidecar的Pod间HTTPS通信,问题根源在于Istio Sidecar的流量拦截逻辑:
- 注入Sidecar的Pod,所有出站流量会被Sidecar接管。若你的HTTPS服务器使用自定义证书,Sidecar默认会尝试终止TLS连接再重新发起请求,但因未信任该自定义证书,导致证书验证失败,触发报错。
- 未注入Sidecar的Pod直接发起HTTPS请求,不受Sidecar拦截,因此能正常返回200。
可通过以下方式解决:
- 透传HTTPS流量:为目标服务配置
DestinationRule,禁用Sidecar的TLS终止,让流量直接透传至HTTPS服务器:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: software-upgrader spec: host: software-upgrader.<你的命名空间>.svc.cluster.local trafficPolicy: tls: mode: DISABLE
- 信任自定义证书:将HTTPS服务器的证书添加到Istio的信任根集合中,或通过
DestinationRule配置Sidecar使用指定证书验证服务器身份。 - 启用Istio自动双向TLS:放弃自定义HTTPS配置,依赖Istio自动为服务间通信提供加密,无需手动管理证书。
内容的提问来源于stack exchange,提问作者Pradeep Padmanaban C
相关产品推荐
相关产品推荐

