更新时间:2024-06-29 GMT+08:00
分享

NGINX Ingress控制器

插件简介

Kubernetes通过kube-proxy服务实现了Service的对外发布及负载均衡,它的各种方式都是基于传输层实现的。在实际的互联网应用场景中,不仅要实现单纯的转发,还有更加细致的策略需求,如果使用真正的负载均衡器更会增加操作的灵活性和转发性能。

基于以上需求,Kubernetes引入了资源对象Ingress,Ingress为Service提供了可直接被集群外部访问的虚拟主机、负载均衡、SSL代理、HTTP路由等应用层转发功能。

Kubernetes官方发布了基于Nginx的Ingress控制器,CCE的NGINX Ingress控制器插件直接使用社区模板与镜像。Nginx Ingress控制器会将Ingress生成一段Nginx的配置,并将Nginx配置通过ConfigMap进行储存,这个配置会通过Kubernetes API写到Nginx的Pod中,然后完成Nginx的配置修改和更新,详细工作原理请参见工作原理

开源社区地址:https://github.com/kubernetes/ingress-nginx

  • 2.3.3及以上版本的Nginx Ingress默认仅支持TLS v1.2及v1.3版本,如果客户端TLS版本低于v1.2,会导致客户端与Nginx Ingress协商时报错。如果需要支持更多TLS版本,请参见TLS/HTTPS
  • 安装该插件时,您可以通过“nginx配置参数”添加配置,此处的设置将会全局生效,该参数直接通过配置nginx.conf生成,将影响管理的全部Ingress,相关参数可通过ConfigMaps查找,如果您配置的参数不包含在ConfigMaps所列出的选项中将不会生效。
  • 安装该插件后,您在CCE控制台创建Ingress时可以选择对接Nginx控制器,并通过“注解”设置Nginx Ingress功能,支持的注解字段详情请参见Annotations
  • 请勿手动修改和删除CCE自动创建的ELB和监听器,否则将出现工作负载异常;若您已经误修改或删除,请卸载Nginx Ingress插件后重装。

工作原理

Nginx Ingress由资源对象Ingress、Ingress控制器、Nginx三部分组成,Ingress控制器用以将Ingress资源实例组装成Nginx配置文件(nginx.conf),并重新加载Nginx使变更的配置生效。当它监听到Service中Pod变化时通过动态变更的方式实现Nginx上游服务器组配置的变更,无须重新加载Nginx进程。工作原理如图1所示。

  • Ingress:一组基于域名或URL把请求转发到指定Service实例的访问规则,是Kubernetes的一种资源对象,Ingress实例被存储在对象存储服务etcd中,通过接口服务被实现增、删、改、查的操作。
  • Ingress控制器(Ingress Controller):用以实时监控资源对象Ingress、Service、End-point、Secret(主要是TLS证书和Key)、Node、ConfigMap的变化,自动对Nginx进行相应的操作。
  • Nginx:实现具体的应用层负载均衡及访问控制。
图1 Nginx Ingress工作原理

注意事项

  • 对于v1.23版本前的集群,通过API接口创建的Ingress在注解中必须添加kubernetes.io/ingress.class: "nginx"。如果集群中安装了多套NGINX Ingress控制器,需将nginx替换为自定义的控制器名称,用于识别Ingress对接的控制器实例。
  • 独享型ELB规格必须支持网络型(TCP/UDP),且网络类型必须支持私网(有私有IP地址)。
  • 运行Nginx Ingress控制器实例的节点以及该节点上运行的容器,无法访问Nginx Ingress,请将工作负载Pod与Nginx Ingress控制器实例进行反亲和部署,具体操作步骤请参见工作负载与Nginx Ingress控制器实例反亲和部署
  • Nginx Ingress控制器实例在升级时会预留10s的宽限时间,用于删除ELB后端的Nginx Ingress控制器。
  • Nginx Ingress控制器实例的优雅退出时间为300s,若插件升级时存在超过300s的长连接,长连接会被断开,出现服务短暂中断。

前提条件

在安装此插件之前,您需要存在一个可用集群,且集群中包含一个可用节点。若没有可用集群 ,请参照购买Standard/Turbo集群中的步骤创建。

安装插件

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到NGINX Ingress控制器插件,单击“安装”
  2. 在安装插件页面,设置“规格配置”

    表1 插件规格配置

    参数

    参数说明

    插件规格

    该插件支持自定义资源规格部署。

    实例数

    您可根据需求调整插件实例数。

    实例数为1时插件不具备高可用能力,当插件实例所在节点异常时可能导致插件功能无法正常使用,请谨慎选择。

    容器

    您可根据需求调整插件实例的容器规格。

  3. 设置插件支持的“参数配置”

    • 控制器名称:自定义控制器名称,该名称为Ingress控制器的唯一标识,同一个集群中不同的控制器名称必须唯一,且不能设置为ccecce是ELB Ingress Controller的唯一标识)。创建Ingress时,可通过指定控制器名称,声明该Ingress由此控制器进行管理。
    • 命名空间:选择Ingress控制器所在的命名空间。
    • 负载均衡器:支持对接共享型或独享型负载均衡实例,如果无可用实例,请先创建。负载均衡器需要拥有至少两个监听器配额,且端口 80 和 443 没有被监听器占用。
    • 开启准入校验:针对Ingress资源的准入控制,以确保控制器能够生成有效的配置。开启后将会对Nginx类型的Ingress资源配置做准入校验,若校验失败,请求将被拦截。关于准入校验详情,请参见准入控制
      • 开启准入校验后,会在一定程度上影响Ingress资源的请求响应速度。
      • 仅2.4.1及以上版本的插件支持开启准入校验。
    • nginx配置参数:配置nginx.conf文件,将影响管理的全部Ingress,相关参数可通过ConfigMaps查找,如果您配置的参数不包含在ConfigMaps所列出的选项中将不会生效。

      此处以设置keep-alive-requests参数为例,设置保持活动连接的最大请求数为100。

      {
          "keep-alive-requests": "100"
      }
    • 开启指标采集:插件版本不低于2.4.12时,支持采集Prometheus监控指标。具体操作详情请参见监控NGINX Ingress控制器指标
    • 自定义服务器证书:选择一个IngressTLS或kubernetes.io/tls类型的密钥,用于配置Nginx Ingress控制器启动时的默认证书。如果无可选密钥,您可以单击“创建TLS类型的密钥证书”进行新建,详情请参见创建密钥。关于默认证书更多说明请参见Default SSL Certificate
    • 默认404服务:默认使用插件自带的404服务。支持自定义404服务,填写“命名空间/服务名称”,如果服务不存在,插件会安装失败。
    • 添加TCP/UDP服务:Nginx Ingress默认仅支持转发外部HTTP和HTTPS流量,通过添加TCP/UDP端口映射,可实现转发外部TCP/UDP流量到集群内服务。关于添加TCP/UDP服务的更多信息,请参见暴露TCP/UDP服务
      • 协议:选择TCP或UDP。
      • 服务端口:ELB监听器使用的端口,端口范围为1-65535。
      • 目标服务命名空间:请选择Service所在的命名空间。
      • 目标服务名称:请选择已有Service。页面列表中的查询结果已自动过滤不符合要求的Service。
      • 目标服务访问端口:可选择目标Service的访问端口。
      • 集群版本为v1.19.16-r5、v1.21.8-r0、v1.23.6-r0及以上时,支持设置TCP/UDP混合协议能力。
      • 集群版本为v1.19.16-r5、v1.21.8-r0、v1.23.6-r0、v1.25.2-r0及以上时,支持设置TCP/UDP混合协议使用相同的对外端口。

  4. 设置插件实例的“调度策略”

    • 调度策略对于DaemonSet类型的插件实例不会生效。
    • 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
    表2 插件调度配置

    参数

    参数说明

    多可用区部署

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。
    • 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。

    节点亲和

    • 不配置:插件实例不指定节点亲和调度。
    • 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。
    • 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。
    • 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。

      同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。

    容忍策略

    容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。

    插件会对实例添加针对node.kubernetes.io/not-readynode.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。

    详情请参见设置容忍策略

  5. 单击“安装”

安装多个NGINX Ingress控制器

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到已经安装的NGINX Ingress控制器插件,单击“新增”
  2. 在安装插件页面,重新配置NGINX Ingress控制器参数,参数说明详情请参见安装插件
  3. 参数配置完成后,单击“安装”
  4. 等待插件安装指令下发完成,您可以返回“插件中心”,单击“管理”,在插件详情页查看已安装的控制器实例。

组件说明

表3 NGINX Ingress控制器插件组件

容器组件

说明

资源类型

cceaddon-nginx-ingress-<控制器名称>-controller

(2.5.4之前版本中的名称为cceaddon-nginx-ingress-controller)

基于Nginx的Ingress控制器,为集群提供灵活的路由转发能力。

Deployment

cceaddon-nginx-ingress-<控制器名称>-backend

(2.5.4之前版本中的名称为cceaddon-nginx-ingress-default-backend)

Nginx的默认后端。返回“default backend - 404”。

Deployment

工作负载与Nginx Ingress控制器实例反亲和部署

运行Nginx Ingress控制器实例的节点以及该节点上运行的容器,无法访问Nginx Ingress,为避免这个问题发生,需要将工作负载与Nginx Ingress控制器实例反亲和部署,即工作负载Pod无法调度至Nginx Ingress控制器实例运行的节点。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:aplpine
        imagePullPolicy: IfNotPresent
        name: nginx
      imagePullSecrets:
      - name: default-secret
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:    #通过Nginx Ingress控制器实例的标签实现反亲和
                  - key: app
                    operator: In
                    values:
                      - nginx-ingress   #如果集群中安装了多套Nginx Ingress控制器,对应的标签值为nginx-ingress-<控制器名称>
                  - key: component
                    operator: In
                    values:
                      - controller
              namespaces:
                - kube-system
              topologyKey: kubernetes.io/hostname

版本记录

表4 NGINX Ingress控制器插件版本记录

插件版本

支持的集群版本

更新特性

社区版本

2.6.5

v1.25

v1.27

v1.28

v1.29

支持在启动命令中关闭指标采集

1.9.3

2.6.4

v1.25

v1.27

v1.28

v1.29

适配CCE v1.29集群

1.9.3

2.5.6

v1.25

v1.27

v1.28

修复部分问题

1.9.3

2.5.4

v1.25

v1.27

v1.28

  • 同一集群支持安装多套NGINX Ingress控制器
  • 支持通过控制台配置nginx-ingress默认证书
  • 支持将NGINX Ingress控制器指标上报至Prometheus

1.9.3

2.4.6

v1.25

v1.27

v1.28

  • 适配CCE v1.28集群
  • 支持开启准入校验
  • 支持优雅退出、无损升级能力
  • 插件多可用区部署模式支持选择均匀分布
  • 修复CVE-2023-44487漏洞

1.9.3

2.3.5

v1.27

-

1.8.0

2.3.3

v1.27

适配CCE v1.27集群

1.8.0

2.2.52

v1.23

v1.25

  • 同一集群支持安装多套NGINX Ingress控制器
  • 支持通过控制台配置nginx-ingress默认证书

1.5.1

2.2.42

v1.23

v1.25

  • 支持优雅退出、无损升级能力
  • 插件多可用区部署模式支持选择均匀分布

1.5.1

2.2.9

v1.25

-

1.5.1

2.2.7

v1.25

  • 插件挂载节点时区
  • 支持双栈

1.5.1

2.2.3

v1.25

  • 支持插件实例AZ反亲和配置
  • 对创建临时存储卷的POD添加不可调度容忍时间
  • 默认污点容忍时长修改为60s

1.5.1

2.2.1

v1.25

  • 适配CCE v1.25集群
  • 更新至社区v1.5.1版本

1.5.1

2.1.33

v1.19

v1.21

v1.23

  • 支持优雅退出、无损升级能力
  • 插件多可用区部署模式支持选择均匀分布

1.2.1

2.1.10

v1.19

v1.21

v1.23

  • 支持插件实例AZ反亲和配置
  • 默认污点容忍时长修改为60s
  • 插件挂载节点时区
  • 支持双栈

1.2.1

2.1.9

v1.19

v1.21

v1.23

  • 支持插件实例AZ反亲和配置
  • 默认污点容忍时长修改为60s
  • 插件挂载节点时区
  • 支持双栈

1.2.1

2.1.5

v1.19

v1.21

v1.23

  • 支持插件实例AZ反亲和配置
  • 默认污点容忍时长修改为60s

1.2.1

2.1.3

v1.19

v1.21

v1.23

nginx-ingress支持开启publishService开关

1.2.1

2.1.1

v1.19

v1.21

v1.23

更新至社区v1.2.1版本

1.2.1

2.1.0

v1.19

v1.21

v1.23

  • 更新至社区v1.2.0版本
  • 修复CVE-2021-25746漏洞,新增规则禁用一些存在越权风险的Anntotations值
  • 修复CVE-2021-25745漏洞,新增规则禁用一些存在越权风险的访问路径

1.2.0

2.0.1

v1.19

v1.21

v1.23

  • 适配CCE v1.23集群
  • 更新至社区v1.1.1版本

1.1.1

1.3.2

v1.15

v1.17

v1.19

v1.21

  • 适配CCE v1.21集群
  • 同步至社区v0.49.3版本

0.49.3

1.2.6

v1.15

v1.17

v1.19

配置seccomp默认规则

0.46.0

1.2.5

v1.15

v1.17

v1.19

同步至社区v0.46.0版本

0.46.0

1.2.3

v1.15

v1.17

v1.19

适配CCE v1.19集群

0.43.0

1.2.2

v1.15

v1.17

同步至社区v0.43.0版本

0.43.0

分享:

    相关文档

    相关产品