Fission使用教程 ——在K8s中以Faas的形式部署方程
我的这个function是一个爬数据的脚本,这个脚本作用于一个空气质量与天气之间关联的一个分析场景,所以我吧我的restful api设计为:url '/weather/retrieval_air' method 为GET。2.给你的function创建一个package,这个package中需要包含这个function所需要的配置信息(即其使用的包,pandas什么的)3. 给你配置好的func
Pre request:
本机安装:openstack(使用openStack RC file连接上openstack),Kubectl,Helm
Cluster中安装:K8s cluster,且可访问.
背景简介:
Fission是一种基于FaaS理念的一种工具。FaaS是指把服务以方程的形式部署在云端,非常易用,且轻量化。
操作教程:
安装
一:
在K8s中部署Fission(使用Helm):
export FISSION_VERSION='1.20.0' kubectl create -k "github.com/fission/fission/crds/v1?ref=v${FISSION_VERSION}" helm repo add fission-charts https://fission.github.io/fission-charts/ helm repo update helm upgrade fission fission-charts/fission-all --install --version v${FISSION_VERSION} --namespace fission \ --create-namespace --set routerServiceType='ClusterIP'
检查是否安装成功:
kubectl get pods -n fission --watch
二:
在本机安装Fission Client(For mac/Linux,Windows用WSL):
OS=$(uname -s | tr '[:upper:]' '[:lower:]') curl -Lo fission https://github.com/fission/fission/releases/download/v$FISSION_VERSION/fission-v$FISSION_VERSION-$OS-amd64 \ && chmod +x fission && sudo mv fission /usr/local/bin/
部署function:
使用fission部署一个function时,一个有3个必须完成的步骤:
1.给你的function配置基础环境(这个环境由fission原生自带)
2.给你的function创建一个package,这个package中需要包含这个function所需要的配置信息(即其使用的包,pandas什么的)
3. 给你配置好的function创建一个router,你的可以通过这个使用http来访问你的function
你可以直接使用fission指令来配置function,但是比较慢,可以直接使用yaml文件来更新和配置。首先需要用fission创建一个spec文件夹,然后再在其中创建各种命令的yaml文件,然后使用fission apply直接全部应用到你的fission中。
一:使用fission创建specs文件夹来存放yaml文件
fission specs init
二:创建两个基础环境,python以及nodejs。这都是fission原生带的基础环境,不包括其他的包。
fission env create --spec --name python --image fission/python-env --builder fission/python-builder
fission env create --spec --name nodejs --image fission/node-env --builder fission/node-builders
三: 更具你的需求添加你想要配置的function等。我在这举一个例子:
我有一个python脚本,可以从一个网站中爬去数据并进行preprocess,最终返回一个json文件。我要把部署到fission中,且可以通过一个router访问他。
1. 如同我上面说的,如果我想要部署一个function,首先我需要创建一个fission package,其中包含这个function所需要的依赖。为了创建这个package,我需要设计3个文件,这写文件会描述我的依赖。
1. requirement.txt
2. build.sh
在requirement.txt中,我需要写下我所有需要的库。在我的代码中,我需要的库为:
pandas, request
所以我的requirement.txt 为:
在build.sh中,我需要描述我的安装库的逻辑。因为我会使用pip3来安装所以代码这么写:
#!/bin/sh
pip3 install -r ${SRC_PKG}/requirements.txt -t ${SRC_PKG} && cp -r ${SRC_PKG} ${DEPLOY_PKG}
这里的SRC_PKG, SRC_PKG, DEPLOY_PKG都是存在k8s中的配置变量,配置fisison时可以直接用。
如果你想让你的代码引用其他你自己定义的k8s配置变量,你可以用Configmap来设置k8s的全局变量。
Configmap: 是个yaml文件,名字可以叫shared-data.yaml
内容为:
apiVersion: v1 kind: ConfigMap metadata: namespace: default name: shared-data data: ES_USERNAME: elastic ES_PASSWORD: elastic
然后可以通过修改data来决定k8s中pod之间共享的一些变量,通过这个指令部署:
kubectl apply -f ./fission/specs/shared-data.yaml
当你完成这三个文件后,你需要把这三个文件压缩成一个zip包。然后再使用fission创建基于这个zip包的package,从而配置你的fission function。 (这里有两种方法,你也可以用source的方法
fission package create --spec --name aircondition
\ --source ./functions/aircondition/*.py
\ --source ./functions/aircondition/*.txt
\ --source ./functions/aircondition/*.sh
\ --env python \ --buildcmd './build.sh'
这样就会生成一个可以yaml配置文件。使用这个文件即可创建出一个供我的function运行的package。这样不需要压缩就可以更新你的包,会比较方便。但是问题是fission会抽风找不到你的文件,bug比较多,我不推荐这么做。你也可以自己试试)
压缩时要注意,你必须保证你的文件压缩在最靠前的目录,而不是压缩整个文件夹!使
如果检查你的压缩包结果是这样的,包中还有一个文件夹,则是错误的。
用命令行来压缩你的文件更能确保正确。cd 进你的文件夹,并使用如下命令压缩:
zip -r ../your_file_name.zip .
如果文件格式是这样的,就正确了。
2. 作完zip准备后,就可以用fission来创建压缩包的配置文件。假设我的python文件名为:retrieval_air.py,且我使用zip命令压缩好了他的包,使用如下命令来创建fission 包配置:
fission package create --spec --sourcearchive ./functions/aircondition.zip\
--env python\
--name aircondition\
--buildcmd './build.sh'
3. 有了package之后就可以创建我的function:
fission fn create --spec --name aircondition \
--pkg aircondition \
--env python \
--entrypoint "aircondition.main"
4. 配置我的router
使用restful api来设计function之间的api,router是用于设定其被调用的方法。我的这个function是一个爬数据的脚本,这个脚本作用于一个空气质量与天气之间关联的一个分析场景,所以我吧我的restful api设计为:url '/weather/retrieval_air' method 为GET。
fission route create --spec --name aircondition-get --function aircondition \ --method GET \ --url '/aircondition'
5. 应用这些配置
好耶,完成配置了。现在使用fission apply就可以直接应用所有的这些配置,如果一切正常,这个fission就可以使用了!使用如下命令apply这些配置:
fission spec apply --specdir ./specs --wait
如果一切正常,现在你将会看到这个输出:
Name: aircondition
Environment: python
Status: succeeded
Build Logs:
Collecting pandas
Using cached pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl (13.9 MB)
Collecting requests
Using cached requests-2.31.0-py3-none-any.whl (62 kB)
Collecting tzdata>=2022.7
Using cached tzdata-2024.1-py2.py3-none-any.whl (345 kB)
Collecting pytz>=2020.1
Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
Collecting numpy>=1.22.4
Using cached numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl (18.1 MB)
Collecting python-dateutil>=2.8.2
Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Collecting certifi>=2017.4.17
Using cached certifi-2024.2.2-py3-none-any.whl (163 kB)
Collecting charset-normalizer<4,>=2
Using cached charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl (142 kB)
Collecting idna<4,>=2.5
Using cached idna-3.7-py3-none-any.whl (66 kB)
Collecting urllib3<3,>=1.21.1
Using cached urllib3-2.2.1-py3-none-any.whl (121 kB)
Collecting six>=1.5
Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: pytz, urllib3, tzdata, six, numpy, idna, charset-normalizer, certifi, requests, python-dateutil, pandas
Successfully installed certifi-2024.2.2 charset-normalizer-3.3.2 idna-3.7 numpy-1.26.4 pandas-2.2.2 python-dateutil-2.9.0.post0 pytz-2024.1 requests-2.31.0 six-1.16.0 tzdata-2024.1 urllib3-2.2.1
这说明你的包成功部署了。此时你可以通过一些指令来测试function是否能正常运作。
fission fn log -f --name yourfunctionname
这个可以让fission输出你function的输出.
现在让我们用我们的route来测试function的输出。首先ssh进你的cluster入口,然后使用kubectl port-forward service/router -n fission 9090:80这段命令连通你的cluster和你本地9090 port。
我们route为/aircondtion,所以我现在只要输入 curl "http://127.0.0.1:9090/aircondition" | jq '.' 就一样调用我的aircondition function。
最终得到的输出为:
curl "http://127.0.0.1:9090/aircondition" | jq '.'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 96 100 96 0 0 8 0 0:00:12 0:00:10 0:00:02 25
{
"data": [
{
"BPM2.5": 6.5028571429,
"datetime_local": "2024-05-17-01",
"location_name": "Melbourne"
}
]
}
成功!
更多推荐
所有评论(0)