基于ACK One与云效快速构建多集群CD

更新时间:2025-04-01 06:35:09

云效是阿里云提供的一站式DevOps平台,涵盖软件研发全生命周期的工具链和服务管理,可以通过流水线Flow将应用部署到ACK集群中。分布式云容器平台ACK One的应用分发功能可以根据多样的策略(静态权重、动态资源调度、Gang调度等)将Kubernetes资源灵活分配到多个集群,并具备重调度和故障迁移等能力。结合云效自身的CD能力和ACK One的应用分发功能,您可以快速将单集群持续交付构建成多集群持续交付系统,并获得强大的多集群资源调度与分发能力。

工作流程

结合云效ACK One多集群应用分发能力,您可以快速将单集群发布流水线转变为多集群持续交付流水线:

  • 无需修改原先发布的应用资源(如Deployment)。

  • 只需在原应用基础上增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy)。

  • 原单集群中的应用不受影响,不会发生服务中断或重启。

image
  1. 将应用YAML、分发策略(PropagationPolicy)、差异化策略(OverridePolicy)提交到Codeup代码仓库中。

  2. 创建云效流水线,并配置将应用和策略部署到ACK One舰队实例中。

  3. ACK One多集群应用分发。按照策略将应用分发到多集群中,同时接管单集群中已部署的该应用。

前提条件

步骤一:将代码仓库导入Codeup

ACK One gitops-demo项目通过网页端导入到云效的Codeup。本文以mc-app为例,包含内容如下:

  • 应用资源:

    • Deployment:deployment.yaml。本例默认Replicas2。

    • Service:service.yaml

  • ACK One多集群应用分发策略:

    • PropagationPolicy(pp.yaml):分发策略。本例含义是将上述应用资源按照动态感知到的各关联集群中当前可用资源的比例来进行分发。本例测试使用2个集群,剩余资源一致,所以最终副本数是1:1。

      apiVersion: policy.one.alibabacloud.com/v1alpha1
      kind: PropagationPolicy
      metadata:
        name: echo-server-policy
        namespace: default
      spec:
        preserveResourcesOnDeletion: false
        propagateDeps: true
        placement:
          replicaScheduling:
            replicaSchedulingType: Divided
            replicaDivisionPreference: Weighted
            weightPreference:
              dynamicWeight: AvailableReplicas
        resourceSelectors:
          - apiVersion: apps/v1
            kind: Deployment
            name: echo-server
          - apiVersion: v1
            kind: Service
            name: echo-server
    • OverridePolicy(op.yaml):差异化策略。本例OverridePolicy功能是为Deployment添加label a=a1分发到各关联集群中。

      apiVersion: policy.one.alibabacloud.com/v1alpha1
      kind: OverridePolicy
      metadata:
        name: echo-server-op
        namespace: default
      spec:
        resourceSelectors:
          - apiVersion: apps/v1
            kind: Deployment
            name: echo-server
        overrideRules:
          - overriders:
              plaintext:
                - operator: add
                  path: /metadata/labels/a
                  value: a1
      #      targetCluster:
      #        clusterNames:
      #          - clusterid

步骤二:创建流水线并发布相关策略

通过云效流水线Flow将应用的策略部署到舰队中,ACK One按照策略将应用分发到多集群中,同时接管单集群中已部署的该应用。

  1. 新建流水线

  2. 添加流水线源,并添加步骤一中导入的代码仓库。

  3. 添加Kubernetes部署任务。

    1. 在流水线编辑页面,单击+ 新的任务 > 部署 > Kubernetes发布进入编辑页面。

    2. 配置Kubectl发布,配置详情,请参见Kubernetes Kubectl 发布,重点配置如下所示:

      参数

      说明

      参数

      说明

      集群连接

      单击+ 新建连接

      集群类型

      选择自定义集群

      集群名称

      自定义集群名称。

      集群ID

      填入舰队实例ID。

      集群配置文件

      舰队实例的KubeConfig。

      命名空间

      自定义命名空间。

      YAML路径

      输入manifests/directory/mc-app

  4. 单击保存并运行,运行流水线。运行完成后可查看部署日志

步骤三:查看多集群部署结果

  1. 使用舰队kubeconfig,在舰队中查看已部署的Demo应用。

    kubectl get deploy

    预期输出:

    NAME          READY   UP-TO-DATE   AVAILABLE   AGE
    echo-server   2/2     2            0           11m
  2. 在舰队中执行以下命令,查看子集群中的Deployment状态。

    kubectl amc get deploy -M --show-labels          

    预期输出:

    NAME          CLUSTER    READY   UP-TO-DATE   AVAILABLE   AGE    ADOPTION LABELS
    echo-server   c9xxxxxx   1/1     1            1           11m    Y        a=a1,app=echo-server,...
    echo-server   cbxxxxxx   1/1     1            1           11m    Y        a=a1,app=echo-server,...
    • 由于本文测试的两个集群剩余资源相同,所以两个副本被平均分配到两个关联集群中。

    • 每个副本中a=a1标签是通过差异化策略自动添加。

    • ADOPTIONY表示该集群的资源已经被ACK One多集群应用分发的PropagationPolicy管理。更新镜像时,变更将自动下发到子集群,删除舰队中的应用,也会同步清理各子集群中的相关应用。

步骤四:测试重调度能力

若关联集群节点发生故障导致Pod资源不足而处于pending状态,舰队会自动进行多集群重调度,将其迁移至资源充足的其他集群。

  1. 模拟节点故障:将一个关联集群中的所有节点进行节点排水,使Pod因资源不足无法调度而处于pending状态。

  2. 等待约三分钟后,在舰队执行以下命令查看事件,DescheduleBindingSucceed即为重调度成功事件,表明发生了重调度。

    kubectl describe deployment echo-server

    预期输出:

    Events:
      Type     Reason                      Age                    From                                Message
      ----     ------                      ----                   ----                                -------
      Normal   ScalingReplicaSet           4m53s                  deployment-controller               Scaled up replica set echo-server-74d8cff746 to 2
      Normal   ApplyPolicySucceed          4m53s (x3 over 4m53s)  resource-detector                   Apply policy(default/echo-server-policy) succeed
      Normal   ScheduleBindingSucceed      4m53s                  default-scheduler                   Binding has been scheduled successfully. Result: {cbxxxxxx:1,c9xxxxxx:1,[]}
      Warning  ApplyPolicyFailed           4m53s                  resource-detector                   Apply policy(default/echo-server-policy) failed: resourcebindings.work.one.alibabacloud.com "echo-server-deployment" already exists
      Normal   SyncWorkSucceed             8s (x5 over 4m53s)     binding-controller                  Sync work of resourceBinding(default/echo-server-deployment) successful.
      Normal   GetDependenciesSucceed      8s (x9 over 4m53s)     dependencies-distributor            Get dependencies([]) succeed.
      Normal   ApplyOverridePolicySucceed  8s (x9 over 4m53s)     override-manager                    Apply override policy(default/echo-server-op) for cluster(cbxxxxxx) succeed.
      Warning  SyncWorkFailed              8s (x7 over 4m53s)     binding-controller                  Operation cannot be fulfilled on resourcebindings.work.one.alibabacloud.com "echo-server-deployment": the object has been modified; please apply your changes to the latest version and try again
      Normal   AggregateStatusSucceed      8s (x11 over 4m53s)    resource-binding-status-controller  Update Resource with AggregatedStatus successfully.
      Normal   DescheduleBindingSucceed    8s                     karmada-descheduler                 Binding has been descheduled, 1 replica(s) in cluster(cbxxxxxx), 1 total descheduled replica(s)
      Normal   ScheduleBindingSucceed      8s                     default-scheduler                   Binding has been scheduled successfully. Result: {c9xxxxxx:2,[]}
      Normal   ApplyOverridePolicySucceed  8s (x2 over 8s)        override-manager                    Apply override policy(default/echo-server-op) for cluster(c9xxxxxx) succeed.
  3. 执行以下命令,查看Deployment在重调度后子集群中的状态。

    kubectl amc get deploy -M echo-server

    预期输出:

    NAME          CLUSTER           READY   UP-TO-DATE   AVAILABLE   AGE     ADOPTION
    echo-server   c9xxxxxx          2/2     2            2           6m7s    Y

    通过预期输出可以看到2个副本均在资源充足的c9xxxxxx集群中运行。

  • 本页导读
  • 工作流程
  • 前提条件
  • 步骤一:将代码仓库导入Codeup
  • 步骤二:创建流水线并发布相关策略
  • 步骤三:查看多集群部署结果
  • 步骤四:测试重调度能力