在开源社区当中,Kubernetes 的 Ingress Controller 的实现有多种方式,Nginx Ingress 只是其中的一种实现方式,当然也是目前社区中使用量最大的一种 Ingress Controller 的实现方式,其不仅功能强大,而且性能极高。本文主要介绍如何使用腾讯云容器服务实现多种方式进行 Nginx Ingress 的部署,并会简单介绍各种方式的实现原理以及优缺点和适用场景。
Nginx Ingress 是什么Nginx Ingress 是 Kubernetes 的一种对象,通过nginx-ingress-controller 将用户声明的 nginx-ingress 转化成 nginx 的转发规则。其核心解决的问题是流量的转发和东西向的负载均衡。
主要的工作原理是nginx-ingress-controller监听api-server的变化(Kubernetes Informers),通过 watch Kubernetes 的 Ingress、Service、Endpoint、Secret、ConfigMap 等对象变化,更改 Nginx 实例的配置,进行流量转发。
目前社区中,针对于 Nginx Ingress 主要有如下的两种实现方式
Kubernetes 开源社区的实现
Nginx 官方的实现
为什么需要 Nginx Ingress开源社区当中,对 Ingress Controller 的实现方式有多种,每一种 Controller 都有其适用的场景以及各自的优缺点,为什么推荐使用 nginx-ingress-controller?下面我们来探讨一下,如果不使用 nginx-ingress-controller 会给业务带来什么困扰
这里以腾讯云容器服务控制台(以下简称 TKE)默认推荐的 ingress controller 为例子,存在如下的一些问题:
CLB 类型的 Ingress 能力无法满足现有业务的需求,如无法共享同一个外网入口,支持默认默认转发后端等
原有业务已使用了 nginx-inrgess,并且运维已习惯于配置 nginx.conf,不希望做过多的改变
使用 nginx-ingress-controller,能够很好地解决以上的问题。
需要什么前提条件 部署 nginx-ingress-operator 组件部署安装进入腾讯云容器服务控制台当中,选择需要部署 Nginx Ingress 的集群,进入集群-组件管理当中,部署安装 Nginx Ingess 组件,如下图:
组件安装并且正常运行 部署方案TKE 提供了多种对于nginx-ingress-controller的部署方案以及接入 LB 的方式,适配不同的业务场景需求,以下会对不同的方案进行介绍。
nginx-ingress-controller 部署方案 方案一: DaemonSet + 节点池Nginx 作为关键的流量接入网关,是至关重要的组件,不建议将 Nginx 与其他业务部署在相同的节点内,可以通过节点池设置污点的方式,进行部署。关于节点池的相关说明,可以查看腾讯云容器服务节点池概述。
使用此部署方案,应该注意如下几个事项:
提前准备好部署 nginx-ingress-controller 的节点池,同时设置节点池的污点 Taint 和 Label,防止其他 Pod 调度到该节点池。
确保已成功部署安装好 nginx-ingress-operator 组件,部署方式参考上方指引
进入组件详情,创建
nginx-ingress-controller实例(单一集群内可同时存在多个实例)
部署方式选择 指定节点池DaemonSet部署
设置容忍污点
设置 Request/Limit,其中 Request 需设置比节点池的机型配置小(节点本身有资源预留,避免实例因资源不足而不可用),Limit 可不设置
其他参数根据业务需要进行设置即可
方案二:Deployment + HPA使用 Deployment + HPA 的方案进行部署,您可以根据业务需要配置污点和容忍,将 Nginx 和业务 Pod 进行分散部署。搭配 HPA,设置 CPU/内存等指标进行弹性伸缩。
使用此部署方案,应该注意如下几个事项:
在集群中设置即将部署 nginx-ingress-controller 的节点的 Label
确保已成功部署安装好 nginx-ingress-operator 组件,部署方式参考上方指引。
进入组件详情,创建
nginx-ingress-controller实例(单一集群内可同时存在多个实例)
部署方式选择 自定义Deployment+HPA部署
设置 HPA 触发策略
设置 Request/Limit
设置节点调度策略,推荐 nginx-ingress-controller 独占节点,避免其他业务资源侵占而导致不可用
其他参数根据业务需要进行设置即可
Nginx 前端接入 LB 的部署方式