前言:
在云原生时代中,容器镜像是一切应用分发的基础载体,除了dockerhub作为流行的镜像仓库外,各大公有云厂商也都提供了功能丰富镜像仓库服务,如ACR(Aliyun Container Registry), GCR(Goolge Container Registry),构建容器镜像已是所有开发者必须掌握的基础实践能力。
无论开发者选择在本地使用docker完成基本的镜像构建,还是使用CI/CD服务(如Jenkins),本质上都是遵循“pull -> build -> push”的过程,完成镜像的构建、分发和同步等操作。
本文介绍了一种新的面向开发者的简单镜像构建实践,基于阿里云Serverless Kubernetes容器服务,可以自动化而且低成本的构建容器镜像,以便让开发者了解如何使用Serverless运行CI/CD和自动化任务。
why serverless kubernetes?
容器镜像的构建是需要计算资源的,开发者在本地使用docker pull/build/push时,其计算资源是本地开发机器,如果开发者在传统kubernetes集群中部署Jenkins或Gitlab-runner服务,其计算资源也是需要持续运行。但是,容器镜像的构建基本属于高度动态的行为,往往是定时或者条件触发引起的操作,所以为了动态的构建操作而维护一个固定的计算资源池对成本是不利的。
Serverless Kubernetes不同与传统基于节点的k8s集群,serverless集群中只有pod运行时才会收费,意味着只有在构建镜像时用户才需要付费,当构建结束时,也就停止计费。所以在成本上与传统k8s集群或ecs部署的方式相比显著减少。
Kaniko
在Serverless Kubernetes集群中,pod没有privileged权限,无法访问主机上的docker daemon,也就无法使用docker in docker方案进行镜像的操作,那么如何在kubernetes集群中不依赖宿主机的Docker情况下构建镜像呢?显然这是一个通用需求,社区也有了推荐的方案:kaniko。
kaniko的工作原理与docker build类似,但是不依赖docker daemon,在pod中完成Dockfile各层的解析和build,这使得pod不需要privileged权限也可以完成镜像的pull/build/push。
实践示例:定时同步容器镜像
下面让我们使用Serverless Kubernetes和Kaniko实现一个简单的镜像build实验:定时同步镜像到国内ACR。
步骤1: 创建Serverless Kubernetes集群
登陆容器服务控制台, 5s即可完成Serverless集群创建。(如果是国外的源镜像仓库,可以选择美西区域)
步骤2: 创建secret,配置ACR的用户名密码,用于推送镜像到ACR
可登陆cloudshell操作如下命令。
#docker login registry.cn-hangzhou.aliyuncs.com
...
#kubectl create secret generic regsecret --from-file=/root/.docker/config.json
...
步骤3: 创建定时任务CronJob
在控制台选择模版创建如下定时任务,每小时同步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!
更多参考信息
- Serverless Kubernetes快速部署jenkins环境及执行流水线构建: https://yq.aliyun.com/articles/685219
- kaniko intro:https://cloud.google.com/blog/products/gcp/introducing-kaniko-build-container-images-in-kubernetes-and-google-container-builder-even-without-root-access