迈向 serverless 开发的第一步

在本文的第一部分中,我们将讨论设置适合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 进行部署。下面是代码的样子。

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 服务。除 Istio[6]外,还支持把 Gloo[7]作为入口网关。对于我们的例子,将会使用 Istio。以下步骤显示了如何执行仅包含 Ingress Gateway 的 Istio 的轻量级安装:

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轻松确定部署是否成功。如果一切顺利,输出应类似于下面的清单。

NAME READY STATUS RESTARTS AGEcluster-local-gateway-7989595989-9ng8l 1/1 Running 0 2m14sistio-ingressgateway-6877d77579-fw97q 2/2 Running 0 2m14sistio-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.yamlkubectl 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 AGEactivator-54f7c49d5f-trr82 1/1 Running 0 27mautoscaler-5bcd65c848-2cpv8 1/1 Running 0 27mcontroller-c795f6fb-r7bmz 1/1 Running 0 27mnetworking-istio-888848b88-bkxqr 1/1 Running 0 27mwebhook-796c5dd94f-phkxw 1/1 Running 0 27m复制代码

部署演示程序

要创建的用于演示的程序是一个简单的输出 “Hi” 的问候机。可以使用现有的 Linux 容器镜像,可以在 Quay 网站上找到[9]。

第一步是创建一个传统的 Kubernetes 部署,然后可以对其进行修改来使用 serverless 功能。这将能够帮你弄清楚实际差异究竟在哪里,以及如何使用 Knativeless server 进行现有部署。

创建 Kubernetes 资源文件

以下步骤显示了如何创建 Kubernetes 资源文件。必须首先创建一个名为 app.yaml 的新文件,下面的代码必须复制到该文件中。

—apiVersion:apps/v1kind:Deploymentmetadata: name:greeterspec: 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:v1kind:Servicemetadata: name:greeter-svcspec: 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 deploymentsNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEgreeter 1 1 1 1 16s$ kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEgreeter-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/v1alpha1kind:Servicemetadata: name:greeterspec: 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 deploymentsNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEgreeter 1 1 1 1 30mgreeter-bn8cm-deployment 1 1 1 1 59s复制代码

清单2:$ kubectl get servicesNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEgreeter ExternalName istio-ingressgateway.istio-system.svc.cluster.local 114sgreeter-bn8cm ClusterIP 10.110.208.72 80/TCP 2m21sgreeter-bn8cm-metrics ClusterIP 10.100.237.125 9090/TCP 2m21sgreeter-bn8cm-priv ClusterIP 10.107.104.53 80/TCP 2m21s复制代码

清单3$ kubectl get services.serving.knative.devNAME URL LATESTCREATED LATESTREADY READY REASONgreeter http://greeter.default.example.com greeter-bn8cm greeter-bn8cm TrueAttentionIn 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=" ( m i n i k u b e i p ) : (minikube ip): (minikubeip):(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 应用!

https://www.jianshu.com/p/30006af4fa6b

https://www.jianshu.com/p/7b51f12fcb75

https://www.jianshu.com/p/738de79a86ef

https://www.jianshu.com/p/a433deaac825

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值