如何在 DigitalOcean Kubernetes 上使用 Knative 运行无服务器工作负载

作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。

介绍

Kubernetes是一个强大的集装箱编排工具,允许您部署和管理集装箱应用程序,但有时需要时间来管理底层基础设施。 serverless范式帮助用户部署应用程序,而无需担心底层基础设施。

Knative是一个基于Kubernetes的平台,提供部署和管理无服务器工作负载的组件。Knative提供开源Kubernetes集成、云敏感、构建块和可扩展性。

Knative 包含两个主要组件: EventingServing。 Eventing 管理引发无服务器工作负载的事件. Serving 是部署和管理无服务器工作负载的组件组合。 Knative Serving 允许开发人员在 Kubernetes 上部署和管理无服务器应用程序。 使用 Knative Serving,开发人员可以快速轻松地部署新服务,将其扩展到上下,并将其连接到其他服务和事件源。

在本教程中,您将使用 Knative Serving 在 DigitalOcean Kubernetes 集群上部署 Node.js 应用程序作为无服务器工作负载,您将使用 doctl (DigitalOcean CLI) 和 kn (knative CLI) 创建 Kubernetes 集群并部署应用程序。

前提条件

要完成本教程,您将需要以下内容:

*一个数字海洋账户,您将使用该账户启动至少4GB RAM和2个CPU核心的Kubernetes集群. 没有账户的,签入新账户。 此设置将使用 [数字海洋库伯内特斯] (https://www.digitalocean.com/products/kubernetes/) 组. 要创建数字海洋云面板中的Kubernetes集群,请参见我们的 [Kubernetes Quickstart] (https://www.digitalocean.com/docs/kubernetes/quickstart/). (- ) * 为了从远程服务器跟踪此教程,您可以通过跟踪我们的初始服务器设置来设置一个带有非根用户和防火墙的Ubuntu 22.04服务器. 要开始使用 DigitalOcean Droplet, 您可以使用我们的 [Droplet Quickstart] (https://docs.digitalocean.com/products/droplets/quickstart/).

第 1 步:推出 DigitalOcean Kubernetes 集群

Knative 是基于 Kubernetes 的平台,因此您可以在 DigitalOcean 上与 Kubernetes 集群一起使用。在 DigitalOcean 上启动 Kubernetes 集群有多个方法。您可以使用 DigitalOcean Cloud 接口,DigitalOcean CLI 或 Terraform 提供商。

在本教程中,您将使用doctl,DigitalOcean命令行客户端,启动Kubernetes集群. 如果您尚未安装doctl,请遵循 官方安装指南中的步骤。

要在本教程中有效使用 Knative,您需要一个具有至少4GB RAM和2个CPU核心的Kubernetes集群,您可以通过运行以下旗帜的doctl命令启动一个名为knative-tutorial的集群,具有这些规格:

  • --size 指定远程服务器的大小
  • --count 指定将作为集群的一部分创建的节点数量

若要创建 DigitalOcean Kubernetes 集群,请运行以下命令:

1doctl kubernetes cluster create knative-tutorial --size s-2vcpu-4gb --count 3

在这个命令中,你创建了一个名为knative-tutorial的群集,其大小设置为4GB RAM和2个CPU核心,并有3节点。

<$>[注] **注:**您也可以使用 --region 旗帜来指定服务器将位于哪个区域,尽管本教程中没有使用此选项。如果您正在使用远程服务器,例如 Droplet,您可能希望您的群集位于与服务器相同的区域。如果您使用 DigitalOcean 控制面板 创建您的群集,您可以 选择数据中心区域和 VPC 网络

此命令需要几分钟才能完成,一旦完成,您将收到一个类似于以下的消息:

1[secondary_label Output]
2Notice: Cluster is provisioning, waiting for cluster to be running
3...........................................................
4Notice: Cluster created, fetching credentials
5Notice: Adding cluster credentials to kubeconfig file found in "/home/sammy/.kube/config"
6Notice: Setting current-context to do-nyc1-knative-tutorial
7ID Name Region Version Auto Upgrade Status Node Pools
8d2d1f9bc-114b-45e7-b109-104137f9ab62 knative-tutorial nyc1 1.24.4-do.0 false running knative-tutorial-default-pool

集群现在已经准备好使用。

您现在可以验证您的系统是否已设置了kubectl,并可以使用以下命令访问DigitalOcean Kubernetes集群:

1kubectl cluster-info

你应该得到类似的输出:

1[secondary_label Output]
2Kubernetes control plane is running at https://69de217e-0284-4e18-a6d7-5606915a4e88.k8s.ondigitalocean.com
3
4CoreDNS is running at https://69de217e-0284-4e18-a6d7-5606915a4e88.k8s.ondigitalocean.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

由于输出列出了控制平面CoreDNS服务的URL(在输出块中突出),你知道kubectl在你的系统中正确配置,可以到达集群。

作为集群创建过程的一部分,doctl会自动配置kubectl背景以使用新集群,您可以通过运行以下命令来验证此情况:

1kubectl config current-context

此命令将返回当前背景的名称。

你应该得到以下的输出:

1[secondary_label Output]
2do-nyc1-knative-tutorial

输出表明当前的背景是do-nyc1-knative-tutorial,即您创建的集群与其所在区域的名称(‘nyc1’)。

您还可以通过此命令验证集群正在运行,节点准备接受工作负载:

1kubectl get nodes

kubectl 获取节点命令列出了群集中的所有节点,以及其状态和其他信息。

你应该得到以下的输出:

1[secondary_label Output]
2NAME STATUS ROLES AGE VERSION
3do-nyc1-knative-tutorial-159783000-0v9k5 Ready    <none>   2m52s v1.24.4
4do-nyc1-knative-tutorial-159783000-1h4qj Ready    <none>   2m52s v1.24.4
5do-nyc1-knative-tutorial-159783000-1q9qf Ready    <none>   2m52s v1.24.4

输出表示,集群有三个节点准备接受工作负载。

在此步骤中,您在 DigitalOcean 上启动了 Kubernetes 集群,现在您可以安装 Knative 来在 Kubernetes 上部署无服务器工作负载。

步骤 2 – 安装 Knative Serving

在此步骤中,您将在您的 Kubernetes 集群上安装 Knative Serving

要安装 Knative Serving,您将需要 Knative 核心组件和自定义资源. 运行以下命令来安装核心组件:

1kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.0/serving-crds.yaml
2kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.0/serving-core.yaml

命令 kubectl 应用 将 Knative 核心组件和自定义资源安装到您的集群中。 -f 标志指定包含配置更改的文件。

这些命令需要几分钟才能完成,您将收到以下输出(下面的输出被缩短为简短):

1[secondary_label Output]
2customresourcedefinition.apiextensions.k8s.io/certificates.networking.internal.knative.dev created
3customresourcedefinition.apiextensions.k8s.io/clusteringresses.networking.internal.knative.dev created
4customresourcedefinition.apiextensions.k8s.io/configurations.serving.knative.dev created
5customresourcedefinition.apiextensions.k8s.io/images.caching.internal.knative.dev created
6customresourcedefinition.apiextensions.k8s.io/ingresses.networking.internal.knative.dev created
7...

此输出表示 Knative 核心组件和自定义资源都在您的集群中。

一旦他们完成了下载,您可以验证 Knative Serving 已安装:

1kubectl get pods --namespace knative-serving

kubectl get pods 命令将从knative-serving 名称空间中获取集群中启动的所有 pods 的列表,该命令会识别集群中的 pods、它们的当前状态、集群中的容器数量以及特定名称空间中的容器名称。

你应该得到类似的输出:

1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3activator-5f6b4bf5c8-kfxrv 1/1 Running 0 4m37s
4autoscaler-bc7d6c9c9-v5jqt 1/1 Running 0 4m34s
5controller-687d88ff56-9g4gz 1/1 Running 0 4m32s
6domain-mapping-69cc86d8d5-kr57g 1/1 Running 0 4m29s
7domainmapping-webhook-65dfdd9b96-nzs9c 1/1 Running 0 4m27s
8net-kourier-controller-55c99987b4-hkfpl 1/1 Running 0 3m49s
9webhook-587cdd8dd7-qbb9b 1/1 Running 0 4m22s

输出显示在knative-serving名称空间中运行的所有 pods. pods 负责 Knative Serving 的不同组件。

Knative 需要一个网络层来将流量导向您的服务. Knative 中的网络层允许在分布式环境中部署和通信微服务. Knative Serving 支持 Istio, ContourKourier作为网络层。

在本教程中,您将使用Kourier作为网络层,因为它与Knative无缝集成。Kourier使用与Knative生态系统的其他部分相同的API和标准,使其成为已经使用Knative的开发人员和组织的良好选择,他们希望从其强大的网络功能中受益。

使用此命令安装 Kourier:

1kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.8.0/kourier.yaml

你应该得到以下的输出:

 1[secondary_label Output]
 2namespace/kourier-system configured
 3configmap/kourier-bootstrap configured
 4configmap/config-kourier configured
 5serviceaccount/net-kourier configured
 6clusterrole.rbac.authorization.k8s.io/net-kourier configured
 7clusterrolebinding.rbac.authorization.k8s.io/net-kourier configured
 8deployment.apps/net-kourier-controller configured
 9service/net-kourier-controller configured
10deployment.apps/3scale-kourier-gateway configured
11service/kourier configured
12service/kourier-internal configured

输出列出了在Kubernetes集群中创建的所有资源,如NamespacesConfigMaps

要将 Knative 配置为使用 Kourier 作为网络层,您将编辑 ConfigMap 的config-network

要做到这一点,你需要使用kubectl patch命令来更新Kubernetes集群中的对象的字段。

  • --namespace 指示你可以找到要修补的对象
  • `--type' 指示在使用「修补」命令进行配置时要执行哪个修补程序。

运行此命令与相关的旗帜:

1kubectl patch configmap/config-network \
2  --namespace knative-serving \
3  --type merge \
4  --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'

kubectl patch命令修补了configmap/config-networknamespace设置为knative-servingtype设置为合并

合并补丁类型允许更有针对性的更新,而json战略补丁类型允许更全面的更新。

你应该得到以下的输出:

1[secondary_label Output]
2configmap/config-network patched

此命令的输出确保Kourier在集群中正确设置。

最后,用以下命令获取Kourier负载平衡器的外部IP地址:

1kubectl get svc kourier --namespace kourier-system

kubectl get svc命令会检索有关在上述名称空间中运行在 Kubernetes 集群中的服务的信息(在这种情况下,kourier-system)。

你应该得到以下的输出:

1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)                      AGE
3kourier LoadBalancer 10.245.186.153 138.197.231.61 80:31245/TCP,443:30762/TCP 2m33s

该命令的输出包括服务名称、服务类型(例如ClusterIP,NodePort等),集群 IP 地址和端口号码以及外部 IP 地址和端口号码。

负荷平衡器可能需要几分钟才能提供。 您可能会看到一个空的值或等待EXTERNAL-IP字段. 如果是这样的情况,请等待几分钟,然后重新启动命令。

<$>[注] **注:**在继续本教程之前,您将需要提供负载平衡器。一旦为LoadBalancer填充了EXTERNAL-IP字段,您可以继续使用。否则,您可能会在设置DNS服务时遇到问题。

您还可以为您的域名配置 DNS,以指向负载平衡器的外部 IP 地址. Knative 提供一个名为默认域的 Kubernetes 任务,该任务将自动配置 Knative Serving 以使用sslip.io作为默认 DNS 接口。

sslip.io是一个动态的DNS(域名系统)服务,允许用户使用自定义域名而不是IP地址访问他们的设备。

要配置默认 DNS 接口,您需要运行以下命令:

1kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.0/serving-default-domain.yaml

您将获得以下输出:

1[secondary_label Output]
2job.batch/default-domain configured
3service/default-domain-service configured

运行 Magic DNS 服务所需的资源已成功配置。

<$>[注] 注: 如果您喜欢,您也可以添加域名,尽管这超出了本文的范围。您需要设置一个 DNS 提供商(如 Cloud DNS 或 Route53)并创建一个 Knative 输入网关的 A 记录,该记录被映射到您的 Knative 集群的 IP 地址。 然后您将更新 Knative 输入网关配置以使用您创建的 DNS 区域和 A 记录。

您现在已经在您的 Kubernetes 集群中成功安装了 Knative Serving. 您现在可以在您的 Kubernetes 集群中使用 Knative Serving 部署无服务器工作负载。

步骤 3 – 部署无服务器工作负载

在此步骤中,您将部署一个无服务器的工作负载在 Knative 上,该工作负载目前在您的 Kubernetes 集群中运行,您将使用您创建的 Node.js 应用程序作为前提条件的一部分。

在您继续之前,您将创建一个新的名称空间,以部署您的无服务器工作负载。

1kubectl create namespace serverless-workload

此命令将创建一个名称空间,名为无服务器工作负载

你应该得到以下的输出:

1[secondary_label Output]
2namespace/serverless-workload configured

输出确保了名称空间的成功创建。

Knative Serving 使用名为服务的自定义资源来部署和管理您的无服务器工作负载.该服务资源由 Knative Serving API定义。

一旦您创建或修改服务资源,Native Serving 将自动创建一个新的修订

每次创建一个新的修订时,流量将由一个路径路由到新的修订路由。 Knative Serving 自动为每个服务创建一个路由

要在 Knative 上部署无服务器工作负载,您必须创建一个服务资源,您可以通过两种不同的方式实现这一目标:

  • 使用kn,官方的 Knative CLI 工具
  • 使用kubectl命令行工具将 YAML 文件应用到您的 Kubernetes 集群

在以下子节中,您将使用这些方法的每个方法。

选项 1 – 使用 Knative CLI

Knative CLI(kn)是一个命令行接口,允许您与 Knative 交互。

首先,通过下载 Knative CLI 二进制的最新版本来安装 kn:

1wget https://github.com/knative/client/releases/download/knative-v1.8.1/kn-linux-amd64

wget命令将恢复该工具。

然后,将二进制移动到名为kn的文件夹:

1mv kn-linux-amd64 kn

然后,用以下命令使它可执行:

1chmod +x kn

最后,将可执行的二进制文件移动到您的PATH上的目录:

1cp kn /usr/local/bin/

检查kn是否已安装:

1kn version

你应该得到类似的输出:

 1[secondary_label Output]
 2Version:      v1.8.1
 3Build Date:   2022-10-20 16:09:37
 4Git Revision: 1db36698
 5Supported APIs:
 6* Serving
 7  - serving.knative.dev/v1 (knative-serving v1.8.0)
 8* Eventing
 9  - sources.knative.dev/v1 (knative-eventing v1.8.0)
10  - eventing.knative.dev/v1 (knative-eventing v1.8.0)

此命令的输出表示kn已安装。

要使用kn部署 Node.js 应用程序,您将使用kn 服务创建命令。

  • --image 指定您要部署的容器的图像
  • --port 指定您的应用程序倾听的端口
  • --name 指定您要创建的 `服务' 的名称
  • --namespace 指定您要部署工作负载的名称空间

要部署 Node.js 应用程序,请运行以下命令,并使用您的 DockerHub 用户名更新突出部分:

1kn service create node-service \
2  --image your_dockerhub_username/nodejs-image-demo \
3  --port 8080 \
4  --namespace serverless-workload

kn service 命令创建了名为node-service的 Knative Service,其端口设置为8080,名称空间旗帜设置为无服务器工作负载

你应该得到以下的输出:

 1[secondary_label Output]
 2Creating service 'node-service' in namespace 'serverless-workload':
 3
 4  0.236s Configuration "node-service" is waiting for a Revision to become ready.
 5  2.230s ...
 6  2.311s Ingress has not yet been reconciled.
 7  2.456s Waiting for load balancer to be ready
 8  2.575s Ready to serve.
 9
10Service 'node-service' created to latest revision 'node-service-00001' is available at URL:
11http://node-service.serverless-workload.138.197.231.61.sslip.io

此输出提供了创建服务的状态.一旦创建了服务,您将找到与服务链接的路线的URL。

运行以下命令来验证已创建服务资源:

1kn service list --namespace serverless-workload

kn服务列表命令列出了Knative Serving在Kubernetes群集中的特定名称空间中目前部署的所有服务,该命令允许您访问有关每个服务的详细信息,包括其名称、状态和URL。

你应该得到类似的输出:

1[secondary_label Output]
2NAME URL LATEST AGE CONDITIONS READY REASON
3node-service http://node-service.serverless-workload.138.197.231.61.sslip.io node-service-00001 88s 3 OK / 3 True

从此输出中,您可以验证您之前执行的kn service命令创建了一个新的服务字符号,您还可以找到服务的路线年龄状态的URL。

在本节中,您安装了 Knative CLI,并使用它为您的 Node.js 应用部署无服务器工作负载。

选项 2 — 使用 YAML 文件创建服务资源

您还可以通过创建一个YAML文件来部署一个服务资源,该方法有助于确保工作负载的版本控制。

首先,您将在目录中创建一个包含您的Dockerfile的子目录。本教程使用该子目录的名称knative

1mkdir knative

接下来,您将在knative目录中创建一个名为service.yaml的YAML文件:

1nano knative/service.yaml

在新创建的service.yaml文件中,添加以下行来定义将部署您的 Node.js 应用的服务:

 1[label ~/node_project/knative/service.yaml]
 2apiVersion: serving.knative.dev/v1
 3kind: Service
 4metadata:
 5  name: node-yaml-service
 6  namespace: serverless-workload
 7spec:
 8  template:
 9    metadata:
10      name: node-yaml-service-v1
11    spec:
12      containers:
13        - image: docker.io/your_dockerhub_username/nodejs-image-demo
14          ports:
15            - containerPort: 8080

Knative Service YAML 文件指定以下信息:

*第一个元数据部分中的名称指定了服务资源的名称 *名称空间指定了您要部署工作负载的名称空间 *第一个特殊部分中的名称指定了修订名称 *第二个特殊部分中的图像指定了您要部署的容器的图像 *容器端口指定了您的应用程序收听器的端口

请确保以您选择的应用程序和系统的信息更新突出的文本,以及您的 DockerHub 用户名。

保存并关闭文件。

您现在可以通过运行以下命令部署服务资源:

1kubectl apply -f knative/service.yaml

你应该得到以下的输出:

1[secondary_label Output]
2service.serving.knative.dev/node-yaml-service created

输出表示服务资源已成功创建。

运行以下命令来验证已创建服务资源:

1kn service list --namespace serverless-workload

kn service list命令列出了目前在特定名称空间中部署的所有 Knative Serving 服务,该命令允许您访问有关每个服务的详细信息。

你应该得到以下的输出:

1[secondary_label Output]
2NAME URL LATEST AGE CONDITIONS READY REASON
3node-service http://node-service.serverless-workload.174.138.127.211.sslip.io node-service-00001 9d 3 OK / 3 True    
4node-yaml-service http://node-yaml-service.serverless-workload.174.138.127.211.sslip.io node-yaml-service-v1 9d 3 OK / 3 True

您可以验证基于您之前执行的 Knative Service YAML 文件创建了一个新的 Knative Service. 在本节中您创建了 node-yaml-service. 您还可以找到 Knative Route 的 URL。

您在本节中使用了 YAML 文件来为 Node.js 应用程序创建无服务器工作负载。

在此步骤中,您使用kn CLI 工具和 YAML 文件创建了 Knative `Service’ 资源,接下来,您将访问您使用 Knative 部署的应用程序工作负载。

步骤 4 – 访问应用程序工作负载

现在您已经部署了无服务器工作负载,您可以使用创建作为无服务器工作负载的一部分的 Knative Route 的 URL 访问它。

要获取所有 Knative 路径的列表,请运行以下命令:

1kn route list --namespace serverless-workload

kn路线列表命令列出了 Kubernetes 集群中特定名称空间的所有 Knative 路线。

你应该得到类似的输出:

1[secondary_label Output]
2NAME URL READY
3node-service http://node-service.serverless-workload.138.197.231.61.sslip.io True
4node-yaml-service http://node-yaml-service.serverless-workload.138.197.231.61.sslip.io True

您将使用为 Knative Routes 生成的 URL 来确认一切按预期工作。

打开您的浏览器中的任何一个 URL。当您在浏览器中访问该网站时,您的 Node 应用程序的目标页面将加载:

Screenshot of the Node.js Application deployed with Knative

您已成功部署了使用 Knative 在您的 Kubernetes 集群上的无服务器工作负载。

结论

在本教程中,您使用 Knative 部署了无服务器工作负载,您使用kn CLI 工具和通过 YAML 文件创建了一个 Knative Service’ 资源,该资源在您的 Kubernetes 集群上部署了一个 Node.js 应用程序,您使用Route` URL 访问了该资源。

有关 Knative 提供的功能的更多信息,如 自动扩展的 pods, 逐步部署的流量到修订,以及 事件的组件,请访问官方 Knative 文档

若要继续使用 DigitalOcean Kubernetes (DOKS) 构建,请参阅我们的 Kubernetes How-To 文档.您还可以 了解有关 DOKS 的更多信息,如 功能可用性.对于 DOKS 故障排除,您可以参阅我们的 Kubernetes 支持指南

Published At
Categories with 技术
comments powered by Disqus