通過YurtAppSet應用集管理ACK Edge應用
在ACK Edge集群中,您可以使用應用集(YurtAppSet)將應用便捷地部署到多個節(jié)點池中。YurtAppSet提供了靈活的響應機制以感知節(jié)點池標簽的變化,從而能夠統(tǒng)一管理多個節(jié)點池的工作負載配置,如實例數(shù)量和軟件版本等。本文將介紹如何使用YurtAppSet來高效地管理和部署ACK Edge集群的應用。
背景信息
傳統(tǒng)方案
在邊緣計算場景下,計算節(jié)點具有很明顯的地域分布屬性,相同的應用可能需要部署在不同地域下的計算節(jié)點上。以Deployment為例,傳統(tǒng)的做法是先將相同地域的計算節(jié)點設置成相同的標簽,然后創(chuàng)建多個Deployment,不同Deployment通過NodeSelectors選定不同的標簽,從而實現(xiàn)將相同的應用部署到不同地域的需求。
隨著地域分布越來越多,以及不同地域?qū)玫牟町惢枨螅\維變得越來越復雜,具體表現(xiàn)在以下幾個方面:
更新繁瑣:當應用版本更新時,需要手動修改所有Deployment以保持應用在各地域的一致性,降低了更新效率。
管理復雜:隨著管理地域的增多,需要人工地對不同地域的Deployment進行區(qū)分和維護,增加了運維工作量。
配置冗余:多個地域的Deployment配置高度相似,導致配置管理繁瑣且易出錯。
應用集管理方案
應用集(YurtAppSet)是容器服務 Edge 版提供的功能,旨在簡化邊緣計算場景下分散部署的復雜性。通過更上層的抽象,對多個工作負載(Workload資源,如Deployment)進行統(tǒng)一管理,比如創(chuàng)建、更新和刪除等操作。
YurtAppSet提供以下能力,可以幫助您有效解決傳統(tǒng)方案的更新效率低、管理復雜和配置冗余等問題,提高運維效率和應用部署的靈活性。
workloadTemplate:統(tǒng)一模板定義
YurtAppSet允許您通過單一的workloadTemplate定義來統(tǒng)一管理位于多個地域的工作負載。這種方式不僅減少了重復的部署配置,還可以讓批量操作如創(chuàng)建、更新和刪除變得更加高效和一致。
nodepoolSelector:自動化部署
YurtAppSet通過nodepoolSelector機制靈活選擇目標節(jié)點池,實現(xiàn)了與節(jié)點池動態(tài)變化的同步。隨著新節(jié)點池的創(chuàng)建或現(xiàn)有節(jié)點池的移除,nodepoolSelector將自動識別并匹配最新的合適節(jié)點池進行Workload分發(fā)部署,幫助您減輕運維負擔。
workloadTweaks:地域差異化定制配置
當?shù)赜蜷g的應用需求存在差異時,YurtAppSet提供了workloadTweaks功能,允許對特定區(qū)域的Workload進行定制化調(diào)整,從而滿足各地域的特定要求,您無需獨立管理或更新每個Workload。
創(chuàng)建應用集實例
ACK Edge集群為1.26及之后版本時,使用YurtAppSet部署。
ACK Edge集群為1.26之前版本時,使用UnitedDeployment部署。
1.26及之后版本
創(chuàng)建一個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 | 指定需要部署應用的節(jié)點池名稱列表(slice類型,推薦優(yōu)先使用nodepoolSelector指定nodepool)。 | 否 |
spec.nodepoolSelector | 通過labelSelector選擇需要部署應用的節(jié)點池(當與pools同時指定時,取并集)。 | 否 |
spec.workload.workloadTemplate | 指定管理的Workload模板,目前支持 | 是 |
spec.workload.workloadTweaks | 指定對Workload的定制修改。 | 否 |
spec.workload.workloadTweaks[*].pools | 指定該項修改應用在哪些節(jié)點池上(slice類型)。 | 否 |
spec.workload.workloadTweaks[*].nodepoolSelector | 通過labelSelector選擇哪些節(jié)點池將會被修改。 | 否 |
spec.workload.workloadTweaks[*].tweaks.replicas | 指定被修改的workload的replicas數(shù)。 | 否 |
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上執(zhí)行的操作(目前支持:add/remove/replace)。 | 否 |
spec.workload.workloadTweaks[*].tweaks.patches[*].value | 指定修改后的最新取值(只對add/replace操作生效)。 | 否 |
status.conditions | 表示YurtAppSet當前狀態(tài),包括節(jié)點池選中狀態(tài)、workload狀態(tài)等。 | |
status.readyWorkloads | 表示YurtAppSet當前管理的workload中,所有副本都ready的workload數(shù)量。 | |
status.updatedWorkloads | 表示YurtAppSet當前管理的workload中,所有副本都已經(jīng)更新到最新版本的workload數(shù)量。 | |
status.totalWorkloads | 表示YurtAppSet當前管理的workload數(shù)量。 |
1.26之前版本
創(chuàng)建一個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模板,目前節(jié)點池支持 |
spec.topology.pools | 指定多個節(jié)點池。 |
spec.topology.pools[*].name | 節(jié)點池的名稱。 |
spec.topology.pools[*].nodeSelectorTerm | 節(jié)點池的主機親和性配置若需與節(jié)點池NodePool相對應,Key使用 說明 您可以在節(jié)點池頁面,在對應云端和邊緣側(cè)的節(jié)點池名稱的下方查看節(jié)點池ID。 |
spec.topology.pools[*].tolerations | 節(jié)點池的主機容忍性配置。 |
spec.topology.pools[*].replicas | 每個節(jié)點池下Pod的實例數(shù)。 |
如何使用應用集管理邊緣應用
應用版本升級:通過修改
spec.workload.workloadTemplate
中的字段觸發(fā)升級流程,控制器把新的模板更新到各個節(jié)點池下的Workload中以觸發(fā)節(jié)點池控制器升級Pod。應用在某地域灰度更新:通過修改
spec.workload.workloadTweak[*].containerImages
配置,觸發(fā)相應節(jié)點池下應用Pod的鏡像更新。應用在某地域擴縮容:通過修改
spec.workload.workloadTweak[*].replicas
配置,觸發(fā)相應節(jié)點池下應用Pod的擴縮容操作。應用需要部署到一個新的地域:新創(chuàng)建一個匹配spec.nodepoolSelector標簽的節(jié)點池,YurtAppSet會感知到節(jié)點池資源的變化,自動為該節(jié)點池創(chuàng)建一個Workload。之后將該地域的節(jié)點加入該節(jié)點池即可。
應用需要在某個地域下線:刪除對應地域的節(jié)點池,YurtAppSet會自動刪除該地域?qū)腤orkload。