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的配置修改和更新,详细工作原理请参见工作原理。
工作原理
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.15及以上版本的集群中安装此插件。
- 通过API接口创建的Ingress在注解中必须添加kubernetes.io/ingress.class: "nginx"。
- 独享型ELB规格必须支持网络型(TCP/UDP),且网络类型必须支持私网(有私有IP地址)。
- 运行nginx-ingress-controller的节点以及该节点上运行的容器,无法访问Nginx Ingress,请将工作负载Pod与nginx-ingress-controller进行反亲和部署,具体操作步骤请参见工作负载与nginx-ingress-controller反亲和部署。
前提条件
在创建容器工作负载前,您需要存在一个可用集群。若没有可用集群 ,请参照购买集群中的步骤创建。
安装插件
- 社区v1.2.0版本nginx-ingress-controller(对应CCE nginx-ingress插件2.1.0版本)已修复CVE-2021-25746漏洞,新增规则禁用一些存在越权风险的Anntotations值。
- 社区v1.2.0版本nginx-ingress-controller(对应CCE nginx-ingress插件2.1.0版本)已修复CVE-2021-25745漏洞,新增规则禁用一些存在越权风险的访问路径。
- 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”,在右侧找到NGINX Ingress控制器插件,单击“安装”。
- 在安装插件页面,设置“规格配置”。
表1 nginx-ingress插件规格配置 参数
参数说明
插件规格
该插件支持自定义资源规格部署。
实例数
您可根据需求调整插件实例数。
容器
您可根据需求调整插件实例的容器规格。
- 设置插件支持的“参数配置”。
- 负载均衡器:支持对接共享型或独享型负载均衡实例,如果无可用实例,请先创建。负载均衡器需要拥有至少两个监听器配额,且端口 80 和 443 没有被监听器占用。
- nginx配置参数:配置nginx.conf文件,将影响管理的全部Ingress,相关参数可通过configmap查找,如果您配置的参数不包含在configmap所列出的选项中将不会生效。
此处以设置keep-alive-requests参数为例,设置保持活动连接的最大请求数为100。
{ "keep-alive-requests": "100" }
- 默认404服务:默认使用插件自带的404服务。支持自定义404服务,填写“命名空间/服务名称”,如果服务不存在,插件会安装失败。
- 设置插件实例的“调度策略”。
- 调度策略对于DaemonSet类型的插件实例不会生效。
- 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
表2 插件调度配置 参数
参数说明
多可用区部署
- 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。
- 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。
节点亲和
容忍策略
容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。
插件会对实例添加针对node.kubernetes.io/not-ready和node.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。
详情请参见容忍策略。
- 单击“安装”。
组件说明
容器组件 |
说明 |
资源类型 |
---|---|---|
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