Kaniko 构建镜像

一、Kaniko简介

Kaniko 是一个开源工具,用于在容器内部构建 Docker 镜像。它的设计初衷是在不需要使用 Docker 守护进程或特权访问的情况下构建镜像。

使用 Kaniko 构建镜像的步骤如下:

  1. 准备构建上下文:将构建所需的文件和目录放置在一个目录中作为构建上下文。通常,你会将 Dockerfile 文件与应用程序代码一起放在同一个目录中。

  2. 创建并配置 Kaniko 配置文件:创建一个名为 config.json 的配置文件,用于配置 Kaniko 的参数和选项。例如,你可以指定要构建的 Dockerfile 的路径、输出镜像的名称和标签等。

  3. 运行 Kaniko 构建命令:在终端中运行以下命令来使用 Kaniko 构建镜像:

kaniko --context <path-to-context> --dockerfile <path-to-dockerfile> --destination <image-name>:<tag>

将 替换为构建上下文的路径, 替换为 Dockerfile 的路径,: 替换为要生成的镜像的名称和标签。

Kaniko 将会读取构建上下文中的文件,并在容器内部基于指定的 Dockerfile 构建镜像。构建过程完全在容器内完成,无需依赖本地的 Docker 守护进程。

  1. 等待构建完成:根据你的镜像大小和复杂度,构建过程可能需要一些时间。在构建过程中,Kaniko 将显示相关的日志信息,以便你跟踪构建进度和检查错误。

  2. 检查构建结果:构建完成后,你可以使用以下命令查看生成的镜像列表:

    docker images

在列表中,你应该能够看到使用 Kaniko 构建的镜像及其相关信息。

k8s环境构建

在 Kubernetes 中使用 Kaniko 构建镜像的完整流程如下:

  1. 准备 Kubernetes 集群:
    首先,你需要准备一个运行中的 Kubernetes 集群,并确保你具备访问和管理集群的权限。

  2. 创建 Kaniko 的构建配置文件 Secret:
    为了将构建上下文传递给 Kaniko 容器,并允许其推送镜像到镜像仓库,我们需要创建一个包含镜像仓库凭据的 Secret 对象。这个 Secret 将在构建 Pod 中被挂载并提供给 Kaniko。

假设你的镜像仓库是基于 Docker Hub 的,你可以创建一个名为 kaniko-secret.yaml 的 YAML 文件,并填入以下内容:

apiVersion: v1
kind: Secret
metadata:
  name: kaniko-secret
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: <base64-encoded-dockerconfigjson>

<base64-encoded-dockerconfigjson> 替换为经过 base64 编码的包含 Docker Hub 凭据的 .dockerconfigjson 文件内容。

然后,使用以下命令创建 Secret 对象:

kubectl apply -f kaniko-secret.yaml
  1. 创建 Kaniko 的构建 Pod:
    接下来,我们需要创建一个构建 Pod,用于在 Kubernetes 中运行 Kaniko 容器,并执行镜像构建操作。

创建一个名为 kaniko-build-pod.yaml 的 YAML 文件,并填入以下内容:

apiVersion: v1
kind: Pod
metadata:
  name: kaniko-build-pod
spec:
  containers:
    - name: kaniko
      image: gcr.io/kaniko-project/executor:v1.6.0
      volumeMounts:
        - name: context
          mountPath: /workspace
        - name: docker-config
          mountPath: /kaniko/.docker
  volumes:
    - name: context
      emptyDir: {}
    - name: docker-config
      secret:
        secretName: kaniko-secret

这个 Pod 包含一个名为 kaniko 的容器,使用 Kaniko 的官方镜像 gcr.io/kaniko-project/executor:v1.6.0。同时,我们挂载了两个卷,一个用于构建上下文 /workspace,另一个是用于提供镜像仓库凭据的 .docker 目录。

使用以下命令创建构建 Pod:

kubectl apply -f kaniko-build-pod.yaml
  1. 等待构建 Pod 完成:
    构建 Pod 将在 Kubernetes 中启动,并开始运行 Kaniko 容器来执行镜像构建操作。你可以使用以下命令来查看构建 Pod 的状态:

    kubectl get pod kaniko-build-pod

    当 Pod 的状态为 Running 且 READY 列显示为 1/1 时,表示构建 Pod 已经成功启动。

  2. 检查构建日志和结果:
    你可以使用以下命令查看构建 Pod 的日志:

    kubectl logs kaniko-build-pod

    Kaniko 将会显示构建过程中的相关日志信息。

构建完成后,你可以使用以下命令查看生成的镜像列表:

kubectl exec -it kaniko-build-pod -- docker images

在列表中,你应该能够看到使用 Kaniko 构建的镜像及其相关信息。

这就是在 Kubernetes 中使用 Kaniko 构建镜像的完整流程。请确保你的 Kubernetes 集群已正确配置,并且 Kaniko 和相关资源已正确部署。

二、实战

kaniko的工作方式

1.读取指定的Dockerfile。

2.将基本映像(在FROM指令中指定)提取到容器文件系统中。

3.在独立的Dockerfile中分别运行每个命令。

4.每次运行后都会对用户空间文件系统的做快照。

5.每次运行时,将快照层附加到基础层。

kaniko工作原理

kaniko作为一个容器镜像运行,它接受三个参数:一个 Dockerfile ,一个构建上下文以及将镜像推送到的注册表。它在执行程序镜像中提取基本镜像的文件系统。然后,在Dockerfile中执行任何命令,快照用户空间中的文件系统。Kaniko在每个命令后都会将一层已更改的文件附加到基本镜像。最后,执行程序将新镜像推送到指定的注册表。由于Kaniko在执行程序镜像的用户空间中完全执行了这些操作,因此它完全避免了在用户计算机上需要任何特权访问。

kaniko重复拉取镜像问题

使用kaniko来构建镜像,,可以缓存镜像,但在dockerfile中使用copy等命令时会发生 Unpacking rootfs as cmd COPY . . requires it .,每次都要拉镜像,需要更好的科学环境,不然很慢。需要要gcr.io, docker.com, docker.io都使用代理访问。

处理方式

手动拉取镜像到服务节点本地
dockerfile 文件:

/workspace # cat dockerfile
FROM demo-harbor.demo.com/kylinv10/arm-py311-java:v1.0.2
RUN curl --retry-max-time 1800 --connect-timeout 1800 --retry 40 -L -C - "http://magicsvc-api-svc.demo.svc.cluster.local:8785/download?delete_flag=1&url=static/tmp/26125_11721753225.tar.gz"|tar xz
vf - -C /app

WORKDIR /app
RUN pip install -r requirements.txt --no-index -f src/dependency/ && rm -rf src/dependency/
#[install_tools]

# Define environment variable
ENV MODEL_NAME lightgbm_model
ENV SERVICE_TYPE MODEL
ENV GRPC_WORKERS 0
ENV GUNICORN_MAX_REQUESTS_JITTER 200
#COPY --chown=65500:65500 #[application.properties] /home/master/online
#COPY --chown=65500:65500 deployment/template/hystrix.properties /home/master/online
# seldon-core replace
RUN ln -s /app/modelfunc /home/master/python3/lib/python3.11/site-packages/modelfunc \
   && rm -rf  /home/master/python3/lib/python3.11/site-packages/seldon_core/seldon_methods.py \
   && rm -rf  /home/master/python3/lib/python3.11/site-packages/seldon_core/wrapper.py \
   && cp -f /app/modelfunc/seldon_methods.py* /home/master/python3/lib/python3.11/site-packages/seldon_core/ \
   && cp -f /app/modelfunc/wrapper.py* /home/master/python3/lib/python3.11/site-packages/seldon_core/ \
   && echo '{"model_id": "26125", "md5": "994490bfff9d42e78886f5a41a22b6d0-20240724005002", "version": "1"}' > /home/master/md5

CMD (seldon-core-microservice $MODEL_NAME --service-type $SERVICE_TYPE &);java -jar gun-0.0.1-SNAPSHOT.jar/workspace #
/workspace #

手动拉取镜像:

# 手动拉取镜像
sudo docker pull demo-harbor.demo.com/library/executor-arm:v1.22.0-debug
sudo docker pull  demo-harbor.demo.com/kylinv10/arm-py311-java:v1.0.2   # 手动拉取镜像,该镜像比较大,需要手动拉取 4.97G, 在构建时超时了;

——
参考链接:
https://github.com/GoogleContainerTools/kaniko

https://blog.csdn.net/weixin_38320674/article/details/107650424

https://www.bianchengquan.com/article/511721.html


相关文章:
docker镜像构建工具kaniko构建过程缓慢原因探究

为者常成,行者常至