Kubernetes pods 部署 istio 服务网格后无法发出 https 请求

Kubernetes pods can not make https request after deploying istio service mesh

我正在探索托管在 EKS(亚马逊)上的 k8s 集群上的 istio 服务网格。

我尝试在一个新的 k8s 集群上部署 istio-1.2.2,demo.yml 文件用于 bookapp 演示和我正确理解的大多数用例。

然后,我使用 helm 默认配置文件(推荐用于生产)在我现有的具有 100 多个微服务的开发集群上部署了 istio 运行,我注意到我的服务可以调用 http 端点但不能调用外部安全端点(https://www.google.com,等)

我得到:

curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number

尽管我能够从我的测试集群调用外部 https 端点。

为了验证,我检查了出口策略,它是 mode: ALLOW_ANY 在两个集群中。

现在,我从我的开发集群中完全删除了 istio,并安装了 demo.yml 进行测试,但现在这也不起作用。

我尝试将我的问题与此联系起来,但没有成功。

https://discuss.istio.io/t/serviceentry-for-https-on-httpbin-org-resulting-in-connect-cr-srvr-hello-using-curl/2044

我不明白我错过了什么或做错了什么。

注意:我指的是这个设置:https://istio.io/docs/setup/kubernetes/install/helm/

这很可能是 Istio 中的一个错误(参见示例 istio/istio#14520):如果您在集群中的任何位置有任何 Kubernetes 服务对象,它侦听端口 443 但其名称以 http(不是 https),它将中断所有出站 HTTPS 连接。

我遇到的这个实例涉及配置 AWS 负载均衡器来执行 TLS 终止。 Kubernetes 服务需要公开端口 443 来配置负载均衡器,但它接收普通的未加密 HTTP。

apiVersion: v1
kind: Service
metadata:
  name: breaks-istio
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:...
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
spec:
  selector: ...
  ports:
    - name: http-ssl # <<<< THIS NAME MATTERS
      port: 443
      targetPort: http

当我对此进行试验时,将 name: 更改为 httpstcp-https 似乎可行。这些 name prefixes 对 Istio 很重要,但我还没有立即发现告诉 Istio 端口是 HTTPS(即使它实际上不提供 TLS)与普通未解释的 TCP 之间有任何功能上的区别。

您确实需要搜索您的集群并找到 每个 侦听端口 443 的服务,并确保端口名称不以 http-... 开头。