Kubernetes | OpenFaaS

2020 08 8, Sat

平时老说现在的语言写个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:密码登录

看看是不是这么一个界面:

OpenFaas首页

是就对了。

可能唯一不一样的就是左边那个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

用网页也是类似的:

OpenFaas商店页

选中nodeinfo,点击deploy就好了。然后在nodeinfo里面invoke,就可以得到结果了。

OpenFaas function页

自己写一个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"]

或者网页

OpenFaas页

从此以后,编写API不再是一个问题。