OpenFaaS系列文章:
WSL中OpenFaaS开发环境配置
OpenFaaS部署前端
OpenFaaS开发后端curd接口
mkdir openfaas-restful-demo
cd openfaas-restful-demo
```bash
faas-cli template store pull golang-middleware
faas-cli new --lang golang-middleware record
使用arkade工具可以方便地安装k8s app,之前也可以使用arkade安装openfaas,此处使用ark来安装postgresql。
根据官方文档提供的命令
安装
curl -sLS https://get.arkade.dev | sudo sh
查看postgesql app的信息
arkade info postgresql
安装
arkade install postgresql
可以查看运行数据库的pod,默认位于default命名空间中
kubectl get pods
NAME READY STATUS RESTARTS AGE
postgresql-postgresql-0 1/1 Running 3 (38m ago) 23h
安装成功后会输出一些有用的信息
To get the password for "postgres" run:
export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
可以根据以下命令查看密码
echo $(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
PostgreSQL can be accessed via port 5432 on the following DNS name from within your cluster:
postgresql.default.svc.cluster.local - Read/Write connection
如果需要在集群外部连接,则使用localhost地址,还需要将5432端口转发出去
kubectl port-forward --namespace default svc/postgresql 5432:5432
使用lsof命令查看可以发现5432端口存在TCP监听进程
lsof -i:5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kubectl 4743 lbaf23 8u IPv4 171741 0t0 TCP localhost:postgresql (LISTEN)
kubectl 4743 lbaf23 9u IPv6 171745 0t0 TCP ip6-localhost:postgresql (LISTEN)
可以根据用户名postgre,密码为先前输出的密码,在localhost:5432地址连接数据库
以上信息可以根据
arkade info postgresql
命令查看
可以参考一个基于golang-middleware模板创建的前后端项目leaderboard-app
以下是摘自官方文档的一段话
Note: The OpenFaaS philosophy is that environment variables should be used for non-confidential configuration values only, and not used to inject secrets.
因此一些敏感信息如数据库密码等不应该使用环境变量来注入,而应该使用faas提供的secrets功能
新建openfaas-restful-demo-db-password.txt文件,写入密码
使用faas-cli保存密码
faas-cli secret create secret-api-key \
--from-file=openfaas-restful-demo-db-password.txt
查看密码
faas-cli secret list
record.yml中写明密码
version: 1.0
provider:
name: openfaas
gateway: http://localhost:31112
functions:
record:
lang: golang-middleware
handler: ./record
image: lbaf23/record:latest
build_args:
GO111MODULE: on
environment:
postgres_db: demo
postgres_port: 5432
postgres_host: postgresql.default.svc.cluster.local # 集群内部连接地址
postgres_user: postgres
postgres_sslmode: disable # 关闭ssl模式
secrets:
- openfaas-restful-demo-db-password # 关联密码
在init()函数中初始化一个数据库连接,是对于所有函数的副本共有的
package function
import (
"database/sql"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
"time"
_ "github.com/lib/pq"
)
var db *sql.DB # 实际上是一个连接池,可以设置最小和最大连接数量
func init() {
var err error
secretfile, _ := ioutil.ReadFile("/var/openfaas/secrets/openfaas-restful-demo-db-password")
password := strings.Split(string(secretfile), "\n")[0]
user := os.Getenv("postgres_user")
host := os.Getenv("postgres_host")
dbName := os.Getenv("postgres_db")
port := os.Getenv("postgres_port")
sslmode := os.Getenv("postgres_sslmode")
connStr := "postgres://" + user + ":" + password + "@" +
host + ":" + port + "/" + dbName + "?sslmode=" + sslmode
fmt.Println(connStr)
db, err = sql.Open("postgres", connStr)
if err != nil {
panic(err.Error())
}
err = db.Ping()
if err != nil {
panic(err.Error())
}
}
leaderboard-app项目采用vendor进行包管理,但是由于近年来更加流行mod管理工具,本文采用go mod进行包管理。
vendor和mod
vendor
不区分包的版本,开发和部署的包版本可能会不一样,可能会出问题mod
从go1.13开始默认开启go mod模式,管理更加清晰
进入创建的函数目录,创建go mod
cd record
go mod init function
go mod tidy
同时需要添加faas的打包参数,编辑根目录下record.yml文件,添加build_args
version: 1.0
provider:
name: openfaas
gateway: http://localhost:31112
functions:
record:
lang: golang-middleware
handler: ./record
image: lbaf23/record:latest
build_args:
GO111MODULE: on # mod模式
environment:
postgres_db: demo
postgres_port: 5432
postgres_host: postgresql.default.svc.cluster.local # 集群内部连接地址
postgres_user: postgres
postgres_sslmode: disable # 关闭ssl模式
secrets:
- openfaas-restful-demo-db-password # 关联密码
如果使用vscode编辑代码,gopls可能会报错,因为gopls目前默认是不支持一个项目中有多个go module的,可以在设置里面编辑settings.json文件,添加
"gopls": {
"build.experimentalWorkspaceModule": true
}
或者进入function的目录再打开vscode
cd record
code .
faas up -f record.yml
本文代码地址:https://github.com/lbaf23/openfaas-restful-demo
发现faas-cli build函数的时候似乎不会保存docker依赖镜像到本地,每次build都会从docker hub拉取镜像,导致构建时间较长,因此可以手动将镜像pull到本地加快构建速度
以本项目为例,打开template/golang-middleware/Dockerfile文件,发现依赖镜像有以下三个,将镜像拉取到本地
docker pull ghcr.io/openfaas/of-watchdog:0.9.2 docker pull golang:1.16-alpine3.14 docker pull alpine:3.14
然后进行faas build,可以发现构建速度极大提高