管理虚拟节点
管理虚拟节点
本文档主要介绍虚拟节点和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管理控制台,点击控制台左侧Helm-Helm模板,选中百度智能云模板,选择cce-virtual-kubelet
模板进行安装。由于百度智能云模板标签页下包含较多模板,可以搜索模板名称cce-virtual-kubelet
快速找到对应模板。点击安装按钮,完成模板参数后填写安装即可。
安装参数说明(加粗且带有*号的参数为用户必填项):
参数 | 描述 | 获取方式 | 示例 |
---|---|---|---|
region* |
地域 | 填写所在地域的英文缩写,仅支持开放BCI产品的地域 | bj |
clusterID* |
CCE集群id,为准备工作中已有的集群id | 从集群列表页获取 | cce-abcd1122 |
bci.subnets* |
创建BCI的子网信息,需要填写子网id和子网所属可用区。 至少填写一个子网;指定多个子网时,每次创建会从子网列表中随机选择一个。BCI需和CCE集群在一个VPC,便于容器间网络互通 |
从私有网络VPC-子网页面获取 | - subnetID: sbn-4syxw5hsuc7e |
bci.securityGroupID* |
安全组ID | 从私有网络VPC-安全组页面获取 | g-f90242zt83dd |
image |
virtual-kubelet镜像id,需要覆盖默认值时填写 | - | registry.baidubce.com/cce-plugin-pro/bci-virtual-kubelet:xxxx |
maximumLogBackups |
cce-virtual-kubelet组件日志文件保留,每份日志文件将占用所在节点/var/log 下256Mi空间 |
- | "4" |
virtualNode.nodeCount |
需要创建的虚拟节点数量,默认为1 | - | 1 |
virtualNode.nodeNamePrefix |
虚拟节点名称前缀,虚拟节点将按照<前缀>-0 ,<前缀>-1 , ... 依次命名 |
- | bci-virtual-kubelet |
virtualNode.cpuCapacity |
虚拟节点CPU Capacity | - | "1000" |
virtualNode.memoryCapacity |
虚拟节点Memory Capacity | - | "4Ti" |
virtualNode.podsCapacity |
虚拟节点Pods Capacity | - | "1000" |
virtualNode.ephemeralStorageCapacity |
虚拟节点Ephemeral Storage Capacity | - | "40Ti" |
virtualNode.enableNodeLease |
是否开启Node Lease,建议开启 | - | true |
virtualNode.enablePodCache |
是否开启Pod Cache,可以提升Pod并发创建性能,无特殊需求建议开启 | - | true |
endpoints.apiserver |
K8S APIServer Endpoint,默认为空则通过集群Service访问,需要覆盖时填写 | - | "https://192.168.0.1:6443" |
virtualNode.ccegateway |
CCE Gateway Endpoint,默认为空则使用默认值,需要覆盖时填写 | - | "cce-gateway.baidubce.com" |
virtualNode.bci |
BCI服务Endpoint,默认为空则使用默认值,需要覆盖时填写 | - | "bci.baidubce.com" |
完成模板安装后,集群中出现名为bci-virtual-kubelet-0
的节点(如果自行修改过nodeNamePrefix
则节点名称与之匹配),即标识虚拟节点创建成功。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.0.96 Ready <none> 1d v1.20.8
bci-virtual-kubelet-0 Ready agent 1m v1.20.8-vk-baidu-bci-cce-stack_2024-06-24-1_PD_BL-2-g3d4f706f
若未能成功创建虚拟节点,可以通过 kubectl get po -n kube-system -l app=bci-virtual-kubelet
查看virtual-kubelet状态及相应日志进行检查。
在虚拟节点启动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