通过虚拟节点将Pod调度到ECI上运行

当您需要在短时间内快速创建大量Pod时,ECS节点扩容速度可能无法满足要求,而预留额外的ECS节点又会产生资源浪费。借助ACK虚拟节点可以将Pod快速地调度到弹性容器实例ECI上运行,且无需购买和管理ECS节点。本文介绍如何在ACK集群(ACK托管集群ACK专有集群)中将Pod调度到ECI上运行。

工作原理

阿里云弹性容器实例ECI(Elastic Container Instance)是面向容器设计的无服务器弹性计算服务,提供了免运维、强隔离、能快速启动的容器运行环境。使用ECI时,您无需购买和管理底层ECS服务器,可以更加关注容器应用而非底层基础设施的维护工作。您可按需创建ECI,仅为容器配置的资源付费(按量按秒计费)。

通常,您的ACK集群会有至少一组ECS节点池,创建Pod时,背后是将Pod调度到ECS节点上运行,这种架构能很好地应对流量稳定的业务。如果您的业务有不易提前预测的瞬时波峰,尽管ACK支持弹性伸缩,但ECS节点池扩容时,ECS实例的创建和启动本身会有一定的额外耗时。借助虚拟节点,您可以直接调度Pod到ECI上运行,省去节点创建时间,避免产生闲置节点资源,降低成本。

image

适用场景

在ECI上运行Pod适合应对突发流量,也能降低计算成本。典型场景包括:

  • 有明显波峰波谷的在线业务:例如在线教育、电商等业务的流量通常有明显的波峰波谷,使用ECI Pod可以更快速地应对突发流量,并且能显著减少固定资源池的维护,降低计算成本。

  • 非持续运行的计算任务,使用ECI Pod运行计算任务,无需保留固定节点,仅需为任务执行期间的计算资源付费,降低计算成本,例如:

    • 数据计算:Spark、Presto。

    • CI/CD Pipeline:例如Jenkins、Gitlab-Runner等。

    • Job任务:例如定时任务、AI任务等。

前提条件

步骤一:部署ack-virtual-node组件

ACK托管集群ACK专有集群中的ack-virtual-node组件安装和托管方式有所不同:

  • ACK托管集群中,需要通过组件管理页面部署ack-virtual-node组件,该组件默认被托管,不占用Worker节点资源。

  • ACK专有集群中,需要通过应用市场页面部署ack-virtual-node组件,安装成功后会在kube-system命名空间下创建一个名为ack-virtual-node-controller的deployment,该deployment会运行在您的Worker节点上。

ACK托管集群

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面的核心组件区域,选择ack-virtual-node组件,然后单击安装,并按照页面提示完成操作。

    安装时,使用集群默认虚拟交换机和安全组作为ack-virtual-node的初始ECI配置参数。如需修改ECI配置参数,请参见下文相关操作

ACK专有集群

  1. 登录容器服务管理控制台,在左侧导航栏选择市场 > 应用市场

  2. 应用市场页面单击应用目录页签,搜索并选中ack-virtual-node,然后在ack-virtual-node页面,单击一键部署

  3. 创建面板中,选择集群和命名空间,然后单击下一步

    命名空间已设置为kube-system,发布名称已设置为ack-virtual-node。

  4. 参数配置页面,选择最新Chart 版本,在参数区域,配置虚拟节点参数,然后单击确定

    参数

    可选属性

    描述

    获取路径

    ALIYUN_CLUSTERID

    Required

    集群ID

    集群信息页面的基本信息页签获取集群ID。

    ALIYUN_RESOURCEGROUP_ID

    Optional

    资源组ID

    不配置时,默认使用默认资源组。如需配置,登录资源管理控制台,获取目标资源组ID。

    ECI_REGION

    Required

    地域ID

    集群信息页面的基本信息页签获取地域信息。

    说明

    关于地域名称与地域ID的关系,请参见地域和可用区列表

    ECI_VPC

    Optional

    虚拟专有网络VPC ID

    集群信息页面的基本信息页签获取集群VPC ID。

    ECI_VSWITCH

    Required

    虚拟交换机

    多个vSwitch ID组成的虚拟交换机列表,用于为业务Pod分配IP。多个vSwitch ID之间使用英文半角逗号(,)分隔,例如vsw-xxx1, vsw-xxx2。建议与节点池使用相同的虚拟交换机列表。

    可在节点池页面的节点池列表,单击某个节点池,在基本详情页签的节点配置区域,获取节点vSwitch ID。

    说明

    请确认当前虚拟交换机在ECI支持的可用区列表中。

    ECI_SECURITY_GROUP

    Required

    安全组ID

    集群信息页面的基本信息页签获取安全组ID。

    ECI_ACCESS_KEY

    Required

    您的AccessKey ID

    请参见获取AccessKey

    请授权RAM的AliyunECIFullAccess策略。更多信息,请参见为RAM用户授权

    ECI_SECRET_KEY

    Required

    您的AccessKey Secret

    请参见获取AccessKey

    请授权RAM的AliyunECIFullAccess策略。更多信息,请参见为RAM用户授权

    KUBERNETES_APISERVER_HOST

    Required

    API Server的IP地址

    API Server内网连接端点的IP和端口。可在集群信息页面的基本信息页签查询。

    KUBERNETES_APISERVER_PORT

    Required

    API Server的端口

  5. 执行以下命令,查看ack-virtual-node组件部署状态。

    kubectl -n kube-system get deploy ack-virtual-node-controller

    预期输出:

    NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
    ack-virtual-node-controller   1/1     1            1           2m31s

步骤二:将Pod调度到ECI上运行

为集群部署了ack-virtual-node组件后,您可以借助虚拟节点将Pod调度到ECI上。本小节介绍了在ACK托管集群ACK专有集群中将Pod调度到ECI上的两种常见方式。

如果您期望在ACK集群Pro版配置更为灵活的ECI Pod调度策略,例如只允许将Pod调度到ECI上、优先调度Pod到ECS节点上,或只允许将Pod调度到ECS节点上,具体操作请参见指定ECS和ECI的资源分配

通过Pod标签将Pod调度到ECI上

创建Pod时添加标签alibabacloud.com/eci=true,Pod将被调度到ECI上。示例如下。

  1. 执行以下命令,为Pod添加标签alibabacloud.com/eci=true

    kubectl run nginx --image nginx -l alibabacloud.com/eci=true
  2. 执行以下命令,查看通过虚拟节点调度到ECI上运行的Pod。

    kubectl get pod -o wide|grep virtual-kubelet

    预期输出:

    nginx-7fc9f746b6-r4xgx     1/1     Running   0          34s   192.XX.XX.108   virtual-kubelet-cn-hangzhou-k        <none>           <none>

通过命名空间标签将Pod调度到ECI上

在命名空间上添加标签alibabacloud.com/eci=true后,在该命名空间内创建Pod,Pod将调度到ECI上。示例如下。

  1. 执行以下命令,创建命名空间vk

    kubectl create ns vk
  2. 执行以下命令,为Pod所在的命名空间vk添加标签alibabacloud.com/eci=true

    kubectl label namespace vk alibabacloud.com/eci=true
  3. 执行以下命令,让命名空间中的Pod调度到虚拟节点上。

    kubectl -n vk run nginx --image nginx
  4. 执行以下命令,查看通过虚拟节点调度到ECI上运行的Pod。

    kubectl -n vk get pod -o wide|grep virtual-kubelet

    预期输出:

    nginx-6f489b847d-vgj4d      1/1     Running             0          1m   192.XX.XX.108   virtual-kubelet-cn-hangzhou-k        <none>           <none>

相关操作

为了使用虚拟节点的一些更高级的特性,后续您可能需要升级ack-virtual-node组件或者修改ACK虚拟节点配置。当您不再需要使用虚拟节点时,也可以删除ack-virtual-node组件。

升级ack-virtual-node组件

升级耗时约1分钟。升级过程中无法新建Pod,但对存量Pod不造成影响。

ACK托管集群

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面的核心组件区域,选择ack-virtual-node组件,然后单击升级,并按照页面提示完成操作。

ACK专有集群

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. 在Helm列表的操作列,单击ack-virtual-node对应的更新,在版本区域,选择最新的Chart版本。

  4. 在配置参数区域,更新Required字段(需与此前配置一致。如此前配置了Optional字段,也需保持一致),然后单击确定

    您也可以同时指定virtualNode.image.tag字段,升级VirtualNode镜像到指定版本。

修改ACK虚拟节点配置

关于修改ACK虚拟节点配置的操作,请参见配置eci-profile

删除ACK虚拟节点

  1. 卸载ack-virtual-node组件。

    • 在ACK托管版集群中,删除所有ECI Pod后,在组件管理页面卸载ack-virtual-node组件。

    • 在ACK专有版集群中,删除所有ECI Pod后,在Helm管理页面删除ack-virtual-node组件。

  2. 通过命令kubectl delete node <node name>删除相关虚拟节点。

    说明

    卸载ack-virtual-node组件后,集群中已创建的ECI Pod并不会被删除。