做者:Kamesh Sampath翻譯:瘋狂的技術宅前端
原文:https://serverless-architectu...node
未經容許嚴禁轉載linux
在本文的第一部分中,咱們將討論設置適合Knative 0.6.0 版的開發環境。第二部分介紹第一個 serverless 微服務的部署。使用 Knative 建立 serverless 應用程序的基本要求是對 Kubernetes 的紮實知識。若是你沒有經驗,則應該學習官方的基本 Kubernetes 教程1。git
在深刻了解以前必須先安裝一些工具和程序:程序員
對於 Windows 用戶,WSL 5被證實是很是有用的,因此我建議也把它裝好。github
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 沒有當即啓動,這徹底正常;由於首次啓動時可能須要幾分鐘才能完成,因此設置時請耐心等待。面試
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 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 資源文件。必須首先建立一個名爲 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
首先簡單地複製 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 自動生成。此外無需爲探針的活動性和準備狀態定義端口。
部署遵循與前面相同的模式,使用命令 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-ingressgateway 的 NodePort。若是咱們擁有 istio-ingressgateway 的 NodePort,咱們能夠經過 $IP_ADDRESS 來調用 greeter 服務,方法是傳遞帶有 HTTP/curl 調用的主機頭。
curl -H "Host:greeter.default.example.com" $IP_ADDRESS
如今你將得到與傳統 Kubernetes 部署相同的結果(Hi greeter =>'9861675f8845':1
)。若是容許部署處於空閒模式約 90 秒鐘,則部署將終止。在下一個調用中,而後從新激活計劃的部署並應答請求。
恭喜,你已經成功部署並調用了本身的第一個 serverless 應用!
參考文章與連接