需求背景、方案概述、一期功能点见:
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)
- 集群边缘网段,调用 UEC. DescribeUEcUK8SClusterInfo,获取集群边缘网段,如返回为空值(第一次添加边缘虚拟节点),让用户自行输入网段,前端需判断:1. 网段不与集群当前所在 VPC 网段(不仅限于集群子网)重合;2. 网段不与用户现有 UEC 网段重合(UEC. CheckUEcUK8SVKParam);网段掩码范围 [16,20] 。
- 查重 1 提示:集群边缘网段与集群 VPC 网段重合,请重新输入
- 查重 2 提示:集群边缘网段与现有边缘网段重合,请重新输入
- 选择边缘机房,调用 API:UEC.DescribeUECClusterIDC(模块标题「边缘机房」)
- UEC 容器规格(C/MB):
输入参数
字段 | 类型 | 必填 | 说明 | 默认值 |
---|---|---|---|---|
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. 获取节点列表
- 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
节点信息
调用 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
- 禁用文字:!! 是否禁用以下一个边缘虚拟节点?禁用边缘虚拟节点后应用将不能通过该虚拟节点创建边缘容器实例,现有通过边缘虚拟节点创建的边缘容器实例将被保留
-
5. 虚拟节点删除
沿用普通节点删除逻辑,调用新的 API,DeleteUK8SUECNode,调用链为 UK8S.DeleteUK8SUECNode → UEC.DeleteUEcUK8SVKNode,由 UEC 完成节点的禁用、排空及边缘容器实例的删除
文字:!! 是否删除以下一个边缘虚拟节点?通过边缘虚拟节点创建的边缘容器实例将会被默认删除
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. 用户输入边缘网段是否与现有边缘网段重合