nginx ingress 如何使用 7 层负载均衡

2021-11-15 15:10:32 浏览数 (1)

当前 nginx ingress 在云 CLB 接入的时候,使用了 4 层的 CLB 侦听,这样本身是合理的。但有些云产品功能却无法在四层下工作,如:证书绑定,WAF 等。

本文探讨一个方法,使用七层的 CLB 接入 nginx ingress。

腾讯云 nginx ingress 的工作原理

腾讯云的默认 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

0 人点赞