• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

Kubernetes 中使用 自制 kaniko 构建镜像

kaniko 介绍

通常标准 Dockerfile 的生成需要与 Docker 后台进程交互访问,因此需要本机 root 权限。在 Docker 后台进程无法暴露的场景下生成容器镜像就很困难。

Kaniko 就是为解决这类问题而生的,Kaniko 是由 Google 开发。它是一个不需 root 特权就可以从 Dockerfile 中生成镜像,并将镜像推送到指定 registry。因为 Kaniko 不需要特权,因此用户可以在标准 Kubernetes 集群、Google Kubernetes 引擎、以及其它无法访问 Docker后台进程环境中运行。

制作自己的 kaniko 镜像

1. 下载官网的 kaniko 镜像

我们这里用 debug 版本的镜像。因为debug版本的 才有 shell。【参看官网说明

[root@model kaniko-dk]# docker pull mrlaojia/offical-kaniko:debug-0.15.0

2. 从官网镜像取出有用文件

我们取出两个有用的文件,一个 CA 库,一个就是 kaniko 命令本身

# 用官网镜像启动一个容器
[root@model kaniko-dk]# docker run -it --rm --name k1 --entrypoint "" mrlaojia/offical-kaniko:debug-0.15.0 /busybox/sh 

# 取出文件
[root@model kaniko-dk]# docker cp k1:/kaniko/ssl/certs/ca-certificates.crt .
[root@model kaniko-dk]# docker cp k1:/kaniko/executor .
[root@model kaniko-dk]# ls
ca-certificates.crt  executor

# 将文件名字改为 kaniko (官网默认名字为 executor,当然也可以不改)
[root@model kaniko-dk]# mv executor kaniko

3. 制作镜像所需文件

[root@model kaniko-dk]# tree
.
├── ca-certificates.crt
├── config.json
├── Dockerfile
└── kaniko

[root@model kaniko-dk]# docker build -t my-kakino:0.15.0 .

说明:

  • kaniko ca-certificates.crt : 导出的文件

  • config.jsondocker login 私有仓库 后的验证文件 一般位于 ~/.docker/config.json

  • Dockerfile:制作 kaniko 镜像用的 dockerfile

Dockerfile 文件内容为:

FROM busybox:latest

# DOCKER_CONFIG 存放 kaniko push 私有仓的认证 config.json
# SSL_CERT_DIR 存放私有仓的 CA 认证信息
ENV DOCKER_CONFIG=/kaniko/.docker/ SSL_CERT_DIR=/etc/ssl/certs
COPY ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

WORKDIR /kaniko
COPY config.json ./.docker/config.json

COPY kaniko /usr/local/bin/kaniko

4. 启动一个 kaniko 容器

[root@model kaniko-dk]# docker run  -it --rm --name mykaniko my-kakino:0.15.0 /bin/sh

/kaniko # ls /etc/ssl/certs/ca-certificates.crt 
/etc/ssl/certs/ca-certificates.crt

/kaniko # ls .docker/config.json 
.docker/config.json

/kaniko # env
HOSTNAME=cdcda43a2ec8
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SSL_CERT_DIR=/etc/ssl/certs
DOCKER_CONFIG=/kaniko/.docker/
PWD=/kaniko

5. kaniko 制作镜像并推送

新建制作镜像所需要的 dockerfile

/kaniko # ls
Dockerfile     entrypoint.sh

/kaniko # cat Dockerfile 
FROM busybox:latest
ENV DESCRIB="hello busybox web" WWWDIR="/www"
COPY entrypoint.sh /entrypoint.sh
RUn chmod +x entrypoint.sh ; mkdir -p $WWWDIR
CMD ["httpd","-f","-h","/www"]
ENTRYPOINT ["/entrypoint.sh"]


/kaniko # cat entrypoint.sh 
#!/bin/sh
echo "from kaniko ${DESCRIB}:  ${HOSTNAME}" >$WWWDIR/index.html
exec $@

/kaniko # kaniko -f Dockerfile -c `pwd` --verbosity=debug  --destination=registry.cn-shanghai.aliyuncs.com/laojia/laojia-busyweb:1.0

6. 查看推送结果,并拉取验证

无标题.jpg


[root@model kaniko-dk]# docker pull registry.cn-shanghai.aliyuncs.com/laojia/laojia-busyweb:1.0
1.0: Pulling from laojia/laojia-busyweb
bdbbaa22dec6: Already exists 
43fe7d399a39: Pull complete 
d7c9fa0f2ad0: Pull complete 
Digest: sha256:7e6a126ee21b9e93395626c8b427b58b477227a6ebc02ffdec433c6f623f0ac4
Status: Downloaded newer image for registry.cn-shanghai.aliyuncs.com/laojia/laojia-busyweb:1.0
registry.cn-shanghai.aliyuncs.com/laojia/laojia-busyweb:1.0

[root@model kaniko-dk]# docker run -td --rm --name busyweb registry.cn-shanghai.aliyuncs.com/laojia/laojia-busyweb:1.0   
6b5bca7e9e85542465240d730cc10dcac1eacff3ac2dd6b3c7570e901a12ec26

[root@model kaniko-dk]# docker ps
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED             STATUS              PORTS               NAMES
6b5bca7e9e85        registry.cn-shanghai.aliyuncs.com/laojia/laojia-busyweb:1.0   "/entrypoint.sh http…"   2 seconds ago       Up 1 second                             busyweb
cdcda43a2ec8        my-kakino:0.15.0                                              "/bin/sh"                5 minutes ago       Up 5 minutes                            mykaniko

[root@model kaniko-dk]# docker exec -it busyweb ip add    
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

[root@model kaniko-dk]# curl 172.17.0.3 
from kaniko hello busybox web:  6b5bca7e9e85

[root@model kaniko-dk]#

7. 制作 kaniko 镜像踩过的坑

  • 使用 debug 版的镜像,因为它才有 shell ,使用 ci/cd 时shell是必须的

  • 要覆盖官网的 entrypoint 入口

  • config.json 是kaniko 推送镜像时候的身份认证文件。需要事先 docker login 私有仓 获取


如果出现下面错误:: x509: certificate signed by unknown authority

error building image: getting stage builder for stage 0: Get https://registry.gitlab.example.com/v2/: x509: certificate signed by unknown authority

解决方法是:

将你私有仓的 CA 证书,导入到 ca-certificates.crt 文件里面。 【获取CA证书的方法

 echo "-----BEGIN CERTIFICATE-----       ...       -----END CERTIFICATE-----" >> /kaniko/ssl/certs/ca-certificates.crt


如果在 k8s 上面跑。稍微整理下即可。





老外的这篇文章帮助很大:https://0xacab.org/help/ci/docker/using_kaniko.md



0
0
下一篇:windows 从浏览器中导出 https 网站根 CA 证书

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。