在应用的多集群分发部署中,您可以使用ACK One应用发布的工作流功能,实现应用在集群间分批发布。例如您可以将应用先发布到测试集群,经验证后再发布到生产集群,用来控制发布风险。本文通过示例应用的部署介绍如何在主控实例上实现集群间灰度分发。

前提条件

  • 开发者用户从ACK One控制台获取主控实例的KubeConfig,通过Kubectl连接至主控实例。

  • 主控实例管理员(实例创建者)已配置命名空间和配额。具体操作,请参见管理命名空间与配额

  • 主控实例已添加多个关联集群。具体操作,请参见添加关联集群
  • 安装AMC命令行工具。具体操作,请参见AMC命令行帮助

操作步骤

  1. 使用以下内容,创建app-meta.yaml文件,包含应用相关的Kubernetes原生资源。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: demo
      name: demo
      namespace: demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:red
            name: demo
  2. 执行以下命令,在主控实例上部署应用demo
    kubectl apply -f app-meta.yaml
  3. 使用以下内容,创建policy-topology.yaml。定义分发的目标集群是测试集群cluster-test和生产集群cluster-prod
    1. 执行以下命令,查看主控实例管理的关联集群,确定应用分发的目标集群。
      kubectl get managedclusters

      预期输出:

      NAME                     HUB ACCEPTED   MANAGED CLUSTER URLS   JOINED   AVAILABLE   AGE
      managedcluster-c5***z9   true                                  True     True        12d
      managedcluster-c1***e5   true                                  True     True        12d
    2. 选择对应目标集群,替换如下示例中的<clusterid1><clusterid2>为待发布的目标集群ID。
    apiVersion: core.oam.dev/v1alpha1
    kind: Policy
    metadata:
      name: cluster-test
      namespace: demo
    type: topology
    properties:
      clusters: ["<clusterid1>"]
    ---
    apiVersion: core.oam.dev/v1alpha1
    kind: Policy
    metadata:
      name: cluster-prod
      namespace: demo
    type: topology
    properties:
      clusters: ["<clusterid2>"]
  4. 执行以下命令,在主控实例上部署多集群应用的分发策略。
    kubectl apply -f policy-topology.yaml
  5. 使用以下内容,创建workflow.yaml,定义工作流。
    apiVersion: core.oam.dev/v1alpha1
    kind: Workflow
    metadata:
      name: deploy-demo
      namespace: demo
    steps:
      - type: deploy
        name: deploy-test
        properties:
          policies: ["cluster-test"]
      - type: deploy
        name: deploy-prod
        properties:
          auto: false
          policies: ["cluster-prod"]
    说明 在workflow的deploy-prod中增加auto: false,表示执行deploy-pod步骤前需要人工确认。
  6. 执行以下命令,在主控实例上部署多集群应用工作流。
    kubectl apply -f workflow.yaml
  7. 使用以下内容,创建app.yaml,定义应用。
    apiVersion: core.oam.dev/v1beta1
    kind: Application
    metadata:
      name: demo
      namespace: demo
      annotations:
        app.oam.dev/publishVersion: version1
    spec:
      components:
        - name: demo
          type: ref-objects
          properties:
            objects:
              - apiVersion: apps/v1
                kind: Deployment
                name: demo
      workflow:
        ref: deploy-demo
    参数 说明
    annotations: app.oam.dev/publishVersion 应用的版本控制,当应用或应用引用的Kubernetes资源发生变化时,必须更新此字段,才能触发向目标集群的分发。
    components. type: ref-objects 通过apiVersionkindname引用同命名空间下的Kubernetes资源,应用将下发这些资源到目标关联集群中。
    • 目前ACK One支持的应用Kubernetes资源包括Deployment/apps/v1Secret/v1ConfigMap/v1Ingress/networking.k8s.io/v1
    • 如需分发其他资源的需求,请提交工单联系ACK One团队。
    workflow. ref 定义Application部署使用的工作流。
  8. 执行以下命令,在主控实例上部署应用demo
    kubectl apply -f app.yaml
  9. 执行以下命令查看应用部署状态。
    可以看到应用demo处于workflowSuspending状态。
    kubectl get app demo -n demo

    预期输出:

    NAME   COMPONENT   TYPE          PHASE                HEALTHY   STATUS   AGE
    demo   demo        ref-objects   workflowSuspending   true               38s
  10. 执行以下命令,查看Deployment资源在各集群上的部署状态。
    替换其中<clusterid1><clusterid2>为待查看的目标集群ID。可以看到测试集群已部署,但生产集群没有部署。
    • 执行以下命令,查看测试集群cluster-test部署状态。
      kubectl amc get deployment demo -n demo -m <clusterid1>

      预期输出:

      Run on ManagedCluster <clusterid1>
      NAME   READY   UP-TO-DATE   AVAILABLE   AGE
      demo   1/1     1            1           2m
    • 执行以下命令,查看生产集群cluster-prod部署状态。
      kubectl amc get deployment demo -n demo -m <clusterid2>

      预期输出:

      Run on ManagedCluster <clusterid2>
      Error from server (NotFound): deployments.apps "demo" not found
  11. 执行以下命令,继续运行workflow将其部署到生产集群。
    kubectl amc workflow resume demo -n demo

    预期输出:

    Successfully resume workflow: demo
  12. 查看Deployment资源在生产集群的部署状态。
    可以看到生产集群已部署。
    kubectl amc get deployment demo -n demo -m <clusterid2>

    预期输出:

    Run on ManagedCluster <clusterid2>
    NAME   READY   UP-TO-DATE   AVAILABLE   AGE
    demo   1/1     1            1           8m