我有一个使用https的后端。 我想根据URL /路径将后端的负载分开。
我决定使用入口做这个URL /路径,以便移动业务到不同后端基于逻辑(相同后端,只是复制到不同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
答案 0 :(得分:1)
如果要在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: extensions/v1beta1
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通过TLS到达后端,则Ingress YAML应该如下所示:
apiVersion: extensions/v1beta1
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解密的TLS到达后端,则Ingress YAML应该如下所示:
apiVersion: extensions/v1beta1
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该版本的文章。
答案 1 :(得分:0)
如果您使用的是 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 来源的控制器。
在这个例子中,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