当前 nginx ingress 在云 CLB 接入的时候,使用了 4 层的 CLB 侦听,这样本身是合理的。但有些云产品功能却无法在四层下工作,如:证书绑定,WAF 等。
本文探讨一个方法,使用七层的 CLB 接入 nginx ingress。
腾讯云 nginx ingress 的工作原理
腾讯云的默认 nginx ingress 的流量如下:
CLB -> TCP -> nginx-controller -> http -> 后端应用 pod。
ingress 为 nginx 提供了路由规则。
通过 CLB Ingress 来接入
现在,我们尝试在配置了 nginx ingress 的基础上来使用“普通的Ingress”来接入流量。
我们知道,nginx ingress 其实就是在集群里部署了 nginx,并且提供了 crd 来管理 nginx 的配置文件。我们可以看到在 kube-system下,有 nginx 部署的 pod 和 service,名字是:“xxx-ingress-nginx-controller”。
服务 “xxx-ingress-nginx-controller” 是 LoadBalancer 类型的,CLB 指向了主机的 IP 和 NodePort 端口。
了解了这个原理,我们就可以来尝试创建一个 CLB 类型的 Ingress 来接入外部流量。
首先,需要创建一个 NodePort 类型的 Service 指向 nginx controller:
代码语言:txt复制apiVersion: v1
kind: Service
metadata:
name: ng-controller
namespace: kube-system
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
k8s-app: xyz-ingress-ingress-nginx-controller
qcloud-app: xyz-ingress-ingress-nginx-controller
- 我们创建的 NginxIngress 的 Class 名字是
xyz-ingress
创建一个 CLB Ingress 指向这个 Service:
代码语言:txt复制apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: clb-echo-ingress
namespace: xyz
annotations:
kubernetes.io/ingress.class: qcloud
spec:
rules:
- http:
paths:
- backend:
serviceName: ng-controller.kube-system
servicePort: 80
path: /
- 此处的命名空间可以和你的应用保持一致。
通过上述两个资源的应用,就可以实现 七层的 CLB 接入了。
其实,nginx ingress 的 class 创建的时候,已经为 nginx 创建了一个 service 了。我们可以复用这个 service。
代码语言:txt复制apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: clb-echo-ingress
namespace: kube-system
annotations:
kubernetes.io/ingress.class: qcloud
spec:
rules:
- http:
paths:
- backend:
serviceName: xyz-ingress-nginx-controller
servicePort: 80
path: /
- 直接指向了 nginx controller 创建的服务
- 与 nginx controller 保持在同一个命名空间
注意:
- 当前直接使用 CLB Ingress 指向 nginx controller 的 service 当前有一点 bug,具体需要修改 xxx-nginx-controller 这个 service,将
port: http
修改为port: 80
。 官方正在修改。 - nginx-ingress 自己创建的那个 CLB 浪费了。:(
腾讯云 Nginx Ingress 参考:https://cloud.tencent.com/document/product/457/50502