利用Serverless Kubernetes和Kaniko快速自動化構建容器鏡像

前言:

在雲原生時代中,容器鏡像是一切應用分發的基礎載體,除了dockerhub做爲流行的鏡像倉庫外,各大公有云廠商也都提供了功能豐富鏡像倉庫服務,如ACR(Aliyun Container Registry), GCR(Goolge Container Registry),構建容器鏡像已經是全部開發者必須掌握的基礎實踐能力。docker

不管開發者選擇在本地使用docker完成基本的鏡像構建,仍是使用CI/CD服務(如Jenkins),本質上都是遵循「pull -> build -> push」的過程,完成鏡像的構建、分發和同步等操做。shell

本文介紹了一種新的面向開發者的簡單鏡像構建實踐,基於阿里雲Serverless Kubernetes容器服務,能夠自動化並且低成本的構建容器鏡像,以便讓開發者瞭解如何使用Serverless運行CI/CD和自動化任務。json

why serverless kubernetes?

容器鏡像的構建是須要計算資源的,開發者在本地使用docker pull/build/push時,其計算資源是本地開發機器,若是開發者在傳統kubernetes集羣中部署Jenkins或Gitlab-runner服務,其計算資源也是須要持續運行。可是,容器鏡像的構建基本屬於高度動態的行爲,每每是定時或者條件觸發引發的操做,因此爲了動態的構建操做而維護一個固定的計算資源池對成本是不利的。api

Serverless Kubernetes不一樣與傳統基於節點的k8s集羣,serverless集羣中只有pod運行時纔會收費,意味着只有在構建鏡像時用戶才須要付費,當構建結束時,也就中止計費。因此在成本上與傳統k8s集羣或ecs部署的方式相比顯著減小。app

Kaniko

在Serverless Kubernetes集羣中,pod沒有privileged權限,沒法訪問主機上的docker daemon,也就沒法使用docker in docker方案進行鏡像的操做,那麼如何在kubernetes集羣中不依賴宿主機的Docker狀況下構建鏡像呢?顯然這是一個通用需求,社區也有了推薦的方案:kaniko。less

kaniko的工做原理與docker build相似,可是不依賴docker daemon,在pod中完成Dockfile各層的解析和build,這使得pod不須要privileged權限也能夠完成鏡像的pull/build/push。測試

實踐示例:定時同步容器鏡像

下面讓咱們使用Serverless Kubernetes和Kaniko實現一個簡單的鏡像build實驗:定時同步鏡像到國內ACR。ui

步驟1: 建立Serverless Kubernetes集羣

登錄容器服務控制檯, 5s便可完成Serverless集羣建立。(若是是國外的源鏡像倉庫,能夠選擇美西區域)google

步驟2: 建立secret,配置ACR的用戶名密碼,用於推送鏡像到ACR

可登錄cloudshell操做以下命令。阿里雲

#docker login registry.cn-hangzhou.aliyuncs.com
...
#kubectl create secret generic regsecret --from-file=/root/.docker/config.json
...

步驟3: 建立定時任務CronJob

在控制檯選擇模版建立以下定時任務,每小時同步busybox鏡像到ACR。

apiVersion: v1
kind: ConfigMap
metadata:
  name: dockerfile-cm
data:
  Dockerfile: |
    FROM busybox:latest
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: kaniko-builder
spec:
  schedule: "*/60 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: builder
            image: gcr.io/kaniko-project/executor:latest
            imagePullPolicy: Always
            args:
            - "--dockerfile=/configs/Dockerfile"
            - "--destination=registry.cn-hangzhou.aliyuncs.com/jovizhangwei/busybox:latest"
            volumeMounts:
            - name: dockerfile
              readOnly: true
              mountPath: "/configs/"
            - name: secrets
              readOnly: true
              mountPath: "/root/.docker/"
          volumes:
          - name: dockerfile
            configMap:
              name: dockerfile-cm
          - name: secrets
            secret:
              secretName: regsecret
          restartPolicy: OnFailure

待job執行後,可查看ACR鏡像倉庫,確認鏡像已同步。

用戶能夠按照需求定製此模版文件,好比修改須要同步的鏡像,添加build步驟等,也能夠設置pod的資源限制(vcpu 0.25/0.5/1等), 以最小的計算成本完成同步任務。

結束

經過上面的示例,咱們看到基於Serverless Kubernetes的按需付費特性,可使用很低的成本運行一些定時和CI/CD任務,而不用維護一個固定的計算資源池,其一樣適用於壓力測試、數據計算、工做流處理等其餘場景。

Happy Hacking!

更多參考信息

  1. Serverless Kubernetes快速部署jenkins環境及執行流水線構建: https://yq.aliyun.com/articles/685219
  2. kaniko intro:https://cloud.google.com/blog/products/gcp/introducing-kaniko-build-container-images-in-kubernetes-and-google-container-builder-even-without-root-access

原文連接

相關文章
相關標籤/搜索