【kaniko】在k8s中构建docker镜像

背景

在某些场景中,我需要使用一个应用中去动态的构建一个docker镜像。而一般VM基础设施比较健全时,应用程序理论上也会运行在虚拟容器中。所以这时会产生一个需求,就是在容器中创建镜像。最常见的就是在k8s的pod中创建、发布镜像

参考:https://devopscube.com/build-docker-image-kubernetes-pod/

对于docker in docker该方案有两个缺点

  • 需要使用高级权限,容易被恶意攻击
  • k8s在未来可能不支持docker

开始

这里提供的方案叫做Kaniko


kaniko不需要高级权限,它的工作原理是:

  1. kaniko提供一个专用的镜像:gcr.io/kaniko-project/executor。这个镜像只提供一些静态的go的二进制文件,和一些基础的推拉镜像功能
  2. kaniko接收3个参数: Dockerfile,构建镜像所需的资源等及用于推送镜像的远程仓库
  3. 部署时,kaniko读取Dockerfile,并且根据FROM关键字去提取基础镜像
  4. 然后根据Dockerfile的命令进行快照
  5. 在完成每个快照后,kaniko只会将一些更新操作追加到基础镜像中
  6. 最终将生成的镜像推送到仓库

整个过程看起来跟我们平时构建镜像、推送的逻辑好像没什么太大的差别,但是kaniko抽取了最核心的构建和推送逻辑,阉割了其他不需要的职能,保证其安全性和便捷性。

根据官方介绍,构建镜像的资源支持:s3协议、本地文件夹、标准输入、git仓库等

步骤

apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: wenyangchou/kaniko-project-executor:latest
    args:
    - "--context=git://github.com/scriptcamp/kubernetes-kaniko"
    - "--destination=10.13.68.15:5000/kaniko-demo-image:1.0"
  restartPolicy: Never

其中image使用官方的拉不下来,拉下来之后也启动不起来。所以这里找了一个代替的非官方镜像

问题

  • 私有仓库认证

创建docker secret: 

kc create secret generic kaniko-secret --namespace=phantom --from-file=/root/.docker/config.json

然后挂载到 /knaiko/.docker

创建git/ssh secret:

如下:

apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: wenyangchou/kaniko-project-executor:latest
    volumeMounts:
      - name: kaniko-secret
        mountPath: /kaniko/.docker/

    args:
    - "--context=git://xxxx"
    - "--destination=xxxx"
    - "--dockerfile=dev/Dockerfile"
    - "--git=branch=dev"
    - "--insecure=true"
    - "--skip-tls-verify=true"
  restartPolicy: Never
  volumes:
    - name: kaniko-secret
      secret:
        secretName: kaniko-secret

  

  • git仓库认证
  • context上下文

这个被官方文档带偏,容易产生误解。

以该项目为例: https://github.com/wenyangchou/kaniko-test

git拉取有两个地址: git@github.com:wenyangchou/kaniko-test.git 和 https://github.com/wenyangchou/kaniko-test.git

上下文乍一看可能觉得是: 

--context=git@github.com:wenyangchou/kaniko-test.git

实际测试后发现,地址应该为https的

--context=https://github.com/wenyangchou/kaniko-test.git

正确做法如下:

apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: wenyangchou/kaniko-project-executor:latest
    args:
    - "--context=git://github.com/wenyangchou/kaniko-test.git"
    - "--destination=10.13.68.15:5000/kaniko-test:v1"
    - "--dockerfile=docker/torch/Dockerfile"
  restartPolicy: Never

参数

  • --dockerfile 和 --context-sub-path 区别

--dockerfile 构建目录为项目根目录,而 --context-sub-path为子文件夹目录

--dockerfile=docker/torch/Dockerfile相当于

docker build -t . -f docker/torch/Dockerfile

而--context-sub-path相当于

docker -t docker/torch -f docker/torch/Dockerfile
  • --git

切换分支: 【仅供参考gitlab】

--git=branch=dev

如果使用--git=branch=dev,single-branch=false,recurse-submodules=false 会失败

 

posted @ 2021-12-08 20:45  周周周文阳  阅读(2434)  评论(1编辑  收藏  举报