为什么在 Kubernetes 集群中使用 istio 时使用 TLS 会导致上游错误
Why does using TLS lead to an upstream error when using istio in a Kubernetes Cluster
我正在尝试在 Kubernetes 集群中部署服务。只要我不使用 TLS,一切都正常。
我的设置是这样的:
版本为 1.15.7 的 Azure Kubernetes 集群
Istio 1.4.2
到目前为止我所做的是。使用以下命令创建集群并安装 Istio:
istioctl manifest apply --set values.grafana.enabled=true \--set values.tracing.enabled=true \
--set values.tracing.provider=jaeger \
--set values.global.mtls.enabled=false \
--set values.global.imagePullPolicy=Always \
--set values.kiali.enabled=true \
--set "values.kiali.dashboard.jaegerURL=http://jaeger-query:16686" \
--set "values.kiali.dashboard.grafanaURL=http://grafana:3000"
一切都开始了,所有 pods 都是 运行。
然后我创建一个网关
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ddhub-ingressgateway
namespace: config
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*.example.de"
# tls:
# httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
privateKey: /etc/istio/ingressgateway-certs/tls.key
hosts:
- "*.example.de"
- port:
number: 31400
name: tcp
protocol: TCP
hosts:
- "*.example.de"
然后我导入我的自定义证书,我认为它们也可以工作,因为它们已正确安装,并且当通过浏览器访问我的服务时,我可以看到具有所有值的安全连接属性。
这是我部署的服务:
kind: Service
apiVersion: v1
metadata:
name: hellohub-frontend
labels:
app: hellohub-frontend
namespace: dev
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
selector:
app: hellohub-frontend
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hellohub-frontend
namespace: dev
spec:
replicas: 1
template:
metadata:
labels:
app: hellohub-frontend
spec:
containers:
- image: ddhubregistry.azurecr.io/hellohub-frontend:latest
imagePullPolicy: Always
name: hellohub-frontend
volumeMounts:
- name: azure
mountPath: /cloudshare
ports:
- name: http
containerPort: 8080
volumes:
- name: azure
azureFile:
secretName: cloudshare-dev
shareName: ddhub-share-dev
readOnly: true
和虚拟服务:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: hellohub-frontend
namespace: dev
spec:
hosts:
- "dev-hellohub.example.de"
gateways:
- config/ddhub-ingressgateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: hellohub-frontend.dev.svc.cluster.local
port:
number: 8080
当我使用 http 访问服务时。我的服务页面出现了。使用 https 时,我总是得到 "upstream connect error or disconnect/reset before headers. reset reason: connection termination".
我错过了什么或者我做错了什么?是什么导致 Kubernetes 找不到我的服务。我知道我的配置在网关处终止了 TLS,并且集群内部的通信是相同的,但情况似乎并非如此。
另一个问题是如何为 Sidecars 启用调试日志。我找不到工作方式。
提前致谢!
似乎网关试图通过特使代理以 mtls 模式访问您的上游,但在您的容器中找不到特使代理 "hellohub-frontend",您是否为您的命名空间启用了 istio 注入 "dev"或者 pod,还定义了 mtls-policy?
apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
name: "default"
spec:
peers:
- mtls:
mode: STRICT
您是否尝试过使用 istioctl 更改 istio-proxy 的日志级别。
istioctl proxy-config log <pod-name[.namespace]> --level all:warning,http:debug,redis:debug
我正在尝试在 Kubernetes 集群中部署服务。只要我不使用 TLS,一切都正常。
我的设置是这样的: 版本为 1.15.7 的 Azure Kubernetes 集群 Istio 1.4.2
到目前为止我所做的是。使用以下命令创建集群并安装 Istio:
istioctl manifest apply --set values.grafana.enabled=true \--set values.tracing.enabled=true \
--set values.tracing.provider=jaeger \
--set values.global.mtls.enabled=false \
--set values.global.imagePullPolicy=Always \
--set values.kiali.enabled=true \
--set "values.kiali.dashboard.jaegerURL=http://jaeger-query:16686" \
--set "values.kiali.dashboard.grafanaURL=http://grafana:3000"
一切都开始了,所有 pods 都是 运行。 然后我创建一个网关
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ddhub-ingressgateway
namespace: config
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*.example.de"
# tls:
# httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
privateKey: /etc/istio/ingressgateway-certs/tls.key
hosts:
- "*.example.de"
- port:
number: 31400
name: tcp
protocol: TCP
hosts:
- "*.example.de"
然后我导入我的自定义证书,我认为它们也可以工作,因为它们已正确安装,并且当通过浏览器访问我的服务时,我可以看到具有所有值的安全连接属性。
这是我部署的服务:
kind: Service
apiVersion: v1
metadata:
name: hellohub-frontend
labels:
app: hellohub-frontend
namespace: dev
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
selector:
app: hellohub-frontend
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hellohub-frontend
namespace: dev
spec:
replicas: 1
template:
metadata:
labels:
app: hellohub-frontend
spec:
containers:
- image: ddhubregistry.azurecr.io/hellohub-frontend:latest
imagePullPolicy: Always
name: hellohub-frontend
volumeMounts:
- name: azure
mountPath: /cloudshare
ports:
- name: http
containerPort: 8080
volumes:
- name: azure
azureFile:
secretName: cloudshare-dev
shareName: ddhub-share-dev
readOnly: true
和虚拟服务:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: hellohub-frontend
namespace: dev
spec:
hosts:
- "dev-hellohub.example.de"
gateways:
- config/ddhub-ingressgateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: hellohub-frontend.dev.svc.cluster.local
port:
number: 8080
当我使用 http 访问服务时。我的服务页面出现了。使用 https 时,我总是得到 "upstream connect error or disconnect/reset before headers. reset reason: connection termination".
我错过了什么或者我做错了什么?是什么导致 Kubernetes 找不到我的服务。我知道我的配置在网关处终止了 TLS,并且集群内部的通信是相同的,但情况似乎并非如此。
另一个问题是如何为 Sidecars 启用调试日志。我找不到工作方式。
提前致谢!
似乎网关试图通过特使代理以 mtls 模式访问您的上游,但在您的容器中找不到特使代理 "hellohub-frontend",您是否为您的命名空间启用了 istio 注入 "dev"或者 pod,还定义了 mtls-policy?
apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
name: "default"
spec:
peers:
- mtls:
mode: STRICT
您是否尝试过使用 istioctl 更改 istio-proxy 的日志级别。
istioctl proxy-config log <pod-name[.namespace]> --level all:warning,http:debug,redis:debug