在ACK Edge集群中,您可以使用应用集(YurtAppSet)将应用便捷地部署到多个节点池中。YurtAppSet提供了灵活的响应机制以感知节点池标签的变化,从而能够统一管理多个节点池的工作负载配置,如实例数量和软件版本等。本文将介绍如何使用YurtAppSet来高效地管理和部署ACK Edge集群的应用。
背景信息
传统方案
在边缘计算场景下,计算节点具有很明显的地域分布属性,相同的应用可能需要部署在不同地域下的计算节点上。以Deployment为例,传统的做法是先将相同地域的计算节点设置成相同的标签,然后创建多个Deployment,不同Deployment通过NodeSelectors选定不同的标签,从而实现将相同的应用部署到不同地域的需求。
随着地域分布越来越多,以及不同地域对应用的差异化需求,运维变得越来越复杂,具体表现在以下几个方面:
- 更新繁琐:当应用版本更新时,需要手动修改所有Deployment以保持应用在各地域的一致性,降低了更新效率。 
- 管理复杂:随着管理地域的增多,需要人工地对不同地域的Deployment进行区分和维护,增加了运维工作量。 
- 配置冗余:多个地域的Deployment配置高度相似,导致配置管理繁琐且易出错。 
应用集管理方案
应用集(YurtAppSet)是容器服务 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。