嘗試使用Knative建立一個應用

banq發表於2018-08-20
本文使用Knative構建一個應用的嘗試:

Knative有一些非常有趣的功能:應用可伸縮到零,可從原始碼直接構建到容器、事件和路由策略,看起來非常有前景。


瞭解Knative

Knative是利用Kubernetes提供的一種稱為自定義資源定義(CRD)的擴充套件技術,我們可以定義自己物件並透過Kubernetes API訪問它們。

與Knative所有互動是透過kubectl,Kubernetes官方的CLI。kubectl用於在Kubernetes API中建立,更新或刪除資源,Knative對這些資源中的更改(例如啟動容器)做出反應並確保系統隨時間的一致性。

Knative定義了不同的CRD,但最接近應用的概念是“服務”。

[img index=1]

一個“服務”是由Knative的“路徑”和“配置”組成。預設情況下,會建立一個讓你的應用可訪問的路由,因此我們可以直接關注“配置”。

一個“配置”資源包含了“構建”和“修訂”。一個“構建”定義了一系列關於如何構建應用的步驟,但不用擔心,有叫第二資源BuildTemplate的東東,它提供了根據不同的用例如何定義這些步驟的模板。最後,“修訂”指定了執行應用的配置,其中包含用於容器的Docker映象等欄位。

為應用定義服務
為了定義一個從原始碼構建和部署應用所需的最小配置,我們必須遵循以下步驟:

1. 選擇適合你的用例的構建模板BuildTemplate,並將其應用於Kube群集。在我的例子中,我選擇了Buildpack模板,因為它能夠自動檢測並安裝我的應用程式的任何依賴項。

$ kubectl apply -f https://raw.githubusercontent.com/knative/build-templates/master/buildpack/buildpack.yaml

2. Knative需要將應用程式上傳到Docker Registry,因此我們需要有一個註冊器,為了簡單起見,我決定使用Docker Hub。

3.要讓Knative推送映象,我們需要定義ServiceAccount使用者名稱和密碼才能使用Docker Hub,並在叢集中配置它們:

---
apiVersion: v1
kind: Secret
metadata:
  name: basic-user-pass
  annotations:
    build.knative.dev/docker-0: https://index.docker.io
type: kubernetes.io/basic-auth
stringData:
  username: jszroberto
  password: <REMOVED>

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-bot
secrets:
- name: basic-user-pass
<p class="indent">


$ kubectl apply -f serviceaccount.yml

4.我們現在可以定義服務:

---
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: buildpack-example
  namespace: default
spec:
  runLatest:
    configuration:
      build:
        serviceAccountName: build-bot # ServiceAccount with the authentication for Docker Hub
        source:
          git:
            url: https://github.com/jszroberto/helloworld-go
            revision: master
        template:
          name: buildpack
          arguments:
          - name: IMAGE
            value: jszroberto/buildpack-example # Published Docker image to Docker Hub
      revisionTemplate:
        metadata:
          labels:
            knative.dev/type: app
        spec:
          container:
            image: jszroberto/buildpack-example # Used Docker image to run the app
<p class="indent">


5.使用服務配置部署應用:

$ kubectl apply -f service.yml

6.構建和部署應用程式需要幾分鐘,只需等待pod執行:

$ kubectl -n default get pods

7.所有應用程式的流量都透過knative-ingressgateway。要在群集中獲取其IP,請使用以下命令。如果你的群集是新的,則服務可能需要一些時間才能獲得外部IP地址:

export IP_ADDRESS = $(kubectl get svc knative-ingressgateway -n istio-system -o'jsonpath = {.status.loadBalancer.ingress [0] .ip}')
<p class="indent">


8.要查詢服務的URL,請鍵入:

export HOST_URL = $(kubectl get services.serving.knative.dev buildpack-example -o jsonpath ='{。status.domain}')
<p class="indent">


最後,我們可以用curl訪問應用程式:

curl -H "Host: ${HOST_URL}" http://${IP_ADDRESS}
Hello World: Go Sample v1!
<p class="indent">


綜上所述
簡而言之,我們必須瞭解Knative使用自定義資源定義(CRD)來擴充套件Kubernetes API以及如何定義這些資源,這樣我們的應用程式才得以構建和部署。我們使用kubectl 實現與Knative互動並配置資源。此外,我們必須以我們可以將映像拉推到Docker Hub的方式來配置Kubernetes。

讓我們退後一步,考慮一下這對開發人員來說意味著什麼,Knative能夠構建並執行我們的應用程式,但我們必須熟悉許多新概念(例如CRD,構建,構建模板,配置,修訂,服務,安全,服務帳戶,Docker登錄檔,Istio Ingress,路由,kubectl,等等)。在我看來,開發人員必須儘可能地專注於程式碼。程式碼的執行位置和方式無關緊要,必須學習所有這些新概念會使事情變得更加複雜,並可能會使你遠離程式碼,感覺Knative缺少一種更直接的方式來在雲中部署應用程式。



Running my first application on Knative – Roberto

[該貼被banq於2018-08-21 09:27修改過]

相關文章