在ACK托管集群(智能托管模式)中部署工作负载并实现负载均衡

本文介绍如何在ACK托管集群(智能托管模式)中部署一个工作负载,并通过ALB Ingress实现公网访问。完成后,您可以通过设定的域名访问该应用,实现外部流量的高效管理和负载均衡。

本文将指引完成以下操作。

  1. 为示例应用创建一个命名空间。

  2. 部署一个Nginx示例应用,并创建Service以将应用暴露到集群网络。

  3. 创建ALB Ingress,以通过ALB实现应用的公网访问。需要手动创建AlbConfig用于管理ALB实例,创建IngressClass以关联AlbConfig。

  4. 验证部署是否成功,并通过浏览器访问应用。后续资源如无需使用,可释放。

操作完成后,可实现如下内容。

  • 运行一个2副本的Nginx示例应用。

  • 通过 ALB Ingress 和 Service 为应用提供稳定的公网入口。

  • 基于智能托管模式,ACK 将自动根据应用负载动态扩缩容,并接管节点的生命周期管理,以减少运维负担。

前提条件

步骤一:创建命名空间

您可以为本实践创建一个命名空间,以便实现资源隔离。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择命名空间与配额

  3. 单击创建,在弹出的对话框自定义命名空间名称(本文以my-nginx-namespace为例),按照页面指引配置其他信息,然后单击确定

步骤二:部署Nginx应用并创建Service

本小节将部署一个名为my-nginxNginx示例Deployment,以及一个名为my-nginx-svcService来公开该应用。

  • Deployment:副本数为2,镜像使用Nginx示例应用,暴露80端口以接收 HTTP 网络流量。

  • Service:Service类型为ClusterIP,将Service 的端口 80 映射到 Pod 容器的端口 80,并通过Label Selector来匹配Pod。

本小节仅提供示例流程。如需详细了解工作负载和Service的创建流程,请参见创建工作负载Service管理
  1. 参见以下代码创建一个名为my-nginx.yaml的文件,用于在命名空间中部署DeploymentService。

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: my-nginx    # 示例应用的名称。
      namespace: my-nginx-namespace  # 替换为此前创建的命名空间名称。
      labels:
        app: nginx
    spec:
      replicas: 2       # 设置副本数量。
      selector:
        matchLabels:
          app: nginx     # 对应服务中Selector的值需要与其一致,才可以通过服务公开此应用。
      template:
        metadata:
          labels:
            app: nginx
        spec:
        #  nodeSelector:
        #    env: test-team
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80         # 需要在服务中暴露该端口。
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: nginx
      name: my-nginx-svc
      namespace: my-nginx-namespace  # 替换为此前创建的命名空间名称。
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: ClusterIP   # 若为Flannel,则需使用Nodeport。
  2. 部署DeploymentService。

    kubectl apply -f my-nginx.yaml
  3. 查看DeploymentService的状态。

    • 查看Deployment的状态。

      kubectl get deployment my-nginx -n my-nginx-namespace

      预期输出:

      NAME       READY   UP-TO-DATE   AVAILABLE   AGE
      my-nginx   2/2     2            2           4m36s
    • 查看Service的状态:

      kubectl get svc my-nginx-svc -n my-nginx-namespace

      预期输出:

      NAME           TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
      my-nginx-svc   ClusterIP   192.XX.XX.164   <none>        80/TCP    42s

步骤三:创建ALB Ingress及其关联资源

通过ALB Ingress管理访问集群应用的外部流量时,您需要准备以下资源。

创建ALB Ingress之前,建议您通过ALB Ingress管理了解其原理和要求。
  • ALB Ingress Controller:负责管理Ingress资源的组件。集群开启智能托管模式后,ALB Ingress Controller 已为默认安装。

  • AlbConfig:由ALB Ingress Controller创建的一种CRD,声明ALB实例的配置。一个AlbConfig对应一个ALB实例。ALB实例是用户请求流量的入口,负责将用户请求转发到后端Service中。

  • IngressClass:创建ALB Ingress时可以通过指定该IngressClass来引用相应的AlbConfig配置,从而实现特定的应用路由配置和负载均衡策略。

创建AlbConfig

  1. 创建并拷贝以下内容到alb.yaml文件中,用于创建AlbConfig。

    • AlbConfig指定addressTypeInternet,即ALB实例会拥有公网IP地址,DNS域名可被解析到公网IP,可在公网环境下访问。

    • 请填写vSwitchId为两个不同可用区的虚拟交换机ID。交换机需与集群处于同一VPC,且为ALB支持的可用区

      您可以在专有网络管理控制台交换机页面获取交换机ID。如需创建交换机,请参见创建和管理交换机
    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb
    spec:
      config:
        name: alb
        addressType: Internet  # 负载均衡的地址类型,Internet类型可在公网环境下访问。
        zoneMappings:               
        - vSwitchId: vsw-uf6ccg2a9g71hx8go****  # 替换为您的虚拟交换机的ID。
        - vSwitchId: vsw-uf6nun9tql5t8nh15****  # 替换为您的虚拟交换机的ID。
      listeners:
        - port: 80
          protocol: HTTP
  2. 创建AlbConfig。

    kubectl apply -f alb.yaml
  3. 查看AlbConfig资源。

    kubectl get AlbConfig alb

    预期输出:

    NAME   ALBID        DNSNAME                                  PORT&PROTOCOL   CERTID   AGE
    alb    alb-******   alb-******.<regionID>.alb.aliyuncs.com                            60s
    说明

    创建HTTPS监听并为其配置证书后,PORT&PROTOCOLCERTID中才会显示内容,内容为空是正常现象。

创建IngressClass

  1. 使用以下代码创建一个名为ingress_class.yaml文件,用于创建IngressClass。

    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: alb
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: alb # IngressClass关联的AlbConfig的名称
  2. 创建IngressClass。

    kubectl apply -f ingress_class.yaml

创建ALB Ingress

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

  3. 路由页面,切换命名空间为此前创建的命名空间,然后单击创建 Ingress,在创建 Ingress对话框配置路由,按照页面提示完成Ingress的创建。

    下表仅介绍核心配置项。详细配置项说明和相关操作(例如配置域名解析),请参见创建ALB Ingress

    配置项

    说明

    网关类型

    选择类型为ALB Ingress

    名称

    自定义路由名称,例如my-albingress。

    Ingress Class

    选择此前创建的Ingress Class,以引用相应的AlbConfig配置。

    规则

    • 服务名称:选择目标服务,即此前创建的Service。

    • 端口:选择服务需要暴露的端口,即本示例使用的80。

    其余配置保持默认即可。

    创建完成后,您可以在左侧导航栏,选择网络 > 路由,查看Ingress是否成功部署。等待1分钟左右,在端点列查看并复制ALB DNS的端点名称。

步骤四:访问应用

ALB DNS的端点名称直接粘贴到浏览器中,以访问Nginx应用。

image

(可选)步骤五:清理资源

本文创建的资源包括Deployment、Service、AlbConfig、IngressClass以及ALB Ingress。请参见以下命令清理资源。

以下命令中的资源名称均为示例值。执行时请替换为实际的资源名称。
kubectl delete deployment my-nginx
kubectl delete Service my-nginx-svc
kubectl delete ALBIngress my-albingress
kubectl delete AlbConfig alb
kubectl delete IngressClass alb

相关文档