為解決應用多叢集部署時的重複操作,易出錯,難同步等問題,可使用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 參數禁止自動建立,然後手動設定所需的策略。具體操作,請參見分發策略與差異化策略。