Kubernetes 中使用 自制 kaniko 构建镜像
kaniko 介绍
通常标准 Dockerfile 的生成需要与 Docker 后台进程交互访问,因此需要本机 root 权限。在 Docker 后台进程无法暴露的场景下生成容器镜像就很困难。
Kaniko 就是为解决这类问题而生的,Kaniko 是由 Google 开发。它是一个不需 root 特权就可以从 Dockerfile 中生成镜像,并将镜像推送到指定 registry。因为 Kaniko 不需要特权,因此用户可以在标准 Kubernetes 集群、Google Kubernetes 引擎、以及其它无法访问 Docker后台进程环境中运行。
dockerhub上官网镜像地址:https://hub.docker.com/r/mrlaojia/offical-kaniko
制作自己的 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.json :docker 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. 查看推送结果,并拉取验证
[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 条评论