当前位置:网站首页>消除对特权账户的依赖使用Kaniko构建镜像
消除对特权账户的依赖使用Kaniko构建镜像
2022-08-03 19:46:00 【叶赫那拉 赫敏】
Kaniko项目最初于2018年由谷歌提出。Kaniko的创建之初是寻求在执行容器镜像构建时消除对特权账户的依赖。无特权的容器镜像构建是注重安全性的公司最需要的功能之一。这与在Kubernetes集群中构建容器镜像类似。
在了解如何使用Kaniko构建镜像之前,我们先了解一下几种构建镜像的方式。
docker构建镜像
docker build -t your_registry/your_repository:tag
然后用 docker push 将镜像推送到镜像仓库。
docker push your_registry/your_repository:tag
容器内构建镜像
docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/kaniko:/tmp/kaniko docker
- 挂载宿主机的socket文件到容器内部,然后在容器内部用 docker build 构建镜像
$ docker build -t dllhb/kaniko-test:v0.1 .
Sending build context to Docker daemon 5.632kB
Step 1/4 : FROM alpine:latest
latest: Pulling from library/alpine
89d9c30c1d48: Already exists
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Downloaded newer image for alpine:latest
---> 965ea09ff2eb
Step 2/4 : MAINTAINER <[email protected] xiaomage>
---> Running in 8a2b1dc13d6b
Removing intermediate container 8a2b1dc13d6b
---> bd535532278d
Step 3/4 : RUN apk add busybox-extras curl
---> Running in fc254ad3d088
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/5) Installing busybox-extras (1.30.1-r3)
Executing busybox-extras-1.30.1-r3.post-install
(2/5) Installing ca-certificates (20190108-r0)
(3/5) Installing nghttp2-libs (1.39.2-r0)
(4/5) Installing libcurl (7.66.0-r0)
(5/5) Installing curl (7.66.0-r0)
Executing busybox-1.30.1-r2.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 7 MiB in 19 packages
Removing intermediate container fc254ad3d088
---> 1bbe81600a67
Step 4/4 : CMD ["echo","Hello DevOps"]
---> Running in 4b92a6a4b37e
Removing intermediate container 4b92a6a4b37e
---> de712b8cd7e5
Successfully built de712b8cd7e5
Successfully tagged dllhb/kaniko-test:v0.1Sending build context to Docker daemon 5.632kB
Step 1/4 : FROM alpine:latest
latest: Pulling from library/alpine
89d9c30c1d48: Already exists
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Downloaded newer image for alpine:latest
---> 965ea09ff2eb
Step 2/4 : MAINTAINER <[email protected] xiaomage>
---> Running in 8a2b1dc13d6b
Removing intermediate container 8a2b1dc13d6b
---> bd535532278d
Step 3/4 : RUN apk add busybox-extras curl
---> Running in fc254ad3d088
由于docker依赖于 docker daemon 进程, docker daemon 进程是一个 Unixsocket 连接,且 /var/run/docker.sock 文件是root权限,
$ ls -ltr /var/run/docker.sock
lrwxr-xr-x 1 root daemon 69 Nov 26 15:13 /var/run/docker.sock
$ docker run --rm -it --privileged docker:18.06-dind
dind能够满足构建容器镜像的需求,但是从上面的命令看,有一个参数:–privileged 。意味着这个容器具有一些特权,他可能会看到宿主机上的一些设备,而且能够执行mount命令。
dind还有很多问题,只是方便docker开发人员来测试docker,所以官方也说running Docker inside Docker is generally not recommended。
上述两种方法,都能满足在容器内构建容器镜像且推送镜像至远端仓库的需求,但是从security角度来讲,需要root 权限(第一种方式),提供特权(第二种方式) 都使得风险增大,在Kubernetes 多租户的场景下,这种风险是不能接受的。那是否有一种不需要特殊权限,还能快速构建容器镜像的方法呢?答案就是下面讲的Kaniko。
Kaniko介绍
Kaniko是谷歌开源的一款用来构建容器镜像的工具。与docker不同,Kaniko 并不依赖于Docker daemon进程,完全是在用户空间根据Dockerfile的内容逐行执行命令来构建镜像,这就使得在一些无法获取 docker daemon 进程的环境下也能够构建镜像,比如在标准的Kubernetes Cluster上。

kaniko以容器镜像的方式来运行的,同时需要三个参数: Dockerfile、上下文、以及远端镜像仓库的地址
Kaniko会先提取基础镜像(Dockerfile FROM 之后的镜像)的文件系统,然后根据Dockerfile中所描述的,一条条执行命令,每一条命令执行完以后会在用户空间下面创建一个snapshot,并与存储与内存中的上一个状态进行比对,如果有变化,就将新的修改生成一个镜像层添加在基础镜像上,并且将相关的修改信息写入镜像元数据中。等所有命令执行完,kaniko会将最终镜像推送到指定的远端镜像仓库。
1. Kaniko Demo
这里选择的是 GitHub - traefik/whoami: Tiny Go webserver that prints os information and HTTP request to output 和
https://github.com/peishunwu/kaniko项目用来测试。访问该服务之后,接口会返回访。
对项目的要求是,通过 Dockerfile 能够直接编译得到镜像。一共有两个验证点:
① 能够构建镜像
② 构建的镜像能够运行
2. 在 Docker 上运行 Kaniko
生成推送镜像的凭证
以下说明:
YOUR_USERNAME(我的dockerhub账户)
YOUR_PASSWORD(我的dockerhub账户密码)
export AUTH=$(echo -n YOUR_USERNAME:YOUR_PASSWORD | base64 )
cat > config.json <<-EOF
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "${AUTH}"
}
}
}
EOF
构建镜像
docker run \
--interactive -v `pwd`/config.json:/kaniko/.docker/config.json gcr.io/kaniko-project/executor:latest \
--context git://github.com/traefik/whoami \
--dockerfile Dockerfile \
--destination=xxx/kaniko-demo:v1
context:构建需要的上下文。支持多种格式,S3、本地目录、标准输入、Git 仓库等
dockerfile:Dockerfile 路径
destination:构建后推送的镜像地址
其中–destination=xxx/kaniko-demo:v1:xxx/kaniko-demo我的dockerhub的仓库

在生产环境,可以配置缓存,用于加速镜像构建。
执行上一步的命令之后,可以看到如下输出:


如果没有问题会正常退出!
docker images|grep kaniko-demo

执行完命令,没有任何输出,符合预期。构建之后的镜像,直接被推送到了远程 Registry。
DockerHub 查看镜像,在 DockerHub 页面可以查看到推送的镜像:

docker run -d -p 8011:80 peishunwu/kaniko-demo:v1

curl localhost:8011

服务正常!
边栏推荐
猜你喜欢
随机推荐
ECCV2022 | 用于视频问题回答的视频图Transformer
JWT详解
In-depth understanding of JVM-memory structure
【统计机器学习】线性回归模型
【夜莺监控方案】08-监控msyql集群(prometheuse+n9e+mysqld_exporter)
MySQL Basics
网络协议-TCP、UDP区别及TCP三次握手、四次挥手
高性能计算软件与开源生态| ChinaOSC
危化企业双重预防机制数字化建设进入全面实施阶段
Brush the topic of mobile zero power button
阿里巴巴政委体系-第五章、阿里政委体系建设
Postgresql snapshot optimization Globalvis new system analysis (performance greatly enhanced)
Benchmarking Lane-changing Decision-making for Deep Reinforcement Learning
虚拟机vmware设置nat模式上网
【leetcode】剑指 Offer II 008. 和大于等于 target 的最短子数组(滑动窗口,双指针)
Teach you to locate online MySQL slow query problem hand by hand, package teaching package meeting
标准C语言学习总结11
Postgresql快照优化Globalvis新体系分析(性能大幅增强)
1161 最大层内元素和——Leetcode天天刷【BFS】(2022.7.31)
622 设计循环队列——Leetcode天天刷【循环队列,数组模拟,双指针】(2022.8.2)









