自建Kubernetes集群对接ECI

ECI能为Kubernetes提供基础的容器Pod运行环境,但业务间的依赖、负载均衡、弹性伸缩、定期调度等能力依然需要Kubernetes来提供。本文为您介绍自建Kubernetes集群如何与ECI对接,以及如何使用ECI。

对接方式

ECI为Kubernetes提供一种层次化的解决方案:即ECI负责底层Pod容器资源的调度和管理工作,Kubernetes在ECI之上作为PaaS层来管理业务负载,例如管理Deployment、Service、StatefulSet、CronJob等。

ECI在接管Pod容器底层基础设施的管理工作后,Kubernetes不再需要直接负责单个Pod的放置、启动等工作,也不再需要关心底层虚拟机的资源情况,通过ECI即可确保Pod需要的资源随时可用。对于长时间运行的业务负载,您可以将此类负载的弹性流量部分调度至ECI,缩短弹性扩容的时间,减少弹性部分的扩容成本,并尽可能充分利用已有资源。当业务流量下降后,可以快速释放部署在ECI上的Pod,从而降低您的使用成本。

如果您在本地IDC,或者阿里云的ECS上自建了Kubernetes集群,则可以通过部署虚拟节点(VNode)的方式来使用ECI。VNode对标原生kubernetes节点,内置了virtual-kubelet、kube-proxy等组件,兼容原生kubernetes节点API。当有Pod调度到VNode上时,VNode会自动创建并管理底层的ECI资源。在VNode上运行的每个Pod都对应一个ECI实例,架构如下图所示:vnode

关于自建集群如何接入VNode,请参见:

计费说明

VNode按个数计费。每个VNode会有一个常驻节点,相当于2 vCPU,8 GiB的ECI实例,收取相关实例费用。

费用计算公式为:单个VNode费用=(2*vCPU单价+8*内存单价)*运行时长。

关于ECI实例如何计费,以及vCPU和内存的具体单价,请参见ECI实例计费

说明

VNode支持标签功能,您可以为VNode绑定特定标签,以便区分VNode实例费用和普通ECI实例费用。

功能限制

基于公有云的安全性和虚拟节点本身带来的限制,ECI目前还不支持Kubernetes中HostPath、DaemonSet等功能,具体如下表所示。

不支持的功能

说明

推荐替代方案

HostPath

挂载本地宿主机文件到容器中

使用emptyDir、云盘或者NAS文件系统

HostNetwork

将宿主机端口映射到容器上

使用type=LoadBalancer的负载均衡

DaemonSet

在容器所在宿主机上部署Static Pod

通过sidecar形式在Pod中部署多个镜像

type=NodePort的Service

将宿主机端口映射到容器上

使用type=LoadBalancer的负载均衡

调度方式

对于混合使用普通节点和虚拟节点的Kubernetes集群,您可以根据需要将Pod调度到VNode,以ECI来运行。主要方式如下:

  • 手动调度

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

  • 自动调度

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

使用ECI功能

在Kubernetes集群中创建Pod到ECI时,为充分使用ECI提供的功能,在不改变Kubernetes语义的前提下,您可以根据需求为Pod添加Annotation。Annotation需添加到Pod级别的metadata中,支持的Annotation列表以及配置示例,请参见ECI Pod Annotation

说明

您可以在创建Pod时手动添加Annotation,也可以配置eci-proflie,实现自动添加Annotation到Label能够匹配上的Pod。