全部产品
Search
文档中心

自建Kubernetes集群对接VNode

更新时间: 2022-05-19

如果您在线下IDC或者阿里云ECS上自建了Kubernetes集群,您需要在集群中部署虚拟节点(VNode)来使用ECI。本文为您介绍自建的Kubernetes集群如何对接VNode。

前提条件

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

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

准备工作

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

参数

描述

操作

地域(Region)

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

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

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

专有网络(VPC)

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

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

说明

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

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

交换机(vSwitch)

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

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

安全组(SecurityI Group)

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

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

说明

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

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

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

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

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

类型

权限

说明

标准权限

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版本以上集群无需配置。

步骤一:配置虚拟节点证书

虚拟节点需要使用KubeConfig来接入集群。因此,创建虚拟节点前需要为虚拟节点签发证书(即KubeConfig)。 操作步骤如下:

说明

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

  1. 下载并执行配置脚本,生成KubeConfig。

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

    • TLS Bootstrap

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

      • 集群版本为1.14~1.20

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

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

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

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

      • 集群版本为1.14~1.20

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

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

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

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

    cat vnode-config

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

    • 确认待创建虚拟节点的VPC网络能够连接到server地址。

    • 如果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: ******.****************
    • ServiceAcoount

      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: ***********************************************

步骤二:创建虚拟节点

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

方式一:控制台

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

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

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

  4. 单击创建虚拟节点

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

    相关参数说明如下:

    参数

    描述

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

    虚拟节点所属的专业网络、交换机和安全组。请参考准备工作创建。

    KubeConfig

    虚拟节点要连接的Kubernetes集群的KubeConfig。请参考步骤一生成证书。

    TlsBootstrapEnabled

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

    标签

    虚拟节点绑定的标签信息。

    污点

    虚拟节点绑定的污点信息。

    弹性公网IP

    如果虚拟节点需要访问公网,则需要绑定弹性公网IP。

    • 自动创建:自动创建弹性公网IP,并将其绑定到虚拟节点。

    • 使用已有:绑定已有的弹性公网IP。

    说明

    弹性公网IP是可以独立购买和持有的公网IP地址资源。更多信息,请参见弹性公网IP

    资源组

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

    如果没有指定资源组,则虚拟节点将加入到默认资源组中。

方式二:OpenAPI

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

名称

类型

示例值

描述

RegionId

String

cn-shanghai

地域ID。

VSwitchId

String

vsw-2ze23nqzig8inprou****

交换机ID。虚拟节点以及虚拟节点下的ECI实例所使用的交换机。

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

SecurityGroupId

String

sg-2ze81zoc3yl7a3we****

安全组ID。虚拟节点以及该虚拟节点下的ECI实例将加入到该安全组中。

KubeConfig

String

JTVDbmFwaVZlcnNpb24lM0ElMjB2MSU1Q25jbHVzdGVycyUzQSU1Q24tJTIwY2x1c3RlciUzQSU1Q24uLi******

虚拟节点要连接的Kubernetes集群的KubeConfig。需进行Base64编码后传入。

TlsBootstrapEnabled

Boolean

true

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

查看结果

创建后等待一段时间,您可以在Kubernetes集群中查询到虚拟节点,如下图所示。

vnode1

步骤三:配置反亲和性策略

由于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调度到虚拟节点上,以使用ECI来运行Pod。

  • 手动调度

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

  • 自动调度

    ECI Profile功能支持自定义配置selector,可以将满足条件的Pod自动调度到VNode。具体操作,请参见。配置ECI Profile实现Pod编排