为解决应用多集群部署时的重复操作,易出错,难同步等问题,可使用AMC命令行工具将应用快速部署到多个集群,并实现后续统一管理和自动同步更新。
工作原理

- 用户执行 - kubectl amc promote命令,将集群内选定的资源同步到舰队。
- 在舰队中创建资源并自动生成PropagationPolicy,Policy中会添加 - target-clusters指定的集群和cluster-1自身。
- 舰队会将资源分发到 - target-clusters(图中cluster-2)中,并且这些集群(包含cluster-1)中同步后的资源都由舰队统一管理。
前提条件
- 多个集群已关联到舰队。具体操作,请参见管理关联集群。 
- 已为RAM用户授予AliyunAdcpFullAccess权限。具体操作,请参见为RAM用户授权。 
- 已从ACK One控制台获取舰队实例的KubeConfig,并通过 - kubectl连接至舰队。
步骤一:在舰队及目标集群中创建命名空间
将资源分发至多个集群前,请确保其所属的命名空间已同时存在于舰队和所有分发目标集群中,否则将会分发失败。下方示例中,需要分发的资源属于gateway-demo命名空间。
若命名空间已经存在于舰队及所有目标集群中,则可跳过此步骤。
- 使用舰队kubeconfig执行以下命令,在舰队中创建 - gateway-demo。- kubectl create ns gateway-demo
- 复制并保存下方YAML到 - web-demo-ns-policy.yaml中。- apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: ClusterPropagationPolicy metadata: name: web-demo-ns-policy spec: resourceSelectors: - apiVersion: v1 kind: Namespace name: gateway-demo placement: clusterAffinity: clusterNames: - ${cluster1_id} # 您的集群id - ${cluster2_id} # 您的集群id replicaScheduling: replicaSchedulingType: Duplicated
- 使用舰队kubeconfig执行以下命令,在舰队中创建 - ClusterPropagationPolicy,分发Namespace。- kubectl apply -f web-demo-ns-policy.yaml
步骤二:执行promote命令同步资源到舰队
使用kubectl amc promote命令将单集群资源同步到舰队,并指定分发到多个集群。
- 使用 - amc get命令查看初始情况:- service1和- web-demo仅存在于cluster-1集群中的- gateway-demonamespace下。- ADOPTION为N表示未被ACK One舰队中的Propagation管理。- kubectl amc -ngateway-demo get svc -M kubectl amc -ngateway-demo get deployment -M- 预期输出: - NAME CLUSTER CLUSTER_ALIAS TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ADOPTION service1 c8xxxxxx cluster-1 ClusterIP 192.168.**.** <none> 80/TCP 104m N NAME CLUSTER CLUSTER_ALIAS READY UP-TO-DATE AVAILABLE AGE ADOPTION web-demo c8xxxxxx cluster-1 2/2 2 2 104m N
- 执行以下命令,将cluster-1的资源纳入舰队管理,并额外分发到其他集群。 - 请使用集群ID替换命令中的 - ${cluster1_id}、- ${cluster2_id}参数。- target-clusters表示要将promote的资源额外分发到哪些集群中,指定多个集群格式为- ${cluster2_id},${cluster3_id}。- kubectl amc promote service service1 -ngateway-demo -m ${cluster1_id} --target-clusters ${cluster2_id} kubectl amc promote deployment web-demo -ngateway-demo -m ${cluster1_id} --target-clusters ${cluster2_id}- 预期输出: - ResourceTemplate (gateway-demo/service1) is created successfully PropagationPolicy (gateway-demo/service1-67676f499c) is created successfully Resource "/v1, Resource=services"(gateway-demo/service1) is promoted successfully ResourceTemplate (gateway-demo/web-demo) is created successfully PropagationPolicy (gateway-demo/web-demo-6675b99c65) is created successfully Resource "apps/v1, Resource=deployments"(gateway-demo/web-demo) is promoted successfully
- 再次使用 - amc get命令查看结果,可见- service1和- web-demo已被分发到cluster-2集群中,并且2个集群中的该资源都受ACK One 舰队管理(- ADOPTION为Y)。至此,cluster-1中的web-demo应用已扩展为多集群部署。- kubectl amc -ngateway-demo get svc -M kubectl amc -ngateway-demo get deployment -M- 预期输出: - NAME CLUSTER CLUSTER_ALIAS TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ADOPTION service1 cfxxxxxx cluster-2 ClusterIP 192.168.**.*** <none> 80/TCP 19s Y service1 c8xxxxxx cluster-1 ClusterIP 192.168.**.** <none> 80/TCP 5h58m Y NAME CLUSTER CLUSTER_ALIAS READY UP-TO-DATE AVAILABLE AGE ADOPTION web-demo c8xxxxxx cluster-1 2/2 2 2 6h1m Y web-demo cfxxxxxx cluster-2 2/2 2 2 24s Y
修改默认分发策略
promote 命令默认自动创建“复制分发”类型的分发策略(PropagationPolicy),即设置replicaSchedulingType: Duplicated,表明将应用直接复制到每个集群中。在舰队中执行下方命令,可查看默认创建的分发策略。
kubectl get pp -ngateway-demo xx -oyaml预期输出:
apiVersion: policy.one.alibabacloud.com/v1alpha1
kind: PropagationPolicy
metadata:
  ...
spec:
  ...
  placement:
    clusterAffinity:
      ...
    replicaScheduling:
      replicaSchedulingType: Duplicated # 复制分发策略若需使用其他策略,例如副本静态权重或者动态权重等,可在执行命令时加入 --auto-create-policy=false 参数禁止自动创建,然后手动配置所需的策略。具体操作,请参见分发策略与差异化策略。