11月19日,業界應用最為廣泛的Kubernetes管理平臺創建者Rancher Labs(以下簡稱Rancher)宣布Rio發布了beta版本,這是基于Kubernetes的應用程式部署引擎,它于今年5月份推出,現在最新的版本是v0.6.0,Rio結合了多種云原生技術,從而簡化了將代碼從測驗環境發布到生產環境的流程,同時保證了強大而安全的代碼體驗,
什么是Rio?
下圖是Rio的架構:

Rio采用了諸如Kubernetes、knative、linkerd、cert-manager、buildkit以及gloo等技術,并將它們結合起來為用戶提供一個完整的應用程式部署環境,
Rio具有以下功能:
-
從源代碼構建代碼,并將其部署到Kubernetes集群
-
自動為應用程式創建DNS記錄,并使用Let’s Encrypt的TLS證書保護這些端點
-
基于QPS以及作業負載的指標自動擴縮容
-
支持金絲雀發布、藍綠發布以及A/B部署
-
支持通過服務網格路由流量
-
支持縮容至零的serverless作業負載
-
Git觸發的部署
Rancher的產品生態

Rio屬于Rancher整套產品生態的一部分,這些產品支持從作業系統到應用程式的應用程式部署和容器運維,當Rio和諸如Rancher 2.3、k3s和RKE等產品結合使用時,企業可以獲得完整的部署和管理應用程式及容器的體驗,
深入了解Rio
要了解Rio如何實作上述功能,我們來深入了解一些概念以及作業原理,
安裝Rio
前期準備
-
Kubernetes版本在1.15以上的Kubernetes集群
-
為集群配置的kubeconfig(即背景關系是你希望將Rio安裝到的集群)
-
在$PATH中安裝的Rio CLI工具,可參閱以下鏈接,了解如何安裝CLI:
https://github.com/rancher/rio/blob/master/README.md
安裝
使用安裝好的Rio CLI工具,呼叫rio install,你可能需要考慮以下情況:
ip-address:節點的IP地址的逗號分隔串列,你可以在以下情況使用:
-
你不使用(或不能使用)layer-4的負載均衡器
-
你的節點IP不是你希望流量到達的IP地址(例如,你使用有公共IP的EC2實體)
服 務
在Rio中,service是一個基本的執行單位,從Git倉庫或容器鏡像實體化之后,一個service由單個容器以及服務網格的關聯sidecar組成(默認啟用),例如,運行使用Golang構建的一個簡單的“hello world”應用程式,
rio run https://github.com/ebauman/rio-demo
或者運行容器鏡像版本:
rio run ebauman/demo-rio:v1
還有其他選項也可以傳遞給rio run,如需要公開的任意埠(-p 80:8080/http),或者自動擴縮的配置(--scale 1-10),你可以通過這一命令rio help run,查看所有可傳遞的選項,
想要查看你正在運行的服務,請執行rio ps:
$ rio ps
NAME IMAGE ENDPOINT
demo-service default-demo-service-4dqdw:61825 https://demo-service...
每次你運行一個新的服務,Rio將會為這一服務生成一個全域性的端點:
$ rio endpoints
NAME ENDPOINTS
demo-service https://demo-service-default.op0kj0.on-rio.io:30282
請注意,此端點不包括版本——它指向由一個common name標識的服務,并且流量根據服務的權重進行路由,
自動DNS&TLS
默認情況下,所有Rio集群都將為自己創建一個on-rio.io主機名,并以隨機字串開頭(如lkjsdf.on-rio.io),該域名成為通配符域名,它的記錄決議到集群的網關,如果使用NodePort服務,則該網關可以是layer-4負載均衡器,或者是節點本身,
除了創建這個通配符域名,Rio還會使用Let’s Encrypt為這個域名生成一個通配符證書,這會允許自動加密任何HTTP作業負載,而無需用戶進行配置,要啟動此功能,請傳遞-p引數,將http指定為協議,例如:
rio run -p 80:8080/http ...
自動擴縮容
Rio可以根據每秒所查詢到的指標自動擴縮服務,為了啟用這一特性,傳遞--scale 1-10作為引數到rio run,例如:
rio run -p 80:8080/http -n demo-service --scale 1-10 ebauman/rio-demo:v1
執行這個命令將會構建ebauman/rio-demo并且部署它,如果我們使用一個工具來添加負載到端點,我們就能夠觀察到自動擴縮容,為了證明這一點,我們需要使用HTTP端點(而不是HTTPS),因為我們使用的工具不支持TLS:
$ rio inspect demo-service
<snipped>
endpoints:
- https://demo-service-v0-default.op0kj0.on-rio.io:30282
- http://demo-service-v0-default.op0kj0.on-rio.io:31976
<snipped>
rio inspect除了端點之外還會顯示其他資訊,但我們目前所需要的是端點資訊,使用HTTP端點以及HTTP基準測驗工具rakyll / hey,我們可以添加綜合負載:
hey -n 10000 http://demo-service-v0-default.op0kj0.on-rio.io:31976
這將會發送10000個請求到HTTP端點,Rio將會提高QPS并適當擴大規模,執行另一個rio ps將會展示已經擴大的規模:
$ rio ps
NAME ... SCALE WEIGHT
demo-service ... 2/5 (40%) 100%
分階段發布、金絲雀部署以及權重
注意
對于每個服務,都會創建一個全域端點,該端點將根據基礎服務的權重路由流量,
Rio可以先交付新的服務版本,然后再推廣到生產環境,分階段發布一個新的版本十分簡單:
rio stage --image ebauman/rio-demo:v2 demo-service v2
這一命令使用版本v2,分階段發布demo-service的新版本,并且使用容器鏡像ebauman/rio-demo:v2,我們通過執行rio ps這一命令,可以看到新階段的發布:
$ rio ps
NAME IMAGE ENDPOINT WEIGHT
demo-service@v2 ebauman/rio-demo:v2 https://demo-service-v2... 0%
demo-service ebauman/rio-demo:v1 https://demo-service-v0... 100%
請注意,新服務的端點具有v2的新增功能,因此即使權重設定為0%,訪問此端點仍將帶你進入服務的v2,這可以讓你能夠在向其發送流量之前驗證服務的運行情況,
說到發送流量:
$ rio weight demo-service@v2=5%
$ rio ps
NAME IMAGE ENDPOINT WEIGHT
demo-service@v2 ebauman/rio-demo:v2 https://demo-service-v2... 5%
demo-service ebauman/rio-demo:v1 https://demo-service-v0... 95%
使用rio weight命令,我們現在將發送我們5%的流量(從全域的服務端點)到新版本,當我們覺得demo-service的v2性能感到滿意之后,我們可以將其提升到100%:
$ rio promote --duration 60s demo-service@v2
demo-service@v2 promoted
超過60秒之后,我們的demo-service@v2服務將會逐漸提升到接收100%的流量,在這一程序中任意端點上,我們可以執行rio ps,并且查看行程:
$ rio ps
NAME IMAGE ENDPOINT WEIGHT
demo-service@v2 ebauman/rio-demo:v2 https://demo-service-v2... 34%
demo-service ebauman/rio-demo:v1 https://demo-service-v0... 66%
路由(Routing)
Rio可以根據主機名、路徑、方法、標頭和cookie的任意組合將流量路由到端點,Rio還支持鏡像流量、注入故障,配置retry邏輯和超時,
創建一個路由器
為了開始制定路由決策,我們必須首先創建一個路由器,路由器代表一個主機名和一組規則,這些規則確定發送到主機名的流量如何在Rio集群內進行路由,你想要要定義路由器,需要執行rio router add,例如,要創建一個在默認測驗時接收流量并將其發送到demo-service的路由器,請使用以下命令:
rio route add testing to demo-service
這將創建以下路由器:
$ rio routers
NAME URL OPTS ACTION TARGET
router/testing https://testing-default.0pjk... to demo-service,port=80
發送到https://testing-default...的流量將通過埠80轉發到demo-service,
請注意,此處創建的路由為testing-default.-n <namespace>傳遞給rio命令:
rio -n <namespace> route add ...
基于路徑的路由
為了定義一個基于路徑的路由,當呼叫rio route add時,指定一個主機名加上一個路徑,這可以是新路由器,也可以是現有路由器,
$ rio route add testing/old to demo-service@v1
以上命令可以創建一個基于路徑的路由,它會在https://testing-default.demo-service@v1服務,
標頭和基于方法的路由
Rio支持基于HTTP標頭和HTTP verbs的值做出的路由策略,如果你想要創建基于特定標頭路由的規則,請在rio route add命令中指定標頭:
$ rio route add --header X-Header=SomeValue testing to demo-service
以上命令將創建一個路由規則,它可以使用一個X-Header的HTTP標頭和SomeValue的值將流量轉發到demo-service,類似地,你可以為HTTP方法定義規則:
$ rio route add --method POST testing to demo-service
故障注入
Rio路由有一項有趣的功能是能夠將故障注入回應中,通過定義故障路由規則,你可以設定具有指定延遲和HTTP代碼的失敗流量百分比:
$ rio route add --fault-httpcode 502 --fault-delay-milli-seconds 1000 --fault-percentage 75 testing to demo-service
其他路由選項
Rio支持按照權重分配流量、為失敗的請求重試邏輯、重定向到其他服務、定義超時以及添加重寫規則,要查看這些選項,請參閱以下鏈接:
https://github.com/rancher/rio
自動構建
將git倉庫傳遞給rio run將指示Rio在提交到受監控的branch(默認值:master)之后構建代碼,對于Github倉庫,你可以通過Github webhooks啟動此功能,對于任何其他git repo,或者你不想使用webhooks,Rio都會提供一項“gitwatcher”服務,該服務會定期檢查您的倉庫中是否有更改,
Rio還可以根據受監控的branch的拉取請求構建代碼,如果你想要進行配置,請將--build-pr傳遞到rio run,還有其他配置這一功能的選項,包括傳遞Dockerfile的名稱、自定義構建的鏡像名稱以及將鏡像推送到指定的鏡像倉庫,
堆疊和Riofile
Rio使用稱為Riofile的docker-compose-style manifest定義資源
configs:
conf:
index.html: |-
<!DOCTYPE html>
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
services:
nginx:
image: nginx
ports:
- 80/http
configs:
- conf/index.html:/usr/share/nginx/html/index.html
Riofile定義了一個簡單的nginx Hello World網頁所有必要的組件,通過rio up部署它,會創建一個Stack(堆疊),它是Riofile定義的資源的集合,
Riofile具有許多功能,例如觀察Git庫中的更改以及使用Golang模板進行模板化,
其他Rio組件
Rio還有許多功能,例如configs、secrets以及基于角色訪問控制(RBAC),詳情可參閱:
https://rio.io/
Rio可視化
Rio Dashboard
Rio的beta版本包括了一個全新的儀表盤,使得Rio組件可視化,要訪問此儀表盤,請執行命令:rio dashboard,在有GUI和默認瀏覽器的作業系統上,Rio將自動打開瀏覽器并加載儀表盤,

你可以使用儀表盤來創建和編輯堆疊、服務、路由等,此外,可以直接查看和編輯用于各種組件技術(Linkerd、gloo等)的物件,盡管不建議這樣做,儀表盤目前處于開發的早期階段,因此某些功能的可視化(如自動縮放和服務網格)尚不可用,
Linkerd
作為Rio的默認服務網格,Linked附帶了一個儀表盤作為產品的一部分,該儀表盤可以通過執行rio linkerd來使用,它將代理本地本地主機流量到linkerd儀表盤(不會在外部公開),與Rio儀表盤類似,有GUI和默認瀏覽器的作業系統上,Rio將自動打開瀏覽器并加載儀表盤:

Linkerd儀表盤顯示了Rio集群的網格配置、流量和網格組件,Linkerd提供了Rio路由的某些功能組件,因此這些配置可能會顯示在此儀表盤上,還有一些工具可用于測驗和除錯網格配置和流量,
結 論
Rio為用戶提供許多功能,是一款強大的應用程式部署引擎,這些組件可以在部署應用程式時為開發人員提供強大的功能,使流程穩定而安全,同時輕松又有趣,在Rancher產品生態中,Rio提供了企業部署和管理應用程式和容器的強大功能,
如果你想了解Rio的更多資訊,歡迎訪問Rio主頁或Github主頁:
https://rio.io
https://github.com/rancher/rio
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/53417.html
標籤:其他
