如果您在线下IDC或者阿里云ECS上自建了Kubernetes集群,您需要在集群中部署虚拟节点(VNode)来使用ECI。本文为您介绍自建的Kubernetes集群如何对接VNode。
前提条件
准备工作
操作前,请准备创建虚拟节点所需的参数信息,并了解虚拟节点所需的权限信息。需要准备的参数如下表所示。
参数 | 描述 | 操作 |
---|---|---|
地域(Region) | 地域指的是物理的数据中心。请根据您以及您目标用户所在的地理位置,资源价格等因素选择合适的地域。更多信息,请参见地域和可用区。 ECI及其相关资源将创建在选择的地域下。 | 您可以通过弹性容器实例控制台或者调用DescribeRegions获取ECI支持的地域信息。 |
专有网络(VPC) | 专有网络是您基于阿里云创建的自定义私有网络,不同的专有网络之间逻辑上彻底隔离。更多信息,请参见什么是专有网络。 ECI及其相关资源将创建在您配置的专有网络中。 说明 如果您的Kubernetes集群部署在线下IDC,请确保IDC网络与该VPC网络之间已实现网络互通。 | 您可以在专有网络控制台的专有网络页面创建并查看专有网络。 |
交换机(vSwitch) | 交换机是组成专有网络的基础网络设备。交换机可以连接不同的云资源。在专有网络中创建ECI及其相关资源时,需要指定交换机(支持指定多个,系统将自动选择)。 | 您可以在专有网络控制台的交换机页面创建并查看交换机,根据已选的VPC来选择对应的交换机。 |
安全组(SecurityI Group) | 安全组是一种虚拟防火墙,可以控制组内资源的进出流量,从而提高网络安全性。更多信息,请参见安全组概述。 ECI及其相关资源将加入到安全组中。 说明 推荐使用企业安全组,并添加以下入方向的安全组规则:
| 您可以在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增加 |
pvc update和pvc patch | 更新PVC的Annotation。 | |
endpoints create和endpoints update | 选主保护。 1.13版本以上集群无需配置。 |
步骤一:配置虚拟节点证书
虚拟节点需要使用KubeConfig来接入集群。因此,创建虚拟节点前需要为虚拟节点签发证书(即KubeConfig)。 操作步骤如下:
如果使用集群admin证书,可跳过本节。
下载并执行配置脚本,生成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
检查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来创建虚拟节点。
方式一:控制台
登录弹性容器实例控制台。
在顶部菜单栏,选择地域。
在左侧导航栏,选择虚拟节点。
单击创建虚拟节点。
完成相关参数配置,单击确定。
相关参数说明如下:
参数
描述
专有网络、交换机、安全组
虚拟节点所属的专业网络、交换机和安全组。请参考准备工作创建。
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集群中查询到虚拟节点,如下图所示。

步骤三:配置反亲和性策略
由于VNode不是真实节点,因此无法运行DaemonSet。创建VNode后,您需要修改kube-proxy的DaemonSet,配置nodeAffinity来禁止DaemonSet调度到VNode。相关配置如下:
执行以下命令修改DaemonSet配置。
kubectl -n kube-system edit ds kube-proxy
配置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编排。