单集群应用迁移至舰队并分发到多集群

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

工作原理

image

  1. 用户执行kubectl amc promote命令,将集群内选定的资源同步到舰队。

  2. 在舰队中创建资源并自动生成PropagationPolicy,Policy中会添加target-clusters指定的集群和cluster-1自身。

  3. 舰队会将资源分发到target-clusters(图中cluster-2)中,并且这些集群(包含cluster-1)中同步后的资源都由舰队统一管理。

前提条件

步骤一:在舰队及目标集群中创建命名空间

将资源分发至多个集群前,请确保其所属的命名空间已同时存在于舰队和所有分发目标集群中,否则将会分发失败。下方示例中,需要分发的资源属于gateway-demo命名空间。

若命名空间已经存在于舰队及所有目标集群中,则可跳过此步骤。
  1. 使用舰队kubeconfig执行以下命令,在舰队中创建gateway-demo

    kubectl create ns gateway-demo
  2. 复制并保存下方YAMLweb-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
  3. 使用舰队kubeconfig执行以下命令,在舰队中创建ClusterPropagationPolicy,分发Namespace。

    kubectl apply -f web-demo-ns-policy.yaml

步骤二:执行promote命令同步资源到舰队

使用kubectl amc promote命令将单集群资源同步到舰队,并指定分发到多个集群。

  1. 使用amc get命令查看初始情况:service1web-demo仅存在于cluster-1集群中的gateway-demo namespace下。ADOPTIONN表示未被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
  2. 执行以下命令,将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
  3. 再次使用amc get命令查看结果,可见service1web-demo已被分发到cluster-2集群中,并且2个集群中的该资源都受ACK One 舰队管理(ADOPTIONY)。至此,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 参数禁止自动创建,然后手动配置所需的策略。具体操作,请参见分发策略与差异化策略