云原生之旅 12 使用 Kaniko Docker 容器镜像

IT技术2年前 (2022)更新 IT大王
0

前言

前一篇文章【云原生之旅 – 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents】有讲到在Kubernetes Pod (Jenkins build agent) 里面构建 docker 容器镜像,当时我们采取了一种简单快速的方式来 run docker in docker,也就是 mount/var/run/docker.sock 到主机的 docker engine,这需要docker run在特权privileged 模式下,有很大的安全隐患。另外这种方式还有个很大的缺陷就是当一台机器上同时运行多个docker build agent时,会出现阻塞的情况,因为这一批agent用的都是宿主机上的同一个docker engine。

所以我们今天介绍一款专门用于Kubernetes 构建容器镜像的工具Kaniko,它是Google 创建的一个开源工具. 并且不需要 privileged access to the host,解决了前一种方式的缺陷。
关键词:使用Kaniko构建容器镜像,Run docker in docker, 在 Kubernetes上构建 Docker 容器镜像,无需特权在Kubernetes中构建镜像,dockerprivileged,更安全的方式构建容器镜像
### 本文同步发表于知乎https://zhuanlan.zhihu.com/p/584805862

原理

Kaniko会先提取基础镜像(Dockerfile FROM 之后的镜像)的文件系统,然后根据Dockerfile中所描述的,一条条执行命令,每一条命令执行完以后会在用户空间下面创建一个snapshot,并与存储与内存中的上一个状态进行比对,如果有变化,就将新的修改生成一个镜像层添加在基础镜像上,并且将相关的修改信息写入镜像元数据中。等所有命令执行完,kaniko会将最终镜像推送到指定的远端镜像仓库。

准备

我们需要在Kubernetes 里创建一个docker-registry 类型的 secret,后面会挂载到 kaniko container,这样kaniko才有权限push image到Docker Hub registry
kubectl -n jenkins create secret docker-registry dockercred 
--docker-server=https://index.docker.io/v1/ 
--docker-username=<dockerhub-username> 
--docker-password=<dockerhub-password>

使用Kaniko 构建镜像

Define kaniko container in Pod Template

并且挂载刚才建的 docker-registry类型的secret

kind: Pod
spec:
  containers:  # list of containers that you want present for your build, you can define a default container in the Jenkinsfile
    - name: kaniko
      image: gcr.io/kaniko-project/executor:v1.9.0-debug # include shell
      imagePullPolicy: IfNotPresent
      command:
        - /busybox/cat
      tty: true
      resources:
        limits:
          cpu: 500m
          memory: 1024Mi
      volumeMounts:
      - name: kaniko-secret
        mountPath: /kaniko/.docker
  volumes:
  - name: kaniko-secret
    secret:
        secretName: dockercred
        items:
        - key: .dockerconfigjson
          path: config.json

Jenkins pipeline

  • –context: This is the location of the Dockerfile.
  • –destination: You need to replace Docker Hub username `wadexu007` with your Docker Hub username for kaniko to push the image to the Docker Hub registry.
pipeline {
  options {
    timeout(time: 10, unit: 'MINUTES')
    buildDiscarder(logRotator(numToKeepStr: '10', daysToKeepStr: '7'))
  }
  agent {
    kubernetes {
      idleMinutes 3  // how long the pod will live after no jobs have run on it
      yamlFile 'Jenkins/kaniko-demo/build-pod.yaml'  // path to the pod definition relative to the root of our project 
    }
  }
stages { stage('Kaniko Build and Push Docker Image') { steps { script { dir('Jenkins/kaniko-demo') { container('kaniko') { sh """ /kaniko/executor --context `pwd` --destination wadexu007/demo-app:1.0.5 """ } } } } } } }

完整例子参考我的 Github Repo

### 本文同步发表于知乎https://zhuanlan.zhihu.com/p/584805862

测试

创建一个Pipeline job

Repository URL =https://github.com/wadexu007/learning_by_doing

Script Path =Jenkins/kaniko-demo/Jenkinsfile

Click `Build now`

云原生之旅 12 使用 Kaniko Docker 容器镜像

感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力

### 本文同步发表于知乎https://zhuanlan.zhihu.com/p/584805862

© 版权声明
好牛新坐标 广告
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章