邁向 serverless 開發的第一步

做者:Kamesh Sampath

翻譯:瘋狂的技術宅前端

原文:https://serverless-architectu...node

未經容許嚴禁轉載linux

在本文的第一部分中,咱們將討論設置適合Knative 0.6.0 版的開發環境。第二部分介紹第一個 serverless 微服務的部署。使用 Knative 建立 serverless 應用程序的基本要求是對 Kubernetes 的紮實知識。若是你沒有經驗,則應該學習官方的基本 Kubernetes 教程1git

在深刻了解以前必須先安裝一些工具和程序:程序員

  • Minikube 2
  • kubectl 3
  • kubens 4

對於 Windows 用戶,WSL 5被證實是很是有用的,因此我建議也把它裝好。github

設置Minikube

Minikube 是單節點 Kubernetes 集羣,很是適合使用 Kubernetes 進行平常開發。設置以後,必須執行如下步驟以便使 Minikube 準備好經過 Knative Serving 進行部署。下面是代碼的樣子。web

minikube profile knative 

minikube start -p knative --memory=8192 --cpus=6 \
  --kubernetes-version=v1.12.0 \
  --disk-size=50g \
  --extra-config=apiserver.enable-admission-plugins="LimitRanger,NamespaceExists,NamespaceLifecycle,ResourceQuota,ServiceAccount,DefaultStorageClass,MutatingAdmissionWebhook"

首先,必須建立一個 Minikube 配置文件,這是第一行實現的功能。而後,第二個命令用於設置一個 Minikube 實例,該實例包含 8 GB RAM,6 個 CPU 和 50 GB 的硬盤空間。 boot 命令還包含 Kubernetes 集羣的一些其餘配置,這些配置是啓動和運行 Knative 所必需的。一樣重要的是,所使用的 Kubernetes 版本不得早於 1.12.0,不然 Knative 將不起做用。若是 Minikube 沒有當即啓動,這徹底正常;由於首次啓動時可能須要幾分鐘才能完成,因此設置時請耐心等待。面試

創建 Istio 入口網關

Knative 須要一個入口網關才能將請求路由到 Knative 服務。除 Istio6外,還支持把 Gloo 7做爲入口網關。對於咱們的例子,將會使用 Istio。如下步驟顯示瞭如何執行僅包含 Ingress Gateway 的 Istio 的輕量級安裝:json

curl -L https://raw.githubusercontent.com/knative/serving/release-0.6/third_party/istio-1.1.3/istio-lean.yaml \
| sed 's/LoadBalancer/NodePort/' \
| kubectl apply --filename –

與 Minikube 同樣,Istio Pod 的部署也須要幾分鐘。使用命令 kubectl —namespace istio-system get pods –watch,你能夠看到狀態;Ctrl + C 結束。能夠經過命令 kubectl –namespace istio-system get pods 輕鬆肯定部署是否成功。若是一切順利,輸出應相似於下面的清單。segmentfault

NAME                                     READY   STATUS    RESTARTS   AGE
cluster-local-gateway-7989595989-9ng8l   1/1     Running   0          2m14s
istio-ingressgateway-6877d77579-fw97q    2/2     Running   0          2m14s
istio-pilot-5499866859-vtkb8             1/1     Running   0          2m14s

安裝 knative 服務

經過安裝 Knative Serving 8,能夠在 Kubernetes 上運行 serverless 工做負載。它還提供了自動縮放和修訂跟蹤。能夠經過如下命令安裝:

kubectl apply --selector knative.dev/crd-install=true \
--filename https://github.com/knative/serving/releases/download/v0.6.0/serving.yaml

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.6.0/serving.yaml --selector networking.knative.dev/certificate-provider!=cert-manager

一樣,部署 Knative Pod 可能要花幾分鐘時間;你能夠用命令 kubectl –namespace knative-serving get pods –watch 檢查狀態。和前面同樣用 Ctrl + C 終止檢查。用命令 kubectl –namespace knative-serving get pods 檢查全部程序是否正在運行。若是是這種狀況,應該顯示下面的輸出。

NAME                               READY   STATUS    RESTARTS   AGE
activator-54f7c49d5f-trr82         1/1     Running   0          27m
autoscaler-5bcd65c848-2cpv8        1/1     Running   0          27m
controller-c795f6fb-r7bmz          1/1     Running   0          27m
networking-istio-888848b88-bkxqr   1/1     Running   0          27m
webhook-796c5dd94f-phkxw           1/1     Running   0          27m

部署演示程序

要建立的用於演示的程序是一個簡單的輸出 「Hi」 的問候機。可使用現有的 Linux 容器鏡像,能夠在 Quay 網站上找到9

第一步是建立一個傳統的 Kubernetes 部署,而後能夠對其進行修改來使用 serverless 功能。這將可以幫你弄清楚實際差別究竟在哪裏,以及如何使用 Knativeless server 進行現有部署。

建立 Kubernetes 資源文件

如下步驟顯示瞭如何建立 Kubernetes 資源文件。必須首先建立一個名爲 app.yaml 的新文件,下面的代碼必須複製到該文件中。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: greeter
spec:
  selector:
    matchLabels:
      app: greeter
  template:
    metadata:
      labels:
        app: greeter
    spec:
      containers:
      - name: greeter
        image: quay.io/rhdevelopers/knative-tutorial-greeter:quarkus
        resources:
          limits:
            memory: "32Mi"
            cpu: "100m"
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: greeter-svc
spec:
  selector:
    app: greeter
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080

建立部署和服務

經過應用先前建立的 YAML 文件能夠建立部署和服務。這能夠經過 kubectl apply –filename app.yaml 命令完成。一樣,在這一點上,命令 kubectl get pods –watch 可用於獲取有關應用狀態的信息,而 CTRL + C 可終止整個過程。若是一切順利,咱們如今應該有了一個名爲 greeter 的部署和一個名爲 greeter-svc 的服務。

$ kubectl get deployments
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
greeter   1         1         1            1           16s

$ kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
greeter-svc   NodePort    10.110.164.179           8080:31633/TCP   50s

要激活服務,你還可使用 Minikube 快捷方式(例如 minikube service greeter-svc)在瀏覽器中打開服務 URL。若是你更喜歡用 curl 打開相同的URL,則必須使用命令 curl $(minikube service greeter-svc –url)。如今你應該會看到一個相似於如下內容的文本:Hi greeter =>'9861675f8845':1

經過 knative 將傳統的 kubernetes 部署遷移到 serverless

首先簡單地複製 app.yaml 文件,將其命名爲 serverless-app-yaml 並將其更新爲下面代碼所示的內容。

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: greeter
spec:
  template:
    metadata:
      labels:
        app: greeter
    spec:
      containers:
      - image: quay.io/rhdevelopers/knative-tutorial-greeter:quarkus
        resources:
          limits:
            memory: "32Mi"
            cpu: "100m"
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /healthz
        readinessProbe:
          httpGet:
            path: /healthz

若是將傳統的 Kubernetes 應用(app.yaml)與 serverless 應用(serverless-app.yaml)進行比較,咱們會發現三點:首先,不須要其餘服務,由於 Knative 將自動建立並進行路由服務。其次,因爲服務的定義是手動完成的,所以再也不須要選擇器,因此如下代碼行被省略:

selector:
        matchLabels:
          app: greeter

最後,在 TEMPLATE | SPEC | CONTAINERS 名稱被省略,由於該名稱由 Knative 自動生成。此外無需爲探針的活動性和準備狀態定義端口。

部署 serverless 應用程序

部署遵循與前面相同的模式,使用命令 kubectl apply –filename serverless-app.yaml 。在成功部署 serverless 應用以後,應該建立如下對象:如今應該已經添加了部署(清單1)。一些新服務也應該可用(清單2),包括 ExternalName 服務,該服務指向 istio-ingressgateway.istio-system.svc.cluster.local。還應該有一個提供 URL 的 Knative 服務,能夠向其發送請求(清單3)。

清單1:
$ kubectl get deployments
NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
greeter                    1         1         1            1           30m
greeter-bn8cm-deployment   1         1         1            1           59s
清單2:
$ kubectl get services
NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP                                           PORT(S)          AGE
greeter                 ExternalName              istio-ingressgateway.istio-system.svc.cluster.local              114s
greeter-bn8cm           ClusterIP      10.110.208.72                                                    80/TCP           2m21s
greeter-bn8cm-metrics   ClusterIP      10.100.237.125                                                   9090/TCP         2m21s
greeter-bn8cm-priv      ClusterIP      10.107.104.53                                                    80/TCP           2m21s
清單3
$ kubectl get services.serving.knative.dev
NAME    URL                                LATESTCREATED   LATESTREADY     READY   REASON
greeter http://greeter.default.example.com greeter-bn8cm   greeter-bn8cm   True
Attention
In a Minikube deployment we will have neither LoadBalancer nor DNS to resolve anything to *.example.com or a service URL like http://greeter.default.example.com. To call a service, the host header must be used with http/curl.

爲了可以調用服務,請求必須經過入口或網關(在咱們的例子中爲 Istio)進行。要找出咱們必須在 http/curl 調用中使用的 Istio 網關的地址,可使用如下命令:

IP_ADDRESS="$(minikube ip):$(kubectl get svc istio-ingressgateway --namespace istio-system --output 'jsonpath={.spec.ports[?(@.port==80)].nodePort}')"

該命令在名稱空間 istio-system 中接收服務 istio-ingressgatewayNodePort。若是咱們擁有 istio-ingressgatewayNodePort,咱們能夠經過 $IP_ADDRESS 來調用 greeter 服務,方法是傳遞帶有 HTTP/curl 調用的主機頭。

curl -H "Host:greeter.default.example.com" $IP_ADDRESS

如今你將得到與傳統 Kubernetes 部署相同的結果(Hi greeter =>'9861675f8845':1)。若是容許部署處於空閒模式約 90 秒鐘,則部署將終止。在下一個調用中,而後從新激活計劃的部署並應答請求。

恭喜,你已經成功部署並調用了本身的第一個 serverless 應用!

參考文章與連接



本文首發微信公衆號:前端先鋒

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章


歡迎繼續閱讀本專欄其它高贊文章:



  1. https://kubernetes.io/docs/tu...
  2. https://kubernetes.io/docs/ta...
  3. https://kubernetes.io/docs/ta...
  4. https://github.com/ahmetb/kub...
  5. https://docs.microsoft.com/en...
  6. https://istio.io
  7. https://gloo.solo.io
  8. https://knative.dev/docs/serv...
  9. https://quay.io/rhdevelopers/...
相關文章
相關標籤/搜索