2020年12月份,k8s宣佈將廢棄dockershim,在2022年4月釋出的k8s v1。24版本中已完全移除。
在k8s與docker脫鉤之前,在k8s下進行Docker映象編譯可以簡單的採取docker in docker方案,即在D
ocker中執行Docker,它透過掛載
/var/run/docker。sock
檔案作為Docker容器的卷,在Kubernetes叢集中構建Docker容器。
當k8s與docker脫鉤後,在k8s下如何編譯docker映象呢,谷歌推出了Kaniko來幫你解決這個問題了!
Kaniko官方地址:https://github。com/GoogleContainerTools/kaniko
Kaniko Logo
Kaniko是一個從Dockerfile構建容器映象的工具。與Docker不同,Kaniko不需要Docker守護程序。
由於不依賴於Docker守護程序,我們可以在使用者沒有root訪問許可權的任何環境(如 k8s叢集)中執行。
Kaniko使用一個executor映象(
gcr。io/kaniko-project/executor
),在該映象的容器內可以完全在使用者空間中執行Dockerfile中的每個命令。同樣在一個k8s pod裡,這個容器映象也可以按順序執行Dockerfile中的每個命令。
這也就意味著我們可以在k8s裡不借助Docker守護程序也能編譯Docker映象。
容器映象中心
我們在本例中使用阿里雲提供的免費的“容器映象服務”來作為Docker Registry用於推送映象。
地址為:https://cr。console。aliyun。com/
阿里雲“容器映象服務”
我當前的名稱空間為:
wiselyman_k8s
為我們示例新建一個映象倉庫:
ubuntu-hello
(私有)
那如果推送或者拉取的路徑應該為:
registry。cn-hangzhou。aliyuncs。com/wiselyman_k8s/ubuntu-hello:[映象版本號]
在k8s叢集中配置訪問容器映象中心的secret
我們需在k8s叢集中配置訪問容器映象中心的secret,這樣我們才可以在叢集中推送或者拉取docker映象。
kubectl create secret docker-registry aliyun-regsecret ——docker-server=registry。cn-hangzhou。aliyuncs。com ——docker-username=
檢視建立的secret:
kubectl describe secret aliyun-regsecret
顯示:
Name: aliyun-regsecretNamespace: defaultLabels:
GitHub中的簡單Dockerfile
首先,我們在GitHub中建立一個專案
kaniko-demo
的專案,包含一個簡單的
Dockerfile
:
FROM ubuntuENTRYPOINT [“/bin/bash”, “-c”, “echo hello”]
GitHub倉庫的地址為:
https://github。com/wiselyman/kaniko-demo
(私有不能訪問,生產中的git地址肯定是私有的)
編寫Kaniko的k8s pod部署檔案
kaniko-pod。yaml
apiVersion: v1kind: Podmetadata: name: kanikospec: containers: - name: kaniko image: gcr。io/kaniko-project/executor:latest args: [“——dockerfile=Dockerfile”, “——context=git://token@github。com/wiselyman/kaniko-demo。git#refs/heads/main”, “——destination=registry。cn-hangzhou。aliyuncs。com/wiselyman_k8s/ubuntu-hello:v1”] volumeMounts: - name: kaniko-secret mountPath: “/kaniko/。docker” volumes: - name: kaniko-secret secret: secretName: aliyun-regsecret items: - key: 。dockerconfigjson path: config。json restartPolicy: Never
執行器映象為:
gcr。io/kaniko-project/executor:latest
。為了速度更快,我們可以在
https://mirrors。kb。cx
上檢索
kaniko-project
選擇合適的映象。我們把映象更換為:
gcriokaniko/executor:latest
kaniko使用
gcr。io/kaniko-project/executor:latest
執行引數命令:
——dockerfile
:要編譯Dockerfile的路徑;
——context
:指定編譯上下文的路徑(此處為git,支援本地目錄、和一些儲存桶等),token生成可參考:https://docs。github。com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token;
——destination
:需推送的映象倉庫地址。
開始編譯映象
我們部署
kaniko-pod。yaml
就可以編譯映象:
kubectl create -f kaniko-pod。yaml
當前pod的容器日誌如下:
kaniko pod中編譯和推送docker映象
我們看到圖中有docker映象編譯的過程,最終將映象推送到阿里雲的映象中心的倉庫。
我們去阿里雲的映象中心的倉庫看一下:
阿里雲映象中心的倉庫
結語
自此我們成功的使用k8s編譯了Docker映象,但是我們並沒有使用Docker的守護程序,下次有時間我將結合Jenkins一起,將Docker映象編譯結合到自動化的流水線上,敬請期待。
如果對k8s下如何用最簡單高效的方式安裝Jenkins感興趣,可繼續觀看此文:《基於Jenkins和k8s的雲原生CI/CD:安裝篇》。