如何配置入口以使用 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 记录以将所有流量从一个域定向到另一个域?
Python3 + Nginx:将 HTTP 流量重定向到 AWS Elastic Beanstalk 上的 HTTPS