無需特權在Kubernetes中構建鏡像之 Kaniko
Kaniko
是 Google 造的輪子之一,用於在 Kubernetes 上無需 特權模式
構建 docker image
。
Kaniko
不依賴 Docker daemon
守護程序,而是完全在 userspace
中執行 Dockerfile
中的每個命令。這使您可以在 沒有特權模式
或沒有運行 Docker daemon
的環境(例如:Kubernetes集羣)中構建容器鏡像。
Kaniko 工作原理
傳統的 Docker build 是 Docker daemon 根據 Dockerfile,使用特權用戶(root)在宿主機依次執行,並生成鏡像的每一層。
而 Kaniko
工作原理和此類似, Kaniko
執行器獲取並展開基礎鏡像(在Dockerfile中FROM一行定義),按順序執行每條命令,每條命令執行完畢後爲文件系統做快照。快照是在用戶空間創建,並與內存中存在的上一個狀態進行對比,任何改變都會作爲對基礎鏡像的修改,並以新層級對文件系統進行增加擴充,並將任何修改都寫入鏡像的元數據中。當Dockerfile中每條命令都執行完畢後,執行器將新生成的鏡像推送到鏡像倉庫中。
Kaniko
解壓文件系統,執行命令,在執行器鏡像的用戶空間中對文件系統做快照,這都是爲什麼Kaniko不需要特權訪問的原因,以上操作中沒有引入任何 Docker daemon 進程或者 CLI 操作。
在 Kubernetes 中使用
前提條件
:
Kubernetes secret
解決目標 registry
認證問題,官方文檔中的樣例是通過添加一個 kaniko-secret.json
並把內容賦值給 GOOGLE_APPLICATION_CREDENTIALS
這個環境變量,如果是自建 registry
可以直接使用 docker config
。
$ echo "{\"auths\":{\"registry.example.com\":{\"username\":\"username\",\"password\":\"password\"}}}" > config.json $ kubectl create configmap docker-config --from-file=config.json configmap/docker-config created
使用 Pod 構建
apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest args: ["--dockerfile=<path to Dockerfile within the build context>", "--context=s3://<bucket name>/<path to .tar.gz>", "--destination=<aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:my-tag>"] volumeMounts: - name: docker-config mountPath: /kaniko/.docker/ # when not using instance role - name: aws-secret mountPath: /root/.aws/ restartPolicy: Never volumes: - name: docker-config configMap: name: docker-config # when not using instance role - name: aws-secret secret: secretName: aws-secret
Kaniko 一些構建參數
構建參數 | 解釋 |
---|---|
–build-arg | 構建時傳遞ARG值,可以多次傳遞 |
–cache | 設置緩存, true 開啓緩存 |
–cache-repo | 指定用來緩存的遠程倉庫 |
–cache-dir | 定義緩存的目錄 |
–skip-tls-verify | 倉庫地址是http時使用,不推薦生產使用 |
–cleanup | 設置此標誌可在構建結束時清理文件系統 |
–registry-mirror | 設置鏡像倉庫,默認 index.docker.io |