本文關鍵字:自建雲函數後端。self build serverless function as service,single node serverless
在前面《雲主機上手動安裝PAI面闆》中我們講到了在雲主機上安裝某種“類似baota xx語言項目管理器”的虛拟主機管理面闆,也提到它并不是cloudbase版的雲函數面闆,後者這種方案要重得多:
function serverless最初也是由一個專家一篇文章給的思路,然後業界覺得好用就流行起來了。vs 傳統虛拟主機管理面闆和language backend as service,它至少有下面幾個顯著的不同特點:1),它将服務托管細粒化到了語言機關,即函數調用,故名faas,2),它與流行的API分離前後端結合,對這種webappdev有支援3),它利用了devops docker, 可scaleable叢集的部署。4)營運上它支援按需按調用計費,将語言按調用次數收費。5) 它面向來自内部外部多種不同服務互動的混合雲,構成的API調用環境。
它自動化了好多部署和開發級的東西以devops,以容器為後端,Triggers是一個重要元件,從GATEWAY代理中提取函數。根據觸發從容器中fork一個process出來(是以與那些純k8s和swarm的管理面闆直接提供docker級别的服務粒度不同)。這個process就是watchdog 它是一種similar to fastCGI/HTTP的輕量web伺服器,提供函數服務。由于支援多種環境多種不同服務互動,是以main_handler()中總有event指定事件來源,支援event,content為參數的async函數書寫方式(而這,是nodejs的語言支援精髓)。。
綜上,它是某種更傾向于“雲網站管理面闆”的思路。and more ...開源界的對應産品就是openfaas這類。
openfaas一般使用到k8s這種比較重的多節點docker管理器。注重叢集可伸縮的雲函數商用服務。那麼對于個人,隻是拿來裝個雲主機搭個部落格,不想用到服務端的雲函數(雖然有免費額度,不過總擔心超)的使用者,有沒有更輕量的方案呢?
這就是faas containerd serverless without kubernetes:faasd,它其實也是一種openfaas的後端,隻不過它使用containerd代替後端容器管理,是以它也可以To deploy embedded apps in IoT and edge use-cases,項目位址,
http://github.com/openfaas/faasd/,作者甚至在樹莓派上運作了它。
好了,下面在一台1h2g的雲主機上來安裝它,測試在ubuntu18.04下進行。
基礎
以下腳本從項目的cloudinit.txt提取,有改正和修補。注意使用說明:外網通路雲主機需開8080,如果提示Get
http://faasd-provider:8081/namespace=: dial tcp: i/o timeout之前,把你的雲主機對外的8081打開,最好都打開。
一些變量
MIRROR_PATH="http://default-8g95m46n2bd18f80.service.tcloudbase.com/d/demos"
# the openfaas backend
OPENFAAS_PATH=${MIRROR_PATH}/faasd
安裝依賴
apt-get install nginx golang python git runc python-certbot-nginx -qq -y
不安裝runc會導緻containerd可能出現oci runtime error,導緻啟不動faasd
安裝faasd
1.3.5有個link錯誤,是以換用1.3.3。
# install faasd
installOpenfaasd() {
echo "=====================containerd install progress======================="
msg=$(wget -qO- ${OPENFAAS_PATH}/containerd/v1.3.3/containerd-1.3.3-linux-amd64.tar.gz > /tmp/containerd.tar.gz && tar -xvf /tmp/containerd.tar.gz -C /usr/local/bin/ --strip-components=1
cat << 'EOF' > /etc/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable containerd
systemctl start containerd 2>&1)
status=$?
updateProgress 50 "$msg" "$status" "containerd install"
echo "=====================cni install progress======================="
msg=$(/sbin/sysctl -w net.ipv4.conf.all.forwarding=1
mkdir -p /opt/cni/bin
wget -qO- ${OPENFAAS_PATH}/containernetworking/v0.8.5/cni-plugins-linux-amd64-v0.8.5.tgz > /tmp/cni-plugins-linux-amd64-v0.8.5.tgz && tar -xz /tmp/cni-plugins-linux-amd64-v0.8.5.tgz -C /opt/cni/bin 2>&1)
status=$?
updateProgress 60 "$msg" "$status" "cni install"
echo "=====================faasd install progress(this may take long and finally fail due to network issues,you can manual fix later)======================="
msg=$(wget -qO- ${OPENFAAS_PATH}/openfaas/faasd/0.9.2/faasd > /usr/local/bin/faasd && chmod a+x /usr/local/bin/faasd
export GOPATH=$HOME
rm -rf /var/lib/faasd/secrets/basic-auth-password
rm -rf /var/lib/faasd/secrets/basic-auth-user
rm -rf $GOPATH/go/src/github.com/openfaas/faasd
mkdir -p $GOPATH/go/src/github.com/openfaas/
cd $GOPATH/go/src/github.com/openfaas/ && git clone https://github.com/openfaas/faasd && cd faasd && git checkout 0.9.2
cd $GOPATH/go/src/github.com/openfaas/faasd/ && /usr/local/bin/faasd install
sleep 60 && systemctl status -l containerd --no-pager
journalctl -u faasd-provider --no-pager
systemctl status -l faasd-provider --no-pager
systemctl status -l faasd --no-pager 2>&1)
status=$?
updateProgress 90 "$msg" "$status" "faasd install"
echo "=====================faas-cli install progress======================="
msg=$(wget -qO- ${OPENFAAS_PATH}/openfaas/faas-cli/0.12.9/faas-cli > /usr/local/bin/faas-cli && chmod a+x /usr/local/bin/faas-cli && ln -sf /usr/local/bin/faas-cli /usr/local/bin/faas
sleep 5 && journalctl -u faasd --no-pager
cat /var/lib/faasd/secrets/basic-auth-password | /usr/local/bin/faas-cli login --password-stdin 2>&1)
status=$?
updateProgress 100 "$msg" "$status" "faas-cli install"
}
整個腳本跟pai安裝腳本的風格很類似。可以像pai一樣把nginx也整合起來作為總前端(openfaas+faasd也是前後端的一種說法),把8080轉發到nginx,要知道,nginx是通用協定轉發器不隻http,見《基于openresty前後端統一,生态共享的webstack實作》。
以上這些如果無誤完成。在雲主機上可以打開8080(faasd),8081(faasd-provider)等。打開8080需要登入。
如果打不開8080,可能是腳本faasd up時從docker.io下載下傳的幾個必要小images時timeout了。cd /var/lib/faasd/ && /usr/local/bin/faasd up(一定要觀察看到幾個小images下完,可能會提示8080已被占用)。重新開機即可通路8080。
在雲主機上sudo cat /var/lib/faasd/secrets/basic-auth-password得到網關密碼。使用者名是admin,然後部署雲函數:faas-cli store deploy figlet --env write_timeout=1s。系統可能依然會開二個執行個體,設成僅1個也可以。由于faas-cli都是一樣的,其它相關适用的進階用法可以繼續關注faasd相關文檔得到。
然後,,,就是把運作在cloudbase的雲函數移過來,可能需要一些補正,跑在自己的伺服器上,好處是不用再擔心額度了,省心省事。
不過說真的我對于這種docker做的虛拟化不放心,最好不要存資料。是以還是選擇pai,未來整合pai,faas試試?
(此處不設回複,掃碼到微信參與留言,或直接點選到原文)