需求背景、方案概述、一期功能点见:
https://www.yuque.com/cncfucloud/cncfucloud/xqmvg4

1. 添加边缘 VK 节点

1.1 页面设计

  • 在「添加虚拟节点」按钮弹出页,新增「边缘虚拟节点」选项,用户填写部分参数信息,点击「确认」后,UK8S节点列表页则新增一个边缘虚拟节点(Node节点),该节点为逻辑节点,也支持禁用、删除等操作。
  • 边缘实例与 UK8S 集群所在地域无关,「添加虚拟节点」按钮在全域开放,对于没有 Cube 的地域,将「类型」字段中「虚拟节点」Tab 置灰,并提示:「通过虚拟节点,可在 UK8S 集群中直接创建 Serverless 容器实例 Cube,当前地域尚未开通 Cube,敬请期待。」
  • 「边缘虚拟节点」后增加链接,链接到边缘虚拟节点文档(https://docs.ucloud.cn/uk8s/administercluster/uec_vk

image.png

  • 集群边缘网段,调用 UEC. DescribeUEcUK8SClusterInfo,获取集群边缘网段,如返回为空值(第一次添加边缘虚拟节点),让用户自行输入网段,前端需判断:1. 网段不与集群当前所在 VPC 网段(不仅限于集群子网)重合;2. 网段不与用户现有 UEC 网段重合(UEC. CheckUEcUK8SVKParam);网段掩码范围 [16,20]
    • 查重 1 提示:集群边缘网段与集群 VPC 网段重合,请重新输入
    • 查重 2 提示:集群边缘网段与现有边缘网段重合,请重新输入
  • 选择边缘机房,调用 API:UEC.DescribeUECClusterIDC(模块标题「边缘机房」)

image.png

  • UEC 容器规格(C/MB):
    • 0.5: 512, 1024, 2048
    • 1.0: 1024, 2048, 4096
    • 2.0: 2048, 4096, 8192
    • 4.0: 4096, 8192, 16384
    • 8.0: 8192, 16384

      1.2 AddUK8SUECNode API 说明

      API:AddUK8SUECNode
      调用链:UK8S.AddUK8SUECVKNode → UEC.CreateUEcUK8SVKNode
      创建 UEC VK Node 时,UK8S 侧自动生成 VK 节点的资源 uk8s-xxxxxxxx-uec-xxxxx,并传给 UEC,作为 UK8S 侧对 UEC VK 的资源标识

输入参数

字段 类型 必填 说明 默认值
Region string 集群所在地域 前端根据集群传入
ProjectId string 项目 ID 前端根据集群传入
ClusterId string 集群 ID 前端根据集群传入
ClusterCIDR string 集群所有边缘节点共用的大网段,UEC 将根据 ClusterCIDR 及 MaxPod 创建 PodCIDR 并返回,
需要验证是否与 UEC. DescribeUEcUK8SClusterInfo 返回的 ClusterCIDR(如有)匹配
前端调用 UEC 查询集群网段接口输入
MaxPod string 可调度的最大 Pod 数 32
Cpu string 不指定 request 时的默认 CPU 核数 2C
Mem string 不指定 request 时的默认内存 4G

返回参数

字段 类型 说明
RetCode int
Action string

2. 获取节点列表

image.png

  • API:ListUK8SClusterNodeV2 兼容,可以通过 UEC.DescribeUEcUK8SVKNode 来获取边缘 VK 的相关信息
    • UEC.DescribeUEcUK8SVKNode 返回:IdcID,IdcName,PodCIDR(10.10.30.1/24),ResourceId(uk8s-xxxxxxxx-uec-xxxxx)
  • 添加边缘虚拟节点后,在 UK8S 的节点列表面,通过 ListUK8SClusterNodeV2 展示常规 master 节点、node 节点、虚拟节点(包括边缘虚拟节点)。
  • API 需要考虑兼容的字段: | 字段 | 说明 | | —- | —- | | NodeId/InstanceName | 采用边缘 VK 创建时的 NodeName(uk8s-xxxxxxxx-uec-xxxxx) | | NodeRole | agent | | InstanceType | 目前枚举值为 UHost/UPHost,添加一个枚举值 “UEC”,前端解释为「边缘虚拟节点」 | | Zone | 空值 | | CPU/Memory | 虚拟节点的 NodeCapacity | | InstanceId | 云主机的资源 ID,当 InstanceType 为 UEC 时返回节点名称 | | MachineType | 添加一个枚举 “UEC” | | OsType | Linux | | OsName | 空值 | | IPSet | 空值 | | CreateTime | 边缘 VK 节点创建时间 | | ExpireTime | 空值 | | AsgId | 空值,缩组 id | | Unschedulable | 默认为 false,被禁用后为 true | | IDCId | 新增字段,返回边缘 VK 节点 IDCId,其他类型节点为空值。
    页面在「可用区」栏后新增「边缘机房」栏 | | PodCIDR | 新增字段,返回边缘 VK 节点的 PodCIDR,其他类型节点为控制。
    页面在「内网IP」栏后新增「边缘容器网段」栏 |

3. 节点描述 / 获取节点中的 Pod

image.png
节点信息
调用 API:https://uxiao.ucloudadmin.com/#/api-manager/api/detail/UK8S/DescribeUK8SNode

字段 说明
节点名称 边缘 VK 节点的 NodeName
创建时间 边缘 VK 节点的 CreateTimestamp
标签 边缘 VK 节点的 Labels
注释 边缘 VK 节点的 Annotations
污点 边缘 VK 节点的 Taints
服务商 ID 留空
内网地址 UEC API 返回的 PodCIDR
容器运行时版本 containerd://1.4.4
kubelet版本 v1.19.5-uec-x.x.x,v1.19.5 为集群版本(现在边缘 VK 信息没有,建议创建 VK 节点时在节点信息中加上)
kube-proxy版本 留空
CPU/内存 展示边缘 VK 节点里的 requests CPU/Memory 的和
理论上边缘 VK 伸展出来的都是 Cube,limits=requests
POD分配数量 通过边缘 VK 伸展出来的 UEC 容器的数量

Pod 列表
通过 ListUK8SPod 中 FieldSelector : sepc.Nodename=uk8s-xxxxxxxx-uec-xxxxx 筛选出相关的 Pod

4. 虚拟节点禁用 / 启用

沿用普通节点禁用逻辑,边缘虚拟节点设置为不可调度,创建的边缘实例保留
API:https://uxiao.ucloudadmin.com/#/api-manager/api/detail/UK8S/CordonUK8SNode
image.png image.png

  • 禁用文字:!! 是否禁用以下一个边缘虚拟节点?禁用边缘虚拟节点后应用将不能通过该虚拟节点创建边缘容器实例,现有通过边缘虚拟节点创建的边缘容器实例将被保留
  • 启用文字:!! 是否启用以下一个边缘虚拟节点?

    5. 虚拟节点删除

    沿用普通节点删除逻辑,调用新的 API,DeleteUK8SUECNode,调用链为 UK8S.DeleteUK8SUECNode → UEC.DeleteUEcUK8SVKNode,由 UEC 完成节点的禁用、排空及边缘容器实例的删除
    image.png

  • 文字:!! 是否删除以下一个边缘虚拟节点?通过边缘虚拟节点创建的边缘容器实例将会被默认删除

    6. UEC 需要改动的地方

  • [ ] UEC.CreateUEcUK8SVKNode 入参缺少 MaxPod、Cpu、Mem、VKName

  • UEC 创建 VK 后,需要根据 MaxPod、Cpu、Mem,更改 VK Node 的 NodeCapacity 信息,NodeCapacity = Cpu / Mem * MaxPod,并给 UK8S 返回 PodCIDR
  • 建议创建 VK 节点后,kubelet 版本信息改为 v1.19.5-uec-x.x.x,即 {集群版本}-uec-{插件版本},方便后续插件的升级维护
  • UEC 新增两个接口:1. 查询集群边缘网段;2. 用户输入边缘网段是否与现有边缘网段重合