Kubernetes | OpenFaaS
平时老说现在的语言写个Hello World都那么麻烦,一个类套一个类的,写一个web server提供api还需要干一堆事情。
于是为了偷懒我发掘出了一个好东西 -> OpenFaaS
FaaS?
FaaS是相对于PaaS SaaS IaaS类似的一个概念,展开写叫Function as a Service。即编写函数就可以构建一个服务。现在很多云平台都提供了FaaS的服务,也叫Serverless,因为我们不再需要管理架构和服务了。
OpenFaaS在k8s serverless中,是一个相对比较稳定的实现。如果感兴趣的话也可以试试别的
简单说,有了OpenFaaS和docker,我以后就可以简简单单几行代码写完一个简单的服务了。
安装OpenFaaS到k8s
上一篇提到两个部署工具,一个是arkade,一个是helm。其实就是当时看到openfaas记下来的。
极速安装
arkade install openfaas --load-balancer
# 或者私有化部署用
# arkade install openfaas
Helm
kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
helm repo add openfaas https://openfaas.github.io/faas-netes/
helm repo update && helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=true --set serviceType=LoadBalancer
# 或者私有化部署
# helm repo update && helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=true --set ingress.enabled=true
验证安装过程
验证安装么的问题的话,会多出来俩namespace,还会有这些pods:
$ kubectl get namespaces
NAME STATUS AGE
default Active 23d
kube-system Active 23d
kube-public Active 23d
kube-node-lease Active 23d
kubernetes-dashboard Active 23d
openfaas Active 23d
openfaas-fn Active 23d
$ kubectl get --namespace openfaas pod
NAME READY STATUS RESTARTS AGE
nats-5cd4dff7c8-fddmn 1/1 Running 4 4d22h
ingress-operator-6dfb66d756-vq767 1/1 Running 4 23d
basic-auth-plugin-7d4956689b-2vspb 1/1 Running 4 23d
queue-worker-6cb888d49c-nnk4w 1/1 Running 9 4d22h
alertmanager-8678d8894f-wwht7 1/1 Running 4 4d22h
prometheus-649f7c575c-sg5lz 1/1 Running 4 4d22h
gateway-f85d5d786-qzf4w 2/2 Running 13 4d22h
faas-idler-b85f98fb7-4rms4 1/1 Running 13 4d22h
获取密码:
$ kubectl --namespace openfaas get secret basic-auth -o yaml
apiVersion: v1
data:
basic-auth-password: V3RUNUw4YTBRNjNYNEFYMW9hMUlmeTgxbgo=
basic-auth-user: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2020-07-16T05:55:49Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:basic-auth-password: {}
f:basic-auth-user: {}
f:type: {}
manager: kubectl
operation: Update
time: "2020-07-16T05:55:49Z"
name: basic-auth
namespace: openfaas
resourceVersion: "12716"
selfLink: /api/v1/namespaces/openfaas/secrets/basic-auth
uid: 2b4f2a36-b9b8-4630-b20c-8030384950a7
type: Opaque
上面是我openfaas部署生成的,你的八成的和我的不一样。用echo V3RUNUw4YTBRNjNYNEFYMW9hMUlmeTgxbgo= | base64 -d
得到WtT5L8a0Q63X4AX1oa1Ify81n
。注意把自己的密码套进去
安装faas-cli
有faas-cli才能用openfaas。
Mac上brew install faas-cli
即可。
安装以后还需要设置默认的服务器地址,然后登录
# 如果需要的话写到rc文件里面
export OPENFAAS_URL=http://192.168.10.10:31112
# 登录
echo WtT5L8a0Q63X4AX1oa1Ify81n | faas-cli login -u admin --password-stdin
然后打开k8s任意节点的31112端口,用admin:密码登录
看看是不是这么一个界面:
是就对了。
可能唯一不一样的就是左边那个dig。
部署function
部署现成的熟饭
function有别人已经写好的,放在了store里面,比如说nodeinfo,用faas-cli或者网页都可以部署。
比如说查看节点信息的nodeinfo:
$ faas-cli store deploy nodeinfo
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.
Deployed. 202 Accepted.
URL: http://192.168.10.10:31112/function/nodeinfo
我们直接打开这个URL,就会得到
Hostname: nodeinfo-555965ddfb-xpv5r
Arch: x64
CPUs: 16
Total mem: 7975MB
Platform: linux
Uptime: 373466
用网页也是类似的:
选中nodeinfo,点击deploy就好了。然后在nodeinfo里面invoke,就可以得到结果了。
自己写一个function
自己写一个function也非常简单,最简单的function无非是输入字符序列,输出字符串的函数。
比如说截图里面出现的dig,实际上就是一个非常简单的我自己写的function。
无非就是:
- 建一个空目录
- 切换进去以后
- 拉下来模板
- 每次新写function
- 选择模板新建一个function
- 修改代码
- 部署
翻译成命令就是:
# 建一个空目录
$ mkdir $WORKSPACE/$GIT_SERVER/$GIT_USER/faas-functions
# 切换进去以后
$ cd $WORKSPACE/$GIT_SERVER/$GIT_USER/faas-functions
# 拉下来模板
$ faas-cli template pull
# 每次新写function
# 选择模板新建一个function
$ faas-cli new --lang go dig
# 修改function定义
$ vim dig.yml
$ cat dig.yml
version: 1.0
provider:
name: openfaas
gateway: http://192.168.10.10:31112
functions:
dig:
lang: go
handler: ./dig
image: jeffguorg/faas-dig:1.0
# 修改代码
$ vim dig/handler.go
package function
import (
"encoding/json"
"net"
)
// Handle a serverless request
func Handle(req []byte) string {
host, err := net.LookupIP(string(req))
if err != nil {
return err.Error()
}
result, err := json.Marshal(host)
if err != nil {
return err.Error()
}
return string(result)
}
# 部署
$ faas-cli deploy -f dig.yml
然后就可以从http://192.168.10.10:31112/function/dig访问到了:
$ echo -n dig | faas-cli invoke dig
["10.43.58.194"]
或者网页
从此以后,编写API不再是一个问题。