阿里云弹性容器实例ECI对接使用完全指南:从快速上手到生产级实践

阿里云弹性容器实例ECI对接使用完全指南:从快速上手到生产级实践

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实例前需要完成以下准备工作:已开通弹性容器实例服务、访问控制(RAM)服务并完成相关RAM角色授权;已在合适的地域下创建专有网络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') # 设置容器规格(vCPU和内存) request.set_Cpu(2.0) request.set_Memory(4.0) # 设置容器镜像 request.set_Image('nginx:latest') # 发送请求 response = client.do_action_with_exception(request) print(json.loads(response))

调用CreateContainerGroup接口时,可以通过InstanceType参数指定实例规格,既可以指定vCPU和内存规格,也可以直接指定ECS规格如ecs.c6.xlarge。如需使用GPU实例,在通过InstanceType参数指定ECS GPU实例规格的基础上,必须通过容器属性中的GPU参数指定容器使用的GPU个数。

创建ECI实例时,还可以通过PrivateIpAddress参数指定实例的私网IP地址,通过EipInstanceId参数绑定已有EIP,或通过AutoCreateEip和EipBandwidth参数创建并绑定一个EIP。

2.3 方式三:ACK Serverless集群(完全基于ECI)

ACK Serverless集群是完全基于ECI运行的Kubernetes集群。在ACK Serverless集群中,您无需手动部署虚拟节点,即可直接创建ECI Pod,集群中的每个Pod均对应一个ECI实例。

ACK Serverless集群可以为您提供完全基于ECI运行的Kubernetes环境,为在线和离线业务、仿真环境、开发测试环境等提供免运维、低成本的Kubernetes环境。您无需购买节点,无需对集群进行节点维护和容量规划,即可直接部署容器应用,并且只需要为应用配置的CPU和内存资源量进行按需付费。您可以直接使用Kubernetes API或者命令行直接管理容器应用,ACK Serverless集群集成阿里云各类服务,可以帮助您简化Kubernetes的开发,专注于应用构建而非基础架构运维。

使用流程如下:创建ACK Serverless集群;准备容器镜像;创建应用(可通过容器服务控制台创建,或在CloudShell上通过kubectl创建)。

2.4 方式四:ACK集群(混合使用ECI和ECS)及自建Kubernetes集群

ACK集群默认是基于ECS运行的Kubernetes集群。如果您已经建立了ACK集群,可以通过部署虚拟节点(基于Virtual Kubelet技术)的方式来使用ECI。有了虚拟节点后,当您的ACK集群需要扩容时,无需规划节点的计算容量,可以直接在虚拟节点下按需创建ECI,ECI与集群中真实节点上的Pod之间网络互通。建议您将长时间运行的业务负载的弹性流量部分调度至ECI,这可以缩短弹性扩容的时间,减少扩容成本,并充分利用已有资源。当业务流量下降后,您可以快速释放部署在ECI上的Pod,从而降低使用成本。

在ACK集群中使用ECI的流程如下:创建ACK集群;部署ack-virtual-node组件产生虚拟节点;准备容器镜像;创建应用。

如果您在本地IDC或者阿里云ECS上自建了Kubernetes集群,同样可以通过部署虚拟节点(VNode)的方式来使用ECI。VNode对标原生Kubernetes节点,内置了virtual-kubelet、kube-proxy等组件,兼容原生Kubernetes节点API。当有Pod调度到VNode上时,将在ECI上运行。ECI提供了VNodectl命令行工具,方便接入和管理VNode。

在混合使用ECI和普通节点的场景下,一般可以通过配置Pod Label、配置Namespace Label和配置ECI弹性调度等方式将Pod调度到ECI。给Pod添加alibabacloud.com/eci=true的标签,Pod将以ECI方式运行,并且所在的节点是虚拟节点。ACK集群中的虚拟节点默认带有virtual-kubelet.io/provider=alibabacloud:NoSchedule的污点,需要在Pod中增加对应的容忍度才能调度到虚拟节点上。

3. ECI网络与安全组配置

ECI实例目前只能部署在VPC网络中。交换机CIDR块中的IP地址数量决定了可以在该交换机中创建的ECI实例的最大数量,因此在创建ECI实例之前需要规划好交换机的CIDR块。

安全组是一种虚拟防火墙,具备状态检测和数据包过滤能力,用于在云端划分安全域。通过添加安全组规则,您可以控制安全组内ECI实例的入流量和出流量。一个安全组可以管理同一个VPC内的多个ECI实例,一个ECI实例必须属于一个安全组。

创建ECI实例时,必须要指定安全组。调用CreateContainerGroup接口创建ECI实例时,可以通过SecurityGroupId参数来指定安全组。创建成功的ECI实例不支持修改安全组,如果想要变更安全组,需要重新创建ECI实例。

安全组分为普通安全组和企业安全组。如果您对整体规模和运维效率有较高需求,建议使用企业安全组,相比普通安全组,企业安全组大幅提升了组内支持容纳的实例数量,简化了规则配置方式。

对于安全组内的ECI实例,您可以添加安全组规则来控制其出入流量:当ECI实例需要与所在安全组之外的网络进行通信时,可以添加允许访问的安全组规则实现网络互通;在运行ECI实例的过程中,发现部分请求来源有恶意攻击行为时,可以添加拒绝访问的安全组规则实现网络隔离。如果需要从公网访问VPC内的ECI实例,需要在安全组中开放对应的端口。

当ECI需要访问RDS等数据库服务时,可以在RDS白名单中添加VPC或交换机网段,属于该网段的ECI实例均可访问该RDS实例;也可以在RDS白名单中添加安全组,该安全组中的ECI实例均可以访问该RDS实例。

4. ECI存储卷挂载

ECI支持挂载多种存储卷类型,包括OSS对象存储和云盘等。

4.1 挂载OSS

OSS是阿里云提供的海量、安全、低成本、高可靠的存储空间,适合存储非结构化数据(如图片、音视频等)。部署阿里云CSI插件后,可以在自建的Kubernetes集群使用阿里云OSS作为Volume。挂载OSS时仅支持静态数据卷。OSS为共享存储,一个OSS Bucket可以挂载到多个Pod上。不支持动态挂载OSS,即OSS不支持动态创建PV。挂载目录中建议存放的文件数不超过1000个,文件数量过多时OSSFS会占用大量内存,可能导致Pod发生OOM。

以下是使用PVC方式静态挂载OSS到ECI Pod的YAML示例:

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" path: "/" ramRole: ""

相关参数说明如下:driver配置为ossplugin.csi.alibabacloud.com,表示使用阿里云OSS CSI插件;volumeHandle为PV的唯一标识符,与metadata中的name保持一致;bucket为OSS Bucket的名称,目前只支持挂载Bucket,不支持挂载Bucket下的子目录或文件;url为OSS的接入域名(Endpoint)。

挂载OSS时支持定制化参数输入,例如-o max_stat_cache_size=0代表禁用属性缓存,每次访问文件都会从OSS中获取最新的属性信息;-o allow_other代表允许其他用户访问挂载的文件系统。

4.2 挂载云盘

部署阿里云CSI插件后,可以在自建的Kubernetes集群使用阿里云云盘作为Volume。使用PVC方式挂载云盘时,支持静态数据卷和动态数据卷。云盘只能挂载到同一可用区的VNode上运行的ECI Pod。

5. ECI监控、日志与事件

5.1 查看监控信息

在ECI实例详情页面,可以查看CPU利用率、内存利用率、网络流量、磁盘使用情况等监控信息。云监控会自动从ECI实例采集资源指标,您可以在云监控控制台中查看指标图表,跟踪实例运行状况。

您可以针对ECI实例的一个或多个监控指标设置报警规则(例如CPU利用率高于80%),当监控数据符合报警规则时,云监控会自动发送报警通知,便于您及时了解资源运行状态,处理异常情况。云监控支持监控ECI实例的CPU利用率、内存利用率、存储空间容量等指标。

5.2 采集日志到SLS

ECI支持对接阿里云日志服务SLS,将ECI日志采集到SLS中。ECI支持通过容器的环境变量传入日志相关的自定义配置,实现通过SLS自动采集容器日志。仅在创建ECI实例时才能通过环境变量自定义配置日志采集,更新实例时传入的日志相关环境变量不会生效。

以下是通过环境变量配置日志采集的示例:

apiVersion: v1 kind: Pod metadata: name: eci-log-demo spec: containers: - name: app image: nginx:latest env: - name: aliyun_logs_logstore value: "stdout" - name: aliyun_logs_logstore_project value: "your-project-name" - name: aliyun_logs_logstore_logstore value: "your-logstore-name"

5.3 查看事件

在实例详情页面的事件页签下,可以查看当前实例对应的最近50条事件。事件列表展示事件名称、类型(Normal/Warning)、描述、开始时间和结束时间等信息。通过查看事件可以快速定位和排查实例运行中的问题。

6. ECI高级特性

6.1 镜像缓存加速

镜像缓存功能用于加速实例创建。使用镜像缓存创建ECI实例可以加速拉取镜像,减少ECI实例的启动耗时。您可以预先将需要使用的镜像制作成缓存快照,然后基于该快照来创建ECI实例,避免或减少镜像层的下载,从而提升实例的创建速度。经实测,以使用Docker Hub的Flink镜像(约386.26 MB)创建Pod为例,正常创建过程中镜像准备阶段需要耗时50秒,使用镜像缓存后大幅缩短了启动时间。

开启自动匹配镜像缓存后,如果匹配到了镜像缓存,则可以加速ECI实例创建;如果没有完全匹配的镜像缓存,则系统会自动创建一个镜像缓存,该镜像缓存不收取创建费用,可用于后续创建同类镜像的ECI实例。调用CreateContainerGroup接口创建ECI实例时,可以通过AutoMatchImageCache参数来开启自动匹配镜像缓存。在控制台创建时,可以在容器组配置区域展开高级配置,然后选中自动匹配镜像缓存。

6.2 弹性伸缩

对于运行同一业务的ECI实例,可以将其加入到弹性伸缩组中。设置伸缩组最小实例数来保证日常业务运行,设置伸缩组最大实例数来避免成本超标,同时可以设置伸缩规则,配合定时任务或报警任务来实现自动扩缩容组内的ECI实例。弹性伸缩会实时统计指标数据,在统计值满足报警条件时触发报警,并在生效周期内自动执行伸缩规则,动态调整伸缩组内的ECI实例数量。

创建伸缩组时需选择"ECI"作为伸缩组类型。在伸缩配置中,可以设置容器组的CPU、内存规格。通过Kubernetes YAML文件方式也可以为ECI类型的伸缩组创建伸缩配置。

7. ECI成本优化实践

ECI采用按量按秒计费模式,用户仅为容器实际配置的CPU和内存资源付费。以下是一些成本优化的实操建议:

合理选择规格:大部分场景下,如果没有特殊的规格需求(如GPU、本地盘等),推荐指定vCPU和内存来创建ECI实例。系统会尝试使用多种ECS规格进行支撑,以提供比ECS单规格更好的弹性和资源供应能力。

利用内网访问:当ECI需要访问同地域的其他阿里云服务(如OSS、RDS等)时,优先使用内网Endpoint进行访问,避免产生外网流量费用。

快速释放闲置资源:业务流量下降后,及时释放部署在ECI上的Pod,避免为闲置资源付费。配合弹性伸缩组的自动缩容策略,可以实现资源的自动回收。

使用镜像缓存:通过镜像缓存加速实例启动,不仅提升了用户体验,还能减少实例运行时长从而降低成本。

混合部署策略:将长时间运行的稳定业务负载部署在ECS节点上,将弹性流量部分调度至ECI。这样可以充分利用已有资源,同时享受ECI的弹性能力。

8. 总结

阿里云弹性容器实例ECI作为Serverless容器运行服务,通过控制台、OpenAPI/SDK、ACK Serverless集群、ACK集群及自建Kubernetes集群四种方式,为不同技术栈和业务场景的用户提供了灵活的接入选择。ECI与Kubernetes生态的深度融合,使得用户可以在享受Serverless免运维体验的同时,充分利用Kubernetes的编排、负载均衡、定时调度等能力。

在实际生产应用中,镜像缓存加速、日志服务SLS采集、云监控告警、存储卷挂载等高级特性为ECI提供了完备的可观测性和数据持久化能力。合理的网络与安全组配置保障了ECI实例的网络安全,而弹性伸缩和成本优化策略则帮助用户在保证业务弹性的同时有效控制成本。

无论是快速上手的个人开发者,还是需要大规模容器化部署的企业用户,ECI都能提供安全、弹性、免运维的容器运行环境。随着Serverless容器技术的不断发展,ECI将成为云原生应用部署的重要基础设施之一。

常见问题解答

问:ECI实例和普通ECS实例有什么区别?
答:ECI是Serverless容器运行服务,用户无需管理底层服务器,只需提供Docker镜像即可运行容器,按容器实际消耗的CPU和内存按秒计费。而ECS是虚拟机服务,用户需要自行管理和维护操作系统及运行环境。

问:ECI实例如何与Kubernetes集群对接?
答:ECI可以通过三种方式与Kubernetes对接:ACK Serverless集群(完全基于ECI)、ACK集群中部署虚拟节点(混合使用ECI和ECS)、自建Kubernetes集群中部署VNode。

问:创建ECI实例时必须配置哪些网络资源?
答:创建ECI实例时必须指定VPC、交换机(VSwitch)和安全组。ECI实例只能部署在VPC网络中,一个ECI实例必须属于一个安全组。

问:如何加速ECI实例的启动速度?
答:可以使用镜像缓存功能,将需要使用的镜像预先制作成缓存快照,基于该快照创建ECI实例可以避免或减少镜像层的下载。在控制台创建时可开启"自动匹配镜像缓存",或通过API的AutoMatchImageCache参数开启。

问:ECI支持哪些存储类型?
答:ECI支持挂载OSS对象存储和云盘作为数据卷。OSS为共享存储,支持ReadWriteMany访问模式;云盘支持静态和动态数据卷挂载。

问:如何采集ECI容器的日志?
答:ECI支持对接阿里云日志服务SLS,通过容器的环境变量传入日志相关的自定义配置,实现自动采集容器日志到SLS中。日志相关配置仅在创建ECI实例时生效。