管理虚拟节点
管理虚拟节点
本文档主要介绍虚拟节点和BCI,包含如何在CCE中创建虚拟节点和通过虚拟节点创建BCI Pod。
虚拟节点和百度智能云容器实例BCI
百度智能云容器实例BCI提供无服务器化的容器资源。您只需提供容器镜像及启动容器所需的配置参数,即可运行容器,而无需关心这些容器如何被调度部署到底层的物理服务器资源中。BCI服务将为您完成IaaS层资源的调度和运维工作,从而简化您对容器的使用流程,降低部署和维护成本。同时BCI只会对您创建容器时申请的资源计费,因此实现真正的按需付费。
虚拟节点Virtual Node来源于Kubernetes社区的virtual-kubelet技术,实现了在CCE集群中调度BCI实例,使用户无需购买物理集群节点即可快速启动和编排容器。启动容器的数量不受物理节点的容量限制,赋予了集群极大的弹性伸缩能力。
准备工作
- 注册百度账号,并完成实名认证。
- 开通百度智能云容器实例服务。登录容器实例控制台开通相应的服务。
-
创建一个容器集群,操作步骤参考创建集群。
- 推荐:集群类型请选择标准Kubermetes托管集群;Master配置请选择托管Master
- 推荐:k8s版本1.20及以上
- 集群创建成功后,请增加2个worker BCC节点,用来运行相关系统组件,BCC配置建议在2C8G及以上。
操作指南
新版本集群(集群id为cce-开头)和老版本集群(集群id以c-开头)操作有所不同,请根据需要添加虚拟节点的目标集群选择对应的操作。
新版本集群(集群id为cce-开头)
前提条件
- 已创建CCE标准托管集群或者CCE标准独立集群,且集群版本为1.18.9/1.20.8/1.22.5/1.24.4/1.26.9/1.28.8。如需创建集群则见创建集群。
- 已开通弹性容器实例服务并确认集群所在区域在BCI支持的地域列表内。可登录弹性容器实例控制台开通相应的服务,并查看当前支持的地域和可用区。
步骤一:部署CCE Virtual Kubelet组件
在CCE集群中,需要通过组件管理页面部署CCE Virtual Kubelet组件,根据两种不同集群类型,请按照如下不同步骤:
注意:若您已通过Helm模板安装cce-virtaul-kubelet,暂不支持在组件管理安装,若您想通过组件中心安装则可 提交工单 联系我们处理。
步骤二:将Pod调度到BCI上运行
在虚拟节点启动Pod
相较于常规Pod,需要在Pod Spec中添加如下的nodeSelector和tolerations字段,才能将Pod调度到虚拟节点上。
Pod Spec示例:
spec:
nodeSelector:
type: "virtual-kubelet"
tolerations:
- key: "virtual-kubelet.io/provider"
operator: "Equal"
value: "baidu"
effect: "NoSchedule"
调度到虚拟节点上的Pod会以BCI Pod的形式启动。 更多BCI Pod配置项说明请参考 配置BCI Pod
删除虚拟节点
- 通过
kubectl drain <node name> --force
操作停止虚拟节点上的所有Pod。 - 在 Helm-Helm实例页面,选择相应集群和namespace,删除虚拟节点对应的
cce-virtual-kubelet
实例。 - 通过命令
kubectl delete node <node name>
删除虚拟节点。
注意: 当集群中存在分配在虚拟节点上的BCI Pod时,卸载
cce-virtual-kubelet
组件会导致BCI实例的残留。
老版本集群(集群id以c-开头)
创建虚拟节点
登录CCE管理控制台,点击需要添加虚拟节点的集群,选择左侧导航栏中的虚拟节点标签,点击页面上的创建虚拟节点按钮。
注意: 如果用户尚未开通容器实例服务,创建按钮将置灰,点击创建按钮会提示需要开通容器实例服务。
点击创建按钮后,进入虚拟节点创建页面,相关参数说明如下:
基本信息定义了虚拟节点的属性:
参数 | 含义 | 备注 |
---|---|---|
虚拟节点名称 | 虚拟节点名称,会在页面虚拟节点列表和kubernetes node列表中展示 | 同一个集群中节点名称不可重复 |
CPU使用限额 | 虚拟节点的CPU Quota,限制虚拟节点上可以调度的BCI实例CPU总量 | 需要显式声明BCI Pod的resource quota才会生效 |
内存使用限额 | 虚拟节点的Memory Quota,限制虚拟节点上可以调度的BCI实例内存总量 | 需要显式声明BCI Pod的resource quota才会生效 |
容器实例属性定义了在虚拟节点上启动的BCI实例的属性:
参数 | 含义 | 备注 |
---|---|---|
VPC | BCI实例所在VPC | 如果选择VPC与集群所在VPC不同,可能导致网络地址的冲突,详见网络冲突说明 |
可用区及子网 | BCI实例所在的可用区及子网 | 只显示对应VPC下可以创建BCI实例的可用区及子网 |
安全组 | 应用于BCI实例的安全组 | - |
点击确认后跳转到虚拟节点列表页面,列表中会展示刚刚添加的虚拟节点及其状态。
管理虚拟节点
在虚拟节点列表中,可以查看虚拟节点当前的状态,以及虚拟节点的属性信息。
- 虚拟节点名称:虚拟节点名称。
-
虚拟节点状态:
- 创建中:虚拟节点正在创建中,一般创建时间不超过一分钟。
- 正常:虚拟节点Ready,可以将Pod调度到虚拟节点上启动对应的BCI实例。
- 异常:虚拟节点NotReady,可以查看对应的virtual-kubelet排查异常原因。
- 删除中:点击删除按钮后,虚拟节点状态会变为删除中,直至该虚拟节点被完全删除。
-
操作:
- 查看virtual-kubelet:查看该虚拟节点对应的virtual-kubelet运行状态。
- 删除:删除该虚拟节点。
- 如何使用:提供将Pod调度到对应虚拟节点需要指定的Pod Spec字段。
在虚拟节点启动Pod
相较于常规Pod,需要在Pod Spec中添加如下的nodeSelector
和tolerations
字段,才能将Pod调度到虚拟节点上。
spec:
nodeSelector:
type: "virtual-kubelet"
tolerations:
- key: "virtual-kubelet.io/provider"
operator: "Equal"
value: "baidu"
effect: "NoSchedule"
调度到虚拟节点上的Pod会以BCI Pod的形式启动。
更多BCI Pod配置项说明请参考配置BCI Pod。
删除虚拟节点
在虚拟节点列表中点击对应虚拟节点的删除按钮,确认需要删除的虚拟节点后,点击确认,虚拟节点进入删除中状态,直至在列表中不可见即为删除成功。
如果删除时提示禁止删除,请参考为什么无法删除虚拟节点。
为什么创建虚拟节点时提示有网络冲突
当创建虚拟节点时,选择集群所在VPC(称为VPC A)以外的其他VPC(称为VPC B)作为容器实例VPC后,虚拟节点上运行的BCI实例将运行在B VPC中。
VPC A与VPC B的地址空间可能存在重合,同时CCE集群容器网络也会占用A VPC地址空间以外的一段地址作为容器网段,这段地址也可能会和VPC B的地址空间存在重合。因此,BCI Pod的IP地址代表的是VPC B中对应的网络地址,在VPC A中可能存在另一个实体拥有相同的IP地址。此时如果在集群中访问BCI实例的IP地址,实际访问到的对象并不是该BCI实例,而是VPC A中的拥有相同IP地址的网络实体,此时就可能会出现非预期的访问结果。
即下图中在VPC A中访问172.16.0.3的流量并不会走虚线路径打到BCI实例上,而是会走实线路径打到集群中的另一个Pod。
如果在充分理解这种场景可能带来的问题的情况下,仍有业务场景需要在VPC B中调度容器实例,可以继续进行创建。
我们强烈建议仅让CCE集群调度处于与集群相同VPC的BCI实例。
为什么无法删除虚拟节点
当仍有运行中的BCI实例位于某个虚拟节点时,CCE不允许删除该虚拟节点,因为直接删除虚拟节点可能导致运行在该虚拟节点上的BCI实例泄漏。
通常情况下我们无需删除虚拟节点,虚拟节点不同于真实节点,不会占用集群计算资源。如果用户需要删除虚拟节点,我们建议手动停止运行在虚拟节点上的Pod,或者驱逐虚拟节点上的所有Pod。
驱逐虚拟节点上的Pod可以使用kubectl命令行工具执行以下命令进行操作,假设需要删除的虚拟节点名称为bci-virtual-kubelet-0
:
$ kubectl drain bci-virtual-kubelet-0 --force