Kubernetes 中的 Istio CORS 和 SSL 问题
Istio CORS and SSL Issue inside Kubernetes
我一直在为这个问题绞尽脑汁,我不知道这是一个错误还是配置错误。我的情况如下:
在我的集群中,我有命名空间 "testing",它有 2 个部署:
- 前端
- 后端
服务:
- 前端-service.local
- 后端-service.local
他们的服务都正常工作,并且 ALB 配置为可以从浏览器访问。
在集群内部,从前端,我可以用一个变量指向后端 https://back.example.com,一切都按预期进行。
但是,我被要求在集群内部进行通信,所以这次我的第一次尝试是从前端指向后端服务。
试图指向:https://back-end-service.local 并收到此错误:
原因:CORS请求未成功
我猜是因为 TLS,我在命名空间中部署了 Istio,并在 STRICT 模式下启用了双向 TLS。打开 Kiali 后,我确实看到加密通信正常工作,但是,我仍然遇到同样的错误。
我做的测试:
如果我登录到前端 pod 并尝试卷曲 https://back.example.com,我会从我的 API.
那里得到积极的回应
如果我执行 curl https://back-end-service.local,我会得到 curl: (35) SSL routines:SSL23_GET_SERVER_HELLO:unknown 协议。
所以简而言之,我可以在集群外部与我的后端进行通信,然后返回,但如果我尝试在内部服务之间进行通信,它会因 CORS 和 SSL 错误而失败。
我的配置:
kind: PeerAuthentication
apiVersion: security.istio.io/v1beta1
metadata:
name: default
namespace: testing
selfLink: >-
/apis/security.istio.io/v1beta1/namespaces/production/peerauthentications/default
resourceVersion: '7291'
generation: 1
creationTimestamp: '2020-06-06T00:22:24Z'
annotations:
kubectl.kubernetes.io/last-applied-configuration: >
{"apiVersion":"security.istio.io/v1beta1","kind":"PeerAuthentication","metadata":{"annotations":{},"name":"default","namespace":"testing"},"spec":{"mtls":{"mode":"STRICT"}}}
spec:
selector: ~
mtls:
mode: STRICT
portLevelMtls: ~
后端服务:
kind: Service
apiVersion: v1
metadata:
name: back-end-service
namespace: testing
selfLink: /api/v1/namespaces/testing/services/back-end-service
uid: dccf1b
resourceVersion: '7520501'
creationTimestamp: '2020-05-14T21:48:54Z'
labels:
app: back-end
annotations:
kubectl.kubernetes.io/last-applied-configuration: >
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"back-end"},"name":"back-end-service","namespace":"testing"},"spec":{"ports":[{"name":"http","port":3001,"targetPort":3001}],"selector":{"app":"back-end"}}}
finalizers:
- service.kubernetes.io/load-balancer-cleanup
spec:
ports:
- name: https
protocol: TCP
port: 3001
targetPort: 3001
nodePort: 30742
selector:
app: back-end
clusterIP: 192.168.1.1
type: LoadBalancer
sessionAffinity: None
externalTrafficPolicy: Cluster
我曾尝试将服务的名称更改为 HTTP 和 HTTPS,但不仅限于此。任何帮助将不胜感激!
您可以尝试使用端口 3001 代替端口 443 吗?端口 443 上可能没有 https,因此出现 SSL 错误。
我一直在为这个问题绞尽脑汁,我不知道这是一个错误还是配置错误。我的情况如下:
在我的集群中,我有命名空间 "testing",它有 2 个部署:
- 前端
- 后端
服务:
- 前端-service.local
- 后端-service.local
他们的服务都正常工作,并且 ALB 配置为可以从浏览器访问。
在集群内部,从前端,我可以用一个变量指向后端 https://back.example.com,一切都按预期进行。
但是,我被要求在集群内部进行通信,所以这次我的第一次尝试是从前端指向后端服务。
试图指向:https://back-end-service.local 并收到此错误:
原因:CORS请求未成功
我猜是因为 TLS,我在命名空间中部署了 Istio,并在 STRICT 模式下启用了双向 TLS。打开 Kiali 后,我确实看到加密通信正常工作,但是,我仍然遇到同样的错误。
我做的测试:
如果我登录到前端 pod 并尝试卷曲 https://back.example.com,我会从我的 API.
那里得到积极的回应如果我执行 curl https://back-end-service.local,我会得到 curl: (35) SSL routines:SSL23_GET_SERVER_HELLO:unknown 协议。
所以简而言之,我可以在集群外部与我的后端进行通信,然后返回,但如果我尝试在内部服务之间进行通信,它会因 CORS 和 SSL 错误而失败。
我的配置:
kind: PeerAuthentication
apiVersion: security.istio.io/v1beta1
metadata:
name: default
namespace: testing
selfLink: >-
/apis/security.istio.io/v1beta1/namespaces/production/peerauthentications/default
resourceVersion: '7291'
generation: 1
creationTimestamp: '2020-06-06T00:22:24Z'
annotations:
kubectl.kubernetes.io/last-applied-configuration: >
{"apiVersion":"security.istio.io/v1beta1","kind":"PeerAuthentication","metadata":{"annotations":{},"name":"default","namespace":"testing"},"spec":{"mtls":{"mode":"STRICT"}}}
spec:
selector: ~
mtls:
mode: STRICT
portLevelMtls: ~
后端服务:
kind: Service
apiVersion: v1
metadata:
name: back-end-service
namespace: testing
selfLink: /api/v1/namespaces/testing/services/back-end-service
uid: dccf1b
resourceVersion: '7520501'
creationTimestamp: '2020-05-14T21:48:54Z'
labels:
app: back-end
annotations:
kubectl.kubernetes.io/last-applied-configuration: >
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"back-end"},"name":"back-end-service","namespace":"testing"},"spec":{"ports":[{"name":"http","port":3001,"targetPort":3001}],"selector":{"app":"back-end"}}}
finalizers:
- service.kubernetes.io/load-balancer-cleanup
spec:
ports:
- name: https
protocol: TCP
port: 3001
targetPort: 3001
nodePort: 30742
selector:
app: back-end
clusterIP: 192.168.1.1
type: LoadBalancer
sessionAffinity: None
externalTrafficPolicy: Cluster
我曾尝试将服务的名称更改为 HTTP 和 HTTPS,但不仅限于此。任何帮助将不胜感激!
您可以尝试使用端口 3001 代替端口 443 吗?端口 443 上可能没有 https,因此出现 SSL 错误。