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