邁向 serverless 開發的第一步[每日前端夜話0xEE]
- 2019 年 11 月 25 日
- 筆記
正文共:1999 字
預計閱讀時間:9 分鐘
作者:Kamesh Sampath
翻譯:瘋狂的技術宅
來源:serverless-architecture.io

在本文的第一部分中,我們將討論設置適合 Knative 0.6.0 版的開發環境。第二部分介紹第一個 serverless 微服務的部署。使用 Knative 創建 serverless 應用程序的基本要求是對 Kubernetes 的紮實知識。如果你沒有經驗,則應該學習官方的基本 Kubernetes 教程[1]。
在深入了解之前必須先安裝一些工具和程序:
- Minikube [2]
- kubectl [3]
- kubens [4]
對於 Windows 用戶,WSL [5]被證明是非常有用的,所以我建議也把它裝好。
設置Minikube
Minikube 是單節點 Kubernetes 集群,非常適合使用 Kubernetes 進行日常開發。設置之後,必須執行以下步驟以便使 Minikube 準備好通過 Knative Serving 進行部署。下面是代碼的樣子。
1minikube profile knative 2 3minikube start -p knative --memory=8192 --cpus=6 4 --kubernetes-version=v1.12.0 5 --disk-size=50g 6 --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 服務。除 Istio[6]外,還支持把 Gloo [7]作為入口網關。對於我們的例子,將會使用 Istio。以下步驟顯示了如何執行僅包含 Ingress Gateway 的 Istio 的輕量級安裝:
1curl -L https://raw.githubusercontent.com/knative/serving/release-0.6/third_party/istio-1.1.3/istio-lean.yaml 2| sed 's/LoadBalancer/NodePort/' 3| kubectl apply --filename –
與 Minikube 一樣,Istio Pod 的部署也需要幾分鐘。使用命令 kubectl —namespace istio-system get pods –watch
,你可以看到狀態;Ctrl + C 結束。可以通過命令 kubectl –namespace istio-system get pods
輕鬆確定部署是否成功。如果一切順利,輸出應類似於下面的清單。
1NAME READY STATUS RESTARTS AGE 2cluster-local-gateway-7989595989-9ng8l 1/1 Running 0 2m14s 3istio-ingressgateway-6877d77579-fw97q 2/2 Running 0 2m14s 4istio-pilot-5499866859-vtkb8 1/1 Running 0 2m14s
安裝 knative 服務
通過安裝 Knative Serving [8],可以在 Kubernetes 上運行 serverless 工作負載。它還提供了自動縮放和修訂跟蹤。可以通過以下命令安裝:
1kubectl apply --selector knative.dev/crd-install=true 2--filename https://github.com/knative/serving/releases/download/v0.6.0/serving.yaml 3 4kubectl 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
檢查所有程序是否正在運行。如果是這種情況,應該顯示下面的輸出。
1NAME READY STATUS RESTARTS AGE 2activator-54f7c49d5f-trr82 1/1 Running 0 27m 3autoscaler-5bcd65c848-2cpv8 1/1 Running 0 27m 4controller-c795f6fb-r7bmz 1/1 Running 0 27m 5networking-istio-888848b88-bkxqr 1/1 Running 0 27m 6webhook-796c5dd94f-phkxw 1/1 Running 0 27m
部署演示程序
要創建的用於演示的程序是一個簡單的輸出 「Hi」 的問候機。可以使用現有的 Linux 容器鏡像,可以在 Quay 網站上找到[9]。
第一步是創建一個傳統的 Kubernetes 部署,然後可以對其進行修改來使用 serverless 功能。這將能夠幫你弄清楚實際差異究竟在哪裡,以及如何使用 Knativeless server 進行現有部署。
創建 Kubernetes 資源文件
以下步驟顯示了如何創建 Kubernetes 資源文件。必須首先創建一個名為 app.yaml 的新文件,下面的代碼必須複製到該文件中。
1--- 2apiVersion: apps/v1 3kind: Deployment 4metadata: 5 name: greeter 6spec: 7 selector: 8 matchLabels: 9 app: greeter 10 template: 11 metadata: 12 labels: 13 app: greeter 14 spec: 15 containers: 16 - name: greeter 17 image: quay.io/rhdevelopers/knative-tutorial-greeter:quarkus 18 resources: 19 limits: 20 memory: "32Mi" 21 cpu: "100m" 22 ports: 23 - containerPort: 8080 24 livenessProbe: 25 httpGet: 26 path: /healthz 27 port: 8080 28 readinessProbe: 29 httpGet: 30 path: /healthz 31 port: 8080 32--- 33apiVersion: v1 34kind: Service 35metadata: 36 name: greeter-svc 37spec: 38 selector: 39 app: greeter 40 type: NodePort 41 ports: 42 - port: 8080 43 targetPort: 8080
創建部署和服務
通過應用先前創建的 YAML 文件可以創建部署和服務。這可以通過 kubectl apply –filename app.yaml
命令完成。同樣,在這一點上,命令 kubectl get pods –watch
可用於獲取有關應用狀態的信息,而 CTRL + C 可終止整個過程。如果一切順利,我們現在應該有了一個名為 greeter 的部署和一個名為 greeter-svc 的服務。
1$ kubectl get deployments 2NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 3greeter 1 1 1 1 16s 4 5$ kubectl get svc 6NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 7greeter-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 並將其更新為下面代碼所示的內容。
1apiVersion: serving.knative.dev/v1alpha1 2kind: Service 3metadata: 4 name: greeter 5spec: 6 template: 7 metadata: 8 labels: 9 app: greeter 10 spec: 11 containers: 12 - image: quay.io/rhdevelopers/knative-tutorial-greeter:quarkus 13 resources: 14 limits: 15 memory: "32Mi" 16 cpu: "100m" 17 ports: 18 - containerPort: 8080 19 livenessProbe: 20 httpGet: 21 path: /healthz 22 readinessProbe: 23 httpGet: 24 path: /healthz
如果將傳統的 Kubernetes 應用(app.yaml)與 serverless 應用(serverless-app.yaml)進行比較,我們會發現三點:首先,不需要其他服務,因為 Knative 將自動創建並進行路由服務。其次,由於服務的定義是手動完成的,因此不再需要選擇器,所以以下代碼行被省略:
1 selector: 2 matchLabels: 3 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清單1: 2$ kubectl get deployments 3NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 4greeter 1 1 1 1 30m 5greeter-bn8cm-deployment 1 1 1 1 59s
1清單2: 2$ kubectl get services 3NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 4greeter ExternalName istio-ingressgateway.istio-system.svc.cluster.local 114s 5greeter-bn8cm ClusterIP 10.110.208.72 80/TCP 2m21s 6greeter-bn8cm-metrics ClusterIP 10.100.237.125 9090/TCP 2m21s 7greeter-bn8cm-priv ClusterIP 10.107.104.53 80/TCP 2m21s
1清單3 2$ kubectl get services.serving.knative.dev 3NAME URL LATESTCREATED LATESTREADY READY REASON 4greeter http://greeter.default.example.com greeter-bn8cm greeter-bn8cm True 5Attention 6In 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 網關的地址,可以使用以下命令:
1IP_ADDRESS="$(minikube ip):$(kubectl get svc istio-ingressgateway --namespace istio-system --output 'jsonpath={.spec.ports[?(@.port==80)].nodePort}')"
該命令在名稱空間 istio-system 中接收服務 istio-ingressgateway 的 NodePort。如果我們擁有 istio-ingressgateway 的 NodePort,我們可以通過 $IP_ADDRESS 來調用 greeter 服務,方法是傳遞帶有 HTTP/curl 調用的主機頭。
1curl -H "Host:greeter.default.example.com" $IP_ADDRESS
現在你將獲得與傳統 Kubernetes 部署相同的結果(Hi greeter =>'9861675f8845':1
)。如果允許部署處於空閑模式約 90 秒鐘,則部署將終止。在下一個調用中,然後重新激活計劃的部署並應答請求。
恭喜,你已經成功部署並調用了自己的第一個 serverless 應用!

往期精選
- BootstrapVue 入門
- JavaScript的工作原理:引擎、運行時和調用堆棧
- 用 TypeScript 開發 Node.js 程序
- 快速上手最新的 Vue CLI 3
- JavaScript 程序員可以從C ++中學到些什麼
- 在同一基準下對前端框架進行比較
- Edge 擁抱 Chromium 對前端工程師意味着什麼?
- 使你的 JavaScript 代碼簡單易讀
- Node.js多線程完全指南
- deno如何償還Node.js的十大技術債
- 實戰!半小時寫一個腦力小遊戲
- CSS Flexbox 可視化手冊
- 世界頂級公司的前端面試都問些什麼
- V8引擎內部機制及優化代碼的5個技巧