【kubernates】在k8s中構建docker映象
背景
在某些場景中,我需要使用一個應用中去動態的構建一個docker映象。而一般VM基礎設施比較健全時,應用程式理論上也會執行在虛擬容器中。所以這時會產生一個需求,就是在容器中建立映象。最常見的就是在k8s的pod中建立、釋出映象
序
參考:https://devopscube.com/build-docker-image-kubernetes-pod/
對於docker in docker該方案有兩個缺點
- 需要使用高階許可權,容易被惡意攻擊
- k8s在未來可能不支援docker
開始
這裡提供的方案叫做Kaniko
kaniko不需要高階許可權,它的工作原理是:
- kaniko提供一個專用的映象:gcr.io/kaniko-project/executor。這個映象只提供一些靜態的go的二進位制檔案,和一些基礎的推拉映象功能
- kaniko接收3個引數: Dockerfile,構建映象所需的資源等及用於推送映象的遠端倉庫
- 部署時,kaniko讀取Dockerfile,並且根據FROM關鍵字去提取基礎映象
- 然後根據Dockerfile的命令進行快照
- 在完成每個快照後,kaniko只會將一些更新操作追加到基礎映象中
- 最終將生成的映象推送到倉庫
整個過程看起來跟我們平時構建映象、推送的邏輯好像沒什麼太大的差別,但是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 會失敗