当您需要在短时间内快速创建大量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上运行,省去节点创建时间,避免产生闲置节点资源,降低成本。
适用场景
在ECI上运行Pod适合应对突发流量,也能降低计算成本。典型场景包括:
有明显波峰波谷的在线业务:例如在线教育、电商等业务的流量通常有明显的波峰波谷,使用ECI Pod可以更快速地应对突发流量,并且能显著减少固定资源池的维护,降低计算成本。
非持续运行的计算任务,使用ECI Pod运行计算任务,无需保留固定节点,仅需为任务执行期间的计算资源付费,降低计算成本,例如:
数据计算:Spark、Presto。
CI/CD Pipeline:例如Jenkins、Gitlab-Runner等。
Job任务:例如定时任务、AI任务等。
前提条件
已创建ACK托管集群或ACK专有集群,且集群版本为1.16及以上。如需创建集群,请参见创建ACK托管集群或创建ACK专有集群;如需升级集群,请参见手动升级集群。
已开通弹性容器实例服务并确认集群所在区域在ECI支持的地域列表内。
可登录弹性容器实例控制台开通相应的服务,并查看当前支持的地域和可用区。
已通过kubectl连接Kubernetes集群。具体操作,请参见在CloudShell上通过kubectl管理Kubernetes集群。
步骤一:部署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托管集群
ACK专有集群
登录容器服务管理控制台,在左侧导航栏选择 。
在应用市场页面单击应用目录页签,搜索并选中ack-virtual-node,然后在ack-virtual-node页面,单击一键部署。
在创建面板中,选择集群和命名空间,然后单击下一步。
命名空间已设置为kube-system,发布名称已设置为ack-virtual-node。
在参数配置页面,选择最新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的端口
执行以下命令,查看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上。示例如下。
执行以下命令,为Pod添加标签
alibabacloud.com/eci=true
。kubectl run nginx --image nginx -l alibabacloud.com/eci=true
执行以下命令,查看通过虚拟节点调度到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上。示例如下。
执行以下命令,创建命名空间
vk
。kubectl create ns vk
执行以下命令,为Pod所在的命名空间
vk
添加标签alibabacloud.com/eci=true
。kubectl label namespace vk alibabacloud.com/eci=true
执行以下命令,让命名空间中的Pod调度到虚拟节点上。
kubectl -n vk run nginx --image nginx
执行以下命令,查看通过虚拟节点调度到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托管集群
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面的核心组件区域,选择ack-virtual-node组件,然后单击升级,并按照页面提示完成操作。
ACK专有集群
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm列表的操作列,单击ack-virtual-node对应的更新,在版本区域,选择最新的Chart版本。
在配置参数区域,更新Required字段(需与此前配置一致。如此前配置了Optional字段,也需保持一致),然后单击确定。
您也可以同时指定
virtualNode.image.tag
字段,升级VirtualNode镜像到指定版本。
修改ACK虚拟节点配置
关于修改ACK虚拟节点配置的操作,请参见配置eci-profile。
删除ACK虚拟节点
卸载ack-virtual-node组件。
在ACK托管版集群中,删除所有ECI Pod后,在组件管理页面卸载ack-virtual-node组件。
在ACK专有版集群中,删除所有ECI Pod后,在Helm管理页面删除ack-virtual-node组件。
通过命令
kubectl delete node <node name>
删除相关虚拟节点。说明卸载ack-virtual-node组件后,集群中已创建的ECI Pod并不会被删除。