Categories
程式開發

怎樣為k8s找到最合適的PaaS解決方案?


怎樣為k8s找到最合適的PaaS解決方案? 1

本文最初發佈於Bram Dingelstad的個人博客,經原作者授權由InfoQ中文站翻譯並分享。

我們可能遇到過這樣的情況。團隊中有人發現一個bug,這個bug很特殊,與你經常遇到的軟件bug不同。這不是一個普通的bug,而是非常個人化的bug:hype-driven developer。

它發端於小的事情,然後試圖將團隊推向一個新技術方向或項目中的一個小模塊。在了解它之前,你已埋頭於某個奇怪項目的高級文檔中。這些文檔僅用3個簡單的步驟就解決了你的業務案例。然而,當你試圖找到一種方法去做那些瑣碎的事情時,卻似乎需要更多的步驟。

我們都有這樣的時刻:在過去一年,一個名為Kubernetes的項目成為許多人的關注焦點之一。有些公司發現其有著巨大作用,還有些公司還沒有發現其價值,並在這個過程中將自己搞得“遍體鱗傷”。

而我正處於中間位置。我正在做類似事情,並且做好了踩坑準備。在此之前,先讓我們看看如何在k8s上部署一個簡單的、類似於PaaS的平台。

找到一個完美的類PaaS平台

那麼,我們從哪裡開始?肯定有一種簡單方法能找到這樣的東西,也許,我們從簡單的DuckDuckGo搜索開始。

怎樣為k8s找到最合適的PaaS解決方案? 2

DuckDuckGo搜索沒啥用

顯然,k8s不是PaaS。我想基於k8s構建一個PaaS,當然不是把它當作一個PaaS來使用。

然後,我們在HackerNews上搜索一下。第一個查詢找到一篇失效文章。此外,我在GitHub上偶然發現一個很棒的列表。在進行更廣泛的搜索後,我針對自己的應用場景列出一個可能的候選項目列表。

還有很多其他選擇,我嘗試過其中一些,還有一些是針對大企業的。

我的應用場景

Quest Vault,我們在DigitalOcean droplet上安裝一個簡單的Wordpress來運行我們的電商網站。儘管能通過運行一些簡單的bash腳本實現部署,並在本地運行測試/過渡服務器的副本,但是,我想構建一個基於行業技術的平台,而不是一些bash腳本。編寫這些bash腳本很有趣,並且擁有自己的部署技術棧也很簡單,但是,我希望Quest Vault能擁有一個“豪華些”的東西,一個標準的、讓我們不必為使用的工具操心的東西。

一些必要條件

現在,我想在辦公室運行k3s的garbage server上測試這些項目。 K3s有一個到DigitalOcean droplet的反向代理,而不是在互聯網上訪問。這意味著項目應該支持內部部署

我還希望能完全抽像出k8s。這意味著我不想處理太多的yaml或者一直部署helm charts,我想多考慮下應用程序,並且通過CLI就可以做到。

簡而言之:我想要的是,只要按一個按鈕,它就工作

我們的應用程序有很多活動組件,有些只是簡單腳本,有些則是為遊戲客戶端提供通信的大型應用程序。不管是什麼,我們的平台需要支持大量不同的應用程序類型。這通常意味著支持通過Dockerfile進行部署

我們計劃運行的大多數應用程序都與狀態密切相關。以Wordpress為例,我們需要一個存儲圖片的地方。我們還有很多需要存儲的應用內照片拍攝。我們需要一種方法使我們的應用程序具有某種形式的持久化

我喜歡的項目很多,但是一個好項目和一個偉大項目的區別在於社區和行業的採用。擁有自己的bash腳本和在GitHub上有3個活動用戶的項目幾乎沒有區別。如果你搞砸了,或者無論出於什麼原因需要一些建議,你都希望能從一個活躍的社區獲得幫助

項目清單速覽

Knative

我的Knative經驗有一個不錯的開頭!當讀過關於它的文章後,我很高興地得知:我能運行一個平台,谷歌在其平台內部就把它用於他們自己的類似PaaS的部署。考慮到谷歌創造了k8s,這一定非常合適!它的安裝過程比預期困難得多。

似乎沒有什麼簡單方法來安裝這個平台,而且,無法輕鬆地使用一個平台會是將來的一個風險。

OpenFaaS Cloud

安裝非常簡單!我很快就讓這個平台運行了起來。它滿足我的大多數需求,不過,它似乎更像是實現OpenFaas的一種有趣方式,而不是完全成熟的PaaS可選方案。我不知道如何將我們的用例放到這個特別的平台上。如果你正在搭配使用耦合度比較低的項目或比較小的功能,這是一個很好的選擇!

Convox

Convox看起來很棒!幾名前Heroku工程師,在k8s上構建的一個平台。似乎完美!我想嘗試一下,馬上就開始在DigitalOcean k8s集群上部署它。開發體驗非常棒!

然而,他們似乎並不支持平台的內部部署版本。此外,除一些早期採用者外,這個項目似乎沒有一個非常大的社區。相比而言,這個項目不是很出名,最終我放棄它,去尋找另一種選擇。

Garden

這是一個非常酷的項目。我喜歡它,一家小型的獨立公司開發的一個創新型解決方案。安裝起來很簡單,而且他們的方法對k8s做了很好的抽象,但是他們也允許你通過經典的k8s方式來保持某種形式的控制,比如yaml文件。我真的很願意用它,效果很好!

然而,我確實注意到,它的一些CLI還不是很完善,但是,我認為這只是些小瑕疵,並不能代表最終產品。

Rio

這個項目符合所有條件。一個真正容易使用的CLI?是的。不再以任何方式與k8s交互?是的。使用Dockerfile進行部署?是的!它們還提供了大量其他平台沒有實現或實現得很差的特性。來自Rancher的Rio似乎從他們活躍的社區得到了大量支持。

在garbage server上進行安裝設置

我快速地為k3s實例設置好反向代理,並開始設置Rio。

參照他們GitHub頁面上的快速入門指南,這個過程變得超級簡單:

# 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

這樣就行。我超級激動,希望馬上看一下,現有的基礎設施能否同樣輕鬆地遷移。

Rio的默認安裝允許你使用他們的rDNS服務on-rio.io,這個服務很酷,但不需要把我的garbage server放在反向代理後面。我還沒有使用Linkerd的經驗,所以現在只是禁用它。使用命令rio install --disable-feature rdns,letsencrypt,linkerd重新安裝後,我獲得了想要的結果。

接下來,通過kubectl安裝自定義的ClusterDomain,這讓我能使用on-rio.io之外的另一個域。最後,我安裝了dnsmasq,並創建了一個名為app.rio的假域名,我的應用程序會在這個域名上解析。這將讓我能輕鬆地在 garbage server上測試到應用程序的連接。

apiVersion: admin.rio.cattle.io/v1
kind: ClusterDomain
metadata:
  name: app.rio
spec:
  httpPort: 80

我還得想辦法從DigitalOcean droplet連接到這個集群。我從 garbage server 上的80端口反向代理到8080端口上的droplet。 Rio使用80端口安裝了Gloo的gateway-proxy

最後一步,我設置了nginx配置,使其指向Gloo網關:

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.1proxy_set_header Host
proxy_http_version非常重要,因為基於Envoy的Gloo不支持http_version 1.0上的網關,而只支持1.1上的網關。否則,它會返回一個426 Upgrade Required錯誤。

Host頭對於實現PublicDomain非常重要。需要注意的是,要添加一個PublicDomain,它必須與server_name或被代理的Host頭匹配,否則Gloo無法識別我要訪問的是哪個服務。

rio domain register your.domain.name rio-demo

這就是我尋找最合適的Kubernetes PaaS解決方案的冒險。

英文原文:

Finding the right PaaS for k8s