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"
    }
  ]
}

成功!

Logo

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

更多推荐