Knative 初體驗:Build Hello World

做者 | 阿里雲智能事業羣技術專家 冬島 git

Build 模塊提供了一套 Pipeline 機制。Pipeline 的每個步驟均可以執行一個動做,這個動做能夠是把源碼編譯成二進制、能夠是編譯鏡像也能夠是其餘的任何事情。Knative Build 執行編譯的時候並不須要咱們提早準備編譯環境,全部這些都是直接在 Pod 中執行的。當有任務須要執行的時候 Build 模塊就自動建立 Pod 進行相應的處理。因此這一系列的動做都是 Kubernetes 原生的。github

Knative Build 的幾個關鍵特性

  • 一個完整的 Build 是由多個 Builder 構成的 Pipeline,每個 Builder 能夠執行一個或多個操做
  • 一個 Builder 在執行的時候就是一個 container,並且容器的鏡像是聲明 Builder 的時候用戶本身指定的,因此能夠在 container 裏面執行任何指令
  • 基於 Kaniko 能夠在 Builder 中編譯鏡像以及把鏡像推送到鏡像倉庫等操做
  • BuildTemplate 提供了能夠重複使用的模板
  • Build 過程能夠從 git 倉庫 clone 代碼、向鏡像倉庫 push 鏡像。全部這些動做使用到的鑑權信息均可以經過 serviceAccount 進行關聯。直接使用 Kubernetes 原生的能力便可實現

Build 示例

既然是 Hello World 咱們就從一個具體的例子談起。docker

apiVersion: build.knative.dev/v1alpha1
kind: Build
metadata:
  name: example-build-name
spec:
  serviceAccountName: build-auth-example
  source:
    git:
      url: https://github.com/example/build-example.git
      revision: master
  steps:
    - name: ubuntu-example
      image: ubuntu
      args: ["ubuntu-build-example", "SECRETS-example.md"]
    - image: gcr.io/example-builders/build-example
      args: ["echo", "hello-example", "build"]
    - name: dockerfile-pushexample
      image: gcr.io/example-builders/push-example
      args: ["push", "${IMAGE}"]
      volumeMounts:
        - name: docker-socket-example
          mountPath: /var/run/docker.sock
  volumes:
    - name: example-volume
      emptyDir: {}

關鍵字段解釋:ubuntu

  • steps

steps 字段和 template 字段互斥。若是未指定 template 就須要設置 steps 字段。此字段用於指定 Pipeline 的步驟。也能夠把 steps 定義在 BuildTemplate 中,這樣就能經過模板來複用 Pipeline 的能力了。api

每個 step 就是制定一個鏡像,在真正執行的時候啓動一個容器去作當前 step 的動做。bash

  • Template

若是未設置 steps 就須要指定此字段。此字段經過引用 BuildTemplate 來設置 steps。ssh

  • Source

經常使用的 Source 就是 git repo,經過此字段指定引用的 git repo ,repo 的受權信息經過關聯的 ServiceAccount 進行設定。curl

  • ServiceAccount

從 git repe 克隆代碼和向鏡像倉庫 push 鏡像都須要鑑權信息。這些鑑權信息能夠經過 Kubernetes 的 ServiceAccount 進行關聯。socket

  • Volumes

能夠經過掛載 volume 的形式掛載 secret 或者 emptyDir 在多個 step 之間共享數據ide

  • Timeout

整個 Build 過程默認超時時間是 10 分鐘,也就是若是在 10 分鐘內沒有還有 step 沒有執行完成就會超時退出。但有能夠經過 Timeout 字段自定義超時時間。

接下來分別對每個關鍵字段進行詳細的解讀。

steps

下面這是一個設置 steps 的例子,這個例子中有三個 step。每個 step 都經過一個鏡像執行一個容器完成本身的動做。

spec:
  steps:
    - name: ubuntu-example
      image: ubuntu
      args: ["ubuntu-build-example", "SECRETS-example.md"]
    - image: gcr.io/example-builders/build-example
      args: ["echo", "hello-example", "build"]
    - name: dockerfile-pushexample
      image: gcr.io/example-builders/push-example
      args: ["push", "${IMAGE}"]
      volumeMounts:
        - name: docker-socket-example
          mountPath: /var/run/docker.sock

Template

經過 BuildTemplate 來定義能夠重複使用的 steps,主要是對 steps 的複用。BuildTemplate 自己是 Kubernetes 中的一個 CRD。CRD 的好處就是能夠在用戶之間共享,只要是在同一個 Kubernetes 集羣內就能夠相互共享,這樣效率更高。

BuildTemplate 除了定義 steps 之外還能夠指定 parameters,用戶在使用 BuildTemplate 的時候能夠基於 parameters 對 steps 作個性化的設置。而 BuildTemplate 的編寫者也能夠經過 parameters 來共享變量。

spec:
  parameters:
    # This has no default, and is therefore required.
    - name: IMAGE
      description: Where to publish the resulting image.

    # These may be overridden, but provide sensible defaults.
    - name: DIRECTORY
      description: The directory containing the build context.
      default: /workspace
    - name: DOCKERFILE_NAME
      description: The name of the Dockerfile
      default: Dockerfile

  steps:
    - name: dockerfile-build
      image: gcr.io/cloud-builders/docker
      workingDir: "${DIRECTORY}"
      args:
        [
          "build",
          "--no-cache",
          "--tag",
          "${IMAGE}",
          "--file",
          "${DOCKERFILE_NAME}",
          ".",
        ]
      volumeMounts:
        - name: docker-socket
          mountPath: /var/run/docker.sock

    - name: dockerfile-push
      image: gcr.io/cloud-builders/docker
      args: ["push", "${IMAGE}"]
      volumeMounts:
        - name: docker-socket
          mountPath: /var/run/docker.sock

  # As an implementation detail, this template mounts the host's daemon socket.
  volumes:
    - name: docker-socket
      hostPath:
        path: /var/run/docker.sock
        type: Socket

Source

常見的 source 就是指定一個 git repo 或者 emptyDir 共享數據,下面咱們分別對這兩種場景進行說明。

  • git repo 的例子

下面這個例子的意思是從 https://github.com/knative/build.git clone 代碼,而且指定一個 step 是 cat README.md

spec:
  source:
    git:
      url: https://github.com/knative/build.git
      revision: master
  steps:
    - image: ubuntu
      args: ["cat", "README.md"]
  • volume 共享數據

下面這個例子是兩個 step,第一個 step 下載文件並保存到 /var/my-volume 中,第二個 step 是使用 /var/my-volume 的內容。

spec:
  steps:
    - image: ubuntu
      entrypoint: ["bash"]
      args: ["-c", "curl https://foo.com > /var/my-volume"]
      volumeMounts:
        - name: my-volume
          mountPath: /var/my-volume

    - image: ubuntu
      args: ["cat", "/etc/my-volume"]
      volumeMounts:
        - name: my-volume
          mountPath: /etc/my-volume

  volumes:
    - name: my-volume
      emptyDir: {}

ServiceAccount

下面這個例子是使用了 test-build-robot-git-ssh 這個 ServiceAccount 去關聯 clone 代碼須要的 git ssh 認證信息。經過 ServiceAccount 和 secret 保存認證信息也能夠作到在多個用戶之間共享相同的數據,並且能夠經過 RBAC 控制不一樣資源的可見範圍,比較靈活。

  • Build 配置以下
apiVersion: build.knative.dev/v1alpha1
kind: Build
metadata:
  name: test-build-with-serviceaccount-git-ssh
  labels:
    expect: succeeded
spec:
  serviceAccountName: test-build-robot-git-ssh
  source:
    git:
      url: git@github.com:knative/build.git
      revision: master

  steps:
    - name: config
      image: ubuntu
      command: ["/bin/bash"]
      args: ["-c", "cat README.md"]
  • test-build-robot-git-ssh ServiceAccount 配置以下
apiVersion: v1
kind: ServiceAccount
metadata:
  name: test-build-robot-git-ssh
secrets:
  - name: test-git-ssh
  • ServiceAccount 關聯的 secret 以下
apiVersion: v1
kind: Secret
metadata:
  name: test-git-ssh
  annotations:
    build.knative.dev/git-0: github.com
type: kubernetes.io/ssh-auth
data:
  # Generated by:
  # cat id_rsa | base64 -w 0
  ssh-privatekey: LS0tLS1CRUdJTiBSU0EgUFJJVk.....[example]
  # Generated by:
  # ssh-keyscan github.com | base64 -w 0
  known_hosts: Z2l0aHViLmNvbSBzc2g.....[example]

Timeout

下面這個是自定義 Build 超時時間的例子。

spec:
  timeout: 20m
  source:
    git:
      url: https://github.com/knative/build.git
      revision: master
  steps:
    - image: ubuntu
      args: ["cat", "README.md"]
相關文章
相關標籤/搜索