在边缘计算场景下,您可以以单元化部署模型将工作负载部署在不同的节点池中,业务的实例数、版本都可以按照节点池的维度进行统一管理。本文介绍如何使用单元化部署应用模型。

背景信息

在边缘计算场景下,计算节点具有很明显的地域分布属性,相同的应用可能需要部署在不同地域下的计算节点上。以Deployment为例,传统的做法是先将相同地域的计算节点设置成相同的标签,然后创建多个Deployment,不同Deployment通过NodeSelectors选定不同的标签,从而实现将相同的应用部署到不同地域的需求。

G-6

随着地域分布越来越多,以及不同地域对应用的差异化需求,使得运维变得越来越复杂,具体表现在以下几个方面:

  • 当镜像版本升级,需要修改每个Deployment的镜像版本配置。
  • 需要自定义Deployment的命名规范来表明相同的应用。
  • 相同应用的多个Deployment,除了Name、NodeSelectors和Replicas这些特性外,其他的差异化配置比较小。

单元化部署(UnitedDeployment)是边缘容器服务ACK@Edge提供的功能,通过更上层次的抽象,对多个Deployment进行统一管理,比如创建、更新和删除等操作。

G-7

单元化部署提供一个模板来定义应用,将多个Workload部署到不同的区域, 每个区域定义为一个节点池。 目前单元化部署支持两种类型的Workload:StatefulSet和Deployment。控制器会根据单元化部署中节点池的配置创建子的Workload资源对象,每个资源对象都有一个期望的Replicas Pod数量。通过一个单元化部署实例就可以自动维护多个Deployment或者Statefulset资源,同时还能实现Name、NodeSelectors和Replicas等的差异化配置。

创建单元化部署实例

创建一个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:
        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:
          - cloud
      replicas: 2
    - name: edge
      nodeSelectorTerm:
        matchExpressions:
        - key: apps.openyurt.io/nodepool
          operator: In
          values:
          - edge
      replicas: 2
      tolerations:
      - effect: NoSchedule
        key: apps.openyurt.io/taints
        operator: Exists            
相关字段的解释如下表所示:
字段 含义
spec.workloadTemplate 代表支持的Workload模板,目前节点池支持deploymentTemplate/statefulSetTemplate两种模板。
spec.topology.pools 指定多个节点池。
spec.topology.pools[*].name 节点池的名称。
spec.topology.pools[*].nodeSelectorTerm 节点池的主机亲和性配置若需与节点池NodePool相对应,Key使用apps.openyurt.io/nodepool,Value使用节点池名字。
spec.topology.pools[*].tolerations 节点池的主机容忍性配置。
spec.topology.pools[*].replicas 每个节点池下Pod的实例数。

使用单元化部署应用模型实例管理Pod

  • 升级Pod:通过修改spec.template.workloadTemplate.deploymentTemplate下面的字段触发升级流程,控制器把新的模板更新到各个节点池下的Workload里触发节点池控制器升级Pod。
  • 扩容多个节点池下Pod的Replicas数目:通过修改spec.topology.pools下不同节点池的Repicas配置,触发相应节点池下应用Pod的扩缩容操作。