为解决应用多集群部署时的重复操作,易出错,难同步等问题,可使用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-demo
namespace下。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
参数禁止自动创建,然后手动配置所需的策略。具体操作,请参见分发策略与差异化策略。