阿里云弹性容器实例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和对应的交换机。建议选择多个交换机实现多可用区功能,系统将根据库存情况优先在资源充足的可用区下创建实例。
- 安全组:每个ECI实例必须属于一个安全组。通过配置安全组规则,可以允许或禁止ECI实例对公网或私网的访问。
- 容器组规格:直接选择vCPU和内存规格,该方式可以提供更好的弹性和资源供应能力。如有GPU等特殊需求,可以指定特定的ECS规格。
- 容器镜像:支持Docker Hub、阿里云容器镜像服务ACR等仓库。
- 高级配置:可开启自动匹配镜像缓存来加速实例启动,也可声明数据卷并挂载到容器中。
确认配置信息后选中服务协议,点击确认订单即可完成创建。
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)
# 设置容器镜像
container = {
'Name': 'nginx',
'Image': 'nginx:latest',
'Cpu': 2.0,
'Memory': 4.0
}
request.set_Containers([container])
# 发送请求
response = client.do_action_with_exception(request)
print(json.loads(response))此外,ECI还提供了ExecContainerCommand接口,用于获取进入容器执行命令的WebSocketUri或HttpUrl。HttpUrl的有效时间为30秒,需要在接口调用后的30秒内在浏览器中打开,即可进入容器内部。通过这种方式进入容器的操作将会被审计,审计信息包括请求时间、实例ID和请求IP等,最多保留一个月。
2.3 方式三:ACK Serverless集群(完全基于ECI)
ACK Serverless集群是阿里云容器服务中完全基于ECI运行的Kubernetes集群。依托ECI免运维的特性,Kubernetes完全依托ECI来构建,所有Pod均运行在ECI上,Kubernetes仅需要负责管理业务负载,无需关注底层虚拟机的运维和容量问题。
在ACK Serverless集群中,您无需手动部署虚拟节点,可以直接创建ECI Pod。集群中的所有Pod均基于ECI运行在安全隔离的容器运行环境中,每个Pod对应一个ECI实例。
如果您正在进行Kubernetes集群的选型,强烈推荐选用ACK Serverless集群,它可以为在线和离线业务、仿真环境、开发测试环境等提供免运维、低成本的Kubernetes环境。您无需购买节点,无需对集群进行节点维护和容量规划,即可直接部署容器应用,并且只需要为应用配置的CPU和内存资源量进行按需付费。
2.4 方式四:ACK集群及自建Kubernetes集群(混合使用)
如果您已经建立了ACK集群(以ECS节点为主),可以通过部署虚拟节点(基于Virtual Kubelet)的方式来使用ECI。有了虚拟节点后,当ACK集群需要扩容时,无需规划节点的计算容量,可以直接在虚拟节点下按需创建ECI实例。
建议将长时间运行的业务负载的弹性流量部分调度至ECI,这可以缩短弹性扩容的时间,减少扩容成本,并充分利用已有资源。当业务流量下降后,可以快速释放部署在ECI上的Pod,从而降低使用成本。
对于在本地IDC或者阿里云ECS上自建的Kubernetes集群,同样可以通过部署虚拟节点(VNode)的方式来使用ECI。VNode对标原生Kubernetes节点,内置了virtual-kubelet、kube-proxy等组件,兼容原生Kubernetes节点API。当有Pod调度到VNode上时,VNode会自动创建并管理底层的ECI资源。
VNode按个数计费,每个VNode会有一个常驻节点,相当于2 vCPU、8 GiB的ECI实例。费用计算公式为:单个VNode费用 = (2 × vCPU单价 + 8 × 内存单价) × 运行时长。
需要注意的是,基于公有云的安全性和虚拟节点本身带来的限制,ECI目前还不支持Kubernetes中的HostPath、DaemonSet、HostNetwork、type=NodePort的Service等功能。推荐使用emptyDir、云盘或NAS文件系统替代HostPath,使用type=LoadBalancer的负载均衡替代HostNetwork和NodePort。
对于混合使用普通节点和虚拟节点的Kubernetes集群,可以通过配置nodeSelector和tolerations、指定nodeName的方式手动将Pod调度到VNode;也可以部署eci-profile组件,自定义配置Selector,将满足条件的Pod自动调度到VNode。
3. ECI存储卷配置
ECI实例支持挂载数据卷作为持久化存储。目前ECI支持挂载以下几类数据卷:
- 云盘(Disk):数据块级别的存储产品,具有低时延、高性能、持久性、高可靠等特点。适用于高I/O、低延时场景如数据库、中间件等,但云盘为非共享存储,仅支持挂载到一个实例上。
- NAS(文件存储):可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统。NAS为共享存储,支持多个实例同时访问一份数据。适用于共享数据场景、大数据分析场景、Web应用场景以及日志持久化存储场景。
- OSS(对象存储):海量、安全、低成本、高可靠的存储空间,适合存储非结构化数据如图片、音视频等。OSS为共享存储,支持多个实例同时访问。需要注意的是,OSS数据卷通过ossfs挂载,是一种通过FUSE方式模拟实现的用户态文件系统,对于写场景稳定性欠佳,在写场景中推荐使用NAS。
- EmptyDir:临时目录,用于临时存放数据,便于容器之间共享数据。数据会随实例删除而清空。
- ConfigFile:配置文件,用于向ECI实例注入配置数据。
使用数据卷时,需要先声明数据卷,然后将数据卷挂载到容器中。以下是通过OpenAPI挂载NAS数据卷的配置示例:
# 调用CreateContainerGroup接口时,通过Volume参数声明数据卷
{
"Volume": [
{
"Name": "nas-volume",
"Type": "NFSVolume",
"NFSVolume": {
"Server": "xxxxx.cn-hangzhou.nas.aliyuncs.com",
"Path": "/",
"ReadOnly": false
}
}
],
"Container": [
{
"Name": "app",
"Image": "nginx:latest",
"VolumeMount": [
{
"Name": "nas-volume",
"MountPath": "/data",
"ReadOnly": false
}
]
}
]
}挂载OSS数据卷时,需要使用FlexVolume插件:
{
"Volume": [
{
"Name": "oss-demo",
"Type": "FlexVolume",
"FlexVolume": {
"Driver": "alicloud/oss",
"Options": "{\"bucket\":\"test-bucket\",\"url\":\"oss-cn-hangzhou.aliyuncs.com\",\"ramRole\":\"ram-xxx\"}"
}
}
]
}其中Options参数包括:bucket(OSS Bucket名称)、url(OSS访问域名Endpoint)、path(挂载时相对Bucket根文件的目录结构,默认为/)。
4. 镜像缓存加速
为加速ECI实例的创建速度,ECI提供了镜像缓存(ImageCache)功能。您可以预先将需要使用的镜像制作成缓存快照,后续基于镜像缓存来创建ECI实例,可以避免或减少镜像层的下载,从而提升ECI实例的创建速度。
在控制台创建ECI实例时,可以在容器组配置区域展开高级配置,然后选中"自动匹配镜像缓存"。系统将自动匹配和使用最佳的镜像缓存;如果没有匹配到,系统将自动创建一个镜像缓存。开启自动匹配镜像缓存后,如果匹配到了镜像缓存,则可以加速ECI实例创建;如果没有完全匹配的镜像缓存,则系统会自动创建一个镜像缓存,该镜像缓存不收取创建费用,可用于后续创建同类镜像的ECI实例。
通过OpenAPI创建ECI实例时,可以通过AutoMatchImageCache参数来开启自动匹配镜像缓存。使用镜像缓存后,镜像拉取耗时几乎为0,实例启动时间可达秒级。
5. 日志与监控配置
在ECI实例详情页面,您可以查看事件和日志来排查问题,也可以查看CPU利用率等监控信息了解实例运行情况。云监控会自动获取您当前阿里云账号下的云产品资源,您可以在云监控控制台查看ECI实例的监控图表,也可以设置报警规则,以便及时得知异常监控数据并进行处理。
对于日志的持久化存储,推荐使用NAS数据卷挂载到容器的日志目录。此外,ECI还支持与日志服务SLS集成,通过配置Logtail采集容器日志并投递到SLS进行检索和分析。
6. 弹性伸缩配置
对于运行同一业务的ECI实例,可以将其加入到弹性伸缩组中。设置伸缩组最小实例数来保证日常业务运行,设置伸缩组最大实例数来避免成本超标。同时可以设置伸缩规则,配合定时任务或者报警任务来实现自动扩缩容组内的ECI实例。
创建伸缩组时,需选择"ECI"作为伸缩组类型。伸缩配置是弹性伸缩自动创建ECI实例时所使用的模板,可以通过控制台设置基础信息(如镜像、实例规格、网络、安全组等),并启用高级特性。当触发弹性扩张活动后,弹性伸缩将以该伸缩配置为模板自动创建ECI实例。
7. 安全与权限管理
ECI实例必须属于一个安全组。安全组是一种虚拟防火墙,具备状态检测和数据包过滤功能。通过配置安全组规则,可以允许或禁止安全组内的ECI实例对公网或私网的访问。如果需要从公网访问VPC内的ECI实例,需要在安全组中开放对应的端口。
在使用RAM用户创建ECI实例时,需要进行授权才能操作。建议遵循最小权限原则,为不同角色授予不同权限策略,避免使用主账号AccessKey进行日常操作。
8. 计费与成本优化
ECI默认采用按量付费模式,按秒计费、按小时出账。涉及收费的资源包括:ECI实例的计算资源(vCPU和内存)、镜像缓存、数据缓存、临时存储空间等。
成本优化建议包括:
- 合理选择规格:根据实际业务需求选择vCPU和内存规格,避免资源浪费。
- 使用镜像缓存:自动创建的镜像缓存不收取创建费用,可加速实例启动并减少重复拉取镜像带来的费用。
- 弹性伸缩:通过设置伸缩组最小和最大实例数,在保证业务的同时控制成本上限。
- 按需释放:业务流量下降后及时释放ECI实例,避免闲置资源计费。
- 节省计划:对于长期运行的稳定业务,可考虑购买节省计划(通用型)进一步降低成本。
9. 实战案例:部署一个完整的Web应用
以下是一个完整的实战案例,展示如何通过ACK Serverless集群部署一个Nginx Web应用:
# 1. 创建ACK Serverless集群(通过控制台或CLI)
# 2. 准备部署YAML文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 80
targetPort: 80
# 3. 应用配置
kubectl apply -f nginx-deployment.yaml
# 4. 查看Pod状态(每个Pod对应一个ECI实例)
kubectl get pods -o wide
# 5. 获取服务对外访问地址
kubectl get svc nginx-service在ACK Serverless集群中,每个Pod都对应一个ECI实例,系统会自动完成底层的资源调度和容器运行,无需关心节点维护。
10. 常见问题与最佳实践
镜像拉取慢怎么办? 使用镜像缓存功能,将常用镜像预先制作成缓存快照。在控制台创建实例时开启"自动匹配镜像缓存",或通过API设置AutoMatchImageCache参数。
如何持久化存储容器数据? 根据场景选择合适的数据卷类型:需要共享存储选NAS或OSS,需要高性能低延迟选云盘,临时共享选EmptyDir。
ECI实例如何对外提供服务? 在安全组中开放对应的端口;在Kubernetes中使用type=LoadBalancer的Service;通过绑定EIP或使用NAT网关让ECI实例访问公网。
自建Kubernetes集群如何对接ECI? 通过部署虚拟节点(VNode)来对接。VNode内置了virtual-kubelet、kube-proxy等组件,兼容原生Kubernetes节点API。
ECI不支持哪些Kubernetes功能? 不支持HostPath、DaemonSet、HostNetwork、type=NodePort的Service等。推荐使用替代方案:emptyDir/云盘/NAS替代HostPath,LoadBalancer替代HostNetwork和NodePort。
如何监控ECI实例的运行状态? 通过云监控控制台查看监控图表,设置报警规则;在ECI实例详情页面查看事件、日志和CPU利用率等信息。
结语
阿里云弹性容器实例ECI作为Serverless容器运行服务,提供了从控制台图形化操作到OpenAPI编程调用、从ACK Serverless全托管到自建集群混合部署的完整对接方案。通过合理利用镜像缓存加速、数据卷持久化存储、弹性伸缩和日志监控等能力,开发者可以快速构建高弹性、免运维、成本可控的容器化应用。无论是初创项目的快速验证,还是大型系统的弹性扩容,ECI都能提供灵活而强大的基础设施支撑。



