在云原生时代中,容器镜像是一切应用分发的基础载体,除了dockerhub做为流行的镜像仓库外,各大公有云厂商也都提供了功能丰富镜像仓库服务,如ACR(Aliyun Container Registry), GCR(Goolge Container Registry),构建容器镜像已经是全部开发者必须掌握的基础实践能力。docker
不管开发者选择在本地使用docker完成基本的镜像构建,仍是使用CI/CD服务(如Jenkins),本质上都是遵循“pull -> build -> push”的过程,完成镜像的构建、分发和同步等操做。shell
本文介绍了一种新的面向开发者的简单镜像构建实践,基于阿里云Serverless Kubernetes容器服务,能够自动化并且低成本的构建容器镜像,以便让开发者了解如何使用Serverless运行CI/CD和自动化任务。json
容器镜像的构建是须要计算资源的,开发者在本地使用docker pull/build/push时,其计算资源是本地开发机器,若是开发者在传统kubernetes集群中部署Jenkins或Gitlab-runner服务,其计算资源也是须要持续运行。可是,容器镜像的构建基本属于高度动态的行为,每每是定时或者条件触发引发的操做,因此为了动态的构建操做而维护一个固定的计算资源池对成本是不利的。api
Serverless Kubernetes不一样与传统基于节点的k8s集群,serverless集群中只有pod运行时才会收费,意味着只有在构建镜像时用户才须要付费,当构建结束时,也就中止计费。因此在成本上与传统k8s集群或ecs部署的方式相比显著减小。app
在Serverless Kubernetes集群中,pod没有privileged权限,没法访问主机上的docker daemon,也就没法使用docker in docker方案进行镜像的操做,那么如何在kubernetes集群中不依赖宿主机的Docker状况下构建镜像呢?显然这是一个通用需求,社区也有了推荐的方案:kaniko。less
kaniko的工做原理与docker build相似,可是不依赖docker daemon,在pod中完成Dockfile各层的解析和build,这使得pod不须要privileged权限也能够完成镜像的pull/build/push。测试
下面让咱们使用Serverless Kubernetes和Kaniko实现一个简单的镜像build实验:定时同步镜像到国内ACR。ui
登录容器服务控制台, 5s便可完成Serverless集群建立。(若是是国外的源镜像仓库,能够选择美西区域)google
可登录cloudshell操做以下命令。阿里云
#docker login registry.cn-hangzhou.aliyuncs.com ... #kubectl create secret generic regsecret --from-file=/root/.docker/config.json ...
在控制台选择模版建立以下定时任务,每小时同步busybox镜像到ACR。
apiVersion: v1 kind: ConfigMap metadata: name: dockerfile-cm data: Dockerfile: | FROM busybox:latest --- apiVersion: batch/v1beta1 kind: CronJob metadata: name: kaniko-builder spec: schedule: "*/60 * * * *" jobTemplate: spec: template: spec: containers: - name: builder image: gcr.io/kaniko-project/executor:latest imagePullPolicy: Always args: - "--dockerfile=/configs/Dockerfile" - "--destination=registry.cn-hangzhou.aliyuncs.com/jovizhangwei/busybox:latest" volumeMounts: - name: dockerfile readOnly: true mountPath: "/configs/" - name: secrets readOnly: true mountPath: "/root/.docker/" volumes: - name: dockerfile configMap: name: dockerfile-cm - name: secrets secret: secretName: regsecret restartPolicy: OnFailure
待job执行后,可查看ACR镜像仓库,确认镜像已同步。
用户能够按照需求定制此模版文件,好比修改须要同步的镜像,添加build步骤等,也能够设置pod的资源限制(vcpu 0.25/0.5/1等), 以最小的计算成本完成同步任务。
经过上面的示例,咱们看到基于Serverless Kubernetes的按需付费特性,可使用很低的成本运行一些定时和CI/CD任务,而不用维护一个固定的计算资源池,其一样适用于压力测试、数据计算、工做流处理等其余场景。
Happy Hacking!