全部产品
Search
文档中心

弹性容器实例:接入VNode(VNodectl工具)

更新时间:Jul 17, 2024

如果您在线下IDC或者阿里云ECS上自建了Kubernetes集群,您需要在集群中部署虚拟节点(VNode)来使用ECI。为了能够方便地接入和管理VNode,ECI提供了VNodectl命令行工具。本文为您介绍如何使用VNodectl工具自动创建VNode,以便在自建Kubernetes集群中可以使用ECI。

前提条件

  • 已部署好Kubernetes集群,且集群的版本属于1.13~1.30版本。

  • 如果您的Kubernetes集群部署在线下IDC,请确保已通过高速通道、智能接入网关或者VPN网关打通IDC和云上网络。相关参考如下:

准备工作

操作前,请准备创建VNode所需的参数信息,并了解VNode所需的权限信息。需要准备的参数如下表所示。

参数

描述

操作

地域(Region)

地域指的是物理的数据中心。请根据您以及您目标用户所在的地理位置,资源价格等因素选择合适的地域。更多信息,请参见地域和可用区

ECI及其相关资源将创建在选择的地域下。

您可以通过弹性容器实例控制台或者调用DescribeRegions获取ECI支持的地域信息。

专有网络(VPC)

专有网络是您基于阿里云创建的自定义私有网络,不同的专有网络之间逻辑上彻底隔离。更多信息,请参见什么是专有网络

ECI及其相关资源将创建在您配置的专有网络中。

说明

如果您的Kubernetes集群部署在线下IDC,请确保IDC网络与该VPC网络之间已实现网络互通。

您可以在专有网络控制台专有网络页面创建并查看专有网络。

交换机(vSwitch)

交换机是组成专有网络的基础网络设备。交换机可以连接不同的云资源。在专有网络中创建ECI及其相关资源时,需要指定交换机(支持指定多个,系统将自动选择)。

您可以在专有网络控制台交换机页面创建并查看交换机,根据已选的VPC来选择对应的交换机。

安全组(Security Group)

安全组是一种虚拟防火墙,可以控制组内资源的进出流量,从而提高网络安全性。更多信息,请参见安全组概述

ECI及其相关资源将加入到安全组中。

说明

推荐使用企业安全组,并添加以下入方向的安全组规则:

  • 允许VPC对应网段访问全部端口(1/65535)。

  • 允许K8s API Server对应地址访问VNode服务端口(10250和10255端口)。

您可以在ECS管理控制台安全组页面创建并查看安全组,根据已选的VPC来选择对应的安全组。

创建VNode时,需要配置相关权限,包括原生K8s节点使用的标准权限,以及VNode所需的额外权限,具体如下表所示。

类型

权限

说明

标准权限

system:node

Node标准权限。

system:node-proxier

kube-proxy标准权限。

system:certificates.k8s.io:certificatesigningrequests:nodeclient

Node发起创建证书请求的权限。

system:certificates.k8s.io:certificatesigningrequests:selfnodeclient

Node基于已有证书发起创建证书请求的权限,即证书轮换权限。

额外权限

pods update和pods patch

更新Pod的Annotation。例如为Pod增加k8s.aliyun.com/eci-instance-id等Computed Annotation。

pvc update和pvc patch

更新PVC的Annotation。

endpoints create和endpoints update

选主保护。

1.13版本以上集群无需配置。

安装VNodectl

操作前,您需要安装VNodectl命令行工具。请根据自身环境获取对应的安装包并安装VNodectl。

操作系统

CPU架构

安装包获取链接

macOS

AMD64

macOS_AMD64

ARM64

macOS_ARM64

Linux

AMD64

Linux_AMD64

ARM64

Linux_ARM64

Windows

AMD64

Windows_AMD64

ARM64

Windows_ARM64

建议您将VNodectl安装在Kubernetes集群的master节点上,操作步骤如下:

  1. 连接集群。

  2. 下载安装包。

    wget https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnodectl_0.0.5-beta_linux_amd64.tar.gz -O vnodectl.tar.gz 
  3. 解压安装包。

    tar xvf vnodectl.tar.gz 
  4. 复制vnodectl到指定目录。

    cp vnodectl /usr/local/bin/vnode
说明
  • vnode命令均支持添加--dry进行客户端校验。

  • 执行vnode命令的过程中,如果遇到API版本兼容的错误,请添加--kubernetes-version明确指定集群的K8s版本。

配置集群

VNode需要使用kubeconfig来接入集群。因此,创建VNode前需要为VNode签发证书(即kubeconfig)。配置方式分为TLS Bootstrap方式和ServiceAccount方式。

说明
  • 如果有安全性要求,建议采用TLS Bootstrap方式。采用该方式时,将自动部署vnode-approver组件。vnode-approver组件用于签发Vnode提交的CSR请求,目前已开源至GitHub。更多信息,请参见vnode-approver

  • ServiceAccount方式不支持证书轮换。签发证书时需确保token有足够的有效期(或者设置为不过期),防止因证书过期导致VNode无法正常工作。

TLS Bootstrap

  1. 生成kubeconfig。

    1. 准备集群相关配置信息。

      配置参数

      说明

      获取方式

      示例

      kubeconfig

      用于配置VNode在集群中所需要的权限。

      默认路径为~/.kube/config。您也可以使用其它kubeconfig。

      /path/to/kubeconfig

      集群CA

      用于生成VNode连接到集群所需要的kubeconfig。可直接使用具有admin权限的kubeconfig中的CA,建议使用启动apiserver时传入的CA。

      执行ps aux | grep apiserver命令,从返回信息中获取--client-ca-file的值。

      /path/to/ca.crt

      apiserver地址

      用于集群通信、认证、鉴权等。

      打印kubeconfig,从返回信息中可获取apiserver地址。

      https://8.134.XX.XX:6443

      tokenId

      用于生成TLS Bootstrap token,创建Bootstrap token secret。

      自定义,6位数字字母组合字符串。

      eci123

      tokenSecret

      自定义,16位数字字母组合字符串。

      eci1233333333333

    2. 部署vnode-approver组件。

      vnode addon enable vnode-approver
    3. 配置集群生成kubeconfig。

      请根据实际集群配置信息替换命令中的参数值。示例如下:

      vnode cluster setup --kubeconfig  /path/to/kubeconfig  --bootstrap --bootstrap-token-id <token-id> --bootstrap-token-secret <token-secret> --apiserver-address https://8.134.XX.XX:6443 --cluster-ca-path  /path/to/ca.crt

      如果集群版本低于1.14,命令中请附带集群版本,示例如下:

      vnode cluster setup --kubernetes-version v1.13.0 --kubeconfig  /path/to/kubeconfig --bootstrap --bootstrap-token-id eci123 --bootstrap-token-secret eci1233333333333  --apiserver-address https://8.134.XX.XX:6443 --cluster-ca-path /etc/kubernetes/pki/ca.crt
  2. 校验集群是否具备接入VNode的条件。

    vnode cluster validate

    预期返回如下,kubeconfig默认保存在~/.vnode/deploy/kubeconfig

    kubeconfig can't be empty

ServiceAccount

  1. 生成kubeconfig。

    1. 准备集群相关配置信息。

      配置参数

      说明

      获取方式

      示例

      kubeconfig

      用于配置VNode在集群中所需要的权限。

      默认路径为~/.kube/config。您也可以使用其它kubeconfig。

      /path/to/kubeconfig

      集群CA

      用于生成 VNode连接到集群所需要的kubeconfig。可直接使用具有admin权限的kubeconfig中的CA,建议使用启动apiserver时传入的CA。

      执行ps aux | grep apiserver命令,从返回信息中获取--client-ca-file的值。

      /path/to/ca.crt

      apiserver地址

      用于集群通信、认证、鉴权等。

      打印kubeconfig,从返回信息中可获取apiserver地址。

      https://8.134.XX.XX:6443

    2. 配置集群生成kubeconfig。

      请根据实际集群配置信息替换命令中的参数值。示例如下:

      vnode cluster setup --kubeconfig /path/to/kubeconfig --apiserver-address https://8.134.XX.XX:6443 --cluster-ca-path /path/to/ca.crt

      如果集群版本低于1.14,命令中请附带集群版本,示例如下:

      vnode cluster setup --kubernetes-version v1.13.0 --kubeconfig /path/to/kubeconfig --apiserver-address https://8.134.XX.XX:6443 --cluster-ca-path /etc/kubernetes/pki/ca.crt 
  2. 校验集群是否具备接入VNode的条件。

    vnode cluster validate

    预期返回如下,kubeconfig默认保存在~/.vnode/deploy/kubeconfig

    kubeconfig can't be empty

配置~/.vnode/config文件

~/.vnode/config文件包含了VNode的配置信息,VNodectl运行的时候会读取该文件,因此在创建VNode前需要先配置好该文件。

  1. 打印VNode运行所需的配置信息。

    vnode config default

    配置信息中contexts下各字段说明如下:

    字段

    是否必填

    说明

    name

    context名称。

    vnode-name

    VNode名称,建议不配置,由系统自动生成可保证唯一性

    region-id

    VNode所属地域。请参考准备工作选择。

    access-key-id

    调用阿里云API时需要使用AccessKey完成身份验证。AccessKey包括AccessKey ID和AccessKey Secret,需要一起使用。更多信息,请参见创建AccessKey

    access-key-secret

    vswitch-id

    VNode所属交换机,可配置多个。请参考准备工作创建。

    security-group-id

    VNode所属安全组。请参考准备工作创建。

    resource-group-id

    VNode所属资源组。

    资源组是在阿里云账号下进行资源分组管理的一种机制。每个账号有一个默认资源组。更多信息,请参见资源管理

    如果没有指定资源组,则VNode将加入到默认资源组中。

    kubeconfig

    VNode接入集群时所需的kubeconfig文件路径。完成配置集群操作后会自动生成,默认路径为~/.vnode/deploy/kubeconfig

    taints

    VNode绑定的污点信息。

    tags

    VNode绑定的标签信息。

    标签可用于账单分账管理,为VNode绑定自定义标签后,在查看费用分析时,可以通过该标签筛选出VNode收取的实例费用。更多信息,请参见基于标签查询分账账单

  2. 将配置信息重定向到指定文件(~/.vnode/config),并配置各字段。

    vnode config default > ~/.vnode/config
    vim ~/.vnode/config

    请根据自身需求修改~/.vnode/config文件内容,以下示例仅配置了必填字段。

    kind: vnode
    contexts:
        - name: default
          region-id: cn-guangzhou
          access-key-id: LTAI5tJbBkHcHBUmuP7C****
          access-key-secret: 5PlpKJT6sgLcD4f9y5pACNDbEg****
          vswitch-id: vsw-7xv2yk45qp5etidgf****
          security-group-id: sg-7xv5tcch4kjdr65t****
          kubeconfig: ~/.vnode/deploy/kubeconfig
    current-context: default
  3. 查看并确认当前VNode运行读取的配置信息。

    vnode config
  4. 切换context,使VNode运行加载context下的配置。

    vnode config set-context <context-name>

创建VNode

  1. 创建一个VNode。

    vnode create
    说明

    创建时会采用~/.vnode/config文件中的配置进行创建,支持添加参数来配置customResources、clusterDNS和clusterDomain。更多信息,请参见管理VNode

    返回示例如下,其中VirtualNodeId的值即为生成的VNode的ID。

    {"RequestId":"AB772F9D-2FEF-5BFD-AAFB-DA3444851F29","VirtualNodeId":"vnd-7xvetkyase7gb62u****"}
  2. 查看VNode状态。

    vnode list

    返回示例如下,当STATUS为Ready时,表示VNode创建成功。

    VNODE ID                    VNODE NAME                                   CREATED          STATUS    SCHEDULABLE ZONES
    vnd-7xvetkyase7gb62u****    vnode-cn-guangzhou-a-7xvetkyase7gb62u****    2 minutes ago    Ready     cn-guangzhou-a
  3. 查看节点信息。

    kubectl get node

    返回示例如下,可以看到集群中已接入VNode。

    NAME                                    STATUS     ROLES                  AGE    VERSION
    cn-guangzhou.vnd-7xvetkyase7gb62u****   Ready      agent                  174m   v1.20.6
    vnode-test001                           Ready      control-plane,master   23h    v1.20.6
    vnode-test002                           Ready      <none>                 22h    v1.20.6

禁止DaemonSet调度到VNode

由于VNode不是真实节点,因此无法运行DaemonSet。创建VNode后,您需要修改kube-proxy的DaemonSet,配置nodeAffinity来禁止DaemonSet调度到VNode。

  1. 修改DaemonSet配置。

    kubectl -n kube-system edit ds kube-proxy
  2. 配置nodeAffinity。

    在spec>template>spec下添加以下YAML:

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: type
              operator: NotIn
              values:
              - virtual-kubelet

调度Pod到VNode

创建VNode后,您可以通过以下方式将Pod调度到VNode上,以使用ECI来运行Pod。

  • 手动调度

    通过配置nodeSelector和tolerations、指定nodeName的方式,可以手动将Pod调度到VNode。具体操作,请参见将Pod调度到VNode

  • 自动调度

    部署eci-profile组件后,可以自定义配置Selector,将满足条件的Pod自动调度到VNode。具体操作,请参见使用eci-profile调度Pod到VNode

相关文档