我正在EKS(Amazon)托管的k8s集群上探索istio服务网格。
我尝试使用用于bookapp演示的demo.yml文件以及我正确理解的大多数用例在新的k8s集群上部署istio-1.2.2。
然后,我使用头盔默认配置文件(推荐用于生产)在运行了数百个微服务的现有开发集群上部署了istio,我注意到我的服务可以调用http端点,但不能调用外部安全端点({{ 3}}等)
我得到了:
卷曲:(35)错误:1400410B:SSL例程:CONNECT_CR_SRVR_HELLO:错误 版本号
尽管我能够从测试集群中调用外部https端点。
要进行验证,我检查了出口策略,两个集群均处于模式:ALLOW_ANY 。
现在,我从开发集群中完全删除了istio并安装了demo.yml进行测试,但是现在这也无法正常工作。
我尝试与此相关,但是没有成功。
我不明白自己在想什么或做错了什么。
答案 0 :(得分:2)
这很可能是Istio中的一个错误(例如,参见istio/istio#14520):如果您在集群中的任何位置有任何Kubernetes Service对象,该对象侦听端口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:
更改为https
或tcp-https
似乎是可行的。那些name prefixes对Istio来说很重要,但是我还没有立即发现告诉Istio端口是HTTPS(即使它实际上不提供TLS)与普通的未解释TCP之间的功能区别。
您确实需要搜索集群并找到监听端口443的每一个服务,并确保端口名称不是以http-...
开头。