如何配置入口以使用 https 将流量定向到 https 后端

Posted

技术标签:

【中文标题】如何配置入口以使用 https 将流量定向到 https 后端【英文标题】:how to configure ingress to direct traffic to an https backend using https 【发布时间】:2019-06-24 19:43:04 【问题描述】:

我有一个使用 https 的后端。 我想根据 URL/路径分离该后端的负载。

我决定使用 ingress 来执行这个基于 url/path 的逻辑,以便将流量移动到不同的后端(相同的后端,只是复制到不同的 NodePorts)

我的问题是如何配置入口以接收 https 请求并将这些 https 请求转发到 https 后端?

谢谢

编辑: 我添加了yaml文件:

spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

由于某种原因,我无法将规则形式 http 更改为 https

【问题讨论】:

【参考方案1】:

注意:此回答适用于github上kubernetes组织提供的ingress-nginx方案(https://github.com/kubernetes/ingress-nginx)


如果你想在 k8s 中使用负载平衡机制,你应该改用 services 并在该服务后面启动多个实例,这样 k8s 就会进行负载平衡。如果您想使用不同版本的后端(例如 prod 和 test),那么您将它们分开的方式很好

如果您的服务只能通过 https 访问,您需要在入口 yaml 中添加以下注释:(documentation)

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

要保护入口本身,请查看以下内容:https://kubernetes.io/docs/concepts/services-networking/ingress/#tls

但如果您希望后端服务解密 TLS 通信,请改用以下注释:(documentation)

nginx.ingress.kubernetes.io/ssl-passthrough: "true"

编辑:

如果您想通过 TLS 访问后端,则 Ingress YAML 应该如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

如果您想通过 TLS 访问后端并在入口控制器中使用 TLS 解密,则 Ingress YAML 应该如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - app.myorg.com
    secretName: tls-secret 
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

请务必注意,tls-secret 是 SecretConfig 的名称,其中包含为主机 (app.myorg.com) 颁发的有效证书


如果您想通过 TLS 到达后端并在后端进行 TLS 解密,则 Ingress YAML 应该如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

我自己从未测试过最后一个版本,所以我不知道它是否真的有效,但我强烈建议阅读 this 的段落以了解该变体。

【讨论】:

请查看我的编辑,由于某种原因我无法将规则更改为 https 这种行为是正确的,因为您需要使用注释更改使用的协议。请参阅更新的答案以供参考。 这个答案帮助我解决了一个跨命名空间的路由配置。 Ally 我的部署通过 https 公开服务,并在每个命名空间的入口清单中添加 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" 解决了我的问题。【参考方案2】:

如果您使用 NGINX Ingress 控制器 (https://docs.nginx.com/nginx-ingress-controller/),the nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" 不起作用。但是,nginx.org/ssl-services 将让您选择在后端需要 TLS 的服务。这个名字很混乱,所以我花了一段时间才意识到它的真正目的。

适用于在底层使用 NGINX 的标准 Kubernetes Ingress 控制器;它仅适用于 NGINX 源控制器。

高级注释文档:https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/

在本例中,NGINX 将使用 TLS 连接到 ssl-svc;它忽略任何自签名证书。示例(https://github.com/nginxinc/kubernetes-ingress/tree/v1.12.0/examples/ssl-services):

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    nginx.org/ssl-services: "ssl-svc"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80
      - path: /ssl
        backend:
          serviceName: ssl-svc
          servicePort: 443

【讨论】:

以上是关于如何配置入口以使用 https 将流量定向到 https 后端的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何配置我的 DNS 记录以将所有流量从一个域定向到另一个域?

如何仅使用 AWS 服务重定向流量?

Python3 + Nginx:将 HTTP 流量重定向到 AWS Elastic Beanstalk 上的 HTTPS

如何禁用 nginx 入口控制器的自动 https 重定向?

K8S集群Ingress https实践

如何配置 AWS 网络负载均衡器以使用 Terraform 路由 HTTPS 流量?