本文介绍Custom Container Runtime(自定义容器运行环境)的背景介绍、使用限制、工作原理、HTTP Server配置要求、日志格式、冷启动优化以及计费说明。

背景介绍

在云原生时代,容器镜像已经逐渐变成了软件部署和开发的标准工具。为了简化开发者体验、提升开发和交付效率,函数计算提供了Custom Container Runtime。开发者将容器镜像作为函数的交付物,通过HTTP协议和函数计算系统交互。使用Custom Container Runtime简化了以下场景:
  • 低成本迁移,无需修改代码或是重新编译二进制、共享对象(*.so),保持开发和线上环境一致。
  • 解压前镜像大小最大支持1 GB,避免代码和依赖分离,简化分发和部署。
  • 容器镜像天然的分层缓存,提高代码上传和拉取效率。
  • 标准可复现的第三方库引用、分享、构建、代码上传、存储和版本管理,丰富的开源生态CI/CD交付体验。

工作原理

Custom Container Runtime工作原理与Custom Runtime基本相同。函数计算系统初始化实例前会扮演该函数的服务角色(Service Role),获得临时用户名和密码并拉取镜像。拉取成功后根据指定的启动命令(Command)和参数(Args)启动您定义的HTTP Server。该Server监听您设置的监听端口(CAPort),并与函数计算系统交互,请求处理逻辑即为函数逻辑。函数计算将事件调用和HTTP调用转发至该Server触发函数逻辑执行。principle

HTTP Server配置要求

  • 监听在任何IP(0.0.0.0)的指定端口(端口可以读取环境变量FC_SERVER_PORT,默认为9000)。
  • HTTP Server需配置connection keep-alive
  • 请求超时时间设置为15分钟以上。
  • HTTP Server需要在25秒内启动完毕。

函数日志格式

Custom Container Runtime的日志格式与Custom Runtime的日志格式一致,详情请参见日志格式

冷启动优化最佳实践

相比于代码包,容器镜像依赖的基础环境带来了额外的数据下载和解压的时间,为了更好的冷启动体验,推荐您使用以下最佳实践:

  • 容器镜像地址推荐使用与函数计算同地域的VPC镜像地址,例如registry-vpc.cn-hangzhou.aliyuncs.com/fc-demo/helloworld:v1beta1,以获得最优的镜像拉取延时和稳定性。
  • 镜像最小化,基于类似alphe或ubuntu这样的最小镜像或者是其他镜像中精简版本构建自定义镜像。仅保留必要的依赖,删除不必要的文档,数据和其他文件。
  • 容器镜像配合预留实例一起使用,详情请参见预留实例简介
  • 在资源允许和线程安全的情况下,搭配单实例多并发一同使用,可避免不必要的冷启动,同时降低成本。

计费说明

Custom Container Runtime的计费项与其他类型Runtime的计费项一致,详情请参见计费说明。其中,镜像资源使用量中的执行时间是从仓库拉取镜像到拉取镜像结束的时长。例如,1024 MB内存的实例拉取镜像耗时10秒,则本次拉取镜像的资源消耗量为10 CU-秒。容器镜像在一段时间一定范围内有缓存,因此并不是每次冷启动一定会产生镜像拉取的费用。

使用限制

  • 镜像大小:
    • 若您的函数执行内存小于1 GB,则解压前镜像大小不能超过256 MB。
    • 若您的函数执行内存不小于1 GB,则解压前镜像大小不能超过1024 MB。
  • 镜像仓库:目前仅支持阿里云容器镜像服务默认实例的镜像,未来会支持其他镜像仓库。
  • 镜像访问:目前仅支持同账号同地域(Region)下私有镜像仓库读取,未来会支持读取公共镜像。
  • 容器内文件读写权限:容器run-as-user UID在10000到10999中随机分配。容器中默认/tmp目录可写,其他目录读写权限由镜像文件系统控制。如果运行的UID没有读写某个文件的权限,则需要在Dockerfile中修改。
  • 容器可写层存储空间限制:512 MB,排除只读镜像层,容器产生的数据最大不能超过该限制。
    说明 容器可写层数据不是持久化的,数据会随着容器被销毁而删除。如果需要持久化存储,可以考虑使用函数计算挂载NAS,详情请参见配置NAS,或者使用其他共享存储服务,例如对象存储表格存储等。