安装 NginxIngress 实例

最近更新时间:2024-11-07 16:54:32

我的收藏
注意:
NginxIngress 扩展组件已停止更新,详情请参见 NginxIngress 扩展组件停止更新公告

安装 NginxIngress 组件

1. 登录 容器服务控制台,选择左侧导航栏中的集群
2. 集群管理页面,单击目标集群 ID,进入集群详情页。
3. 选择左侧导航中的组件管理,在组件管理页面,单击新建
4. 新建组件管理页面中勾选 NginxIngress。
5. 单击完成即可安装组件。安装完成后,您可以在组件管理中查看组件详情。

注意事项

腾讯云负载均衡(Cloud Load Balancer)实例已于2023年03月06日升级了架构,升级后公网负载均衡以域名的方式提供服务。VIP 随业务请求动态变化,控制台不再展示 VIP 地址。请参见 域名化公网负载均衡上线公告
新注册的腾讯云用户默认使用升级后的域名化负载均衡。
存量用户可以选择继续使用原有的负载均衡,不受升级影响。如果您需要升级负载均衡服务,则需要同时升级腾讯云产品 CLB 以及 TKE,否则 TKE 中的所有公网类型的 Service/Ingress 同步将可能受到影响。CLB 升级操作详情请参见 域名化负载均衡升级指南;TKE 升级 Service/Ingress 组件版本,请通过 在线咨询 联系我们。

安装方式

您可以根据不同的业务场景需求,使用以下几种安装方案在容器服务 TKE 中安装 NginxIngress。

方案1:通过 DaemonSet 形式在指定节点池部署(推荐)

Nginx 作为关键的流量接入网关,不建议您将 Nginx 与其他业务部署在相同的节点内。推荐您使用指定的节点池来部署 NginxIngress。部署架构如下图所示:



安装步骤

注意:
使用此安装方式,您可以完整享有节点池快速扩缩容的能力,后续您只要调整节点池的数量,即可扩缩容 Nginx 的副本。
DaemonSet 方式无法选择注册节点池
1. 准备用于部署 NginxIngress 的节点池,同时设置污点 taint(防止其他 Pod 调度到该节点池)。部署节点池详情可参见 节点池相关说明
2. 在集群中 安装 NginxIngress 组件
3. 在集群信息页中,选择服务与路由 > NginxIngress,单击新增 NginxIngress 实例(一个集群内可以同时存在多个 Nginx)。


4. 新建 NginxIngress 中,选择部署选项中的指定节点池 DaemonSet 部署,并按需设置其他参数。如下图所示:


节点池:配置节点池。
Nginx 配置:Request 需设置比节点池的机型配置小(节点本身有资源预留)。Limit 可不设置。
镜像版本说明
Kubernetes 版本范围
NginxIngress 组件支持安装的版本
Nginx 实例支持的镜像版本
<=1.18
1.1.0、1.2.0、1.3.0、1.3.1、1.4.1、1.5.1
v0.41.0、v0.49.3
1.0.0
v0.41.0
1.20
1.1.0、1.2.0、1.3.0、1.3.1、1.4.1、1.5.1
v1.1.3
1.0.0
v0.41.0
1.22
1.1.0、1.2.0、1.3.0、1.3.1、1.4.1、1.5.1
v1.1.3
1.24
1.1.0、1.2.0、1.3.0、1.3.1、1.4.1、1.5.1
v1.1.3、v1.6.4
1.26
1.3.0、1.3.1、1.4.1、1.5.1
v1.1.3、v1.6.4、v1.9.5
1.28
1.5.1
v1.9.5
说明:
1. 组件使用 EIP 说明:NginxIngress 组件 1.0.0 和 1.1.0 版本依赖腾讯云弹性公网 IP 服务(EIP),在 v1.2.0 版本中组件不再依赖 EIP,如果您有 EIP 使用限制的需求,建议您升级 NginxIngress 组件。组件的升级不影响存量的 NginxIngress 实例,对业务访问无影响,不影响数据安全。
2. 升级说明:Nginx 实例的版本说明请参见 Ingress-nginx 文档。升级集群请参见 升级集群操作步骤。升级 NginxIngress 组件请参见 组件升级操作步骤
5. 单击确定即可完成安装。

方案2:通过 Deployment + HPA 形式并指定调度规则部署

使用 Deployment + HPA 的形式部署 NginxIngress,您可以根据业务需要配置污点和容忍将 Nginx 和业务 Pod 分散部署。同时搭配 HPA,可设置 Nginx 根据 CPU / 内存等指标进行弹性伸缩。部署架构如下图所示:



安装步骤

1. 准备用于部署 NginxIngress 的节点池,同时设置污点 taint(防止其他 Pod 调度到该节点池)。部署节点池详情可参见 节点池相关说明
2. 在集群中 安装 NginxIngress 组件
3. 在集群信息页中,选择服务与路由 > NginxIngress,单击新增 NginxIngress 实例(一个集群内可以同时存在多个 Nginx)。
4. 新建 NginxIngress 中,选择部署选项中的自定义 Deployment+HPA 部署,并按需设置其他参数。如下图所示:



自动伸缩:可以选择关闭 nginx 实例的自动伸缩。
说明:
当您手动删除 NginxIngress 实例对应的 HPA 对象,平台 ApiServer 滚动更新或者 Nginx controller pod 重启,系统内部会再次对账,重新下发 HPA 对象。新下发的 HPA 可能会伸缩 Nginx controller pod 数量,对业务造成影响。
当您需要关闭 HPA 时请通过此开关关闭 Nginx 实例的 HPA 功能。
Nginx 配置:Request 需设置比节点池的机型配置小(节点本身有资源预留)。Limit 可不设置。

节点调度策略:需自行指定。

注意:
如果您开启了“注册节点能力”,请参考下面的方式,防止 NginxIngress 实例部署到注册节点上。
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node.kubernetes.io/instance-type
operator: NotIn
values:
- external
操作步骤如下:
1. 节点调度策略中,选择自定义调度规则。
2. 强制满足条件中,单击添加条件。如下图所示:



3. 编辑强制满足条件页面,选择自定义 Label 规则,添加调度策略 node.kubernetes.io/instance-type NotIn external。如下图所示:



4. 单击确定
镜像版本说明
Kubernetes 为 1.20 及以下版本的集群,NginxIngress 组件版本为 1.0.0,Nginx 实例的镜像版本只能选择 v41.0。
Kubernetes 为 1.20 及以下版本的集群,NginxIngress 组件版本为 1.1.0,Nginx 实例的镜像版本只能选择 v41.0,v49.3。
Kubernetes 大于等于 1.22 版本的集群,NginxIngress 组件版本只支持 1.1.0,Nginx 实例的镜像版本只能选择 v1.1.3。
说明:
版本说明:如果您需要了解 Nginx 实例的版本信息,请参见 Ingress-nginx 文档
升级集群:如果您需要升级集群,请参见 升级集群操作步骤
升级 NginxIngress 组件:如果您需要升级 NginxIngress 组件,请参见 组件升级操作步骤
5. 单击确定即可完成安装。

方案3:Nginx 前端接入 LB 部署方式

仅部署 Nginx 在集群内将无法接收外部流量,还需配置 Nginx 的前端 LB。TKE 现已提供产品化的安装能力,您也可以根据业务需要选择不同的部署模式。

VPC-CNI 模式集群使用 CLB 直通 Nginx 的 Service(推荐)

如果您的集群是 VPC-CNI 模式的集群,推荐您使用 CLB 直通 Nginx 的 Serivce。下图为以节点池部署的负载示例。

当前方案性能好,而且不需要手动维护 CLB,是最理想的方案。该方案需要集群支持 VPC-CNI,如果您的集群已配置 VPC-CNI 网络插件,或者已配置 Global Router 网络插件并开启了 VPC-CNI 的支持(两种模式混用),建议使用此方案。

Globalrouter 模式集群使用普通 Loadbalancer 模式的 Service

如果您的集群不支持 VPC-CNI 模式网络,您也可以通过常规的 Loadbalancer 模式 Service 接入流量。当前 TKE 上 LoadBalancer 类型的 Service 默认实现是基于 NodePort,CLB 会绑定各节点的 NodePort 作为后端 RS,将流量转发到节点的 NodePort,然后节点上再通过 iptables 或 ipvs 将请求路由到 Service 对应的后端 Pod。这种方案是最简单的方案,但流量会经过一层 NodePort,会多一层转发。可能存在以下问题:
转发路径较长,流量到了 NodePort 还会再经过 k8s 内部负载均衡,通过 iptables 或 ipvs 转发到 Nginx,会增加一点网络耗时。
经过 NodePort 必然发生 SNAT,如果流量过于集中容易导致源端口耗尽或者 conntrack 插入冲突导致丢包,引发部分流量异常。
每个节点的 NodePort 也充当一个负载均衡器,CLB 如果绑定大量节点的 NodePort,负载均衡的状态会分散在每个节点上,容器导致全局负载不均。
CLB 会对 NodePort 进行健康探测,探测包最终会被转发到 NginxIngress 的 Pod,如果 CLB 绑定的节点多,NginxIngress 的 Pod 少,会导致探测包对 NginxIngress 造成较大的压力。

使用 HostNetwork + LB 模式

控制台暂不支持,您可以手动修改 Nginx 工作负载的 Yaml 配置网络模式为 HostNetwork,手动创建 CLB 绑定 Nginx 暴露的节点端口。 需要注意使用 hostNetwork 时,为避免端口监听冲突,NginxIngress 的 Pod 不能被调度到同一节点。

TKE 安装 NginxIngress 默认参数

设置 NginxIngress 参数

您可以在 NginxIngress 组件详情页,Nginx 参数 tab 中选择 NginxIngress 实例进行 YAML 编辑。
注意:
默认情况下配置参数不会重启 Nginx,生效时间有细微延迟。
1. 登录 容器服务控制台,选择左侧导航栏中的集群
2. 集群管理页面,单击目标集群 ID,进入集群详情页。
3. 服务与路由 > NginxIngress 页面,单击实例右侧的查看 YAML。
4. 在 NginxIngress 实例详情页,选择 Nginx 配置页签,并单击编辑 YAML
5. 编辑 YAML 后,单击完成即可配置参数。

配置参数示例

apiVersion: v1
kind: ConfigMap
metadata:
name: alpha-ingress-nginx-controller
namespace: kube-system
data:
access-log-path: /var/log/nginx/nginx_access.log
error-log-path: /var/log/nginx/nginx_error.log
log-format-upstream: $remote_addr - $remote_user [$time_iso8601] $msec "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] [$upstream_addr] [$upstream_response_length] [$upstream_response_time] [$upstream_status] $req_id
keep-alive-requests: "10000"
max-worker-connections: "65536"
upstream-keepalive-connections: "200"
注意:
请勿修改 access-log-path error-log-pathlog-format-upstream。若修改则会对 CLS 日志采集造成影响。
若您需要根据业务配置不同的参数,请参见 官方文档