在ACK Edge叢集中,您可以使用應用集(YurtAppSet)將應用便捷地部署到多個節點池中。YurtAppSet提供了靈活的響應機制以感知節點池標籤的變化,從而能夠統一管理多個節點池的工作負載配置,如執行個體數量和軟體版本等。本文將介紹如何使用YurtAppSet來高效地管理和部署ACK Edge叢集的應用。
背景資訊
傳統方案
在邊緣計算情境下,計算節點具有很明顯的地區分布屬性,相同的應用可能需要部署在不同地區下的計算節點上。以Deployment為例,傳統的做法是先將相同地區的計算節點設定成相同的標籤,然後建立多個Deployment,不同Deployment通過NodeSelectors選定不同的標籤,從而實現將相同的應用部署到不同地區的需求。
隨著地區分布越來越多,以及不同地區對應用的差異化需求,營運變得越來越複雜,具體表現在以下幾個方面:
更新繁瑣:當應用版本更新時,需要手動修改所有Deployment以保持應用在各地區的一致性,降低了更新效率。
管理複雜:隨著管理地區的增多,需要人工地對不同地區的Deployment進行區分和維護,增加了營運工作量。
配置冗餘:多個地區的Deployment配置高度相似,導致組態管理繁瑣且易出錯。
應用集管理方案
應用集(YurtAppSet)是Container Service Edge 版提供的功能,旨在簡化邊緣計算情境下分散部署的複雜性。通過更上層的抽象,對多個工作負載(Workload資源,如Deployment)進行統一管理,比如建立、更新和刪除等操作。
YurtAppSet提供以下能力,可以協助您有效解決傳統方案的更新效率低、管理複雜和配置冗餘等問題,提高營運效率和應用部署的靈活性。
workloadTemplate:統一模板定義
YurtAppSet允許您通過單一的workloadTemplate定義來統一管理位於多個地區的工作負載。這種方式不僅減少了重複的部署配置,還可以讓大量操作如建立、更新和刪除變得更加高效和一致。
nodepoolSelector:自動化部署
YurtAppSet通過nodepoolSelector機制靈活選擇目標節點池,實現了與節點池動態變化的同步。隨著新節點池的建立或現有節點池的移除,nodepoolSelector將自動識別並匹配最新的合適節點池進行Workload分發部署,協助您減輕營運負擔。
workloadTweaks:地區差異化定製配置
當地區間的應用需求存在差異時,YurtAppSet提供了workloadTweaks功能,允許對特定地區的Workload進行定製化調整,從而滿足各地區的特定要求,您無需獨立管理或更新每個Workload。
建立應用集執行個體
ACK Edge叢集為1.26及之後版本時,使用YurtAppSet部署。
ACK Edge叢集為1.26之前版本時,使用UnitedDeployment部署。
1.26及之後版本
建立一個Workload模板為Deployment的YurtAppSet應用集執行個體。
完整的YAML樣本模板如下:
apiVersion: apps.openyurt.io/v1beta1
kind: YurtAppSet
metadata:
name: example
namespace: default
spec:
revisionHistoryLimit: 5
pools:
- np1xxxxxx
- np2xxxxxx
nodepoolSelector:
matchLabels:
yurtappset.openyurt.io/type: "nginx"
workload:
workloadTemplate:
deploymentTemplate:
metadata:
labels:
app: example
spec:
replicas: 2
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- image: nginx:1.19.1
imagePullPolicy: Always
name: nginx
workloadTweaks:
- pools:
- np2xxxxxx
tweaks:
replicas: 3
containerImages:
- name: nginx
targetImage: nginx:1.20.1
patches:
- path: /metadata/labels/test
operation: add
value: test
相關欄位的解釋如下表所示:
欄位 | 含義 | 是否必選 |
spec.pools | 指定需要部署應用的節點池名稱列表(slice類型,推薦優先使用nodepoolSelector指定nodepool)。 | 否 |
spec.nodepoolSelector | 通過labelSelector選擇需要部署應用的節點池(當與pools同時指定時,取並集)。 | 否 |
spec.workload.workloadTemplate | 指定管理的Workload模板,目前支援 | 是 |
spec.workload.workloadTweaks | 指定對Workload的定製修改。 | 否 |
spec.workload.workloadTweaks[*].pools | 指定該項修改應用在哪些節點池上(slice類型)。 | 否 |
spec.workload.workloadTweaks[*].nodepoolSelector | 通過labelSelector選擇哪些節點池將會被修改。 | 否 |
spec.workload.workloadTweaks[*].tweaks.replicas | 指定被修改的workload的replicas數。 | 否 |
spec.workload.workloadTweaks[*].tweaks.containerImages | 指定被修改的workload的容器鏡像。 | 否 |
spec.workload.workloadTweaks[*].tweaks.patches | 通過patch欄位可以修改workloadTemplate的任意欄位。 | 否 |
spec.workload.workloadTweaks[*].tweaks.patches[*].path | 指定需要修改的欄位在workloadTemplate中的路徑。 | 否 |
spec.workload.workloadTweaks[*].tweaks.patches[*].operation | 指定需要在path上執行的操作(目前支援:add/remove/replace)。 | 否 |
spec.workload.workloadTweaks[*].tweaks.patches[*].value | 指定修改後的最新取值(只對add/replace操作生效)。 | 否 |
status.conditions | 表示YurtAppSet目前狀態,包括節點池選中狀態、workload狀態等。 | |
status.readyWorkloads | 表示YurtAppSet當前管理的workload中,所有副本都ready的workload數量。 | |
status.updatedWorkloads | 表示YurtAppSet當前管理的workload中,所有副本都已經更新到最新版本的workload數量。 | |
status.totalWorkloads | 表示YurtAppSet當前管理的workload數量。 |
1.26之前版本
建立一個Workload模板為Deployment的UnitedDeployment部署執行個體。
完整的YAML樣本模板如下:
apiVersion: apps.openyurt.io/v1alpha1
kind: UnitedDeployment
metadata:
name: example
namespace: default
spec:
revisionHistoryLimit: 5
selector:
matchLabels:
app: example
workloadTemplate:
deploymentTemplate:
metadata:
creationTimestamp: null
labels:
app: example
spec:
replicas: 2
selector:
matchLabels:
app: example
template:
metadata:
creationTimestamp: null
labels:
app: example
spec:
containers:
- image: nginx:1.19.3
imagePullPolicy: Always
name: nginx
dnsPolicy: ClusterFirst
restartPolicy: Always
topology:
pools:
- name: cloud
nodeSelectorTerm:
matchExpressions:
- key: apps.openyurt.io/nodepool
operator: In
values:
- np4b9781c40f0e46c581b2cf2b6160****
replicas: 2
- name: edge
nodeSelectorTerm:
matchExpressions:
- key: apps.openyurt.io/nodepool
operator: In
values:
- np47832359db2e4843aa13e8b76f83****
replicas: 2
tolerations:
- effect: NoSchedule
key: apps.openyurt.io/taints
operator: Exists
相關欄位的解釋如下表所示:
欄位 | 含義 |
spec.workloadTemplate | 代表支援的Workload模板,目前節點池支援 |
spec.topology.pools | 指定多個節點池。 |
spec.topology.pools[*].name | 節點池的名稱。 |
spec.topology.pools[*].nodeSelectorTerm | 節點池的主機親和性配置若需與節點池NodePool相對應,Key使用 說明 您可以在節點池頁面,在對應雲端和邊緣側的節點池名稱的下方查看節點池ID。 |
spec.topology.pools[*].tolerations | 節點池的主機容忍性配置。 |
spec.topology.pools[*].replicas | 每個節點池下Pod的執行個體數。 |
如何使用應用集管理邊緣應用
應用版本升級:通過修改
spec.workload.workloadTemplate
中的欄位觸發升級流程,控制器把新的模板更新到各個節點池下的Workload中以觸發節點池控制器升級Pod。應用在某地區灰階更新:通過修改
spec.workload.workloadTweak[*].containerImages
配置,觸發相應節點池下應用Pod的鏡像更新。應用在某地區擴縮容:通過修改
spec.workload.workloadTweak[*].replicas
配置,觸發相應節點池下應用Pod的擴縮容操作。應用需要部署到一個新的地區:新建立一個匹配spec.nodepoolSelector標籤的節點池,YurtAppSet會感知到節點池資源的變化,自動為該節點池建立一個Workload。之後將該地區的節點加入該節點池即可。
應用需要在某個地區下線:刪除對應地區的節點池,YurtAppSet會自動刪除該地區對應的Workload。