做者: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 应用!
参考文章与连接