You need to enable JavaScript to run this app.
导航
部署多套 Nginx Ingress Controller
最近更新时间:2024.04.30 17:43:10首次发布时间:2023.07.24 14:26:51

本文介绍如何在容器服务集群中同时部署多套独立的 Nginx Ingress Controller,对外提供不同的服务访问。

前提条件

背景信息

容器服务支持在集群中同时部署多套独立的 Nginx Ingress Controller 服务,各服务之间互不影响,允许您基于实际业务需求或场景,对外提供不同的服务访问。例如:

  • 在多业务共享集群的场景下,您可以为不同业务配置各自独立的 Nginx Ingress Controller 服务,保证不同的业务匹配不同的服务规则。
  • 在公网和私网业务分离的场景下,同一个集群内,部署两套独立的 Nginx Ingress Controller 服务,两者前端绑定不同网络类型的负载均衡(CLB)实例,满足该集群内部分服务提供公网访问,另一部分服务提供私网访问的需求。

操作步骤

步骤一:部署 Nginx Ingress Controller

容器服务通过应用模板提供名为 ingress-nginx 的 Nginx Ingress Controller。

  1. 登录 容器服务控制台
  2. 在左侧导航栏,选择 应用中心 > 应用模板
  3. 应用模板 页面,找到 ingress-nginx 应用模板,鼠标悬停在该应用模板区域,然后单击 部署
  4. 部署应用 页面,配置 Nginx Ingress Controller 服务参数。
    alt
    参数说明
    基本信息
    名称设置应用名称,同一个命名空间里名称必须唯一。
    项目邀测·申请试用】选择需要部署应用的项目。默认选择 default(默认项目)。更多项目相关操作和说明,请参见 项目管理
    集群选择需要部署应用的目标集群。
    命名空间选择目标集群下的命名空间。
    编排模板
    Chart 来源选择应用的 Chart 来源。默认来源为 应用模板,不可配置。
    Chart选择应用的 Chart 版本。

    配置方式

    选择应用的配置方法。每个应用模板的values.yaml文件配置方法不同,详细说明,请参见values.yaml文件中的注释说明。

    单击
    图标,编辑values.yaml文件。编辑完成后单击 确定

    说明

    values.yaml文件中的常用参数说明,请参见 Nginx Ingress Controller 参数说明

  5. 单击 确定,部署完成应用。
    应用部署完成后会显示在 Helm 应用 页面。选择目标项目、集群、命名空间,找到已部署的 nginx-ingress 应用,单击名称,进入详情页面查看该应用的基本信息、关联创建的工作负载、服务、其他资源等。

    注意

    已部署的 nginx-ingress 应用,若删除其关联的工作负载、服务等资源,但未删除 Webhook 时,会对该 nginx-ingress 应用所在集群中创建路由规则(Ingress)的操作产生影响。更多说明,请参见 FAQ

    alt

步骤二:部署应用和服务

在集群中部署独立的 Nginx Ingress Controller 服务后,可以使用 Nginx Ingress Controller 暴露内部的服务。本小节以一个 nginx 应用为例,为您介绍如何使用独立的 Nginx Ingress Controller 暴露后端服务并验证结果。

创建应用和服务的 YAML 文件。示例文件service-demo.yaml代码如下:

  1. 在集群中部署 nginx 应用和服务。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx # 应用名称
  namespace: doc-ns
spec: 
  replicas: 1 # 应用副本数
  selector: 
    matchLabels: 
      app: nginx
  template: 
    metadata: 
      labels: 
        app: nginx
    spec:
      containers:
      - name: nginx # 容器名称
        image: nginx:latest # 容器镜像地址和版本
        ports:
        - containerPort: 80 # 容器开放的端口号
---
apiVersion: v1
kind: Service
metadata:
  name: service-demo # 服务的名称
  namespace: doc-ns
spec:
  selector:
    app: nginx # 通过标签选择器将服务与后端的容器组(Pod)绑定
  ports:
  - name: rule 
    protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort
  1. 执行以下命令,创建应用和服务。
kubectl apply -f service-demo.yaml

步骤三:配置 Nginx Ingress

  1. 配置 ingress 对外暴露服务。其中,在spec.ingressClassName字段中使用名称指定自定义的 Nginx Ingress Controller。示例文件ingress-demo.yaml代码如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-demo # ingress 的名称
  namespace: doc-ns # ingress 所在的命名空间
spec:
  ingressClassName: user-ingress-nginx # 自定义的 Nginx Ingress Controller 名称
  rules:
  - host: example.com # 外部访问的域名
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: service-demo # ingress 后端对接的服务名称
            port:
              number: 80 # ingress 对接服务的端口号

说明

自定义 Nginx Ingress Controller 的名称命名规则为名称-nginx,例如在本例中,部署时配置的名称为user-ingress,则对应的自定义 Nginx Ingress Controller 的名称为user-ingress-nginx

  1. 执行以下命令,创建应用和服务。
kubectl apply -f ingress-demo.yaml

结果验证

  1. 完成部署后,执行以下命令,查看系统默认 Nginx Ingress Controller 的 IP 地址与自定义 Nginx Ingress Controller 的 IP 地址。
    • 查看系统默认 Nginx Ingress Controller 服务的 IP 地址。
    kubectl -n kube-system get svc
    
    预期输出为:
    NAME                       TYPE          CLUSTER-IP       EXTERNAL-IP       PORT(S)                      AGE
    
    ingress-nginx-controller   LoadBalancer  10.xxx.xxx.221   180.xxx.xxx.114   80:30234/TCP,443:30644/TCP   1d
    
    • 查看自定义 Nginx Ingress Controller 服务的 IP 地址。您可以通过-n doc-ns指定自定义 Nginx Ingress Controller 所在的命名空间。
    kubectl -n doc-ns get svc
    
    预期输出为:
    NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE
    user-ingress-ingress-nginx-controller   LoadBalancer   10.xxx.xxx.52    180.xxx.xxx.55   80:32697/TCP,443:31180/TCP   5m51s
    
  2. 执行以下命令,查看 ingress 配置。可以发现 ingress 对应的 IP 地址与自定义 Nginx Ingress Controller 服务的 IP 地址一致。
kubectl -n doc-ns get ingress

预期输出为:

NAME           CLASS                HOSTS         ADDRESS         PORTS    AGE
ingress-demo   user-ingress-nginx   example.com   180.xxx.xxx.55   80      56s
  1. 分别通过集群默认 Nginx Ingress Controller 服务和自定义 Nginx Ingress Controller 服务来访问该应用。
    • 通过集群默认 Nginx Ingress Controller 服务访问应用。预期输出为404,即无法访问到后端服务。
    curl -H "Host: example.com" http://180.xxx.xxx.114
    
    • 通过自定义 Nginx Ingress Controller 服务访问应用。
    curl -H "Host: example.com" http://180.xxx.xxx.55
    
    预期输出为:
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    

从上面的测试结果可以发现,不同 Nginx Ingress Controller 暴露的服务彼此完全独立,各服务之间互不影响。您可以为不同业务配置各自独立的 Nginx Ingress Controller 服务,实现多业务路由规则分离、公网和私网业务分离等场景需求。

监控运维

当您在集群中部署 Nginx Ingress Controller 后,可以使用集群的可观测能力,对 Nginx Ingress Controller 实例进行监控和运维。详情请参见 自定义 Nginx Ingress Controller 观测最佳实践

参考信息

Nginx Ingress Controller 参数说明

userConfig字段的主要参数说明,如下表所示。

参数默认值描述

networkModel

与所在集群的容器网络模型保持一致

集群的容器网络模型(CNI),取值:

  • vpc-cni:VPC-CNI 网络模型。
  • flannel:Flannel 网络模型。

ResourceNamePreEnable

true

是否为 Nginx Ingress 资源自动增加前缀,取值:

  • true:自动增加前缀。创建资源时,系统会为 Nginx Ingress 资源自动添加.Release.Name前缀。保证在集群中部署多套 Nginx Ingress 时,资源名称唯一,避免冲突。
  • false:不自动增加前缀。适用于基于资源名称做资源标识,完成后续自动化流程的场景。此时,如果您在集群中部署多套 Nginx Ingress 时,需要人工保证如下的资源名称唯一:
    • .Values.controller.electionID
    • .Values.controller.ingressClassResource.name
    • .Values.controller.ingressClassResource.controllerValue
    • .Values.controller.ingressClass

deployNodeType

Node

部署 Nginx Ingress 的节点类型,取值:

  • Node:ECS 类型节点。
  • VirtualNode:VCI 类型节点。
公网配置

PublicNetwork.Isp

"BGP"

负载均衡实例绑定 EIP 的线路类型。包括:BGP、SingleLine_BGP、Static_BGP、Fusion_BGP、ChinaMobile、ChinaTelecom、ChinaUnicom、ChinaMobile_Value、ChinaUnicom_Value 和 ChinaTelecom_Value。详细参数解释,请参见 EIP 产品文档

注意

  • 除 BGP 外,其他线路类型均为 EIP 产品的邀测功能,如需使用,请 提交工单 或联系客户经理申请。
  • 当配置私网类型的负载均衡实例时,需要将该参数修改为空,并配置PrivateNetwork.SubnetId参数。

PublicNetwork.BandWidth

10

负载均衡实例绑定 EIP 的带宽上限,单位为 Mbps。

  • PublicNetwork.BillingType=2时:取值范围 1 ~ 500,默认值 10。
  • PublicNetwork.BillingType=3时:取值范围 1 ~ 200,默认值 10。
PublicNetwork.IpFamily"ipv4"负载均衡实例的 IP 地址类型。当前仅支持 ipv4

PublicNetwork.BillingType

3

负载均衡实例绑定 EIP 的计费类型,取值:

  • 1:包年包月。
  • 2:按量计费-按带宽上限计费,即指定带宽上限后,将按照使用时长计费,与实际流量无关。
  • 3:按量计费-按实际流量计费,即指定带宽上限后,将按照实际使用的出公网流量计费,与使用时长无关。
PublicNetwork.SubnetId(可选)负载均衡实例所属子网,为负载均衡实例提供私网部署环境,分配私网 IP 地址。

PublicNetwork.BandwidthPackageId

(可选)负载均衡实例绑定 EIP 的共享带宽包 ID。

说明

共享带宽包是一种支持复用和共享带宽的云资源。将单个地域内多个公网 IP 或 IPv6 公网带宽添加到一个共享带宽包实例中,共享一条带宽,可以帮助您降低公网带宽的使用成本。详情请参见 什么是共享带宽包

PublicNetwork.MasterZoneID

负载均衡实例的主可用区 ID。

  • 取值不能与SlaveZoneID参数取值相同。
  • 不配置该参数或该参数为空时,默认分配子网所在可用区为主可用区。

说明

负载均衡在各地域支持的可用区情况以及可用区 ID,请参见 地域与可用区

PublicNetwork.SlaveZoneID

负载均衡实例的备可用区 ID。

  • 取值不能与MasterZoneID参数取值相同。
  • 如果配置该参数,则参数MasterZoneID必须一并配置,否则会报错。
  • 不配置该参数或该参数为空时,根据地域可用区部署情况按照如下逻辑处理:
    • 指定地域为单可用区部署时,该参数默认为空,创建单可用区负载均衡实例。
    • 指定地域为多可用区部署时,默认根据指定地域支持的可用区随机分配备可用区。

PublicNetwork.ModifyProtection

负载均衡实例的删除保护功能,取值:

  • NonProtection:不开启控制台修改保护功能,表示允许通过控制台修改实例或删除实例。
  • ConsoleProtection:开启控制台修改保护功能,表示禁止通过控制台修改实例或删除实例。
  • 不配置该参数或该参数为空时,默认为空,表示不开启控制台修改保护功能。

PublicNetwork.LoadBalancerBillingType

2

负载均衡实例的计费类型。取值:

  • 2:按量计费-按规格计费。指定实例规格,并按照实例的使用时长计费。
  • 3:按量计费-按使用量计费。无需指定实例规格,按照实例实际消耗的性能容量计费。

注意

  • 按量计费-按使用量计费 为负载均衡产品的邀测功能,如需使用,请 提交工单 或联系客户经理申请。
  • 当负载均衡选择 按量计费-按使用量计费 类型时,无需配置实例规格类型,即LoadBalancerSpec参数。

PublicNetwork.LoadBalancerSpec

"small_1"

负载均衡实例的规格类型。取值:

  • small_1:小型I
  • small_2:小型II
  • medium_1:中型I
  • medium_2:中型II
  • large_1:大型I
  • large_2:大型II

注意

  • 负载均衡实例规格类型的详细说明,请参见 产品类型与规格
  • LoadBalancerBillingType配置为3,即负载均衡实例采用 按量计费-按使用量计费 类型时,不支持配置本参数。

PublicNetwork.SyncField

更新values.yaml时,是否感知LoadBalancerSpec字段的变更,并更新负载均衡实例。取值:

  • spec:感知LoadBalancerSpec字段的变更,并更新负载均衡实例的规格。
  • 不配置该参数或该参数为空时,默认为空,表示不感知LoadBalancerSpec字段的变更,不能通过values.yaml更新负载均衡实例规格。
私网配置

PrivateNetwork.SubnetId

负载均衡实例所属子网,为负载均衡实例提供私网部署环境,分配私网 IP 地址。

注意

使用私网访问网络时,必须配置该参数。

PrivateNetwork.IpFamily"ipv4"负载均衡实例的 IP 地址类型。当前仅支持 ipv4

PrivateNetwork.MasterZoneID

负载均衡实例的主可用区 ID。

  • 取值不能与SlaveZoneID参数取值相同。
  • 不配置该参数或该参数为空时,默认分配子网所在可用区为主可用区。

说明

负载均衡在各地域支持的可用区情况以及可用区 ID,请参见 地域与可用区

PrivateNetwork.SlaveZoneID

负载均衡实例的备可用区 ID。

  • 取值不能与MasterZoneID参数取值相同。
  • 如果配置该参数,则参数MasterZoneID必须一并配置,否则会报错。
  • 不配置该参数或该参数为空时,根据地域可用区部署情况按照如下逻辑处理:
    • 指定地域为单可用区部署时,该参数默认为空,创建单可用区负载均衡实例。
    • 指定地域为多可用区部署时,默认根据指定地域支持的可用区随机分配备可用区。

PrivateNetwork.ModifyProtection

负载均衡实例的删除保护功能,取值:

  • NonProtection:不开启控制台修改保护功能,表示允许通过控制台修改实例或删除实例。
  • ConsoleProtection:开启控制台修改保护功能,表示禁止通过控制台修改实例或删除实例。
  • 不配置该参数或该参数为空时,默认为空,表示不开启控制台修改保护功能。

PrivateNetwork.LoadBalancerBillingType

2

负载均衡实例的计费类型。取值:

  • 2:按量计费-按规格计费。指定实例规格,并按照实例的使用时长计费。
  • 3:按量计费-按使用量计费。无需指定实例规格,按照实例实际消耗的性能容量计费。

注意

  • 按量计费-按使用量计费 为负载均衡产品的邀测功能,如需使用,请 提交工单 或联系客户经理申请。
  • 当负载均衡选择 按量计费-按使用量计费 类型时,无需配置实例规格类型,即LoadBalancerSpec参数。

PrivateNetwork.LoadBalancerSpec

"small_1"

负载均衡实例的规格类型。取值:

  • small_1:小型I
  • small_2:小型II
  • medium_1:中型I
  • medium_2:中型II
  • large_1:大型I
  • large_2:大型II

注意

  • 负载均衡实例规格类型的详细说明,请参见 产品类型与规格
  • LoadBalancerBillingType配置为3,即负载均衡实例采用 按量计费-按使用量计费 类型时,不支持配置本参数。

PrivateNetwork.SyncField

更新values.yaml时,是否感知LoadBalancerSpec字段的变更,并更新负载均衡实例。取值:

  • spec:感知LoadBalancerSpec字段的变更,并更新负载均衡实例的规格。
  • 不配置该参数或该参数为空时,默认为空,表示不感知LoadBalancerSpec字段的变更,不能通过values.yaml更新负载均衡实例规格。

Controller字段的主要参数说明,如下表所示。

参数默认值描述

ingressClassResource.name

nginx

设置 Ingress Controller 对应的 IngressClass 的名称。

注意

  • 该参数作为 Kubernetes 1.22 以下版本模板中controller.ingressClass参数的替代,可以在kubernetes.io/ingress.class注解中正常使用。
  • 同一个集群中不同套 Ingress Controller 创建的 IngressClass 名称必须唯一,且不能设置为nginx关键字相关名称(nginx是集群默认 Ingress Controller 的监听标识)。

ingressClassResource.controllerValue

"k8s.io/ingress-nginx"

设置 Ingress Controller 对应的 Controller Class。

注意

同一个集群中不同套 Ingress Controller 创建的 Controller Class 名称必须唯一,且不能设置为k8s.io/ingress-nginx关键字相关名称(k8s.io/ingress-nginx是集群默认 Ingress Controller 的监听标识)。

replicaCount1设置该 Ingress Controller Pod 的副本数。
controller.resources.requests.cpu100m设置该 Ingress Controller Pod 的 CPU 请求(CPU Request)。单位为核。若使用毫核为单位,则格式为:CPU 请求+m,例如100m表示 CPU 资源请求为 100 毫核。
resources.requests.memory90Mi设置该 Ingress Controller Pod 的内存请求(Memory Request)。单位为 MiB 或 GiB,格式为:内存请求+单位,例如90Mi表示内存资源请求为 90 MiB;2Gi表示内存资源请求为 2 GiB。

electionID

ingress-controller-leader

选择宿主机时使用的 ID,用于更新 Ingress 端点状态。

注意

若通过 应用中心 部署多套 Nginx Ingress Controller 至同一命名空间下,需要将 electionID 设置为不同的值,避免选主冲突。

部署参数(Deployment/Daemonset)的说明,如下表所示。

参数默认值描述
hostNetworkfalse将 Nginx Ingress Controller 部署至 Deployment/Daemonset 时的主要参数。详细的参数说明,请参见 Kubernetes 官方文档
NodeSelector.kubernetes.iolinux
namespace与应用所在命名空间保持一致
tolerations[]
resources.requests.cpu100m
resources.requests.memory90Mi
namecontroller