接入VNode(手动)

如果您在线下IDC或者阿里云ECS上自建了Kubernetes集群,您需要在集群中部署虚拟节点(VNode)来使用ECI。本文为您介绍如何配置证书并手动创建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版本以上集群无需配置。

配置集群

VNode需要使用kubeconfig来接入集群。因此,创建VNode前需要为VNode签发证书(即kubeconfig)。

说明

如果使用集群admin证书,可跳过本节。

  1. 连接集群。

  2. 下载并执行配置脚本,生成kubeconfig。

    选择TLS Bootstrap或ServiceAccount方式,根据您的Kubernetes集群的版本执行对应命令生成kubeconfig。

    TLS Bootstrap

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

    • 集群版本为1.14~1.22

      curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | bash -s -- bootstrap
    • 集群版本为1.13

    • 1.13版本的集群需要endpoints资源进行选主,脚本中需配置额外权限(EXTRA_PRIVILEDGE=true)。

    • curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | env EXTRA_PRIVILEDGE=true bash -s -- bootstrap

    ServiceAccount

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

    • 集群版本为1.14~1.22

      curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | bash -s -- common
    • 集群版本为1.13

      1.13版本的集群需要endpoints资源进行选主,脚本中需配置额外权限(EXTRA_PRIVILEDGE=true)。

      curl -fsSL https://eci-docs.oss-cn-beijing.aliyuncs.com/vnode/vnode-deploy.sh | env EXTRA_PRIVILEDGE=true bash -s -- common
  3. 检查kubeconfig。

    生成的kubeconfig名为vnode-config。执行以下命令查看kubeconfig。

    cat vnode-config

    检查时,请注意以下几点:

    • 确认待创建VNode的VPC网络能够连接到server地址(处于同一VPC或已打通网络)。

      • 如果server地址是IP地址,需确保VNode所在VPC能够访问该IP地址。

      • 如果server地址是域名,需确保阿里云VPC内能够解析该域名,且VNode所在VPC可以访问域名解析后的IP地址。

    • 如果certificate-authority-data的内容为空,请检查~/.kube/config中的相应字段是否使用了PATH。

    kubeconfig的内容示例如下:

    TLS Bootstrap

    apiVersion: v1
    kind: Config
    current-context: kubernetes-admin@kubernetes
    contexts:
    - name: kubernetes-admin@kubernetes
      context:
        cluster: kubernetes-admin@kubernetes
        user: vnode
        namespace: kube-system
    clusters:
    - name: kubernetes-admin@kubernetes
      cluster:
        certificate-authority-data: "*****************************************=="
        server: https://10.16.XX.XX:6443
    users:
    - name: vnode
      user:
        token: ******.****************

    ServiceAccount

    apiVersion: v1
    kind: Config
    current-context: kubernetes-admin@kubernetes
    contexts:
    - name: kubernetes-admin@kubernetes
      context:
        cluster: kubernetes-admin@kubernetes
        user: vnode
        namespace: kube-system
    clusters:
    - name: kubernetes-admin@kubernetes
      cluster:
        certificate-authority-data: "*****************************************=="
        server: https://10.16.XX.XX:6443
    users:
    - name: vnode
      user:
        token: ***********************************************

创建VNode

操作步骤

您可以通过弹性容器实例控制台或者OpenAPI来创建VNode。

控制台

  1. 登录弹性容器实例控制台

  2. 在顶部菜单栏,选择地域。

  3. 在左侧导航栏,选择虚拟节点

  4. 单击创建虚拟节点

  5. 完成相关参数配置,单击确定

    相关参数说明如下:

    参数

    描述

    专有网络、交换机、安全组

    VNode所属的专有网络、交换机和安全组。请参考准备工作创建。

    KubeConfig

    VNode要连接的Kubernetes集群的kubeconfig。请参考配置集群步骤生成。

    TlsBootstrapEnabled

    是否启用TLS启动引导。

    如果您使用TLS Bootstrap方式生成了kubeconfig,请启用该配置。启用该配置后,将同步启用证书轮换,VNode将在当前证书即将到期时,自动申请新的证书。

    标签

    VNode绑定的标签信息。

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

    污点

    VNode绑定的污点信息。

    资源组

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

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

OpenAPI

您可以调用CreateVirtualNode创建VNode,需要注意的参数如下表所示,更多信息,请参见CreateVirtualNode

名称

类型

示例值

描述

RegionId

String

cn-shanghai

地域ID。

VSwitchId

String

vsw-2ze23nqzig8inprou****

交换机ID。VNode以及VNode下的ECI实例所使用的交换机。

支持指定多个(最小1个,最多10个)属于同一VPC的交换机。

SecurityGroupId

String

sg-2ze81zoc3yl7a3we****

安全组ID。VNode以及该VNode下的ECI实例将加入到该安全组中。

KubeConfig

String

JTVDbmFwaVZlcnNpb24lM0ElMjB2MSU1Q25jbHVzdGVycyUzQSU1Q24tJTIwY2x1c3RlciUzQSU1Q24uLi******

VNode要连接的Kubernetes集群的kubeconfig。需进行Base64编码后传入。

TlsBootstrapEnabled

Boolean

true

是否启用TLS启动引导。如果您使用TLS Bootstrap方式生成了kubeconfig,请启用该配置。启用该配置后,将同步启用证书轮换,VNode将在当前证书即将到期时,自动申请新的证书。

查看结果

创建后等待一段时间,您可以登录Kubernetes集群,执行kubectl get nodes命令查看节点信息。

  • 如果可以查询到VNode,则表示创建成功。预期返回如下:

    vnode1

  • 如果查询不到VNode,则表示创建失败。建议您根据VNode相关事件排查问题。

    弹性容器实例控制台虚拟节点页面,单击目标虚拟节点ID,在事件页签下可以查看该VNode的事件。

    常见的事件错误如下:

    • failed to get kubernetes server version, Get \"https://10.50.XX.XX:6443/version?timeout=32s\": net/http: request canceled (Client.Timeout exceeded while awaiting headers

      表示VNode所在VPC无法连接到Kubernetes API Server的IP,需确认VNode与API Server是否处于同一VPC,如果不属于同一VPC,需确保已打通网络。

    • failed to get kubernetes server version, Get \"https://lb.kubesphere.local:6443/version?timeout=32s\": dial tcp: lookup lb.kubesphere.local on 100.100.X.:53: no such host

      表示VPC内无法解析Kubernetes API Server的域名,可以配置PrivateZone,增加相应域名的解析。

说明

在使用VNode对接自建Kubernetes集群的过程中遇到任何需求或问题时,欢迎使用钉钉搜索群号44666389,加入VNode客户支持群。

禁止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