我有一个使用 https 的后端。 我想根据 URL/路径分离后端的负载。
我决定使用 ingress 来执行此基于 url/路径的逻辑,以便将流量移动到不同的后端(相同的后端,只是复制到不同的 NodePort)
我的问题是如何配置入口以接收 https 请求并将这些 https 请求转发到 https 后端?
谢谢
编辑: 我添加了 yaml 文件:
spec:
rules:
- http:
paths:
- backend:
serviceName: service
servicePort: 9443
path: /carbon
- backend:
serviceName: service2
servicePort: 9443
path: /oauth
出于某种原因,我无法将规则形式 http 更改为 https
注意:本答案适用于github上kubernetes组织提供的ingress-nginx解决方案(https://github.com/kubernetes/ingress-nginx)
如果你想在 k8s 中使用负载均衡机制,你应该使用 services 并在该服务后面启动多个实例,这样 k8s 就会进行负载均衡。如果您想使用不同版本的后端(例如生产和测试),那么分离它们的方法就很好
如果您的服务只能通过 https 访问,您需要将以下注释添加到您的入口 yaml 中:(文档)
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
为了确保入口本身的安全,请看一下:https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
但是如果您希望后端服务解密 TLS 通信,请改用以下注释:(文档)
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段落。
如果您使用 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
nginx.ingress.kubernetes.io/upstream-vhost: example.com
,我也会遇到证书错误;由于某种原因,它没有发送
Host
标头。为了让它工作,我必须使用:
nginx.ingress.kubernetes.io/server-snippet: |
proxy_ssl_name example.com; //your upstream hostname here
proxy_ssl_server_name on;
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: “HTTPS"