Kaniko:无需高权限即可在Kubernetes与Google Container Builder中构建容器镜像

640?wxfrom=5&wx_lazy=1


通常标准Dockerfile的生成需要与Docker后台进程交互访问,因此需要本机root权限。在Docker后台进程无法暴露的场景下(例如Kubernetes集群,详细内容可以参见这儿[1])生成容器镜像就很困难。
Kaniko[2]就是为解决这类问题而生的,它是一个不许root特权就可以从Dockerfile中生成镜像,并将镜像推送到注册库的开源工具。因为Kaniko不需要特权,因此用户可以在标准Kubernetes集群、Google Kubernetes引擎、以及其它无法访问Docker后台进程环境中运行。

Kaniko工作原理

640?wxfrom=5&wx_lazy=1


Kaniko运行时被当做自带三个参数的容器,它们是:Dockerfile,创建上下文和最终镜像需要上传入的注册库。镜像是新创建的,只包含静态Go库和需要下拉上载镜像的配置文件。

640?wxfrom=5&wx_lazy=1


Kaniko执行器获取并展开基础镜像(在Dockerfile中FROM一行定义),按顺序执行每条命令,每条命令执行完毕后为文件系统做快照。快照是在用户空间创建,并与内存中存在的上一个状态进行对比,任何改变都会作为对基础镜像的修改,并以新层级对文件系统进行增加扩充,并将任何修改都写入镜像的元数据中。当Dockerfile中每条命令都执行完毕后,执行器将新生成的镜像上载入注册库中。
Kaniko解压文件系统,执行命令,在执行器镜像的用户空间中对文件系统做快照,这都是为什么Kaniko不需要特权访问的原因,以上操作中没有引入任何Docker后台进程或者CLI操作。

在Kubernetes集群中运行Kaniko

640


在标准Kubernetes集群中运行Kaniko,Pod配置文件需要做如下修改。本例中,Google Cloud Storage[3] bucket提供创建上下文。
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

640


运行Google Cloud Container Builder[6],可以在配置文件中定义如下步骤:
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执行器会根据步骤定义自动创建和上载镜像。

与其它工具比较

640


与Kaniko类似的工具包括img[7]和orca-build[8]。这些工具都是从Dockerfile开始生成镜像,但是采用不同方法和安全策略。在非特权环境下,img以非特权用户身份在容器中生成镜像,而Kaniko则是以root用户身份在容器内生成镜像。orca-build工具则是通过包装runC,用内核空间技术执行RUN命令生成镜像,kinako可以在容器内以root身份执行命令来实现同样的功能。

结论

640


在我们的GitHub库[9]中可以找到很多相关文档,如果发现发现bug可以开问题记录。并可以在Google group[10]中找到我们。
相关链接:
  1. https://github.com/kubernetes/kubernetes/issues/1806

  2. https://github.com/GoogleCloudPlatform/kaniko

  3. https://cloud.google.com/storage/

  4. https://kubernetes.io/docs/concepts/configuration/secret/

  5. https://github.com/GoogleCloudPlatform/kaniko

  6. https://cloud.google.com/container-builder/docs/

  7. https://github.com/genuinetools/img

  8. https://github.com/cyphar/orca-build

  9. https://github.com/GoogleCloudPlatform/kaniko

  10. https://groups.google.com/forum/#!forum/kaniko-users


原文链接:https://cloudplatform.googleblog.com/2018/04/introducing-kaniko-Build-container-images-in-Kubernetes-and-Google-Container-Builder-even-without-root-access.html
Kubernetes入门与进阶实战培训

640


本次培训内容包括:Docker基础、容器技术、Docker镜像、数据共享与持久化、Docker三驾马车、Docker实践、Kubernetes基础、Pod基础与进阶、常用对象操作、服务发现、Helm、Kubernetes核心组件原理分析、Kubernetes服务质量保证、调度详解与应用场景、网络、基于Kubernetes的CI/CD、基于Kubernetes的配置管理等, 点击了解具体培训内容

640?


5月11日正式上课,点击阅读原文链接即可报名。

猜你喜欢

转载自blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/80014492