使用腾讯云容器服务玩转 Nginx Ingress

做者林育新,腾讯云容器产品工程师。目前主要负责腾讯云TKE的控制台的相关研发工做。前端

概述

在开源社区当中,Kubernetes 的 Ingress Controller 的实现有多种方式,Nginx Ingress 只是其中的一种实现方式,固然也是目前社区中使用量最大的一种 Ingress Controller 的实现方式,其不只功能强大,并且性能极高。本文主要介绍如何使用腾讯云容器服务实现多种方式进行 Nginx Ingress 的部署,并会简单介绍各类方式的实现原理以及优缺点和适用场景。nginx

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 实例的配置,进行流量转发。git

img

目前社区中,针对于 Nginx Ingress 主要有以下的两种实现方式github

为何须要 Nginx Ingress

开源社区当中,对 Ingress Controller 的实现方式有多种,每一种 Controller 都有其适用的场景以及各自的优缺点,为何推荐使用 nginx-ingress-controller?下面咱们来探讨一下,若是不使用 nginx-ingress-controller 会给业务带来什么困扰后端

这里以腾讯云容器服务控制台(如下简称 TKE)默认推荐的 ingress controller 为例子,存在以下的一些问题:api

  1. CLB 类型的 Ingress 能力没法知足现有业务的需求,如没法共享同一个外网入口,支持默认默认转发后端等
  2. 原有业务已使用了 nginx-inrgess,而且运维已习惯于配置 nginx.conf,不但愿作过多的改变

使用 nginx-ingress-controller,可以很好地解决以上的问题。网络

须要什么前提条件

部署 nginx-ingress-operator

组件部署安装

进入腾讯云容器服务控制台当中,选择须要部署 Nginx Ingress 的集群,进入集群-组件管理当中,部署安装 Nginx Ingess 组件,以下图:负载均衡

img

组件安装而且正常运行

img

部署方案

TKE 提供了多种对于nginx-ingress-controller的部署方案以及接入 LB 的方式,适配不一样的业务场景需求,如下会对不一样的方案进行介绍。运维

nginx-ingress-controller 部署方案

方案一: DaemonSet + 节点池

img

Nginx 做为关键的流量接入网关,是相当重要的组件,不建议将 Nginx 与其余业务部署在相同的节点内,能够经过节点池设置污点的方式,进行部署。关于节点池的相关说明,能够查看腾讯云容器服务节点池概述性能

img

使用此部署方案,应该注意以下几个事项:

  • 提早准备好部署 nginx-ingress-controller 的节点池,同时设置节点池的污点 TaintLabel,防止其余 Pod 调度到该节点池。

  • 确保已成功部署安装好 nginx-ingress-operator 组件,部署方式参考上方指引

  • 进入组件详情,建立

    nginx-ingress-controller

    实例(单一集群内可同时存在多个实例)

    • 部署方式选择 指定节点池DaemonSet部署
    • 设置容忍污点
    • 设置 Request/Limit,其中 Request 需设置比节点池的机型配置小(节点自己有资源预留,避免实例因资源不足而不可用),Limit 可不设置
    • 其余参数根据业务须要进行设置便可
方案二:Deployment + HPA

img

使用 Deployment + HPA 的方案进行部署,您能够根据业务须要配置污点和容忍,将 Nginx 和业务 Pod 进行分散部署。搭配 HPA,设置 CPU/内存等指标进行弹性伸缩。

img

使用此部署方案,应该注意以下几个事项:

  • 在集群中设置即将部署 nginx-ingress-controller 的节点的 Label

  • 确保已成功部署安装好 nginx-ingress-operator 组件,部署方式参考上方指引。

  • 进入组件详情,建立

    nginx-ingress-controller

    实例(单一集群内可同时存在多个实例)

    • 部署方式选择 自定义Deployment+HPA部署
    • 设置 HPA 触发策略
    • 设置 Request/Limit
    • 设置节点调度策略,推荐 nginx-ingress-controller 独占节点,避免其余业务资源侵占而致使不可用
    • 其余参数根据业务须要进行设置便可

Nginx 前端接入 LB 的部署方式

上文介绍了在 TKE 的集群当中部署 nginx-ingress-operatornginx-ingress-controller 的使用流程和部署方案建议,完成以上步骤,仅仅是在集群内部署了 Nginx 的相关组件,但要接收外部的流量,还须要配置,还须要配置 nginx 的前端 LB。当前 TKE 已完成对 Nginx Ingress 的产品化支持,能够根据业务须要选择如下部署模式之一。

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

前置条件(知足其一便可):

  1. 集群自身网络插件为 VPC-CNI
  2. 集群自身网络插件为 Global Router,并已开启 VPC-CNI 的支持(两种模式混用)

咱们以节点池部署的负载示例 img 当前方案性能好,全部的 Pod 都使用的弹性网卡,弹性网卡的 Pod 是支持 CLB 直绑 Pod 的,能够绕过 NodePort,而且不须要手动维护 CLB,支持自动扩缩容,是最理想的方案。

方案二:Global Router 模式集群使用普通 LoadBalancer 模式的 Service

当前 TKE 对于 LoadBalancer 类型的 Service 默认的实现是基于 NodePort,CLB 会绑定各节点的 NodePort 做为后端的 RS,将流量转发到节点的 NodePort,而后节点再经过 Iptables 或 IPVS 将请求路由到 Service 对应的后端 Pod(指 Nginx Ingress Controller 的 Pod)。

您的集群若是不支持 VPC-CNI 的网络模式,能够经过常规的 LoadBalancer 访问方式的 Service 接入流量。 这是在 TKE 上部署 Nginx Ingress 最简单的方式,流量会通过一层 NodePort,多一层转发,但可能存在如下的问题:

  1. 转发路径较长,流量到 NodePort 后,还会再通过 Kubernetes 内部负载均衡,经过 Iptables 或 IPVS 转发到 Nginx,会增长一点网络耗时
  2. 通过 NodePort,必然会发生 SNAT,若是流量过于集中,容易致使源端口耗尽或者 conntrack 插入冲突而致使丢包,引起部分流量异常。
  3. 每一个节点的 NodePort 也充当一个负载均衡器,CLB 若是绑定大量节点的 NodePort,负载均衡的状态就分散在每一个节点上,容易致使全局负载不均。
  4. CLB 会对 NodePort 进行健康探测,探测包最终会被转发到 Nginx Ingress 的 Pod,若是 CLB 绑定的节点数量多于 Nginx Ingress 的 Pod,会致使探测包对 Nginx Ingress 形成较大的压力。
方案三:使用 HostNetwork + LB

方案二虽然是最简单的部署方式,可是流量会通过一层 NodePort,且可能存在如上所描述的问题,咱们可让 Nginx Ingress 使用 HostNetwork,CLB 直接绑定节点 IP + 端口(80,443)。因为使用 HostNetwork,nginx ingress 的 Pod 就不能被调度到同一个节点当中,避免端口监听冲突。 因为 TKE 还没有对此方案进行产品化,能够经过提早规划,选择部分节点,专门用于部署 nginx-ingress-controller,为节点打上 Label,而后以 DaemonSet 的方式部署在这些节点上(即 nginx-ingress-controller 的部署方案一)。

如何集成监控

TKE 经过集成 腾讯云容器团队的高性能云原生监控服务(传送门:https://console.cloud.tencent.com/tke2/prometheus ),也可在之前发布的文章《如何用 Prometheus 监控十万 container 的 Kubernetes 集群》中了解 Prometheus,Kvass 和怎么利用 kvass 为基础的 Prometheus 集群化技术。

绑定监控实例

img

查看监控数据

img

如何采集和消费日志

TKE 经过集成 腾讯云日志服务 CLS,提供了全套完整的产品化能力,实现 nginx-ingress-controller 的日志采集和消费能力,但须要注意以下几个事项:

  1. 前置要求:确保当前集群已开启日志采集功能
  2. nginx-ingress-controller 实例中,配置日志采集的相关选项。

img

总结

本文梳理了如何使用腾讯云容器服务控制台玩转 Nginx Ingress,主要介绍了控制台上的对于 nginx-ingress-controller 的两种部署方式以及建议,以及前端接入 LB 的三种方式,除了在 TKE 上进行 Nginx Ingress 的一键部署,TKE 还提供集群所部署的 nginx-ingress-controller 日志和监控的相关能力的产品化支持。对于想要在 TKE 上使用 Nginx Ingress,本文是一个很好的参考和指引。

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

相关文章
相关标签/搜索