在K8S中使用kankio打包镜像

时间:2024-11-16 20:01:53

Kaniko 是一个命令行工具,它以容器镜像的形式运行,并直接读取 Dockerfile 来构建容器镜像。与传统的 Docker 构建过程不同,Kaniko 不需要访问 Docker 守护进程(dockerd),而是直接在用户空间中执行 Dockerfile 中的指令,并创建镜像的层。

Kaniko 能做什么?

构建容器镜像:

  • Kaniko 可以根据提供的 Dockerfile 和构建上下文(即包含 Dockerfile 和所需文件的目录)来构建容器镜像。
  • 它支持 Dockerfile 中的大多数指令,如 FROMRUNCOPYEXPOSECMDENTRYPOINT 等。

在 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

注意事项

  1. Kaniko不依赖传统的配置文件来启动,所有配置都是通过命令行参数传递的。
  2. 在使用Kaniko时,需要确保构建上下文和Dockerfile都是可访问的,并且远端镜像仓库的认证信息已经正确配置。
  3. 如果启用了缓存机制,需要确保缓存仓库是可用的,并且有足够的存储空间来存储缓存层。
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允许通过命令行参数来传递配置,以下是一些常用参数:

  1. --dockerfile:指定构建用的Dockerfile路径。
  2. --destination:设置构建完成后的镜像标签或路径。
  3. --context:指定构建上下文的来源,比如本地目录、GCS bucket等。如果构建上下文是一个tar.gz文件,可以使用--context=dir://<path_to_untar>来指定解压后的目录。
  4. --cache:启用缓存机制,默认为false。当设置为true时,Kaniko会在本地或远程仓库中缓存构建层,以加速后续构建。
  5. --cache-repo:缓存层存储的远程仓库地址。
  6. --build-arg:传递构建参数,例如--build-arg VERSION=v1.0
  7. --cache-dir:base image本地缓存目录,默认/cache。需要和--cache=true一起使用。
  8. --cache-copy-layers:缓存COPY命令创建的层。
  9. --cache-run-layers:缓存RUN命令创建的层,默认为true。
  10. --cache-ttl:缓存超时时间(h),默认两周。
  11. --compressed-caching:对缓存层进行tar压缩,默认为true。增加构建运行时间,但减少内存使用量。
  12. --context-sub-path:上下文子目录。
  13. --custom-platform:指定构建平台,例如linux/armlinux/arm/v5等。
  14. --label:为image设置标签。
  15. --log-format:设置日志格式,默认为color。
  16. --log-timestamp:将时间戳添加到日志,默认为false。
  17. --no-push:只构建image不进行推送。
  18. --push-retry:推送image到仓库的重试次数。
  19. --registry-mirror:设置image仓库地址。
  20. --image-download-retry:下载image重试次数,默认为0。

相关文章