• 【k8s】在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使用官方的拉不下来,拉下来之后也启动不起来。所以这里找了一个代替的非官方镜像

    问题

    • 私有仓库认证

    创建secret: 

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

    然后挂载到 /knaiko/.docker

    如下:

    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 会失败

  • 相关阅读:
    程序员的成长
    存储系统的基本数据结构之一: 跳表 (SkipList)
    【机器学习-斯坦福】学习笔记3
    TCP/IP入门(3) --传输层
    2015华为暑期实习(北京)面试经验
    C++面试中关于sizeof问题总结
    KMP详解
    hihoCoder #1014 : Trie树
    Trie树的创建、插入、查询的实现
    Trie树(c++实现)
  • 原文地址:https://www.cnblogs.com/zhouwenyang/p/15541480.html
Copyright © 2020-2023  润新知