【问题标题】:how to configure ingress to direct traffic to an https backend using https如何配置入口以使用 https 将流量定向到 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

【问题讨论】:

    标签: kubernetes kubernetes-ingress nginx-ingress


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 2011-11-02
      相关资源
      最近更新 更多