Kaniko[2]就是为解决这类问题而生的,它是一个不许root特权就可以从Dockerfile中生成镜像,并将镜像推送到注册库的开源工具。因为Kaniko不需要特权,因此用户可以在标准Kubernetes集群、Google Kubernetes引擎、以及其它无法访问Docker后台进程环境中运行。
Kaniko工作原理
Kaniko执行器获取并展开基础镜像(在Dockerfile中FROM一行定义),按顺序执行每条命令,每条命令执行完毕后为文件系统做快照。快照是在用户空间创建,并与内存中存在的上一个状态进行对比,任何改变都会作为对基础镜像的修改,并以新层级对文件系统进行增加扩充,并将任何修改都写入镜像的元数据中。当Dockerfile中每条命令都执行完毕后,执行器将新生成的镜像上载入注册库中。
Kaniko解压文件系统,执行命令,在执行器镜像的用户空间中对文件系统做快照,这都是为什么Kaniko不需要特权访问的原因,以上操作中没有引入任何Docker后台进程或者CLI操作。
在Kubernetes集群中运行Kaniko
apiVersion: v1
kind: Pod
metadata:
name: kaniko
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:latest
args: ["--dockerfile=<path to Dockerfile>",
"--bucket=<GCS bucket>",
"--destination=<gcr.io/$PROJECT/$REPO:$TAG"]
volumeMounts:
- name: kaniko-secret
mountPath: /secret
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /secret/kaniko-secret.json
restartPolicy: Never
volumes:
- name: kaniko-secret
secret:
secretName: kaniko-secret
本例中,需要挂载Kubernetes secret[4](其中包含了将镜像上载入注册库中所需的授权),可以参见下载secret的方法[5]。
在Google Cloud Container Builder中运行Kaniko
steps:
- name: gcr.io/kaniko-project/executor:latest
args: ["--dockerfile=<path to Dockerfile>",
"--context=<path to build context>",
"--destination=<gcr.io/[PROJECT]/[IMAGE]:[TAG]>"]
Kaniko执行器会根据步骤定义自动创建和上载镜像。
与其它工具比较
结论
相关链接:
https://github.com/kubernetes/kubernetes/issues/1806
https://github.com/GoogleCloudPlatform/kaniko
https://cloud.google.com/storage/
https://kubernetes.io/docs/concepts/configuration/secret/
https://github.com/GoogleCloudPlatform/kaniko
https://cloud.google.com/container-builder/docs/
https://github.com/genuinetools/img
https://github.com/cyphar/orca-build
https://github.com/GoogleCloudPlatform/kaniko
https://groups.google.com/forum/#!forum/kaniko-users
Kubernetes入门与进阶实战培训
5月11日正式上课,点击阅读原文链接即可报名。