用无服务器框架部署你的第一个Knative服务

322 阅读6分钟

用无服务器框架部署你的第一个Knative服务

在谈论现代微服务架构时,我看到的一个最大的持续对话是人们问 "我应该在容器或无服务器上运行吗?"。嗯,这并不完全正确。事实上,这通常更像是一种激烈的观点性回应,即为什么我应该使用其中一种。我最喜欢的这种持续对话的例子可能是Trek10的无服务器与容器说唱战。

有点令人惊讶的结论(考虑到讨论的形式)是,这两种方法都完全适合不同的用例。

Kubernetes和Serverless如何让彼此变得更好

我们可以再进一步说,这两种架构模式都能让我们深入了解对方的局限性和潜在的改进。

Kubernetes因操作复杂而闻名,而AWS Lambda等Serverless基础设施旨在完全消除这种复杂性。围绕Kubernetes的广大社区正在不断创新,以创建像Knative这样的工具来解决这些问题,并简化开发人员和运营商的体验。

另一方面,无服务器技术因供应商施加的限制而闻名,如冷启动和运行时间长度限制。这些问题中的许多问题已经开始得到解决,或者在一些平台上已经解决了问题。

在无服务器,我想可以说,我们认为这种对话是合理的,我们希望通过新的工具来支持这两个世界的最佳状态,从而为之做出贡献。正因为如此,无服务器框架现在支持与Knative集成--一个帮助在Kubernetes之上构建无服务器应用的工具。我们认为Knative可以成为许多工作负载的合理选择,尤其是那些由于内部或监管要求而需要多云移植的工作负载。

开始使用

要开始使用无服务器框架Knative插件,有几个先决条件。首先,你需要一个安装了Knative的Kubernetes集群。由于Kubernetes的开源性质,你有很多不同的选择。你可以选择把它安装在大量的云供应商中的任何一个,甚至在你自己的数据中心。对于这个演示,我们将利用谷歌云平台。

在谷歌云平台上创建一个Kubernetes集群

为了让你的Kubernetes集群在GCP中启动和运行,你需要创建一个谷歌云平台账户。

创建你的GCP账户

进入cloud.google.com/,创建一个账户。截至本教程,谷歌为使用GCP提供了300美元的信贷。我将努力使你不超过该信用额度和谷歌默认的限制,但请记住,虽然Kubernetes集群可以向上和向下扩展,但它们的最低节点数仍然是三个,即使不使用时也会开启。作为本指南的最后一步,我将告诉你如何删除你的集群。

在GCP中创建一个项目

在你有一个账户并运行后,你可以在这里使用Google Cloud Console创建一个项目。我把我的项目命名为sls-kubernetes-project ,以保持事物的连续性。

Screenshot of Google Cloud Project UI

无论你给自己的项目取什么名字,都要确保保留这个值,因为我们以后会用到它。

安装和配置谷歌SDK

为了创建你的Kubernetes集群并与之对接,你需要使用Google SDK。它将提供一个漂亮的CLI界面来完成你需要的一切。根据你的操作系统,你可以从这里开始。

如果你按照SDK的安装说明,你可能还用你的谷歌云账户进行了认证。如果没有,你可以用这个做。gcloud auth login

当经历这个过程时,它应该提示你选择一个项目。请确保选择你刚刚创建的项目,在我的例子中是sls-kubernetes-project

之后,让我们设置一些环境变量,使创建我们的集群更容易一些。我们将为我们的集群名称、我们的集群区域(我们在GCP中部署到哪里)和我们的项目名称设置一个环境变量。

export CLUSTER_NAME=slsknative
export CLUSTER_ZONE=us-west1-c
export PROJECT=sls-kubernetes-project

我使用slsknative 作为我的集群名称,你可以使用knative 或其他不会与你可能正在运行的任何其他集群冲突的东西,并遵循集群的命名惯例。

现在,请确保我们在谷歌云CLI设置中把我们的项目设置为默认项目。你可以用gcloud config list 。如果部分输出包括你的项目名称,像这样,你就可以了。

project = sls-kubernetes-project

否则,在你设置了$PROJECT环境变量后,用这个命令设置项目配置。

gcloud projects create $PROJECT --set-as-default

接下来,让我们为我们将在谷歌云上使用的服务启用一些API。

gcloud services enable \
  cloudapis.googleapis.com \
  container.googleapis.com \
  containerregistry.googleapis.com

在这个命令完成后,我们应该准备好创建我们的Kubernetes集群了!

创建你的Kubernetes集群

现在是最难的部分(算是吧,谷歌让这部分变得出奇的简单)。你将使用以下命令在谷歌云中创建一个Kubernetes集群。

gcloud beta container clusters create $CLUSTER_NAME \
  --addons=HorizontalPodAutoscaling,HttpLoadBalancing,Istio \
  --machine-type=n1-standard-2 \
  --cluster-version=latest --zone=$CLUSTER_ZONE \
  --enable-stackdriver-kubernetes --enable-ip-alias \
  --enable-autoscaling --min-nodes=1 --max-nodes=10 \
  --enable-autorepair \
  --scopes cloud-platform

那么,这是在做什么?我们使用GCP来创建一个新的集群,并通过一些标准配置来创建一个能与Knative一起工作的集群。

首先,我们添加一些插件,比如Istio,这些插件可以与Knative很好地配合。我们还指定了我们想在集群中出现的机器类型。我使用稍小的机器类型n1-standard-2 ,因为Kubernetes集群至少有三个节点,而且从这个演示来看,谷歌云将新创建的账户限制在单个区域的8个vCPU。你可以用更大的实例旋转出一个更强大的集群,但你最终可能需要激活账户并确保你的限制增加。

你会注意到,我在这个命令中也启用了自动扩展功能,但在这种情况下,如果我扩展得太远,可能最终会触及一些账户的限制。

在集群创建完成后,你需要授予自己管理权限来管理它。你可以用这个命令来做。

kubectl create clusterrolebinding cluster-admin-binding \
  --clusterrole=cluster-admin \
  --user=$(gcloud config get-value core/account)

一旦你有了这些管理员权限,你就可以使用kubectl ,与集群进行交互并安装Knative。如果你之前已经在你的机器上安装了Docker,你可能会在这里或之后看到一个关于kubectl 的警告,看起来像这样。

WARNING:   There are older versions of Google Cloud Platform tools on your system PATH.
  Please remove the following to avoid accidentally invoking these old tools:

  /Applications/Docker.app/Contents/Resources/bin/kubectl

只要确保你在这一点上重启你的终端。很可能,GCP在安装过程中改变了你的路径,所以你会在~/google-cloud-sdk/bin/kubectl ,然后找到kubectl 。如果没有,只要确保你使用的是Google Cloud SDKkubectl 安装或其他最近的安装。最简单的验证方法是输入which kubectl ,确认它引用了Google Cloud SDK文件夹中的位置。

在我们的集群上安装Knative

现在我们准备在我们的Kubernetes集群上安装Knative!首先,我们将运行这个命令,这有助于避免安装过程中的竞争条件。

kubectl apply --selector knative.dev/crd-install=true \
--filename https://github.com/knative/serving/releases/download/v0.11.0/serving.yaml \
--filename https://github.com/knative/eventing/releases/download/v0.11.0/release.yaml \
--filename https://github.com/knative/serving/releases/download/v0.11.0/monitoring.yaml

然后,我们可以用这个命令完成安装。

kubectl apply \
--filename https://github.com/knative/serving/releases/download/v0.11.0/serving.yaml \
--filename https://github.com/knative/eventing/releases/download/v0.11.0/release.yaml \
--filename https://github.com/knative/serving/releases/download/v0.11.0/monitoring.yaml

这将使我们需要的所有Knative的好东西进入我们的Kubernetes集群。在安装过程中,我们只需要等待几分钟,监控Knative组件的安装情况,直到它们都显示为运行状态。我们用这三个命令来做。

kubectl get pods --namespace knative-serving
kubectl get pods --namespace knative-eventing
kubectl get pods --namespace knative-monitoring

每隔几分钟运行一次,然后确认所有的结果都显示为运行状态。完成后,你就可以在谷歌云的Kubernetes中启动并运行Knative了!

使用无服务器框架和Knative

现在,我们已经完成了集群和Knative的设置,准备开始使用无服务器框架了

首先,确保你的本地机器上至少安装了Node.js 8+。然后,如果你还需要安装无服务器框架,请运行以下npm 命令将其安装在你的机器上。

npm install --global serverless

接下来,我们需要用knative-docker 模板创建一个新的无服务器框架项目,然后将目录换到该项目中。

serverless create --template knative-docker --path my-knative-project

cd my-knative-project

因为我们使用的是serverless-knative 提供者插件,所以在做其他事情之前,我们需要用npm install 安装我们模板的所有依赖项。这将下载在package.json 文件中被列为依赖项的提供者插件。

接下来,让我们看一下我们项目中的serverless.yml 文件,它看起来像这样。

service: my-knative-project

provider:
  name: knative
  # optional Docker Hub credentials you need if you're using local Dockerfiles as function handlers
  docker:
    username: ${env:DOCKER_HUB_USERNAME}
    password: ${env:DOCKER_HUB_PASSWORD}

functions:
  hello:
    handler: hello-world.dockerfile
    context: ./code
    # events:
    #   - custom:
    #       filter:
    #         attributes:
    #           type: greeting
    #   - kafka:
    #       consumerGroup: KAFKA_CONSUMER_GROUP_NAME
    #       bootstrapServers:
    #         - server1
    #         - server2
    #       topics:
    #         - my-topic
    #   - awsSqs:
    #       secretName: aws-credentials
    #       secretKey: credentials
    #       queue: QUEUE_URL
    #   - gcpPubSub:
    #       project: knative-hackathon
    #       topic: foo
    #   - cron:
    #       schedule: '* * * * *'
    #       data: '{"message": "Hello world from a Cron event source!"}'

plugins:
  - serverless-knative

这是无服务器框架的服务定义,其中将Knative Serving组件列为functions ,将其潜在的事件源列为events

你可能会问,这看起来简单了。无服务器框架是如何与我的集群连接的?好吧,默认情况下,我们使用的是你在设置集群时在机器上创建的~/.kube/config 。为了让其他开发者开始工作,你还需要确保他们能够访问你的Kubernetes集群,并拥有自己的kubeconfig文件。

另外,上述内容的一个关键部分是Docker Hub部分。目前,该部分允许你指定证书,以便你的本地Docker镜像和code 目录中的代码可以被送入Docker Hub并被Knative使用。为了使其发挥作用,你需要有一个Docker Hub账户,并在本地设置docker环境变量。在Mac上,你可以像这样设置这些环境变量。

export DOCKER_HUB_USERNAME=yourusername
export DOCKER_HUB_PASSWORD=yourpassword

一旦Docker Hub凭证被设置为环境变量,我们就可以将服务部署到我们的Kubernetes集群。

serverless deploy

这个过程完成后,调用我们的新服务就很简单了。

serverless invoke --function hello

祝贺你!在你看到回应后,你就可以在Kubernetes集群上部署服务了。在你看到响应之后,你就已经使用Knative、Kubernetes和Google Cloud部署了你的第一个无服务器框架服务

现在,如果你需要删除Knative服务,你可以使用。

serverless remove

这应该会删除Knative服务,但请记住,你的Kubernetes集群仍在运行!如果你想删除集群,为自己省点钱,你可以运行这个命令。

gcloud container clusters delete $CLUSTER_NAME --zone $CLUSTER_ZONE

这应该会删除你的集群,但为了安全起见,请确保在GCP用户界面中检查你的集群,以确认它是否有效。

现在,在你继续使用Knative的过程中,你还有很多事情可以做。你可能想尝试用更多有趣的服务来定制你的Docker容器,并将你的Knative集群与Google Cloud Pub/Sub、Kafka或AWS Simple Queue Service等来源的事件整合起来。有很多可能性,我们迫不及待地想看到你用它做什么!

你对Knative和无服务器框架相关的特定事件源或主题的指南感兴趣吗?请在下面给我们留言!