1. 弹性容器实例ECI概述
阿里云弹性容器实例(Elastic Container Instance,简称ECI)是阿里云结合容器技术与Serverless理念推出的容器运行服务。使用ECI部署容器应用时,用户无需购买和管理底层的云服务器ECS,只需提供打包好的Docker镜像,即可在阿里云上直接运行容器。ECI采用按量按秒计费模式,用户仅为容器实际配置的CPU和内存资源付费,无需为闲置的节点资源买单。
一个ECI实例在概念上等同于Kubernetes中的一个Pod。ECI负责Pod底层容器资源的调度和管理,而Kubernetes则在ECI之上作为PaaS层管理Deployment、Service、StatefulSet、CronJob等业务负载。这种分层架构使得ECI既能提供Serverless的免运维体验,又能与Kubernetes生态无缝融合。
ECI的核心价值体现在三个方面:首先是极致的弹性,基于Virtual Kubelet技术,ECI可以虚拟节点的形式接入Kubernetes集群,使集群获得远超节点计算容量的弹性能力;其次是真正的免运维,用户无需规划集群容量、无需维护节点,彻底摆脱底层基础设施的运维负担;最后是精细的成本控制,按Pod运行时间计费,业务高峰时弹性扩容、低谷时快速释放,实现资源利用的最大化。
需要先登录阿里云控制台,点击:阿里云控制台
2. ECI的四种对接使用方式
根据业务场景和技术栈的不同,ECI提供了四种灵活的使用方式:控制台、OpenAPI/SDK、ACK Serverless集群、ACK集群及自建Kubernetes集群。
2.1 方式一:通过控制台直接使用ECI
控制台是最直观的入门方式,适合新手用户快速体验ECI的容器运行能力。在弹性容器实例控制台的容器组页面,点击"创建弹性容器组"即可开始配置。
创建实例时需要配置以下核心参数:选择付费模式(按量付费)和实例类型;选择地域、专有网络VPC和对应的交换机;指定容器镜像(支持Docker Hub、ACR等仓库);配置CPU和内存规格。在高级配置中,可以开启自动匹配镜像缓存来加速实例启动,也可以声明数据卷并挂载到容器中。确认配置信息后选中服务协议,点击确认订单即可完成创建。
在控制台中,您还需要选择安全组。安全组是一种虚拟防火墙,具备状态检测和数据包过滤功能,用于在云端划分安全域。一个ECI实例必须属于一个安全组。如果需要从公网访问VPC内的ECI实例,需要在安全组中开放对应的端口。建议选择多个交换机实现多可用区功能,系统将根据库存情况优先在资源充足的可用区下创建实例。
2.2 方式二:通过OpenAPI/SDK编程调用
对于不使用Kubernetes的开发者,ECI提供了完整的OpenAPI和SDK(支持Java、Python、Go)。核心接口是CreateContainerGroup,通过该接口可以编程式地创建、管理和释放ECI实例。
以下是通过Python SDK创建ECI实例的完整示例:
from aliyunsdkcore.client import AcsClient from aliyunsdkeci.request.v20180808 import CreateContainerGroupRequest import json # 初始化客户端 client = AcsClient( access_key_id='your-access-key-id', access_secret='your-access-secret', region_id='cn-hangzhou' ) # 构建请求 request = CreateContainerGroupRequest.CreateContainerGroupRequest() request.set_AcceptFormat('json') # 设置实例基本信息 request.set_ContainerGroupName('my-eci-demo') request.set_VSwitchId('vsw-xxxxxxxx') request.set_SecurityGroupId('sg-xxxxxxxx') # 设置容器规格 - CPU和内存 request.set_Cpu(2.0) request.set_Memory(4.0) # 设置容器镜像 containers = [{ 'Name': 'nginx', 'Image': 'nginx:latest', 'Cpu': 2.0, 'Memory': 4.0, 'Ports': [{'Port': 80, 'Protocol': 'TCP'}] }] request.set_Containers(containers) # 设置实例数量 request.set_Count(1) # 发送请求 response = client.do_action_with_exception(request) print(json.loads(response))
除了CreateContainerGroup,ECI还提供了UpdateContainerGroup(更新容器组)、DescribeContainerGroups(批量查询容器组信息)等核心API。您可以通过OpenAPI门户进行调试,也可以安装SDK进行开发。
2.3 方式三:ACK Serverless集群(完全基于ECI)
ACK Serverless集群是完全基于ECI运行的Kubernetes集群。在ACK Serverless集群中,您无需手动部署虚拟节点,可以直接创建ECI Pod,每个Pod对应一个ECI实例。
使用ACK Serverless集群的工作流程如下:创建ACK Serverless集群;准备容器镜像;在ACK控制台创建应用,或通过kubectl在CloudShell中创建应用;获取KubeConfig文件后通过kubectl客户端创建应用。
ACK Serverless集群最适合无需管理节点、希望极简运维的场景,例如微服务架构、Job任务、CI/CD流水线等。
2.4 方式四:ACK集群及自建Kubernetes集群通过虚拟节点对接
如果您已经拥有ACK集群(基于ECS)或自建的Kubernetes集群(运行在本地IDC或阿里云ECS上),可以通过部署虚拟节点(VNode)来使用ECI。
VNode基于Kubernetes社区的Virtual Kubelet技术,以虚拟节点的形式接入到Kubernetes集群中,使得集群可以轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。VNode注册为原生Kubernetes节点,内置了virtual-kubelet和kube-proxy,完全兼容Kubernetes API。
在ACK集群中使用ECI时,您需要手动部署ack-virtual-node组件来创建虚拟节点。部署完成后,您可以通过为Pod添加 toleration 来将Pod调度到虚拟节点上运行。每个运行在虚拟节点上的Pod对应一个ECI实例。
对于自建Kubernetes集群,ECI提供了vnodectl命令行工具来自动化VNode的部署和配置。您需要在集群中部署eci-profile组件并配置selector,匹配selector的Pod将自动被调度到VNode上运行。需要注意的是,VNode按个数计费,每个VNode会有一个常驻节点,相当于一个2 vCPU、8 GB的ECI实例,会产生相应的ECI实例费用。
3. 网络配置
ECI实例运行在您指定的专有网络VPC中,因此网络配置是使用ECI的基础。在创建ECI实例时,您需要选择VPC和对应的交换机。建议选择多个交换机以实现多可用区功能,最多可选择10个交换机以提高创建成功率。
如果希望ECI实例能够访问公网,您有两种选择:为该VPC绑定NAT网关并配置SNAT规则;或开启ECI自动创建并绑定弹性公网IP(EIP)功能。对于需要对外提供服务的场景,建议使用NAT网关方式,这样多个实例可以共享一个EIP,更加经济高效。
在安全组配置方面,您需要根据业务需求开放相应的端口。例如,如果您的容器运行了一个Web服务并监听80端口,您需要在安全组中添加入方向规则允许TCP 80端口的访问。
如果您在自建Kubernetes集群中通过VNode使用ECI,还需要注意网络互通问题。部署CSI-Provisioner组件时,如果您的Kubernetes集群部署在线下IDC,请确保已打通IDC与阿里云的网络。
4. 存储管理
ECI支持多种存储方式以满足不同的数据持久化需求。
4.1 挂载云盘
云盘是块存储设备,适合需要高性能随机读写的场景。云盘只能挂载到相同可用区的VNode节点下的ECI Pod,不支持跨可用区挂载。您可以通过PVC方式挂载云盘,支持静态数据卷和动态数据卷。
4.2 挂载NAS
NAS是文件存储服务,适合需要共享数据的场景,多个Pod可以同时挂载同一个NAS文件系统。在创建ECI实例时,您可以在存储配置中打开存储开关并添加NAS数据卷,选择容器组中已添加的NAS数据卷并输入容器内挂载路径。
4.3 挂载OSS
OSS是阿里云提供的对象存储服务,适合存储非结构化数据(如图片、音视频等)。部署阿里云CSI插件后,您可以在自建的Kubernetes集群使用阿里云OSS作为Volume。挂载OSS时仅支持静态数据卷,您需要使用PVC方式静态挂载OSS到ECI Pod上。
以下是使用PVC方式挂载OSS的PV配置示例:
apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv labels: alicloud-pvname: oss-pv spec: capacity: storage: 25Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: oss-pv volumeAttributes: bucket: "oss-test" url: "oss-cn-beijing-internal.aliyuncs.com" otherOpts: "-o max_stat_cache_size=0 -o allow_other" ramRole: ""
需要注意的是,OSS为共享存储,一个OSS Bucket可以挂载到多个Pod上。挂载目录中建议存放的文件数不要超过1000个,文件数量过多时OSSFS会占用大量内存,可能导致Pod发生OOM事件。
4.4 挂载本地盘
如果您需要高性能的本地存储,可以指定ECS本地盘规格来创建ECI Pod,并将本地盘挂载到ECI Pod上。您可以在Pod metadata中添加Annotation(如 k8s.aliyun.com/eci-use-specs: ecs.i2g.2xlarge)来指定本地盘规格。ECI会自动将本地盘组合成RAID 0阵列并挂载到Pod中指定的路径。
5. 镜像缓存与数据缓存
5.1 镜像缓存加速实例启动
使用镜像缓存(ImageCache)创建ECI实例可以加速拉取镜像,减少ECI实例的启动耗时。镜像缓存的基本原理是预先将需要使用的镜像制作成缓存快照,然后基于该快照来创建ECI实例,避免或减少镜像层的下载。
在控制台中,您可以在容器组配置区域展开高级配置,然后选中"自动匹配镜像缓存"。系统将自动匹配和使用最佳的镜像缓存。如果匹配到了镜像缓存,则可以加速ECI实例创建;如果没有完全匹配的镜像缓存,则系统会自动创建一个镜像缓存,该镜像缓存不收取创建费用,可用于后续创建同类镜像的ECI实例。
对于大模型推理等场景,镜像和模型文件通常都很大,使用镜像缓存可以显著缩短实例启动时间。
5.2 数据缓存优化大模型加载
数据缓存(DataCache)可以提前拉取业务所需数据,以便在创建ECI实例时可以直接挂载使用。使用数据缓存创建ECI实例时,您可以指定数据缓存的Bucket,并通过HostPath的方式直接挂载数据存储路径。此时,系统会自动创建并挂载一块按量付费的云盘,该云盘的容量等于数据缓存大小,随实例一起创建和释放。
数据缓存特别适合大模型推理服务的部署场景。在容器化的大模型推理服务部署中,主要包含容器创建与启动、镜像拉取、模型文件下载和推理服务加载模型并启动几个阶段。由于大模型推理服务的镜像和模型都较大,使用数据缓存可以节约模型下载的时间,降低网络资源消耗,提升系统效率。
6. 日志与监控
6.1 日志采集
ECI支持对接阿里云日志服务SLS,将ECI日志采集到SLS中。ECI提供了多种日志采集方式:通过环境变量方式配置日志采集;通过Sidecar模式采集日志;通过SLS CRD方式采集日志(适用于ACK Serverless集群)。
通过环境变量方式配置日志采集时,您可以在容器的环境变量中传入日志相关的自定义配置。需要注意的是,仅在创建ECI实例时才能通过环境变量自定义配置日志采集,更新实例时传入的日志相关环境变量不会生效。
通过Sidecar模式采集日志时,在每个ECI实例中除业务容器外,还运行一个Sidecar容器作为日志Agent,用于采集业务容器产生的日志。
对于ACK Serverless集群,推荐优先使用SLS CRD的方式采集日志。通过SLS CRD开启日志采集仅对后续创建的ECI Pod生效,如果想要采集存量Pod的日志,需要对存量Pod进行一次滚动发布。
6.2 监控与告警
在实例详情页面,您可以查看事件、日志和监控信息来了解实例运行情况。监控信息包括CPU利用率、内存利用率、网络流量、磁盘使用情况等。
您还可以针对ECI实例的一个或多个监控指标设置报警规则。例如,当CPU利用率高于80%时,云监控会自动发送报警通知,便于您及时了解资源运行状态并处理异常情况。云监控支持监控ECI实例的CPU利用率、内存利用率、存储空间容量等指标。
通过结合弹性伸缩和云监控,您可以实现基于实时工作负载的自动扩缩容。弹性伸缩会实时统计指标数据,在统计值满足报警条件时触发报警,并在生效周期内自动执行伸缩规则,动态调整伸缩组内的ECI实例数量。
7. 成本优化
7.1 抢占式实例
ECI支持抢占式实例(Spot Instance),对于短时间运行的Job任务以及部分扩展性和容错率高的无状态应用,使用抢占式实例可以有效地节约实例使用成本。抢占式实例是低价的竞价型计算资源,您可以通过出价的方式使用阿里云上闲置的资源来运行容器。在弹性容器实例控制台创建抢占式ECI实例时,在基本配置部分将计费方式设置为Spot Instance即可。
7.2 伸缩组成本优化
ECI类型的伸缩组开启成本优化功能后,伸缩组在扩容前会进行ECI实例询价、ECS实例规格匹配、价格对比等措施,根据您应用的ECI配置来自动匹配价格更低的指定ECS规格来创建ECI实例。伸缩组在扩容时会比较ECI实例价格与可用的ECS实例规格,并选择符合您配置要求的最低价格ECS实例规格。
7.3 按需计费与资源规划
ECI采用按量按秒计费,您仅为容器实际配置的CPU和内存资源付费。这意味着您可以根据业务需求精确配置每个容器的资源规格,避免资源浪费。同时,ECI实例支持最多20个容器,您可以为每个容器定义自定义的vCPU和内存规格,但所有容器的资源总和不得超过ECI实例的vCPU和内存限制。
在成本优化实践中,建议您:对于短时运行的批处理任务使用抢占式实例;利用伸缩组的成本优化功能自动选择价格更低的规格;合理配置容器资源规格避免过度申请;利用镜像缓存和数据缓存减少重复拉取带来的网络费用。
8. 生产级最佳实践
8.1 多可用区高可用部署
为实现可用区级容灾,建议将ECI实例分散部署在单个地域的多个可用区。在创建ECI实例时选择多个可用区的交换机,系统会根据库存情况优先在资源充足的可用区下创建实例。结合负载均衡(ALB或CLB)进行智能流量调度,可以实现跨可用区的高可用架构。
8.2 镜像加速最佳实践
对于大规模部署场景,建议提前创建镜像缓存以加速实例启动。如果您使用阿里云容器镜像服务ACR,可以配置自动化构建规则并启用镜像缓存加速。在ECI实例的配置中,将重启策略设置为Always可以确保新实例拉取最新镜像。
8.3 安全最佳实践
在使用RAM用户操作ECI时,需要进行授权才能操作。建议遵循最小权限原则,仅为RAM用户授予必要的权限。同时,合理配置安全组规则,仅开放业务必需的端口。
8.4 弹性伸缩实践
结合弹性伸缩ESS和负载均衡SLB,您可以根据实时工作负载动态添加或移除ECI实例,提高资源利用率、增加系统可用性并降低成本。在伸缩组配置中,您需要设置最小实例数和最大实例数,并配置相应的伸缩规则和报警任务。
对于ACK环境,您可以通过配置虚拟节点和Pod调度策略,实现ECI与ECS的混合部署。日常负载运行在ECS节点上,突发流量时自动溢出到ECI虚拟节点,既保证了成本效益又满足了弹性需求。
9. 常见问题解答
问1:ECI实例支持多少个容器?
一个ECI实例最多支持20个容器。您可以为每个容器定义自定义的vCPU和内存规格,但所有容器的资源总和不得超过ECI实例的vCPU和内存限制。
问2:如何进入ECI容器内部执行命令?
您可以通过调用ExecContainerCommand API获取WebSocketUri或HttpUrl来进入容器。HttpUrl的有效时间为30秒,您需要在接口调用后的30秒内在浏览器中打开HttpUrl即可进入容器内部。您也可以通过弹性容器实例控制台使用Workbench连接容器进行交互式命令调试。
问3:镜像缓存和数据缓存有什么区别?
镜像缓存用于加速容器镜像的拉取,减少实例启动时间;数据缓存用于提前拉取业务所需数据(如大模型文件),在创建实例时直接挂载使用。两者都可以显著提升实例启动效率,但针对的是不同类型的数据。
问4:ECI如何与自建Kubernetes集群集成?
您需要在自建Kubernetes集群中部署虚拟节点VNode。VNode基于Virtual Kubelet技术,注册为原生Kubernetes节点。您可以使用vnodectl命令行工具自动化VNode的部署和配置。部署完成后,通过eci-profile配置selector,匹配的Pod将自动调度到VNode上运行。
问5:如何降低ECI的使用成本?
您可以通过以下方式降低成本:使用抢占式实例运行短时Job任务和容错率高的无状态应用;开启伸缩组的成本优化功能自动选择价格更低的规格;合理配置容器资源规格避免过度申请;利用镜像缓存和数据缓存减少重复拉取带来的网络费用。
问6:ECI实例如何访问公网?
您有两种方式让ECI实例访问公网:为该VPC绑定NAT网关并配置SNAT规则;或开启ECI自动创建并绑定弹性公网IP功能。如果您的ECI实例需要对外提供服务,还需要在安全组中开放对应的端口。