背景简介

OpenFaaS是来自Docker社区的一款Serverless框架,作用是为用户提供FaaS计算平台,官网:https://www.openfaas.com,下图来自官方:

说明:
本来访问 OpenFaaS 控制台以后,国外的网络可以直接运行一些官方例子进行测试的,但是由于部署集群的机器都是国内的集群环境,所以无法直接使用官方例子,本文将会从动手写一个小栗子,展开 OpenFaaS 的功能全貌。

环境要求
  • Centos7+
  • K8s/K3s 环境
  • OpenFaaS
  • Helm3
  • Git

OpenFaaS 实践

####1 命令行工具
该工具可以装在其他电脑上,只要网络访问K8S环境没问题就行;
一行命令即可完成部署:

curl -sL https://cli.openfaas.com | sh

看到如下输出表示命令行部署成功:

# 将OPENFAAS_URL写入环境变量中,192.168.133.187是K8S宿主机IP
[root@vm3026 ~]# echo export OPENFAAS_URL=192.168.133.187:31112 >> ~/.bashrc
[root@vm3026 ~]# source ~/.bashrc
# 安装命令行工具
[root@vm3026 ~]# curl -sL https://cli.openfaas.com | sh
Finding latest version from GitHub
0.13.2
Downloading package https://github.com/openfaas/faas-cli/releases/download/0.13.2/faas-cli as /tmp/faas-cli
Download complete.

Running with sufficient permissions to attempt to move faas-cli to /usr/local/bin
New version of faas-cli installed to /usr/local/bin
Creating alias 'faas' for 'faas-cli'.
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|

CLI:
 commit:  eecaee04d59238c4b969b830f39c6f0c30a8868d
 version: 0.13.2
# 账号密码登录
[root@vm3026 ~]# faas-cli login -u admin -p admin
# 查看输出
[root@vm3026 ~]# faas-cli list

####2 OpenFaaS 函数 Demo

demo函数本身流程:一个加法程序,接收1,2,3这样的字符串,分割成三个数字1、2、3,将它们相加的结果返回;

  • faas-cli 基础命令
# 最新模板下载到本地
faas-cli template pull
# 查询 openfaas 的模板列表
faas-cli new --list
# 创建模板函数
# 执行以下命令即可创建函数,add是函数名,python是语言类型,bolingcavalry是docker镜像名字的前缀:
faas-cli new add --lang python -p bolingcavalry
  • 函数 Demo
# 创建 python 函数模板
[root@iZbp1dnzy9ygt2oosvzzzcZ work]# faas-cli new add --lang python -p bolingcavalry
2021/02/11 22:09:48 No templates found in current directory.
2021/02/11 22:09:48 Attempting to expand templates from https://github.com/openfaas/templates.git
2021/02/11 22:10:09 Fetched 12 template(s) : [csharp dockerfile go java11 java11-vert-x node node12 php7 python python3 python3-debian ruby] from https://github.com/openfaas/templates.git
Folder: add created.
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|


Function created in folder: add
Stack file written: add.yml

说明: 当前目录下,产生名为add的文件夹,以及名为add.yml的文件;
add.yml 内容如下:

version: 1.0
provider:
  name: openfaas
  gateway: http://127.0.0.1:8080
functions:
  add:
    lang: python
    handler: ./add
    image: bolingcavalry/add:latest

进入add文件夹,看到faas-cli帮我们生成的源码文件handler.py,默认代码:

# 原文件
def handle(req):
    """handle a request to the function
    Args:
        req (str): request body
    """

    return req

# 调整以后
def handle(req):
    array = req.replace('\n', '').split(',')
    rlt = 0
    for i in array:
        rlt += int(i)
    return rlt

回到add.yml所在目录,执行以下命令开始构建函数:

faas-cli build -f ./add.yml

如下所示,开始在本地构建docker镜像,正常情况下可以构建成功:

Step 29/29 : CMD ["fwatchdog"]
 ---> Running in 94b3e80d0df2
Removing intermediate container 94b3e80d0df2
 ---> 5e6c22fa838d
Successfully built 5e6c22fa838d
Successfully tagged bolingcavalry/add:latest
Image: bolingcavalry/add:latest built.
[0] < Building add done in 62.81s.
[0] Worker done.

Total build time: 62.81s

查看本地镜像,确定是刚刚构建的:

$docker images|grep add
bolingcavalry/add                                  latest              5e6c22fa838d        4 minutes ago       88.4MB

说明: OpenFaaS访问镜像问题

  • K8S环境如何能访问到此镜像;
  • 要注意的是OpenFaaS默认的镜像拉取策略是Always,即每次都远程拉取,所以镜像必须放入仓库,例如hub.docker.com、habor、registry等;(这个策略可以修改,不过本文中先不动它)
  • 测试环境用的是hub.docker.com,因为我的ID是bolingcavalry,因此登录后执行docker push bolingcavalry/add:latest即可推送到远程仓库;

部署函数

执行部署命令faas-cli deploy -f add.yml,控制台会提示部署成功,还会给出URL:

[root@node1 faas-template]# faas-cli deploy -f add.yml
Deploying: add.
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.

Deployed. 202 Accepted.
URL: http://192.168.133.187:31112/function/add.openfaas-fn

如果K8S可以顺利拉取到镜像,就可以看到openfaas-fn这个namespace下新增了名为add-xxx的pod,且状态正常:

[root@node1 faas-template]# kubectl get pods -n openfaas-fn
NAME                        READY   STATUS    RESTARTS   AGE
add-5679bcd94c-vc9rw        1/1     Running   0          32m
nodeinfo-57fb768fb8-955tf   1/1     Running   0          104m

此时登录管理页面,http://192.168.133.187:31112,可以看到新增的函数,也可以在页面上验证功能调用是否正常,如下图:

其他电脑上发起请求测试,如下所示,函数可以正常服务:

[root@node1 ~]# curl http://192.168.133.187:31112/function/add -X POST -d '1,2,3,4,5,6'
21

拓展阅读

OpenFaaS 默认支持的是 K8s 环境,但是本次进行测验的环境主要是 K3s 集群,但是 K3s 默认使用的容器运行时是 Containerd,而非Docker,所以在镜像打制的时候会存在一些认证推送的问题,所以需要一些小技巧绕开镜像仓库的限制问题,由于Containerd 本身缺少镜像鉴权的功能,所以 OpenFaaS 整个流程 Demo 中所有的镜像都是开源的,在生产中这个是完全不允许的;还有就是 OpenFaaS 在国内网络环境存在部分功能受限的的问题,如果想体验完全的 OpenFaaS 功能的话,最好将自己的网络环境和国外网络打通在进行测试,这样体感会更好一些。

Logo

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

更多推荐