经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
云原生之旅 - 12)使用 Kaniko 在 Kubernetes上构建 Docker 容器镜像
来源:cnblogs  作者:WadeXu  时间:2022/11/19 17:14:17  对本文有异议

前言

前一篇文章【云原生之旅 - 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中构建镜像,docker privileged,更安全的方式构建容器镜像
 
### 本文同步发表于知乎 https://zhuanlan.zhihu.com/p/584805862
 

原理

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

准备

我们需要在Kubernetes 里创建一个 docker-registry 类型的 secret,后面会挂载到 kaniko container,这样kaniko才有权限push image到Docker Hub registry
  1. 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

  1. kind: Pod
  2. spec:
  3. containers: # list of containers that you want present for your build, you can define a default container in the Jenkinsfile
  4. - name: kaniko
  5. image: gcr.io/kaniko-project/executor:v1.9.0-debug # include shell
  6. imagePullPolicy: IfNotPresent
  7. command:
  8. - /busybox/cat
  9. tty: true
  10. resources:
  11. limits:
  12. cpu: 500m
  13. memory: 1024Mi
  14. volumeMounts:
  15. - name: kaniko-secret
  16. mountPath: /kaniko/.docker
  17. volumes:
  18. - name: kaniko-secret
  19. secret:
  20. secretName: dockercred
  21. items:
  22. - key: .dockerconfigjson
  23. 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.
  1. pipeline {
  2. options {
  3. timeout(time: 10, unit: 'MINUTES')
  4. buildDiscarder(logRotator(numToKeepStr: '10', daysToKeepStr: '7'))
  5. }
  6.  
  7. agent {
  8. kubernetes {
  9. idleMinutes 3 // how long the pod will live after no jobs have run on it
  10. yamlFile 'Jenkins/kaniko-demo/build-pod.yaml' // path to the pod definition relative to the root of our project
  11. }
  12. }
  13. stages {
  14. stage('Kaniko Build and Push Docker Image') {
  15. steps {
  16. script {
  17. dir('Jenkins/kaniko-demo') {
  18. container('kaniko') {
  19. sh """
  20. /kaniko/executor --context `pwd` --destination wadexu007/demo-app:1.0.5
  21. """
  22. }
  23. }
  24. }
  25. }
  26. }
  27.  
  28. }
  29. }

完整例子参考我的 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`

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

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

 

原文链接:https://www.cnblogs.com/wade-xu/p/16883616.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号