You need to enable JavaScript to run this app.
导航

Nginx Ingress 最佳实践

最近更新时间2024.03.01 14:07:17

首次发布时间2022.05.13 22:03:40

nginx ingress 是 Kubernetes ingress 的一种实现,您可以通过 nginx ingress 接入 ingress 流量。本文为您介绍 ingress-nginx 组件常见的最佳实践操作。

背景信息

容器服务提供基于社区版的 Nginx Ingress Controller,它将 ingress 规则转换成 nginx 的配置,然后基于 nginx 来进行七层的流量转发。

容器服务 ingress-nginx 组件可以在 创建集群 时安装,也可以在集群创建完成后,在 组件管理单独安装

配置实例个数

在容器服务集群中安装 ingress-nginx 组件后,组件的默认实例个数为 2。您也可以调整实例个数,满足生产业务的高可用。

  1. 登录 容器服务控制台,在左侧导航栏中选择 集群
  2. 单击需要配置的目标集群,在集群管理页面的左侧导航栏中,选择 组件管理
  3. 组件管理 页面的 网络 页签下,找到 ingress-nginx 组件,单击 配置
    alt
  4. ingress-nginx 规格配置 对话框,配置 实例个数 为所需数值,然后单击 确定
    alt
  5. (可选)当 ECS 的节点数大于或等于实例个数时,需要配置 ingress-nginx-controller 的反亲和调度策略,使组件的多个实例分散调度到不同的节点上。

    说明

    安装 ingress-nginx 组件后,会以无状态负载(对应名称为 ingress-nginx-controller)的方式部署到集群中。

    1. 在集群管理页面的左侧导航栏中,选择 工作负载 > 无状态负载
    2. 无状态负载 页面的 kube-system 命名空间下,找到 ingress-nginx-controller,单击对应 操作 列的... > 更新
      alt
    3. 按照如下示意图说明,修改配置。详细的操作步骤和参数说明,请参见 更新无状态负载
      • 控制台操作示意图如下:
        alt
      • Yaml 文件代码片段如下:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app.kubernetes.io/name: ingress-nginx
            namespaces:
            - kube-system
            topologyKey: kubernetes.io/hostname
        

配置资源监控和告警

在容器服务集群中,nginx ingress 资源通过对接火山引擎云监控产品来实现监控和告警,包括:采集、查询、展示(Dashboard)以及告警等。

说明

需要提前开启 火山引擎云监控产品

配置资源采集

nginx ingress 对接火山引擎云监控产品,需要安装 metrics-collector 组件。

  1. 登录 容器服务控制台,在左侧导航栏中选择 集群
  2. 单击需要配置的目标集群,在集群管理页面的左侧导航栏中,选择 组件管理
  3. 安装 metrics-collector 组件,配置资源采集。
    alt

配置资源监控

配置完成资源采集后,支持到 云监控控制台 中配置资源监控。详细操作,请参见 查看容器服务监控数据

  1. 登录 云监控控制台
  2. 在左侧菜单栏中,单击 云产品监控,选择 容器服务
  3. 容器服务 产品监控页面,选择 容器组 维度,并通过目标集群、命名空间 kube-system 和工作负载类型进行筛选,选择 ingress-nginx-controller 工作负载。
    alt
  4. 筛选完成后单击容器组(Pod)名称,即可查看 ingress-nginx-controller 的容器组资源监控信息。
    alt

配置资源告警

云监控控制台 支持配置资源告警策略。当监控数据达到阈值,触发告警后,系统会将告警资源、故障类型、当前值、告警持续时间等详细信息发送给告警联系人。详细操作,请参见 创建告警策略创建告警联系人和联系组

  1. 云监控控制台 在左侧菜单栏中,单击 云产品监控,选择 容器服务
  2. 容器服务 产品监控页面,选择 容器组 维度,并通过目标集群、命名空间 kube-system 和工作负载类型进行筛选,选择 ingress-nginx-controller 工作负载。
  3. 单击筛选出的容器组名称,并在详情面板的 告警策略 页签,单击 创建告警策略,新建一个告警策略。
    alt
  4. 配置 ingress-nginx-controller 对应容器组的 CPU、内存、网络指标等告警。详细的参数配置说明,请参见 创建告警策略
    alt

修改资源限制

默认配置下,ingress-nginx-controller 的 CPU 资源限制是 0.5 core,内存限制是 1 GiB。如果您的业务流量较大,建议资源配额 CPU 上限不低于1 core,内存上限不低于2 GiB。您可以根据业务的实际需要调整 ingress-nginx-controller 组件的资源限制。

说明

  • 更改 ingress-nginx-controller 的资源配额前,首先确保实例个数在 2 以上。详细操作,请参见本文上方 配置实例个数
  • 更改配置后滚动更新实例,可能会造成业务流量抖动在 1 分钟以内长链接中断重连,因此建议您在业务流量低峰期操作。
  1. 登录 容器服务控制台,在左侧导航栏中选择 集群
  2. 单击需要配置的目标集群,在集群管理页面的左侧导航栏中,选择 组件管理
  3. 组件管理 页面的 网络 页签下,找到 ingress-nginx 组件,单击 配置
  4. ingress-nginx 规格配置 对话框,配置 Nginx 配置 为所需数值,然后单击 确定。更多参数说明,请参见 ingress-nginx 组件
    alt

专属节点

为了进一步确保 nginx ingress 的性能和稳定性,可以将 ingress-nginx-controller 的多个实例部署在一些高配置节点上,以避免不同实例资源的抢占和单点故障。

下面以 ingress-nginx-controller 的 2 个实例分别独占 2 个专属节点为例,介绍配置步骤。

  1. 在集群中创建两个专属的 Worker 节点。您可以在已有节点池中增加 2 个新的节点,也可以通过创建节点池的方式新增 2 个专属节点。详细操作,请参见 新增节点
  2. 分别给两个专属节点添加键:ingress-nginx值:true 的标签。详细操作,请参见 标签管理
    alt
  3. 分别给两个专属节点添加污点,禁止没有容忍度的 Pod 调度到专属节点上。此处使用和标签相同的键/值。详细操作,请参见 污点管理
    alt
  4. 配置工作负载的污点容忍规则,使 ingress-nginx-controller 实例可以被调度到专属节点上。详细参数说明,请参见 创建无状态负载 中的调度策略参数说明。
    alt
    • 控制台操作示意图如下:
      alt
    • Yaml 文件代码片段如下:
      tolerations:
      - effect: NoExecute
        key: ingress-nginx
        operator: Equal
        value: "true"
      
  5. 为 log-collector 等 daemonset(守护进程)设置相同的污点容忍规则,使相应的实例可以部署到专属节点上进行工作。
  6. 设置 nodeSelector 使 ingress-nginx-controller 实例只能调度到专属节点,禁止实例调度到其他节点。
    nodeSelector:
      ingress-nginx: "true"
    
  7. 设置反亲和调度策略,使 ingress-nginx-controller 的两个实例不能被调度到同一个节点上,保障高可靠。
    alt
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app.kubernetes.io/name: ingress-nginx
        namespaces:
        - kube-system
        topologyKey: kubernetes.io/hostname
    
  8. 配置完成后,查看 ingress-nginx-controller 的实例部署情况
    alt

日志持久化

默认情况下,ingress-nginx-controller 的日志没有进行持久化存储,需要您进行配置开启,实现 ingress-nginx-controller 日志持久化采集、存储以及查询。为了更好地展示 ingress-nginx-controller 日志内容,提升可读性,容器服务将 ingress-nginx-controller 日志采集作为一个独立功能供您使用。

说明

  • 需要开通日志服务。若未开通,请登录 日志服务控制台,根据控制台向导提示,开通服务。
  • 需要安装 log-collector 组件、ingress-nginx 组件。相关操作,请参见 安装组件
  • 需要提前在日志服务中创建 日志项目 和 日志主题。详细操作,请参见 日志项目 和 日志主题
  1. 开启 ingress-nginx 组件的日志采集功能。详细操作,请参见 采集 ingress 组件日志
  2. 查看 ingress-nginx 组件的日志。
    alt
  3. 当不需要 ingress-nginx 日志时,可以单击 组件日志 页签下的 关闭 Ingress 访问日志。关闭后,系统不再采集 Ingress Nginx Controller 组件的日志。

自定义配置原生参数

在 Kubernetes 集群中,路由规则(ingress)对集群服务(service)中外部可访问的 API 对象进行管理,提供七层负载均衡能力,可以给 ingress 配置提供外部可访问的 URL、Rewrite 配置、HTTPS 服务、以及灰度发布功能等高级功能。

针对 Ingress Nginx Controller,容器服务采用与社区完全兼容的配置方式。关于所有的配置说明,请参见 NGINX Configuration

ingress nginx 原生支持的部分高级功能/高级配置可以基于 Annotation 的方式进行配置和实现。在每个ingress Yaml 的 Annotation 里配置,只对本 ingress 生效。更多信息请参见 Annotations

配置示例:自定义最大请求体

对于 nginx,当请求 body 大小超过客户端请求最大允许值时,将向客户端返回413错误。 这个大小可以通过参数client_max_body_size来配置。

  1. 如果您想为集群内 所有 ingress 规则 配置全局参数,可以在 配置项 中对 kube-system 下的 ingress-nginx-controller 增加 proxy-body-size 键值对。
    alt
    alt
    alt
    更新 configmap 后,进入 kube-system 下的 ingress-nginx-controller 容器内查看 nginx 配置是否生效。
    alt
  2. 如果只针对 特定的 ingress 规则 使用自定义值,可以在此 ingress 规则中添加 Annotaion。
    nginx.ingress.kubernetes.io/proxy-body-size: 20m
    
    alt
    alt