【问题标题】:Kubernetes Nginx Ingress partial ssl terminationKubernetes Nginx Ingress 部分 ssl 终止
【发布时间】:2021-02-03 20:54:43
【问题描述】:

我想通过以下方式拆分 Kubernetes Nginx 中的传入流量:

Client --> Nginx --> {Service A, Service B}

我面临的问题是服务 A 是内部服务,不支持 HTTPS,因此应该终止服务 A 的 SSL。另一方面,服务 B 是外部服务(托管在 example.com 上)并且只能工作通过 HTTPS。

我无法使用 Kubernetes Nginx 轻松完成这项工作。这是我带来的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-proxy
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/upstream-vhost: example.com
spec:
  tls:
  - hosts:
    - proxy.com
    secretName: secret
  rules:
    - host: proxy.com
      http:
        paths:
          - path: /api/v1/endpoint
            backend:
              serviceName: service-a
              servicePort: 8080
          - path: /
            backend:
              serviceName: service-b
              servicePort: 443

种类:服务 api版本:v1 元数据: 名称:服务-b 命名空间:默认 规格: 类型:外部名称 外部名称:service-b.external 端口: - 端口:443

我有一条service-b.external:443 指向 example.com 的路线。

此解决方案仅在 service-b 通过 HTTPS 时才有效,但在我的情况下,由于其他一些内部依赖关系,我无法将此服务更改为 HTTPS。

我的问题是 backend-protocol 注释适用于整个类型,我无法为每个路径定义它。

P.S:我正在使用 AWS 提供商

【问题讨论】:

  • 我很确定拥有两个 Ingress 资源是完全有可能的,也是合理的,一个带有 backend-protocol: 注释,另一个没有; Ingress 控制器合并整个集群中的所有 Ingress 资源并获得最具体的胜利(因此/api/v1/endpoint 将被路由到 service-a 并且如果其 Ingress 资源没有注释,它将默认使用 HTTP)
  • @mdaniel 它如何与单个主机一起工作:proxy.com?两者都将指向同一个地址。 ingress 是否支持同一主机的两个项目?

标签: nginx kubernetes kubernetes-ingress


【解决方案1】:

遵循 cmets 建议的解决方案和问题。

是的,如下所述,可以有两个入口项目。在你的情况下 只有一个应该有后端协议。

根据 nginx 入口文档:

基本用法-基于主机的路由

ingress-nginx 可用于许多用例,在各种云提供商内部并支持许多配置。在本节中,您可以找到一个常见的使用场景,其中由 ingress-nginx 提供支持的单个负载均衡器将根据主机名将流量路由到 2 个不同的 HTTP 后端服务。

首先按照说明安装 ingress-nginx。然后假设您需要公开 2 个已安装的 HTTP 服务:myServiceAmyServiceB。假设您想在myServiceA.foo.org 公开第一个,在myServiceB.foo.org 公开第二个。一种可能的解决方案是创建两个 ingress 资源:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-myservicea
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myservicea.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myservicea
          servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-myserviceb
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myserviceb.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myserviceb
          servicePort: 80

当您应用此 yaml 时,将创建 2 个由 ingress-nginx 实例管理的入口资源。 Nginx 配置为使用 kubernetes.io/ingress.class: "nginx" 注释自动发现所有入口。请注意,入口资源应放置在与后端资源相同的命名空间内。

在许多云提供商上,ingress-nginx 也会创建相应的负载均衡器资源。您所要做的就是获取外部 IP 并在您的 DNS 提供程序中添加一个 DNS A record,将 myServiceA.foo.org 和 myServiceB.foo.org 指向 nginx 外部 IP。通过运行获取外部IP:

kubectl get services -n ingress-nginx

here 所述,也可以有单独的 nginx 类。

【讨论】:

  • 感谢您的回复,但我认为您误解了我的问题。事实上,在我的示例中,我需要 service-a 和 service-b 拥有与 proxy.com 相同的主机。问题是,一旦我使用相同的主机,它就无法按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
相关资源
最近更新 更多