ECI能为Kubernetes提供基础的容器Pod运行环境,但业务间的依赖、负载均衡、弹性伸缩、定期调度等能力依然需要Kubernetes来提供。本文为您介绍阿里云容器服务Kubernetes版(简称ACK)如何与ECI对接,使用ECI作为Pod的运行资源。
对接方式
ECI为Kubernetes提供一种层次化的解决方案:即ECI负责底层Pod容器资源的调度和管理工作,Kubernetes在ECI之上作为PaaS层来管理业务负载,例如管理Deployment、Service、StatefulSet、CronJob等。
基于Kubernetes社区的Virtual Kubelet(简称VK)技术,ECI可以以虚拟节点的形式接入到Kubernetes集群中,使得集群可以轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。ECI在接管Pod容器底层基础设施的管理工作后,Kubernetes不再需要直接负责单个Pod的放置、启动等工作,也不再需要关心底层虚拟机的资源情况,通过ECI即可确保Pod需要的资源随时可用。
目前ECI已经无缝集成到阿里云容器服务Kubernetes版中,您可以通过ACK Serverless集群或者ACK集群,快速体验ECI的容器运行能力。
ACK Serverless集群(完全基于ECI)
依托ECI免运维的特性,Kubernetes可以完全依托ECI来构建,即所有Pod均运行在ECI上,Kubernetes仅需要负责管理业务负载,无需关注底层虚拟机的运维和容量问题。
如果您正在进行Kubernetes集群的选型,强烈推荐您选用ACK Serverless集群。ACK Serverless集群可以为您提供完全基于ECI运行的Kubernetes集群,为您的在线和离线业务、仿真环境、开发测试环境等提供免运维、低成本的Kubernetes环境。
低成本
您无需购买节点,无需对集群进行节点维护和容量规划,即可直接部署容器应用,并且只需要为应用配置的CPU和内存资源量进行按需付费。
免运维
您可以直接使用Kubernetes API或者命令行直接管理容器应用。同时,ACK Serverless集群集成阿里云各类服务,可以帮助您简化Kubernetes的开发,专注于应用构建而非基础架构运维。
在ACK Serverless集群中,您无需手动部署虚拟节点,可以直接创建ECI Pod。ACK Serverless集群中的所有Pod均基于ECI运行在安全隔离的容器运行环境中,每个Pod对应一个ECI实例。更多信息,请参见ACK Serverless概述。
ACK集群(混合使用ECI和ECS)
ACK是全球首批通过Kubernetes一致性认证的服务平台,提供高性能的容器应用管理服务。它整合了阿里云虚拟化、存储、网络和安全能力,简化集群的搭建和扩容等工作,让您专注于容器化的应用的开发与管理。
如果您已经建立了ACK集群,可以通过部署虚拟节点(基于VK)的方式来使用ECI。有了虚拟节点后,当您的ACK集群需要扩容时,无需规划节点的计算容量,可以直接在虚拟节点下按需创建ECI,ECI与集群中真实节点上的Pod之间网络互通。建议您将长时间运行的业务负载的弹性流量部分调度至ECI,这可以缩短弹性扩容的时间,减少扩容成本,并充分利用已有资源。当业务流量下降后,您可以快速释放部署在ECI上的Pod,从而降低使用成本。
在ACK集群中,您需要手动部署虚拟节点(基于VK),才能创建ECI Pod。虚拟节点上的Pod均基于ECI运行在安全隔离的容器运行环境中,每个Pod对应一个ECI实例。更多信息,请参见ACK产品概述。
如果您在阿里云ECS上或者线下IDC自建了Kubernetes集群,需要自行部署虚拟节点(基于VNode)来使用ECI,更多信息,请参见自建Kubernetes集群对接ECI。
管理工具
通过VK将ECI以虚拟节点的方式接入Kubernetes集群后,您可以通过以下方式管理Kubernetes集群及ECI实例的运行情况:
弹性容器实例控制台
您可以通过弹性容器实例控制台查看ECI实例的运行情况。操作步骤如下:
登录弹性容器实例控制台。
在顶部菜单栏左上角处选择地域。
在容器组页面,您可以查看该地域下已经创建的ECI实例。
容器服务管理控制台
您可以通过容器服务管理控制台来操作ACK Serverless集群或ACK集群,并查看ECI实例的运行情况。查看ECI实例的操作步骤如下:
登录容器服务管理控制台。
在左侧导航栏单击集群。
在集群列表中找到想要查看的集群,单击集群ID进入详情页面。
在左侧导航栏,选择工作负载>容器组。
在容器组页面,选择命名空间,您可以查看该命名空间下的ECI实例。
阿里云CloudShell
您可以通过阿里云提供的CloudShell来访问Kubernetes集群,使用Kubectl命令来管理集群。具体操作,请参见在CloudShell上通过kubectl管理Kubernetes集群。
kubectl客户端
您可以通过kubectl客户端在本地计算机来访问远端的Kubernetes集群,使用Kubectl命令来管理集群。具体操作,请参见通过kubectl连接Kubernetes集群。
功能限制和说明
基于公有云的安全性和虚拟节点本身带来的限制,ECI目前还不支持Kubernetes中HostPath、DaemonSet等功能,具体如下表所示。
不支持的功能 | 说明 | 推荐替代方案 |
HostPath | 挂载本地宿主机文件到容器中 | 使用emptyDir、云盘或者NAS文件系统 |
HostNetwork | 将宿主机端口映射到容器上 | 使用type=LoadBalancer的负载均衡 |
DaemonSet | 在容器所在宿主机上部署Static Pod | 通过sidecar形式在Pod中部署多个镜像 |
type=NodePort的Service | 将宿主机端口映射到容器上 | 使用type=LoadBalancer的负载均衡 |
通过容器服务Kubernetes版使用ECI时,请注意以下事项:
请先将容器镜像上传到容器镜像仓库中,便于镜像拉取。推荐您使用阿里云容器镜像服务ACR,并使用专有网络的镜像地址(registry-vpc.xxx)。
支持Deployment、ReplicaSet、Job、Cronjob、StatefulSet等常见controller,可以直接运行。
支持利用PrivateZone实现服务发现,建议您在创建集群时开启PrivateZone。
支持负载均衡,即配置type=LoadBalancer的Service。
使用流程
ACK Serverless集群
ACK集群
创建ACK集群。具体操作,请参见创建ACK托管集群。
部署ack-virtual-node组件生成虚拟节点。具体操作,请参见部署ACK虚拟节点组件。
说明如果想要使用ECI相关的新功能,您需要升级ack-virtual-node组件。
关于ack-virtual-node组件的版本信息,请参见ack-virtual-node。
关于如何升级组件,请参见管理组件。
准备容器镜像。
创建ECI Pod。更多信息,请参见ECI Pod概述。
调度方式
对于ACK Serverless集群,整个集群运行在ECI上,无需进行调度。对于混合使用ECI和ECS节点的ACK集群,您可以根据需要将Pod调度到ECI上运行,调度方式如下:
手动调度Pod到ECI
通过配置Pod Label、添加nodeSelector,配置topologySpreadConstraints等方式,可以手动将Pod调度到指定的虚拟节点,以ECI来运行。
自动调度Pod到ECI
eci-profile提供ECI Scheduler能力,基于Mutating Webhook机制实现了一种新的调度机制,即在eci-profile配置文件中,您可以声明需要匹配的Namespace或者Pod的Label,对于Label能够匹配上的Pod,将被自动调度到ECI。更多信息,请参见配置eci-profile。
使用ECI功能
在Kubernetes集群中创建Pod到ECI时,为充分使用ECI提供的功能,在不改变Kubernetes语义的前提下,您可以根据需求为Pod添加Annotation。Annotation需添加到Pod级别的metadata中,支持的Annotation列表以及配置示例,请参见ECI Pod Annotation。
您可以在创建Pod时手动添加Annotation,也可以配置eci-profile,实现自动添加Annotation到Label能够匹配上的Pod。