我们在构建分布式应用程序方面取得了长足的进步。从单体应用到微服务,我们已经能够通过优化使用底层硬件资源来解耦和扩展我们的应用程序。但是现在我们正朝着更轻量级的方法来部署我们的应用程序; 无服务器!随着功能即服务 (FaaS) 的出现,应用程序模块化在云计算领域一直在上升。

https://youtu.be/3JpnyF0agxY

在本博客中,我们将探索从开发到本地部署无服务器功能。

OpenFaas 和 KinD 的美妙之处在于您无需将功能部署到云端进行测试,您可以在本地运行它们!

先决条件:

你只需要在你的机器上安装 Docker。其余的我们将继续设置。我们将安装一些工具,请耐心等待。 🐻

OpenFaas? 🐬

OpenFaas 是一个很棒的工具/框架,由Alex Ellis与开源社区一起开发,它有助于将可突发功能和微服务部署到 Kubernetes,而无需重复的样板编码。

它的构建考虑了开发人员的经验,从而降低了进入 Kubernetes 生态系统的门槛。它带有自己的名为faas-cli的 cli 工具,它巧妙地使用了模板,使推送 docker 镜像和容器部署变得轻而易举。部署后,它会根据网络流量进行自动扩展和自动配置。

由于 OpenFaas 处理了所有开销,您所要做的就是专注于编写函数。但在我们的例子中,我们需要做一些设置👨u200d🏭

函数的属性:

在创建函数时,请记住以下几点。

  • 经验法则是使您的函数无状态。

  • 函数应该是原子的(单一职责)。

  • 应该是幂等的。

  • 该函数的触发器可以是 TCP 或事件,但效果必须是事件。

让我们开始吧! 🚀

安装街机

arkade将是我们为 Kubernetes 安装和部署应用程序和服务的一站式工具。将此工具视为像aptpacman这样的包管理器。我们将需要一堆 CLI 实用程序来启动和运行。

如果您从未在系统中设置过 Kubernetes 工具,请确保安装此工具。

$ curl -sLS https://dl.get-arkade.dev | sudo sh

只是为了说清楚:

  • 使用 arkade get 下载与 Kubernetes 相关的 cli 工具和应用程序。

  • 使用 arkade install 安装 Kubernetes 应用程序,使用helm 图表或 vanillayaml文件。

安装 kubectl

kubectl是一个命令行工具,它与 Kubernetes 主控制器 API 对话以在我们的集群上执行操作。

$ arkade get kubectl

# follow the instructions on the screen.

创建本地 Kubernetes 集群 🧱

我们将在本地 Kubernetes 集群上部署我们的功能,所以让我们进行设置。为此,我们将使用一个名为 KinD(Docker 中的 Kubernetes)的工具。

与需要 VM 的Minikube不同; KinD 利用 Docker 容器来部署您的集群。它比较快。

安装 KindD

我们的目标是将所有内容都保留在本地,因此我们将创建一个本地 Docker 注册表(本地机器为Dockerhub)。 KinD 提供了一个shell 脚本来创建一个 Kubernetes 集群,同时启用本地 Docker 注册表。

#!/bin/sh
set -o errexit

# create registry container unless it already exists
reg_name='kind-registry'
reg_port='5000'
running="$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)"
if [ "${running}" != 'true' ]; then
  docker run \
    -d --restart=always -p "${reg_port}:5000" --name "${reg_name}" \
    registry:2
fi

# create a cluster with the local registry enabled in containerd
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:${reg_port}"]
    endpoint = ["http://${reg_name}:${reg_port}"]
EOF

# connect the registry to the cluster network
docker network connect "kind" "${reg_name}"

# tell https://tilt.dev to use the registry
# https://docs.tilt.dev/choosing_clusters.html#discovering-the-registry
for node in $(kind get nodes); do
  kubectl annotate node "${node}" "kind.x-k8s.io/registry=localhost:${reg_port}";
done

kind-with-registry.sh来自KindD 网站

一旦您在本地计算机上拥有该文件。运行以下命令使其可执行。

$ chmod +x kind-with-registry.sh

现在您可以运行脚本以使用本地 Docker 注册表创建本地 Kubernetes 集群。

$ ./kind-with-registry.sh

确保将 kubectl 上下文设置为新创建的集群;跑:

$ kubectl config current-context

如果结果不是kind-kind;然后运行:

$ kubectl config use kind-kind

确保您的集群正在运行:

$ kubectl cluster-info

确保 Docker 注册表正在运行。

$ docker logs -f kind-registry
OR 
$ docker ps -l

将 OpenFaas 部署到 KindD 集群

现在我们已经启动并运行了本地 Kubernetes 集群,让我们部署我们的 OpenFaas 服务来支持我们的功能。

$ arkade install openfaas

确保已部署 OpenFaas。可能需要一两分钟。

$ kubectl get pods -n openfaas

**模板**📂

在开始创建函数之前,必须了解 OpenFaas 中模板的概念。

什么是模板?

模板基本上是您的函数的包装器。同一模板可用于多种功能。

OpenFaas 已经为不同的编程语言提供了多种模板。

基于网络服务器的模板有两种:

  1. 经典看门狗,使用模板格式从这里。

  2. of-watchdog 使用这里的模板格式。

Watch Dogs 基本上是 Web 服务器,用于代理对我们功能的请求。

我们将使用支持最新of-watchdog的模板。您可以阅读更多关于OpenFaas watchdog的信息。

模板目录中最重要的部分是 Dockerfile,它驱动一切,从您的看门狗到您的函数在模板中的放置方式和位置。您还可以根据功能的需要创建自己的模板。

从商店中提取模板:

# list all the templates 
$ faas-cli template store list

# pull python3-flask template from store
$ faas-cli template store pull python3-flask

这会将 Python 的所有模板从 OpenFaas 存储拉到项目文件夹的 template 目录中。我们将使用python3-flask-debian模板。您可以忽略其余模板或删除它们。

Openfaas 模板结构。Openfaas 模板结构.

上面显示的是所有语言的基本模板结构。

模板结构说明:

1.index.py是我们的 Flask 应用程序的入口点。

  1. 项目根目录中的requirements.txt包含我们的 Flask 应用程序的依赖项。它包含Flask和女服务员(WSGI)。

3.template.yml包含部署特定的配置。

  1. 函数目录里面的requirements.txt是函数特定的依赖。

5.Dockerfile包含为我们的函数构建图像的指令。

构建我们的功能 🔨

现在是时候创建我们的无服务器功能了。

我们将保持范围非常小,并构建一个简单的字典函数来返回您查询的单词的含义。为此,我们将使用PyDictionary模块。

由于我们已经有了模板,我们可以利用它来搭建我们的功能。您可能已经注意到之前我们的python3-flask-debian模板文件夹中的 function 目录和 template.yml 文件。我们可以利用它来使用faas-cli创建我们的新函数。

$ faas-cli new <function-name> --lang <template-name>

$ faas-cli new pydict --lang python3-flask-debian

这将创建一个带有函数名称(pydict)的文件夹以及我们之前在模板函数文件夹中看到的内容,以及一个带有函数名称(pydict)的yaml文件。

让我们将依赖项添加到函数文件夹的 requirements.txt 文件中。

PyDictionary==2.0.1

使用以下代码更新handler.py

from PyDictionary import PyDictionary

dictionary = PyDictionary()

def handle(word):     
    return dictionary.meaning(word)

我们的功能就完成了。 ✔

Openfaas YAML 配置 📄

如果不讨论 YAML 文件,则 Kubernetes 指南是不完整的。它们对于描述我们的部署状态是必要的。faas-cli已经为我们的函数创建了一个yaml文件,即pydict.yml

该文件将告诉faas-cli我们要部署的功能和图像、我们要使用的语言模板、缩放因子和其他配置。

pydict.yml 的内容contents of pydict.yml

YAML 文件分解

1.gateway:确定连接OpenFaas服务的IP地址。由于我们在本地测试它,默认提供的网关很好。 注意: 如果我们在托管云上部署:我们将采用 IP 地址gateway-external

2.functions下:我们可以注册我们想要部署的不同的Serverless功能以及它们的配置。

3.lang:函数使用的语言模板的名称。

4.handler:我们的无服务器功能的位置。

5.image:完全限定的 docker 注册表 URL 以及图像名称和标签。

由于我们使用的是本地注册表,因此我们必须更改图像标签以将其合并。将图像的值更改为以下内容:

更改映像标签以使用本地容器注册表更改映像标签以使用本地容器注册表

端口转发到本地主机

现在,我们需要将 OpenFaas 网关服务端口转发到我们的 localhost 端口。还记得我们的 yaml 文件中的网关吗?

检查OpenFaas服务的网关;跑:

$ kubectl get service -n openfaas

$ kubectl port-forward -n openfaas svc/gateway 8080:8080

虽然集群是在本地部署的,但 Kubernetes 在内部管理它自己的 IP 地址。我们正在端口转发以从本地机器访问 Kubernetes 集群内的服务。完成后,打开一个新的终端窗口,准备起飞!

构建➡推送➡部署🚀

我们已经准备好大部分设置;现在我们可以构建我们的镜像,将其推送到注册表,并将其部署到 Kubernetes。

建立我们的形象

$ faas-cli build -f pydict.yml

将我们的图像推送到本地注册表

$ faas-cli push -f pydict.yml

现在将功能部署到集群;我们需要登录到faas-cli让我们生成用于身份验证的凭据。

生成密码:

$ PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)

检查密码是否存在:

$ env | grep PASSWORD

现在,登录到faas-cli:

$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin

部署时间:

$ faas-cli deploy -f pydict.yml -g http://127.0.0.1:8080

检查我们的部署是否成功。

$ kubectl get pods -n openfaas-fn

测试我们的功能 👨u200d🔬

使用 CLI 测试

我们可以从 CL I 调用我们的函数来获得结果。

$ echo "brevity" | faas-cli invoke pydict

使用 Openfaas 门户进行测试

OpenFaas 还带有一个简洁的 UI 门户来调用我们的函数。

在浏览器中导航到localhost:8080。提示将要求您输入用户名和密码。 usernamepassword 使用 admin 检查我们之前生成的密码。如果您忘记了,您可以随时重复前面的命令,即

PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo) && echo $PASSWORD

OpenFaas UIOpenFaas UI

构建更多功能 🔨

现在您已经使用 OpenFaas 部署了集群,您可以轻松地创建函数并部署它们。如果你想创建一个新函数,你所要做的就是:

1.脚手架使用faas-cli new的新功能

2.编写你的函数

3.faas-cli up -f <config-yaml-file>

faas-cli upbuild, push and deploy命令的快捷方式。

结论

希望这是学习如何使用 OpenFaas 进行无服务器部署的有用指南。如果您有任何疑问或建议,请在评论部分讨论,或者您可以在 Twitter](https://twitter.com/yankexe)[DM 我。

查看 GitHub 上的示例函数

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐