迈向 serverless 开发的第一步[每日前端夜话0xEE]

每日前端夜话 0xEE

每日前端夜话,陪你聊前端。

每天晚上18:00准时推送。

正文共: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-ingressgatewayNodePort 。如果我们拥有 istio-ingressgatewayNodePort ,我们可以通过 $IP_ADDRESS 来调用 greeter 服务,方法是传递带有 HTTP/curl 调用的主机头。

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

现在你将获得与传统  Kubernetes 部署相同的结果( Hi greeter =>'9861675f8845':1 )。如果允许部署处于空闲模式约 90 秒钟,则部署将终止。在下一个调用中,然后重新激活计划的部署并应答请求。

恭喜,你已经成功部署并调用了自己的第一个 serverless 应用!

参考文章与链接

[1] : https://kubernetes.io/docs/tutorials/kubernetes-basics/

[2] : https://kubernetes.io/docs/tasks/tools/install-minikube/

[3] : https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux

[4] : https://github.com/ahmetb/kubectx/blob/master/kubens/

[5] : https://docs.microsoft.com/en-us/windows/wsl/install-win10

[6] : https://istio.io

[7] : https://gloo.solo.io

[8] : https://knative.dev/docs/serving/

[9] : https://quay.io/rhdevelopers/knative-tutorial-greeter

原文: https://serverless-architecture.io/blog/your-first-step-towards-serverless-application-development/

下面夹杂一些私货:也许你和高薪之间只差这一张图

2019年京程一灯课程体系上新,这是我们第一次将全部课程列表对外开放。

愿你有个好前程,愿你月薪30K。我们是认真的 !

在公众号内回复“体系”查看高清大图

长按二维码,加大鹏老师微信好友

拉你加入前端技术交流群

唠一唠怎样才能拿高薪

小手一抖,资料全有。长按二维码关注 前端先锋 ,阅读更多技术文章和业界动态。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章