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,敬请期待。」
4.1.3.2 添加节点页面:
问号提示内容:「当 Cube 急剧扩容时,开启该功能会导致 UK8S ApiServer 压力急剧上升。对无需使用 K8S Service 转发能力的容器,建议不开启该功能。」
4.2 获取节点列表
4.2.1 页面逻辑描述
- 添加虚拟节点后,在 UK8S 的节点列表面,通过 ListUK8SClusterNodeV2 展示常规 master 节点、node 节点及虚拟节点。
需要考虑兼容的字段: | 字段 | 说明 | | —- | —- | | 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 |
节点展示顺序:按照节点名称排序,支持根据机型/类型筛选
- 节点按钮:去除所有原有的「详情」(跳转到云主机详情页面),直接删除,需要保留「节点描述」、「禁用」、「删除」(「禁用」、「删除」按钮合并)三个按钮,后期增加「编辑」按钮
4.2.2 页面交互
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 页面交互
4.4 虚拟节点禁用/启用
沿用普通节点禁用逻辑,虚拟节点设置为不可调度,创建的 Cube 实例保留
API:https://uxiao.ucloudadmin.com/#/api-manager/api/detail/UK8S/CordonUK8SNode
4.5 虚拟节点删除
沿用普通节点删除逻辑,调用新的 API,https://uxiao.ucloudadmin.com/#/api-manager/api/detail/UK8S/DeleteUK8SVKNode
当虚拟节点被删除时,
- cordon 禁用虚拟节点
- drain 排空虚拟节点所创建的 Cube 实例并删除
- 检查是否虚拟节点被排空,所有 Cube 被删除,如否,返回 2,等待一段时间(待定)仍为清理干净则返回异常
- 删除虚拟节点