首页 > 解决方案 > Kubernetes Nginx Ingress TLS 网关到非 TLS 或 mTLS 的上游服务

问题描述

我有一个简单的示例应用程序,其中 ui (vue.js) 连接到支持服务 api (.dotnet core)。两者都内置在各自的 docker 镜像中,并且在不使用 TLS 时可以在 Docker 或 Kubernetes 中正常工作。当部署到 K8S 时,从 UI 到 API 的 url 映射是通过 kubernetes 服务映射完成的,即。(VUE_APP_BASE_URL = http://api-svc/api)

如果我在未启用 TLS 的情况下部署 nginx 入口,则应用程序可以正常工作。但是,当为 INGRESS 应用 TLS 时,UI 不再能够与 API 通信。我将我的 dotnet 应用 CORS 配置为 AllowAnyOrigin、AllowAnyMethod 和 AllowAnyHeader 用于测试目的。

我已经实现了 ISTIO 服务网格以允许通过 envoy 代理 sidecars 实现 mTLS,并将 nginx 入口控制器和 ui/api pod 和服务放置在带有 istio-injection=enabled 标签的命名空间中。这似乎消除了在 ui pod/container 和 api pod/container 之间手动设置 TLS 的需要。

请求没有返回任何内容。我很好奇为什么请求在请求 url 中从 http 转到 https,因为我指出它应该只是:http://api-svc/api。

在此处输入图像描述

这是 Kubernetes 部署的概述。

在此处输入图像描述

SVC and Ingress Yaml

kind: Service
apiVersion: v1
metadata:
  name: api-svc
  labels: 
    app: myapp
  namespace: test
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 8080
    targetPort: 80
  selector:
    app: myapp
---    
kind: Service
apiVersion: v1
metadata:
  name: ui-svc
  labels: 
    app: myapp
  namespace: test
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 8080
    targetPort: 80
  selector:
    app: myapp
---
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: ui-ingress
  labels:
    app: myapp
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
  namespace: test
spec:
  rules:
  - host: myapp.local
    http:
      paths:
      - pathType: ImplementationSpecific
        backend:
          service:
            name: ui-svc
            port: 8080
  tls:
  - hosts:
    - myapp.local
    secretName: tls-secret

我正确地接近这个吗?如果是这样,我错过了什么?(可能在入口上的注释?)或者是否有更好的方法无需处理服务之间的 TLS。

谢谢

标签: .netsslkubernetesistionginx-ingress

解决方案


推荐阅读