# 设计理念

    为更好地支持边缘应用的发布和运维,平台抽象化边缘场景的相关概念,并通过底层的 OpenYurt 以云原生的方式管理,从而将 Erda 本身具有的统一发布、服务编排、监控、日志等特性带入边缘场景。

    # 站点

    在边缘场景下,一个边缘应用通常由若干个微服务及少量的中间件组成,虽然业务场景相对简单,但是稳定性要求高,因此需要高可用部署,即对应的底层计算资源需要多台服务器。这一组服务器便是站点。站点具有明显的地域性,且站点间的网络互相隔离。平台通过底层的 Node Pool 资源管理站点的生命周期,便于运维工程师有效纳管分布在不同地域的海量计算资源。

    对于边缘场景下的部署来说,为了访问距离最近的 Pod,即在站点级别仅访问本站点对应的 Pod,平台封装了 K8s Service Topology 特性,以实现站点级别的流量闭环。在创建边缘应用 SVC 时增加 topologyKeys,结合 Node Pool 的统一标签管理完成流量的站点级分发。

    apiVersion: v1
    kind: Service
    metadata:
      name: ud-test
      labels:
        app: ud-test
    spec:
      ports:
      - name: ud-test
        port: 80
        targetPort: 80
      selector:
        app: ud-test
      topologyKeys:
        - "topology.kubernetes.io/zone"
        # - "*"
    

    # 单元化部署

    不同于传统的 Kubernetes 应用,边缘应用能够将 Deployment 或 StatefulSet 资源批量部署到边缘站点上(即 Node Pool 资源)。平台底层以 UnitedDeployment 描述边缘应用,UnitedDeployment 则通过 topology 字段,描述 Deployment 或 StatefulSet 资源部署所在的 Node Pool 以及每个 Node Pool 所需部署的副本数量,将来还可以扩展出更多站点级配置的字段。topology 字段示例如下:

    topology:
        pools:
        - name: beijing 
          nodeSelectorTerm:
            matchExpressions:
            - key: apps.openyurt.io/nodepool
              operator: In
              values:
              - beijing 
          replicas: 1
        - name: hangzhou 
          nodeSelectorTerm:
            matchExpressions:
            - key: apps.openyurt.io/nodepool
              operator: In
              values:
              - hangzhou 
          replicas: 2
          tolerations:
          - effect: NoSchedule
            key: apps.openyurt.io/example
            operator: Exists
    

    平台在底层封装了 UnitedDeployment, 用于边缘应用分发,解决多个边缘应用之间的依赖问题。通过资源监控以及日志组件对边缘应用进行统一监控和日志采集, 同时基于 WebSocket 隧道访问容器控制台,实现对边缘应用的高效运维管理。

    # 配置集

    单元化部署解决了如何将同一个应用分发到多个地域的问题。理想状态下,所有地域的应用都应该是一致的,而现实往往存在差异,例如配置门店名称、门店 Logo,甚至在某些特定场景下对接的支付渠道也会有差异。

    为此,平台采用了单元化部署,通过一个模板描述边缘应用的配置及发布范围,同时设计了配置集资源,能够将不同的配置作为环境变量下发到不同的地域中。

    apiVersion: v1
    kind: UnitConfigMap
    metadata:
      name: ud-test
      namespace: default
    data:
      common:
        CLUSTER_DNS: 10.96.0.3
        DICE_CLUSTER_NAME: terminus-dev
        DICE_CLUSTER_TYPE: kubernetes
      hangzhou:
        NAME: hangzhou-shop
      beijng:
        NAME: beijing-mall