Kaniko 是一个命令行工具,它以容器镜像的形式运行,并直接读取 Dockerfile 来构建容器镜像。与传统的 Docker 构建过程不同,Kaniko 不需要访问 Docker 守护进程(dockerd),而是直接在用户空间中执行 Dockerfile 中的指令,并创建镜像的层。
Kaniko 能做什么?
构建容器镜像:
- Kaniko 可以根据提供的 Dockerfile 和构建上下文(即包含 Dockerfile 和所需文件的目录)来构建容器镜像。
- 它支持 Dockerfile 中的大多数指令,如
FROM
、RUN
、COPY
、EXPOSE
、CMD
、ENTRYPOINT
等。
在 Kubernetes 集群中构建镜像:
- 由于 Kaniko 不需要 Docker 守护进程,它非常适合在 Kubernetes 集群中运行,以构建和推送镜像到容器镜像仓库。
- 这使得 CI/CD 管道可以更加简洁和高效,因为构建和部署过程可以完全在 Kubernetes 集群内完成。
提高安全性:
- 通过避免使用 Docker 守护进程,Kaniko 减少了潜在的安全风险,因为暴露 Docker 守护进程可能会带来权限提升或容器逃逸等安全问题。
- Kaniko 还支持使用 Kubernetes Secrets 或其他安全机制来存储和访问敏感信息,如镜像仓库的认证凭据。
与云原生生态系统集成:
- Kaniko 可以与 Google Cloud Build、Google Kubernetes Engine(GKE)、Amazon Elastic Kubernetes Service(EKS)、Azure Kubernetes Service(AKS)等云原生服务集成。
- 它还可以与其他 CI/CD 工具(如 Jenkins、GitLab CI/CD、CircleCI 等)一起使用,以实现自动化的构建和部署流程。
支持多种构建上下文:
- Kaniko 支持从本地文件系统、Git 仓库、HTTP/HTTPS URL 或 S3 存储桶等位置获取构建上下文。
可配置性:
- Kaniko 提供了多种配置选项,如指定构建缓存的位置、设置环境变量、配置日志记录等。
Kaniko安装、使用
镜像安装使用
国内镜像加速,并推送到自有仓库。
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/kaniko-project/executor:v1.23.1
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/kaniko-project/executor:v1.23.1 registry.cn-hangzhou.aliyuncs.com/xxxx/executor:v1.23.1
docker push registry.cn-hangzhou.aliyuncs.com/xxxx/executor:v1.23.1
在K8S中创建pod使用kaniko
注意事项
- Kaniko不依赖传统的配置文件来启动,所有配置都是通过命令行参数传递的。
- 在使用Kaniko时,需要确保构建上下文和Dockerfile都是可访问的,并且远端镜像仓库的认证信息已经正确配置。
- 如果启用了缓存机制,需要确保缓存仓库是可用的,并且有足够的存储空间来存储缓存层。
docker run --rm -v "$(pwd)":/workspace executor:v1.23.1 --dockerfile=Dockerfile --destination=registry.cn-hangzhou.aliyuncs.com/xxxx/aaa:bbbst
在K8S中创建Pod进行镜像构建
创建secret
对于非匿名仓库,需要先行创建一个secret来设定账号密码
kubectl create secret docker-registry <secret-name> --docker-server=<registry-url> --docker-username=<username> --docker-password=<password> --docker-email=<email> -n <namespace>
其中:
-
<secret-name>
:Secret的名称,自定义即可。 -
<registry-url>
:Registry的地址。 -
<username>
:登录Registry的用户名。 -
<password>
:登录Registry的密码。 -
<email>
:可选字段,Registry的email。 -
<namespace>
:Kubernetes命名空间。
准备构建镜像使用的Dockerfile,以下为示例:
Dockerfile
# 使用官方的 Alpine Linux 基础镜像,因为它较小且包含 curl
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/alpine:3.2
# 由于 curl 已经包含在 Alpine 的基础镜像中,所以不需要额外安装
# CMD 指令,指定容器启动时执行的命令
CMD curl -H "Content-Type: application/json" \
-d '{"msgtype": "text", "text": {"content": "ok"}}' \
'https://oapi.dingtalk.com/robot/send?access_token=xxxx'
配置Kaniko Pod
使用的image为上文中的
registry.cn-hangzhou.aliyuncs.com/xxxx/executor:v1.23.1
推送目标为
registry.cn-hangzhou.aliyuncs.com/xxxx/aaa:bbb
apiVersion: v1
kind: Pod
metadata:
name: kaniko-pod
namespace: kaniko
spec:
containers:
- name: kaniko
image: registry.cn-hangzhou.aliyuncs.com/xxxx/executor:v1.23.1 # 使用自定义镜像
args:
- --verbosity=trace
- --log-format=color
- --dockerfile=Dockerfile
- --context=dir:///workspace/
- --destination=registry.cn-hangzhou.aliyuncs.com/xxxx/aaa:bbb
volumeMounts:
- name: dockerfile-storage
mountPath: /workspace/
- name: kaniko-secret
mountPath: /kaniko/.docker
volumes:
- name: kaniko-secret
secret:
secretName: regcred
items:
- key: .dockerconfigjson
path: config.json
- name: dockerfile-storage
hostPath: # 或使用PersistentVolumeClaim等其他存储方式
path: /path/to/your/dockerfile/context
以上命令指定了要使用的Dockerfile 以及要推送的镜像地址。注意,如果仓库非匿名,需要进行权限配置。
常用命令及参数
Kaniko允许通过命令行参数来传递配置,以下是一些常用参数:
-
--dockerfile
:指定构建用的Dockerfile路径。 -
--destination
:设置构建完成后的镜像标签或路径。 -
--context
:指定构建上下文的来源,比如本地目录、GCS bucket等。如果构建上下文是一个tar.gz文件,可以使用--context=dir://<path_to_untar>
来指定解压后的目录。 -
--cache
:启用缓存机制,默认为false。当设置为true时,Kaniko会在本地或远程仓库中缓存构建层,以加速后续构建。 -
--cache-repo
:缓存层存储的远程仓库地址。 -
--build-arg
:传递构建参数,例如--build-arg VERSION=v1.0
。 -
--cache-dir
:base image本地缓存目录,默认/cache。需要和--cache=true
一起使用。 -
--cache-copy-layers
:缓存COPY命令创建的层。 -
--cache-run-layers
:缓存RUN命令创建的层,默认为true。 -
--cache-ttl
:缓存超时时间(h),默认两周。 -
--compressed-caching
:对缓存层进行tar压缩,默认为true。增加构建运行时间,但减少内存使用量。 -
--context-sub-path
:上下文子目录。 -
--custom-platform
:指定构建平台,例如linux/arm
、linux/arm/v5
等。 -
--label
:为image设置标签。 -
--log-format
:设置日志格式,默认为color。 -
--log-timestamp
:将时间戳添加到日志,默认为false。 -
--no-push
:只构建image不进行推送。 -
--push-retry
:推送image到仓库的重试次数。 -
--registry-mirror
:设置image仓库地址。 -
--image-download-retry
:下载image重试次数,默认为0。