1.背景

将Cube作为UK8S的虚拟节点接入,使得用户可以将部分Pod调度到Cube,享受按容器资源付费的同时,又可复用K8S的流程流程。

2.方案简述

本质上是在UK8S中拉起一个Virtual Kubelet,来监听K8S中所有需要调度到Cube的Pod,并调用Cube的API来拉起Pod。
详细原理:http://uk8s.page.ucloudadmin.com/wiki/#/doc/vk-cube

3.涉及范围

功能点 功能详述 优先级 备注
添加虚拟节点 往UK8S中添加一个虚拟节点 P0 不需要单独的节点添加API,直接提交yaml
获取节点列表 需要在UK8S的前端页面中展示虚拟节点。(目前接口不支持),部分字段可能不支持,可为空。 P0 ListUK8SClusterNodeV2需要兼容
节点描述 返回数据格式与现在Node信息一致,部分字段可能不支持,可为空 P1 DescribeUK8SNode需要兼容VK节点
获取虚拟节点中的Pod 获取节点中的信息 P1 ListUK8SPod需要兼容VK节点
删除虚拟节点 删除虚拟节点后,运行在虚拟节点的Pod及其他资源均会被删除。 P1 删除VK Deployment及相关资源
禁用节点 禁用VK节点 P1 应该标准接口,需要测试下
集群升级 需要忽略VK节点 P2
CloudProvider、CNI等升级 需要忽略VK节点 P2

待确认项: 删除虚拟节点的时候,是否要先将Pod调度到其他节点? 还是删除后让K8S自行重调度? 也就是说VK是否支持Cordon的逻辑?

4. 功能详述

4.1 添加虚拟节点

4.1.1 页面逻辑描述

在UK8S的节点列表页面,新增一个“添加虚拟节点”的按钮,点击按钮后,用户填写部分参数信息,点击“确认”后,UK8S节点列表页则新增一个Node节点,该节点为逻辑节点,也支持禁用、删除等操作,添加 VK 节点需要新的 API

4.1.2 用户填写参数

字段简述 对应变量 字段详述 类型及约束 页面默认值 必传
节点名称 VIRTUAL_NODE_NAME UK8S的节点名称默认为IP,但VK没有IP,因此需要指定一个节点名 string,不超过64个字符,支持小写字母及数字 页面不展示,命名规则:uk8s-xxxxxxxx-vk-xxxxx,即集群名-vk-五位自动生成字母数字组合
非 API 参数,自动生成后作为创建 VK 变量
可用区 CUBE_REGION cube的可用区 string,必须是cube支持的可用区 随机选择该地域一个cube支持的可用区
子网 CUBE_SUBNET_ID 调度到虚拟节点的Pod所处子网Id string,所处子网必须属于集群VPC 默认与K8Smaster节点子网一致。
Pod 默认
CPU/Memory
CUBE_DEFAULT_CPU
CUBE_DEFAULT_MEM
客户创建 Cube 不指定 Requests 时的默认CPU/Memory float,支持值与Cube一致 默认 2C/4G
Max Pod CUBE_MAX_POD 可调度到Cube的最大Pod数 int,最大值不超过200 默认100
后端将根据 MaxPod 计算 NodeCapacity = 2C4G * MaxPod
ClusterIP支持 CUBE_PROXY_ENABLED 运行在Cube中的Pod可访问UK8S中的Clusterip,在UK8S中通过clusterip可访问cube中的pod bool 默认否
VPC CUBE_VPC_ID 调度到虚拟节点的Pod所处VPCID string,必须与UK8S的所处VPC一致 页面不展示,前端获取
apiserver地址 KUBERNETES_SERVICE_ADDR UK8S的apiserver地址 string,加端口6443,https 页面不展示,前端获取
项目ID CUBE_PROJECT_ID 客户的UK8S集群所处的项目ID string 页面不展示,前端获取
地域 CUBE_REGION 客户的uK8S集群所处地域 string 页面不展示,前端获取

4.1.3 页面交互

4.1.3.1 集群列表页(未添加 VK 节点):

未有虚拟节点时的节点列表页,添加虚拟节点 API:https://uxiao.ucloudadmin.com/#/api-manager/api/detail/UK8S/AddUK8SVKNode
「添加虚拟节点」按钮在没有 Cube 的地域置灰,并提示:「通过虚拟节点,可在 UK8S 集群中直接创建 Serverless 容器实例 Cube,当前地域尚未开通 Cube,敬请期待。」
UK8S支持添加虚拟节点(第一期) - 图1

4.1.3.2 添加节点页面:

UK8S支持添加虚拟节点(第一期) - 图2
问号提示内容:「当 Cube 急剧扩容时,开启该功能会导致 UK8S ApiServer 压力急剧上升。对无需使用 K8S Service 转发能力的容器,建议不开启该功能。」

4.2 获取节点列表

4.2.1 页面逻辑描述

  1. 添加虚拟节点后,在 UK8S 的节点列表面,通过 ListUK8SClusterNodeV2 展示常规 master 节点、node 节点及虚拟节点。
  2. 需要考虑兼容的字段: | 字段 | 说明 | | —- | —- | | NodeId/InstanceName | 采用 VK 创建时的 NodeName(如 cube-virtual-node-xxxx) | | NodeRole | agent | | InstanceType | 目前枚举值为 UHost/UPHost,添加一个枚举值 “VK” | | CPU/Memory | 虚拟节点的 NodeCapacity | | InstanceId | 云主机的资源 ID,当 InstanceType 为 VK 时返回节点名称 | | MachineType | 添加一个枚举 “VK” | | OsType | Linux | | OsName | 空值 | | IPSet | 空值 | | CreateTime | VK 节点创建时间 | | ExpireTime | 空值 | | AsgId | 空值,缩组 id | | Unschedulable | 默认为 false,被禁用后为 true |

  3. 节点展示顺序:按照节点名称排序,支持根据机型/类型筛选

  4. 节点按钮:去除所有原有的「详情」(跳转到云主机详情页面),直接删除,需要保留「节点描述」、「禁用」、「删除」(「禁用」、「删除」按钮合并)三个按钮,后期增加「编辑」按钮

    4.2.2 页面交互

    image.png

    4.3 节点描述 & 获取节点中的 Pod

    4.3.1 页面逻辑描述

    原节点描述页面兼容虚拟节点
    4.3.1.1 节点信息栏
    调用 API:https://uxiao.ucloudadmin.com/#/api-manager/api/detail/UK8S/ListUK8SPod
字段 说明
节点名称 VK 节点的 NodeName
创建时间 VK 节点的 CreateTimestamp
标签 VK 节点的 Labels
注释 VK 节点的 Annotations
污点 VK 节点的 Taints
服务商 ID 留空
内网地址 VK Addresses 字段的 Internal IP
容器运行时版本 命名规则:vk-runtime-x.x.x
kubelet版本 v1.19.5-vk-x.x.x,v1.19.5 为集群版本
kube-proxy版本 留空
CPU/内存 展示 VK 节点里的 requests CPU/Memory 的和
理论上 VK 伸展出来的都是 Cube,limits=requests
POD分配数量 通过 VK 伸展出来的 Cube 的数量
Cube ID 页面不展示,但需要在 API 中添加该字段的返回,用于做 ListCubePodEvent API 的输入,调取 Cube 事件

4.3.1.2 Pods 列表

原先的实现逻辑在节点描述中通过 ListUK8SPod 中 FieldSelector : sepc.Nodename=10.0.0.0 筛选出 Node 节点上的 pod。原先 UK8S 节点 Nodename 为内网 IP。
通过为 VK 创建的 Cube 实例配备 spec.Nodename 这个 label,可以沿用这个逻辑,Nodename 为节点名称,如 virtual-node-01

字段 说明
名称 Cube 实例的资源名称
命名空间 目前 Cube 实例 yaml 中没有 ns 字段,需要在通过 VK 部署时传入
重启次数 Cube 实例的重启次数
CPU/内存 Cube 实例的 CPU/内存(requests),limits 全为 0
状态 Cube 实例的状态 Running/Pending/Terminating

4.3.1.3 状态

VK 节点的 Conditions,从 yaml 里直接获取

4.3.1.4 事件

判断节点类型,如是 VK,调用 ListCubePodEvent,调取所有 VK 创建的 Cube 的 Events

4.3.2 页面交互

UK8S支持添加虚拟节点(第一期) - 图4

4.4 虚拟节点禁用/启用

沿用普通节点禁用逻辑,虚拟节点设置为不可调度,创建的 Cube 实例保留
API:https://uxiao.ucloudadmin.com/#/api-manager/api/detail/UK8S/CordonUK8SNode
UK8S支持添加虚拟节点(第一期) - 图5UK8S支持添加虚拟节点(第一期) - 图6

4.5 虚拟节点删除

沿用普通节点删除逻辑,调用新的 API,https://uxiao.ucloudadmin.com/#/api-manager/api/detail/UK8S/DeleteUK8SVKNode
当虚拟节点被删除时,

  1. cordon 禁用虚拟节点
  2. drain 排空虚拟节点所创建的 Cube 实例并删除
  3. 检查是否虚拟节点被排空,所有 Cube 被删除,如否,返回 2,等待一段时间(待定)仍为清理干净则返回异常
  4. 删除虚拟节点

UK8S支持添加虚拟节点(第一期) - 图7