本文主要介绍虚拟节点及如何通过 Virtual Node Addon 插件部署虚拟节点等。

前提条件

背景信息

虚拟节点来源于社区的 Virtual Kubelet 技术,其实现了 Kubernetes 与弹性容器实例 ECI 的无缝连接,让 Kubernetes 集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。关于Virtual Kubelet的工作原理及其架构,请参见Virtual Kubelet
图 1. 应用场景

应用场景
基于ECI 的虚拟节点支持多种功能,如 GPU 容器实例、挂载 EIP、大规格容器实例等,不仅增强了 Kubernetes 集群的弹性,同时提供了丰富的能力扩展,让用户可以在一个 Kubernetes 集群中轻松管理多种计算 Workload,满足多种场景下的需求。
虚拟节点
在混合集群中,真实节点上的 Pod 与虚拟节点上的 ECI Pod 互联互通。
说明

虚拟节点上的 ECI Pod 是按需收费的,这与真实节点上的计费不同。

ECI 收费规则请参考计费概述

ECI Pod 规格配置支持 0.25c 至 64c,请参考ECI 实例使用限制

安装ack-virtual-node插件

  1. 登录容器服务管理控制台
  2. 在Kubernetes 菜单下,单击左侧导航栏中的市场 > 应用目录,在右侧选中ack-virtual-node
  3. 应用目录-ack-virtual-node页面,单击参数,配置虚拟节点参数。
    参数 参数含义 获取路径
    ECI_VSWITCH 虚拟交换机 您可以节点列表单击某个节点,在实例详情页签的配置信息区域中,获取虚拟交换机的值。
    ECI_SECURITY_GROUP 安全组ID 您可以节点列表单击某个节点,在本实例安全组页签的安全组列表区域中,获取安全组ID的值。
    ECI_ACCESS_KEY 用户AccessKey 请参见如何获取AccessKey ID和AccessKey Secre
    ECI_SECRET_KEY 用户SecretKey 请参见如何获取AccessKey ID和AccessKey Secre
  4. 配置完成后,在右侧的创建页面,选择对应的集群,可以看到命名空间已设定为kube-system,发布名称已设定为ack-virtual-node,单击创建
    创建插件
  5. 安装完成后,你可以通过集群 > 节点,在节点列表页面可以看到添加了一个节点virtual-kubelet。
    添加节点
    您可以通过 kubectl 命令,查看节点和helm部署状态,后续也可以通过helm对ack-virtual-node进行升级和管理。详情请参见在CloudShell上通过kubectl管理Kubernetes集群
    查看状态

在虚拟节点上创建Pod

当集群中存在虚拟节点时,您可以把Pod调度到虚拟节点上,Virtual Kubelet将会创建出相应的ECI Pod。您可以通过以下三种方法操作:
  • 通过设置nodeSelector和tolerations来创建Pod。
    1. 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 无状态,单击右上角的使用模板创建
      模板创建应用
    2. 选择所需的集群和命名空间,选择样例模板或自定义,然后单击创建

      您可以使用如下 yaml 示例模板创建Pod。

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
      spec:
        containers:
        - image: nginx
          imagePullPolicy: Always
          name: nginx
        nodeSelector:
          type: virtual-kubelet
        tolerations:
        - key: virtual-kubelet.io/provider
          operator: Exists
  • 通过设置nodeName的方式创建 Pod。
    1. 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 无状态,单击右上角的使用模板创建
      模板创建应用2
    2. 选择所需的集群和命名空间,选择样例模板或自定义,然后单击创建

      您可以使用如下 yaml 示例模板创建Pod。

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
      spec:
        containers:
        - image: nginx
          imagePullPolicy: Always
          name: nginx
        nodeName: virtual-kubelet
  • 通过配置namespace标签的方式创建Pod。
    1. 通过Cloudshell 连接 Kubernetes 集群。详细内容请参见在CloudShell上通过kubectl管理Kubernetes集群
    2. 执行如下命令,创建Pod。
      kubectl create ns vk
      kubectl label namespace vk virtual-node-affinity-injection=enabled
      kubectl -n vk run nginx --image nginx

      创建pod
应用 > 容器组中,当出现如下界面时,表示 Pod 部署完成。
pod部署完成

相关参考