容器镜像相比于代码包有更好的可移植性和更丰富的工具链生态,但其自带的与应用无关的数据极易使镜像臃肿,GB级镜像会导致分钟级冷启动。开启镜像加速可分两阶段共提速约90%,将分钟级的镜像拉取缩短至秒级。本文介绍使用ACR个人版实现镜像拉取加速的使用原理和配置方法等。

使用原理

对于运行环境为Custom Container且使用阿里云容器镜像服务ACR个人版的函数,每次创建或更新该类函数镜像并开启镜像加速功能时,函数计算会扮演服务RAM角色,用临时的AccessKey拉取镜像,并且转存至函数计算系统的加速镜像缓存服务中。转存结束后,函数中的自定义容器镜像拉取速度将会得到显著提升。

注意事项

  • 支持镜像拉取加速的地域有华北2(北京)、华北3(张家口)、华东1(杭州)、华东2(上海)、中国香港、新加坡(新加坡)、美国(硅谷)和美国(弗吉尼亚)。
  • 如果您同意开启镜像加速,则代表您同意并授权函数计算拉取您仓库内的镜像并转存至函数计算服务内部的加速缓存服务中。镜像数据将被加密,并且具备网络隔离和身份鉴权,以保证足够的数据安全性。开启该功能前,请确保将镜像转存在函数计算系统内部存储服务的操作符合您所在机构的安全规范和指导。
  • 在创建或更新使用ACR个人版镜像的函数后,由于转存镜像也有一定的时间消耗,在缓存镜像可用之前,仍然可能遇到缓存不命中的情况。加速镜像通常会在创建或更新函数后5分钟内完成。

配置方法

您可以在创建或更新函数时,通过以下方式配置镜像拉取加速:

  • 通过函数计算控制台配置该参数。详细操作,请参见使用控制台创建函数
    在更新函数的过程中配置镜像拉取加速的示例如下:container_acceleration
  • 通过Serverless Devs配置该参数。详细信息,请参见YAML规范
    在已有的CustomContainerConfig配置下添加accelerationType,该参数的取值如下:
    • Default:表示开启镜像拉取加速。
    • None:表示关闭镜像拉取加速。
    开启镜像拉取加速的参数配置示例如下:
    customContainerConfig:
      image: registry-vpc.<regionId>.aliyuncs.com/fc-demo/python-flask:[镜像版本号]
      accelerationType: Default

    完整步骤,请参见示例项目puppeteer-pdf

  • 通过SDK配置

查看镜像加速准备状态

您可以通过查看镜像加速准备状态,来判断当前被加速的镜像是否可用。您可以通过以下方式查看镜像加速准备状态:

  • 函数计算控制台的函数详情页面的函数配置页签,找到环境信息区域,即可查看镜像加速准备状态,取值如下:
    • 准备中:对应Preparing
    • 可用:对应Ready
    • 失败:对应Failed
    示例如下:get_accelerated_image_status
  • 调用GetFunction接口,根据返回的accelerationInfostatus参数判断当前镜像加速准备状态。主要的状态如下:
    • Preparing:加速正在准备中,这时调用会使用没有加速效果的原始镜像。
    • Ready:加速完成,后续函数调用会有加速效果。
    • Failed:加速失败。

版本控制最佳实践

如果您使用了ACR个人版并且开启了镜像加速,更新函数镜像会触发新的加速镜像转存。在加速镜像可用前的一段时间内,函数调用会拉取原始镜像从而失去函数加速运行效果。对此,您可参照以下流程通过管理函数管理版本的方式来体系化地发布函数:

  1. 更新函数,此时会连带更新服务的LATEST版本。
  2. 等待镜像加速准备状态从准备中状态至可用后,发布一个新的版本。
  3. 将别名切换到新的服务版本。

查看加速效果

冷启动镜像加速的效果分为两个阶段。

示例项目puppeteer-pdf中提供了一个使用Node.js Express结合Puppeteer将网页转换成PDF的示例。

加速前,端到端耗时66.51s。加速后,第一阶段仅需15.2s,速度提升77.1%;第二阶段加速后缩短至4.3s,冷启动速度再次提升71.6%,总共提升93.5%。示例代码如下:

time curl -H "x-fc-invocation-target: 2016-08-15/proxy/CustomContainerDemo/puppeteer-pdf-no-accl" https://$ACCOUNT_ID.$REGION.fc.aliyuncs.com/generate-pdf\?url\=http://example.com -o /tmp/fc-demo-puppeteer-pdf-no-accl.pdf

# Time spent: 0.06s user 0.09s system 0% cpu 1:06.51 total time

# 加速镜像第一次冷启动
curl -H "x-fc-invocation-target: 2016-08-15/proxy/CustomContainerDemo/puppeteer-pdf-accl" https://$ACCOUNT_ID.$REGION.fc.aliyuncs.com/generate-pdf\?url\=http://example.com -o /tmp/fc-demo-puppeteer-pdf-accl.pdf

# Time spent: 0.05s user 0.06s system 0% cpu 15.200 total time

# 相隔一段时间后的冷启动
curl -H "x-fc-invocation-target: 2016-08-15/proxy/CustomContainerDemo/puppeteer-pdf-accl" https://$ACCOUNT_ID.$REGION.fc.aliyuncs.com/generate-pdf\?url\=http://example.com -o /tmp/fc-demo-puppeteer-pdf-accl.pdf

# Time spent: 0.05s user 0.06s system 0% cpu 4.300 total time
说明 在测试过程中可能存在误差,请以实际情况为准。