您可以通過ACK One艦隊的應用分發功能將艦隊執行個體中的應用分發至多個關聯集群中,無需依賴Git倉庫,簡化應用部署流程。本文介紹如何在艦隊執行個體中建立應用並根據分發策略分發至多叢集中。
前提條件
已開啟艦隊管理功能。
艦隊執行個體已添加多個關聯集群。具體操作,請參見管理關聯集群。
已從ACK One控制台擷取Fleet執行個體的KubeConfig,並通過kubectl串連至Fleet執行個體。
已授予RAM使用者AliyunAdcpFullAccess許可權。具體操作,請參見管理RAM使用者的許可權。
已安裝AMC命令列工具。
步驟一(可選):在艦隊執行個體中建立命名空間
如果待分發的應用所在的命名空間在艦隊中不存在,您需要先在艦隊執行個體中建立命名空間,如已存在則跳過此步驟。
使用艦隊執行個體的KubeConfig串連艦隊執行個體,執行以下命令,建立樣本命名空間demo。
kubectl create namespace demo步驟二:在艦隊執行個體中建立應用
此處應用支援ConfigMap、Deployment、Service等資源,本文以分發單獨一個Nginx Deployment為例介紹。
使用以下內容,建立web-demo.yaml檔案。
apiVersion: apps/v1 kind: Deployment metadata: namespace: demo name: web-demo spec: replicas: 3 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - name: nginx image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0 ports: - containerPort: 80執行以下命令部署應用。
kubectl apply -f web-demo.yaml
步驟三:在艦隊執行個體中建立分發策略為多叢集分發應用
您可以通過定義分發策略(PropagationPolicy)選擇需要分發的應用以及對應的叢集。建立分發策略後會將匹配到的應用分發到對應叢集中。
本文樣本:以複製(Duplicated)方式將Deployment weighted-deployment分發到Cluster1和Cluster2中,兩叢集副本數一致,均為3個。
執行以下命令,擷取艦隊執行個體管理的子叢集ID。
kubectl get mcl預期輸出:
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx true True True 3d23h cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx true True True 5d21h使用以下內容,建立propagationpolicy.yaml檔案。
說明ClusterPropagationPolicy用於Cluster Scope資源的分發,PropagationPolicy用於Namespace Scope資源的分發。apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: ClusterPropagationPolicy metadata: name: web-demo spec: resourceSelectors: - apiVersion: v1 kind: Namespace name: demo placement: clusterAffinity: clusterNames: - ${cluster1-id} # 您的叢集id - ${cluster2-id} # 您的叢集id replicaScheduling: replicaSchedulingType: Duplicated --- apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: web-demo namespace: demo spec: preserveResourcesOnDeletion: true # 設定為true,刪除艦隊上資源時,子叢集上資源會被保留。如需同時清理子叢集資源,請設定為false。 resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: web-demo namespace: demo placement: clusterAffinity: clusterNames: - ${cluster1-id} # 您的叢集id - ${cluster2-id} # 您的叢集id replicaScheduling: replicaSchedulingType: Duplicated主要參數說明如下,詳細參數說明請參見分發策略。
參數
說明
參數值
resourceSelectors
選擇一個或多個待分發的K8s資源。
apiVersion:指定待分發資源的apiVersion,必選。kind:指定待分發資源的類型,必選。name:指定待分發資源的名稱。namespace:指定待分發資源的命名空間。說明PropagationPolicy只可以選擇其本身所在命名空間的資源。labelSelector:通過標籤選擇資源。
placement
clusterAffinity:指定資源要分發的叢集。通過clusterNames數組直接指明叢集ID。更多其他選擇方式請參見分發策略。
說明此處需填寫叢集ID,不是叢集名稱。
replicaScheduling:指定有副本數資源的調度策略。例如Deployment、StatefulSet、Job。replicaSchedulingType值為Duplicated,表示會將每個資源都複製到叢集中,即每個叢集都會有spec.Replicas個副本數。更多說明請參見分發策略。執行以下命令,建立分發策略。
kubectl apply -f propagationpolicy.yaml
步驟四(可選):在艦隊執行個體中建立差異化策略
您可以通過定義差異化策略(OverridePolicy)選擇需要差異化部署的叢集以及資源。建立差異化策略後會將相應的資源進行定製化修改後再部署到選中的叢集中。
本文樣本:將部署到Cluster2的應用進行一些差異化修改,將replicas數修改為1,且將鏡像的registry修改為阿里雲的registry。
使用以下內容,建立overridepolicy.yaml檔案。
apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: OverridePolicy metadata: name: example namespace: demo spec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: web-demo overrideRules: - targetCluster: clusterNames: - ${cluster2-id} overriders: plaintext: - operator: replace path: /spec/replicas value: 1 imageOverrider: - component: Registry operator: add value: {{Registry}}主要參數說明如下,詳細參數說明請參見差異化策略。
參數
說明
參數值
resourceSelector
選擇需要差異化修改的資源。
apiVersion:指定需要差異化修改資源的apiVersion,必選。kind:指定需要差異化修改的資源類型,必選。name:指定需要差異化修改的資源名稱。namespace:指定需要差異化修改的命名空間。說明PropagationPolicy只可以選擇其本身所在命名空間的資源。labelSelector:通過標籤來選擇資源。
overrideRules
通過一組覆蓋規則修改應用模板。
plaintext:使用JSON Patch的方式修改模板。imageOverrider:可以修改鏡像的registry、repository、version。
執行以下命令,建立差異化策略。
kubectl apply -f overridepolicy.yaml
步驟五:查看多叢集中應用的狀態
您可以通過以下AMC命令查看應用的多叢集分髮狀態,也可以直接去關聯集群中查看應用的運行狀態,以確認艦隊應用分發成功。
執行以下命令,查看應用狀態。
kubectl amc get deploy -ndemo -M預期輸出:
NAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTION
web-demo cxxxxxxxxxxxxx 3/3 3 3 3d4h Y
web-demo cxxxxxxxxxxxxx 3/3 3 3 3d4h Y預期輸出表明,應用已經分發至指定的叢集中。
步驟六:升級修改應用
使用如下內容修改
web-demo.yaml,此處以增大replicas為例。您可以對應用資源做任意修改或升級。apiVersion: apps/v1 kind: Deployment metadata: namespace: demo name: web-demo spec: replicas: 4 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - name: nginx image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0 ports: - containerPort: 80執行以下命令,更新
web-demo.yaml應用。kubectl apply -f web-demo.yaml執行以下命令,查看應用狀態。
kubectl amc get deploy -ndemo -M預期輸出:
NAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTION web-demo cxxxxxxxxxxxxx 4/4 4 4 3d4h Y web-demo cxxxxxxxxxxxxx 4/4 4 4 3d4h Y
步驟七:刪除應用資源
對於Namespace資源,為防止誤刪除,艦隊只會進行分發不會進行刪除。對於其他資源,為防止誤刪除,預設情況下在刪除艦隊應用資源或刪除分發策略時子叢集的應用資源不會被刪除。如果您需要清理子叢集的應用資源,請按照以下步驟。
修改
ClusterPropagationPolicy中preserveResourcesOnDeletion欄位為false,表明刪除艦隊執行個體的應用資源時會刪除子叢集的應用資源。apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: ClusterPropagationPolicy metadata: name: web-demo spec: preserveResourcesOnDeletion: false resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: web-demo namespace: demo # 添加namespace欄位 - apiVersion: v1 kind: Namespace name: demo placement: clusterAffinity: clusterNames: - ${cluster1-id} # 您的叢集id - ${cluster2-id} # 您的叢集id replicaScheduling: replicaSchedulingType: Duplicated執行如下命令,更新分發策略。
kubectl apply -f propagationpolicy.yaml執行如下命令,刪除應用資源。
kubectl delete -f web-demo.yaml執行如下命令,查看應用資源。
kubectl amc get deploy -ndemo -M預期輸出:
cluster(cxxxxxxxxxxxxx): deployments.apps "web-demo" not found cluster(cxxxxxxxxxxxxx): deployments.apps "web-demo" not found
相關文檔
如需對多叢集中分發的應用進行統一監控,請參見監控管理。
如需實現同城容災功能,請參見基於ACK One MSE多叢集網關實現同城容災。
關於應用分發策略參數詳細資料,請參見分發策略與差異化策略。