全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:通过虚拟节点将Pod调度到ECI上运行

更新时间:Dec 26, 2023

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

工作原理

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

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

image

前提条件

步骤一:为ack-virtual-node组件配置RAM权限

通过onectl配置

  1. 在本地安装配置onectl。具体操作,请参见通过onectl管理注册集群

  2. 执行以下命令,为ack-virtual-node组件配置RAM权限。

    onectl ram-user grant --addon ack-virtual-node

    预期输出:

    Ram policy ack-one-registered-cluster-policy-ack-virtual-node granted to ram user ack-one-user-ce313528c3 successfully.

通过控制台配置

在注册集群安装组件之前,您需要在接入集群中设置AccessKey用来访问云服务的权限。设置AccessKey之前,您需要创建RAM用户并为其添加访问相关云资源的权限。

  1. 创建RAM用户。具体操作,请参见创建RAM用户

  2. 可选:创建自定义权限策略。具体操作,请参见创建自定义权限策略。

    展开查看自定义策略模板

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "eci:CreateContainerGroup",
                    "eci:DeleteContainerGroup",
                    "eci:DescribeContainerGroups",
                    "eci:DescribeContainerGroupStatus",
                    "eci:DescribeContainerGroupEvents",
                    "eci:DescribeContainerLog",
                    "eci:UpdateContainerGroup",
                    "eci:UpdateContainerGroupByTemplate",
                    "eci:CreateContainerGroupFromTemplate",
                    "eci:RestartContainerGroup",
                    "eci:ExportContainerGroupTemplate",
                    "eci:DescribeContainerGroupMetric",
                    "eci:DescribeMultiContainerGroupMetric",
                    "eci:ExecContainerCommand",
                    "eci:CreateImageCache",
                    "eci:DescribeImageCaches",
                    "eci:DeleteImageCache",
                    "vpc:DescribeVSwitches"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            }
        ]
    }
  3. 为RAM用户添加权限。具体操作,请参见为RAM用户授权

    可选择自定义权限策略或AliyunECIFullAccess策略为RAM用户授权。

  4. 为RAM用户创建AccessKey。具体操作,请参见获取AccessKey

  5. 使用AccessKey在注册集群中创建名为alibaba-addon-secret的Secret资源。

    安装ack-virtual-node组件时将自动引用此AccessKey访问对应的云服务资源。

    kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your access key id>' --from-literal='access-key-secret=<your access key secret>'
    说明

    <your access key id><your access key secret>为上一步获取的AccessKey信息。

步骤二:安装ack-virtual-node组件

通过onectl安装

执行以下命令,安装ack-virtual-node组件。

onectl addon install ack-virtual-node

预期输出:

Addon ack-virtual-node, version **** installed.

通过控制台安装

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

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

  3. 单击其他页签,在ack-virtual-node组件区域单击安装

    提示对话框中单击确定。这时会以集群默认虚拟交换机和安全组作为ack-virtual-node的初始ECI配置参数。具体操作,请参见相关操作

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

为集群部署了ack-virtual-node组件后,您可以借助虚拟节点将Pod调度到ECI上。本小节介绍了在注册集群中将Pod调度到ECI上的两种常见方式。调度前需要确保Virtual node的状态为Ready。

执行以下命令,查看Virtual node状态。

kubectl  get no |grep virtual-kubelet

预期输出:

virtual-kubelet-cn-hangzhou-b   Ready    agent                  18d   v1.20.11-aliyun.1

从预期输出可得,当前Virtual node状态为Ready。

方式一:配置Pod标签

  • 将Pod添加标签alibabacloud.com/eci=true,Pod将以ECI方式运行,其节点是虚拟节点,示例如下:

    1. 执行以下命令给Pod添加标签。

      kubectl run nginx --image nginx -l alibabacloud.com/eci=true
    2. 执行以下命令查看Pod。

      kubectl get pod -o wide|grep virtual-kubelet

      预期输出:

      nginx-7fc9f746b6-r4xgx     0/1     ContainerCreating   0          20s   192.168.XX.XX   virtual-kubelet        <none>           <none>

方式二:配置命名空间标签

  • 将Pod所在的命名空间添加标签alibabacloud.com/eci=true,Pod将以ECI方式运行,其节点是虚拟节点,示例如下:

    1. 执行以下命令创建虚拟节点。

      kubectl create ns vk
    2. 执行以下命令将Pod所在的命名空间添加标签。

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

      kubectl -n vk run nginx --image nginx
    4. 执行以下命令查看Pod。

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

      预期输出:

      nginx-6f489b847d-vgj4d      1/1     Running             0          1m   192.168.XX.XX   virtual-kubelet        <none>           <none>

相关操作

修改虚拟节点配置

虚拟节点Controller的配置决定了其调度ECI Pod的行为和ECI运行环境配置,包括虚拟交换机和安全组配置等。您可以根据需要灵活地修改Controller配置,修改配置后不会影响已经运行的ECI Pod,会立即生效于新调度的ECI Pod。

执行以下命令修改虚拟节点Controller的配置。

kubectl -n kube-system edit deployment ack-virtual-node-controller

常用的变更操作如下:

  • 更新virtual-node controller版本

    当您使用更新虚拟节点功能时,需要更新Virtual Node Controller镜像至最新版本。

  • 修改安全组配置ECI_SECURITY_GROUP

    您可以修改此环境变量,改变ECI Pod的安全组。

  • 修改虚拟交换机配置ECI_VSWITCH

    您可以修改此环境变量,改变ECI Pod所在的虚拟交换机。建议配置多个虚拟交换机支持多可用区,当单个可用区库存不足时,Controller会选择另外一个可用区创建ECI Pod。

  • 修改kube-proxy配置ECI_KUBE_PROXY

    此环境变量默认值为true,表示ECI Pod默认可以访问集群中的ClusterIP Service。如果ECI Pod无需访问ClusterIP Service时,例如Job计算场景,您可以将此环境变量设置为false关闭kube-proxy功能。另外在一些规模化场景,例如集群中需要启动大量ECI Pod时,ECI中的kube-proxy和Kubernetes API Server之间的并发连接数也会大量增加,您同样可以选择关闭kube-proxy功能,减少对API Server的压力,提升可扩展性。

  • 修改kube-system/eci-profile configmap

    您可以修改此ConfigMap配置更多ECI相关参数,例如虚拟交换机及安全组等。

删除虚拟节点

  1. 在注册集群中卸载ack-virtual-node组件。

    通过onectl卸载

    执行以下命令,卸载组件。

    onectl addon uninstall ack-virtual-node

    预期输出:

    Addon ack-virtual-node uninstalled.

    通过控制台卸载

    组件管理页面卸载ack-virtual-node组件即可。

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

    说明

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