为什么在 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