首頁/ 汽車/ 正文

如何在k8s下不依賴Docker編譯映象 - Kaniko實踐

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

如何在k8s下不依賴Docker編譯映象 - 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/

如何在k8s下不依賴Docker編譯映象 - Kaniko實踐

阿里雲“容器映象服務”

我當前的名稱空間為:

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= ——docker-password= ——docker-email=

檢視建立的secret:

kubectl describe secret aliyun-regsecret

顯示:

Name: aliyun-regsecretNamespace: defaultLabels: Annotations: Type: kubernetes。io/dockerconfigjsonData====。dockerconfigjson: 175 bytes

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的容器日誌如下:

如何在k8s下不依賴Docker編譯映象 - Kaniko實踐

kaniko pod中編譯和推送docker映象

我們看到圖中有docker映象編譯的過程,最終將映象推送到阿里雲的映象中心的倉庫。

我們去阿里雲的映象中心的倉庫看一下:

如何在k8s下不依賴Docker編譯映象 - Kaniko實踐

阿里雲映象中心的倉庫

結語

自此我們成功的使用k8s編譯了Docker映象,但是我們並沒有使用Docker的守護程序,下次有時間我將結合Jenkins一起,將Docker映象編譯結合到自動化的流水線上,敬請期待。

如果對k8s下如何用最簡單高效的方式安裝Jenkins感興趣,可繼續觀看此文:《基於Jenkins和k8s的雲原生CI/CD:安裝篇》。

相關文章

頂部