注意:此回答适用于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 的段落以了解该变体。