前言

前一篇文章【云原生之旅 - 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
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`

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

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

云原生之旅 - 12)使用 Kaniko 在 Kubernetes上构建 Docker 容器镜像的更多相关文章

  1. 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents

    前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...

  2. 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

    前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...

  3. 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

    前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...

  4. 云原生之旅 - 7)部署Terrform基础设施代码的自动化利器 Atlantis

    前言 前面有几篇文章讲述了如何使用Terraform创建资源 (基础设施即代码 Terraform 快速入门, 使用 Terraform 创建 Kubernetes) 以及 Kubernetes时代的 ...

  5. 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

    前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...

  6. 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes

    前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...

  7. 云原生之旅 - 2)Docker 容器化你的应用

    前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...

  8. 云原生之旅 - 4)基础设施即代码 使用 Terraform 创建 Kubernetes

    前言 上一篇文章我们已经简单的入门Terraform, 本篇介绍如何使用Terraform在GCP和AWS 创建Kubernetes 资源. Kubernetes 在云原生时代的重要性不言而喻,等于这 ...

  9. 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress

    前言 前一篇文章讲述了基于Nginx代理的Kuberenetes Ingress Nginx[云原生时代的网关 Ingress Nginx]这次给大家介绍下基于Envoy的 Emissary Ingr ...

  10. 8.云原生之Docker容器镜像构建最佳实践浅析

    转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...

随机推荐

  1. docker-compose入门--翻译

    在这一页,你将学习到如何构建一个简单的python的web应用,并通过Docker compose来运行.这个应用程序使用的是Flask框架,并维护着一个存储在reids里的点击计数器.由于这个案例使 ...

  2. 《!--suppress ALL --> 在Android XML 文件中的用途是什么?

    <!--suppress ALL --> 在Android XML 文件中的用途是什么? 警告一次又一次地出现在谷歌地图的 XML 文件中,但是当我使用时,所有警告都被禁用.那么压制所有评 ...

  3. ClangFormat配置备份

    { # 语言 Language: Cpp, # 水平对齐表达式的操作数 AlignOperands: true, # 不对包含头文件进行排序 SortIncludes: false, # 对齐注释 A ...

  4. 利用C库函数time()打印当前系统动态时间

    引入日期和时间头文件 #include<time.h> 用time_t定义一个存储时间的变量获取时间(以秒为单位) time_t t; time (&t); //获取1970年以来 ...

  5. iNeuOS工业互联网操作系统,面向4个领域颁发第一批技术认证资质

    为了更好的紧密合作.利益多赢和共建生态.iNeuOS工业互联网操作系统面向:仪器仪表.双碳环保.核能科学与工程和钢铁冶金领域颁发第一批技术认证资质,一共21名同志在项目实施过程中表现突出,从iNeuO ...

  6. 入门Python,看完这篇就行了!

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/3bbc3146.html 你好,我是测试蔡坨坨. 众所周知,Python语法简洁.功能强大,通过简单的代码就能实现很多实用. ...

  7. flannel跨主网络通信方案(UDP、VXLAN、HOST-GW)详解

  8. 创建一个 autocomplete 输入系统 - 前端 + 后端

    文章转载自:https://mp.weixin.qq.com/s/uqchdrkhdFsof0ZFtECujg 我们经常在网站搜索输入时,会帮我们提醒自动完成的功能,比如: 图片 当我们在百度上搜索 ...

  9. Beats: 使用 Filebeat 进行日志json结构化 - Python

    文章转载自:https://elasticstack.blog.csdn.net/article/details/106688240

  10. centos yum安装docker

    cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo_bak wget -O /etc/yum.repos.d/CentOS-Base.r ...