1. 程式人生 > 其它 >【kubernates】在k8s中構建docker映象

【kubernates】在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使用官方的拉不下來,拉下來之後也啟動不起來。所以這裡找了一個代替的非官方映象

問題

  • 私有倉庫認證
  • git倉庫認證
  • context上下文

這個被官方文件帶偏,容易產生誤解。

以該專案為例:https://github.com/wenyangchou/kaniko-test

git拉取有兩個地址:[email protected]:wenyangchou/kaniko-test.git 和https://github.com/wenyangchou/kaniko-test.git

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

[email protected]: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 會失敗