全部产品
Search
文档中心

容器服务 ACK:部署多个Ingress Controller

更新时间:May 09, 2023

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

前提条件

背景信息

您可以通过调整阿里云容器服务Kubernetes集群中默认的Nginx Ingress Controller配置,使用私网SLB实例。更多信息,请参见部署Ingress Controller使用私网SLB,文中提到的两种模式可以满足大部分需求场景。但对于一些特殊场景,例如,集群内有部分公网服务需要通过公网Ingress方式来对外暴露提供访问,但是又有部分私网服务仅仅只希望对同VPC内非Kubernetes集群内的服务提供访问,而又不允许能被公网访问到,您可以通过部署两套独立的Nginx Ingress Controller服务,其前端绑定不同网络类型的SLB实例来满足这类需求场景。1

部署新的Nginx Ingress Controller服务

当您成功创建一个ACK集群后,默认情况下,集群内部已经部署了一套拥有2个Pod副本的Nginx Ingress Controller服务,其前端挂载在一个公网SLB实例上。

您可以通过以下步骤在ACK集群中再部署一套完全独立的Nginx Ingress Controller服务。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏,选择市场 > 应用市场
  3. 应用市场页面单击应用目录页签,搜索ack-ingress-nginx
    • 1.20以下集群选中ack-ingress-nginx
    • 1.20及以上集群选中ack-ingress-nginx-v1
      说明 安装ack-ingress-nginx-v1时,必须使用Helm v3,如果您使用的是Helm v2 Tiller,您需要升级到Helm v3。具体操作【组件升级】Helm V2 Tiller升级公告
  4. 在目标页面,单击一键部署
  5. 创建面板中,选择集群和命名空间,然后单击下一步
  6. 参数配置页面,设置相应参数,然后单击确定
    ack-ingress-nginx主要参数如下表。
    参数描述
    controller.image.repositoryingress-nginx镜像地址。
    controller.image.tagingress-nginx镜像版本,请参见Nginx Ingress Controller
    controller.ingressClass设置该Ingress Controller可监听的目标Ingress Class标识。
    重要 同一个集群中不同套Ingress Controller监听的Ingress Class标识必须唯一,且不能设置为nginx关键字(nginx是集群默认Ingress Controller的监听标识)。
    controller.replicaCount设置该Ingress Controller Pod的副本数。
    controller.service.enabled是否开启公网SLB访问,不需要开启则设置为false
    controller.service.internal.enabled是否开启私网SLB访问,需要开启则设置为true
    controller.kind设置IngressController部署形态,可选值:DeploymentDaemonSet
    ack-ingress-nginx-v1主要参数如下表。
    参数描述
    controller.image.repositoryingress-nginx镜像地址。
    controller.image.tagingress-nginx镜像版本,请参见Nginx Ingress Controller
    controller.ingressClassResource.name设置Ingress Controller所对应的IngressClass的名称。
    重要 该参数作为1.22以下版本模板中controller.ingressClass参数的替代,可以在kubernetes.io/ingress.class注解中正常使用。同一个集群中不同套Ingress Controller创建的IngressClass名称必须唯一,且不能设置为nginx关键字(nginx是集群默认Ingress Controller的监听标识)。
    controller.ingressClassResource.controllerValue设置Ingress Controller所对应的Controller Class。
    重要 同一个集群中不同套Ingress Controller创建的Controller Class必须唯一,且不能设置为k8s.io/ingress-nginx关键字(k8s.io/ingress-nginx是集群默认Ingress Controller的监听标识)。
    controller.replicaCount设置该Ingress Controller Pod的副本数。
    controller.service.enabled是否启用SLB访问(包括公网和私网)。
    controller.service.external.enabled是否开启公网SLB访问,不需要开启则设置为false
    controller.service.internal.enabled是否开启私网SLB访问,需要开启则设置为true
    controller.kind设置IngressController部署形态,可选值:DeploymentDaemonSet
    controller.electionID选主时使用的ID,用于更新Ingress端点状态。
    重要 若通过应用市场部署多套Nginx Ingress Controller至同一命名空间下,需要将electionID设置为不同的值,避免选主冲突。
    controller.metrics.enabled是否开启ingress-nginx的metrics。
    controller.metrics.serviceMonitor.enabled是否开启serviceMonitor,配置抓取规则。
    说明 建议开启ingress-nginx的metrics后,同时开启此选项,以此来自动配置Prometheus的抓取规则。
  7. 查看部署的Nginx Ingress Controller服务。
    1. 在控制台左侧导航栏,单击集群
    2. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
    3. 在集群管理页左侧导航栏中,选择应用 > Helm
      Helm页面可以看到新的Nginx Ingress Controller服务已经成功部署。

访问测试

本文部署一个测试应用,并配置通过新部署的Nginx Ingress Controller来对外暴露提供服务访问。

  1. 部署一个Nginx测试应用。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: nginx
      template:
        metadata:
          labels:
            run: nginx
        spec:
          containers:
          - image: nginx
            imagePullPolicy: Always
            name: nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      sessionAffinity: None
      type: NodePort
  2. 通过Ingress来对外暴露提供服务访问。
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx
      annotations:
        #注意这里要设置为您前面配置的INGRESS_CLASS。
        kubernetes.io/ingress.class: "<YOUR_INGRESS_CLASS>"
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /
            backend:
              service: 
                name: nginx
                port:
                  number: 80
            pathType: ImplementationSpecific
    说明 您需要配置注释kubernetes.io/ingress.class

    在完成部署应用后,执行以下操作,查看该Ingress资源对应的端点IP地址与新部署的Nginx Ingress Controller服务的IP地址。

    • 执行以下命令查看集群默认部署的nginx-ingress-lb服务对应的公网SLB地址。
       kubectl -n kube-system get svc nginx-ingress-lb

      预期输出:

      NAME               TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)                      AGE
      nginx-ingress-lb   LoadBalancer   172.19.7.30   192.0.2.0   80:31429/TCP,443:32553/TCP   2d
    • 执行以下命令查看新部署的nginx-ingress-lb服务对应的公网SLB地址。
      kubectl -n <YOUR_NAMESPACE> get svc nginx-ingress-lb

      预期输出:

      NAME               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
      nginx-ingress-lb   LoadBalancer   172.19.6.227   198.51.100.10   80:30969/TCP,443:31325/TCP   39m
    • 执行以下命令查看该应用的Ingress配置。
      kubectl get ing

      预期输出:

      NAME      HOSTS         ADDRESS         PORTS     AGE
      nginx     foo.bar.com   198.51.100.10   80        5m

    通过以上预期输出可得,该Ingress资源对应的端点IP地址与新部署的Nginx Ingress Controller服务的一致。

  3. 分别通过集群默认的Nginx Ingress Controller服务和新部署的Nginx Ingress Controller服务来访问该应用。
     # 通过集群默认的Nginx Ingress Controller服务访问该应用(预期返回404)。
      curl -H "Host: foo.bar.com" http://192.0.2.0
    default backend - 404                                                                                                                                                                                        
      # 通过新部署的Nginx Ingress Controller服务访问该应用(预期返回nginx页面)。curl -H "Host: foo.bar.com" http://198.51.100.10
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        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暴露的服务彼此完全是独立的,这特别适用于同一集群内部分服务需要提供公网访问能力,但又有部分服务仅仅只希望为同VPC内非Kubernetes集群的其他服务提供访问的场景。