怎樣為 k8s 找到最合適的 PaaS 解決方案?
最近幾年,Kubernetes 成為許多人關(guān)注的焦點(diǎn)。事實(shí)上,有些公司發(fā)現(xiàn) Kubernetes 能發(fā)揮巨大作用,但有些公司還未發(fā)現(xiàn)其價(jià)值,并在這個(gè)過程中將自己搞得“遍體鱗傷”。對(duì)我來說,我正處于中間位置。我打算做類似事情,并且做好了踩坑準(zhǔn)備。在此之前,先讓我們看看如何在 k8s 上部署一個(gè)簡(jiǎn)單的、類似于 PaaS 的平臺(tái)。
1. 找到一個(gè)完美的類 PaaS 平臺(tái)
那么,我們從哪里開始?肯定有一種簡(jiǎn)單方法能找到這樣的東西,也許,我們從簡(jiǎn)單的 DuckDuckGo 搜索開始。
DuckDuckGo 搜索沒啥用
顯然,k8s 不是 PaaS。我想基于 k8s 構(gòu)建一個(gè) PaaS,當(dāng)然不是把它當(dāng)作一個(gè) PaaS 來使用。
然后,我們?cè)?HackerNews 上搜索一下。第一個(gè)查詢找到一篇失效文章。此外,我在 GitHub 上偶然發(fā)現(xiàn)一個(gè)很棒的列表。
https://github.com/ramitsurana/awesome-kubernetes
在進(jìn)行更廣泛的搜索后,我針對(duì)自己的應(yīng)用場(chǎng)景列出一個(gè)可能的候選項(xiàng)目列表。
- Knative
- OpenFaaS Cloud
- Convox
- Garden
- Rio
還有很多其他選擇,我嘗試過其中一些,還有一些是針對(duì)大企業(yè)的。
2. 我的應(yīng)用場(chǎng)景
在 Quest Vault ,我們?cè)?DigitalOcean droplet 上安裝一個(gè)簡(jiǎn)單的 Wordpress 來運(yùn)行我們的電商網(wǎng)站。盡管能通過運(yùn)行一些簡(jiǎn)單的 bash 腳本實(shí)現(xiàn)部署,并在本地運(yùn)行測(cè)試 / 過渡服務(wù)器的副本,但是,我想構(gòu)建一個(gè)基于行業(yè)技術(shù)的平臺(tái),而不是一些 bash 腳本。編寫這些 bash 腳本很有趣,并且擁有自己的部署技術(shù)棧也很簡(jiǎn)單,但是,我希望 Quest Vault 能擁有一個(gè)“豪華些”的東西,一個(gè)標(biāo)準(zhǔn)的、讓我們不必為使用的工具操心的東西。
https://questvault.net/
現(xiàn)在,我想在辦公室運(yùn)行 k3s 的 garbage server 上測(cè)試這些項(xiàng)目。K3s 有一個(gè)到 DigitalOcean droplet 的反向代理,而不是在互聯(lián)網(wǎng)上訪問。這意味著項(xiàng)目應(yīng)該支持內(nèi)部部署。
https://k3s.io/
我還希望能完全抽象出 k8s。這意味著我不想處理太多的 yaml 或者一直部署 helm charts,我想多考慮下應(yīng)用程序,并且通過 CLI 就可以做到。
簡(jiǎn)而言之:我想要的是,只要按一個(gè)按鈕,它就工作。
我們的應(yīng)用程序有很多活動(dòng)組件,有些只是簡(jiǎn)單腳本,有些則是為游戲客戶端提供通信的大型應(yīng)用程序。不管是什么,我們的平臺(tái)需要支持大量不同的應(yīng)用程序類型。這通常意味著支持通過 Dockerfile 進(jìn)行部署。
我們計(jì)劃運(yùn)行的大多數(shù)應(yīng)用程序都與狀態(tài)密切相關(guān)。以 Wordpress 為例,我們需要一個(gè)存儲(chǔ)圖片的地方。我們還有很多需要存儲(chǔ)的應(yīng)用內(nèi)照片拍攝。我們需要一種方法使我們的應(yīng)用程序具有某種形式的持久化。
我喜歡的項(xiàng)目很多,但是一個(gè)好項(xiàng)目和一個(gè)偉大項(xiàng)目的區(qū)別在于社區(qū)和行業(yè)的采用。擁有自己的 bash 腳本和在 GitHub 上有 3 個(gè)活動(dòng)用戶的項(xiàng)目幾乎沒有區(qū)別。如果你搞砸了,或者無論出于什么原因需要一些建議,你都希望能從一個(gè)活躍的社區(qū)獲得幫助。
3. 項(xiàng)目清單速覽
Knative
我的 Knative 經(jīng)驗(yàn)有一個(gè)不錯(cuò)的開頭!當(dāng)讀過關(guān)于它的文章后,我很高興地得知:我能運(yùn)行一個(gè)平臺(tái),谷歌在其平臺(tái)內(nèi)部就把它用于他們自己的類似 PaaS 的部署??紤]到谷歌創(chuàng)造了 k8s,這一定非常合適!它的安裝過程比預(yù)期困難得多。
https://knative.dev/docs/install/any-kubernetes-cluster/
似乎沒有什么簡(jiǎn)單方法來安裝這個(gè)平臺(tái),而且,無法輕松地使用一個(gè)平臺(tái)會(huì)是將來的一個(gè)風(fēng)險(xiǎn)。
OpenFaaS Cloud
安裝非常簡(jiǎn)單!我很快就讓這個(gè)平臺(tái)運(yùn)行了起來。它滿足我的大多數(shù)需求,不過,它似乎更像是實(shí)現(xiàn) OpenFaas 的一種有趣方式,而不是完全成熟的 PaaS 可選方案。我不知道如何將我們的用例放到這個(gè)特別的平臺(tái)上。如果你正在搭配使用耦合度比較低的項(xiàng)目或比較小的功能,這是一個(gè)很好的選擇!
Convox
Convox 看起來很棒!幾名前 Heroku 工程師,在 k8s 上構(gòu)建的一個(gè)平臺(tái)。似乎完美!我想嘗試一下,馬上就開始在 DigitalOcean k8s 集群上部署它。開發(fā)體驗(yàn)非常棒!
然而,他們似乎并不支持平臺(tái)的內(nèi)部部署版本。此外,除一些早期采用者外,這個(gè)項(xiàng)目似乎沒有一個(gè)非常大的社區(qū)。相比而言,這個(gè)項(xiàng)目不是很出名,最終我放棄它,去尋找另一種選擇。
Garden
這是一個(gè)非常酷的項(xiàng)目。我喜歡它,一家小型的獨(dú)立公司開發(fā)的一個(gè)創(chuàng)新型解決方案。安裝起來很簡(jiǎn)單,而且他們的方法對(duì) k8s 做了很好的抽象,但是他們也允許你通過經(jīng)典的 k8s 方式來保持某種形式的控制,比如 yaml 文件。我真的很愿意用它,效果很好!
然而,我確實(shí)注意到,它的一些 CLI 還不是很完善,但是,我認(rèn)為這只是些小瑕疵,并不能代表最終產(chǎn)品。
Rio
這個(gè)項(xiàng)目符合所有條件。一個(gè)真正容易使用的 CLI?是的。不再以任何方式與 k8s 交互?是的。使用 Dockerfile 進(jìn)行部署?是的!它們還提供了大量其他平臺(tái)沒有實(shí)現(xiàn)或?qū)崿F(xiàn)得很差的特性。來自 Rancher 的 Rio 似乎從他們活躍的社區(qū)得到了大量支持。
https://rancher.com/blog/2019/rio-revolutionizing-the-way-you-deploy-apps
在 garbage server 上進(jìn)行安裝設(shè)置
我快速地為 k3s 實(shí)例設(shè)置好反向代理,并開始設(shè)置 Rio。
參照他們 GitHub 頁面上的快速入門指南,這個(gè)過程變得超級(jí)簡(jiǎn)單:
- # Setting up the reverse proxy to k3s
- ssh -nNTL 6443:localhost:6443 droplet &
- # Installing Rio
- curl -sfL https://get.rio.io | sh -
- # Running the example project
- rio run https://github.com/rancher/rio-demo
這樣就行。我超級(jí)激動(dòng),希望馬上看一下,現(xiàn)有的基礎(chǔ)設(shè)施能否同樣輕松地遷移。
Rio 的默認(rèn)安裝允許你使用他們的 rDNS 服務(wù) on-rio.io,這個(gè)服務(wù)很酷,但不需要把我的 garbage server 放在反向代理后面。我還沒有使用 Linkerd 的經(jīng)驗(yàn),所以現(xiàn)在只是禁用它。使用命令 rio install --disable-feature rdns,letsencrypt,linkerd 重新安裝后,我獲得了想要的結(jié)果。
接下來,通過 kubectl 安裝自定義的 ClusterDomain,這讓我能使用 on-rio.io 之外的另一個(gè)域。最后,我安裝了 dnsmasq,并創(chuàng)建了一個(gè)名為 app.rio 的假域名,我的應(yīng)用程序會(huì)在這個(gè)域名上解析。這將讓我能輕松地在 garbage server 上測(cè)試到應(yīng)用程序的連接。
- apiVersion: admin.rio.cattle.io/v1
- kind: ClusterDomain
- metadata:
- name: app.rio
- spec:
- httpPort: 80
我還得想辦法從 DigitalOcean droplet 連接到這個(gè)集群。我從 garbage server 上的 80 端口反向代理到 8080 端口上的 droplet。Rio 使用 80 端口安裝了 Gloo 的 gateway-proxy。
最后一步,我設(shè)置了 nginx 配置,使其指向 Gloo 網(wǎng)關(guān):
- server {
- listen 80;
- server_name your.domain.name;
- location / {
- proxy_http_version 1.1;
- proxy_set_header Host $host;
- proxy_pass http://localhost:8080;
- }
- }
這有兩件重要的地方需要注意,分別是 proxy_http_version 1.1 和 proxy_set_header Host。proxy_http_version 非常重要,因?yàn)榛?Envoy 的 Gloo 不支持 http_version 1.0 上的網(wǎng)關(guān),而只支持 1.1 上的網(wǎng)關(guān)。否則,它會(huì)返回一個(gè) 426 Upgrade Required 錯(cuò)誤。
Host 頭對(duì)于實(shí)現(xiàn) PublicDomain 非常重要。需要注意的是,要添加一個(gè) PublicDomain,它必須與 server_name 或被代理的 Host 頭匹配,否則 Gloo 無法識(shí)別我要訪問的是哪個(gè)服務(wù)。
- rio domain register your.domain.name rio-demo
這就是我尋找最合適的 Kubernetes PaaS 解決方案的冒險(xiǎn)。