前言:
在云原生时代中, 容器镜像是一切应用分发的基础载体, 除了 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://yq.aliyun.com/articles/693541