更新时间:2024-04-11 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

  • 安装该插件时,您可以通过“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工作原理

使用约束

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

前提条件

在创建容器工作负载前,您需要存在一个可用集群。若没有可用集群 ,请参照购买Standard/Turbo集群中的步骤创建。

安装插件

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

    表1 nginx-ingress插件规格配置

    参数

    参数说明

    插件规格

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

    实例数

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

    容器

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

  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服务,填写“命名空间/服务名称”,如果服务不存在,插件会安装失败。

  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

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

Deployment

cceaddon-nginx-ingress-default-backend

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

Deployment

工作负载与nginx-ingress-controller反亲和部署

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

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-controller的标签实现反亲和
                  - key: app
                    operator: In
                    values:
                      - nginx-ingress
                  - key: component
                    operator: In
                    values:
                      - controller
              namespaces:
                - kube-system
              topologyKey: kubernetes.io/hostname

版本记录

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

插件版本

支持的集群版本

更新特性

社区版本

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

分享:

    相关文档

    相关产品