11月19日,業界應用最爲普遍的Kubernetes管理平臺建立者Rancher Labs(如下簡稱Rancher)宣佈Rio發佈了beta版本,這是基於Kubernetes的應用程序部署引擎。它於今年5月份推出,如今最新的版本是v0.6.0。Rio結合了多種雲原生技術,從而簡化了將代碼從測試環境發佈到生產環境的流程,同時保證了強大而安全的代碼體驗。html
下圖是Rio的架構:nginx
Rio採用了諸如Kubernetes、knative、linkerd、cert-manager、buildkit以及gloo等技術,並將它們結合起來爲用戶提供一個完整的應用程序部署環境。git
Rio具備如下功能:github
從源代碼構建代碼,並將其部署到Kubernetes集羣web
自動爲應用程序建立DNS記錄,並使用Let’s Encrypt的TLS證書保護這些端點docker
基於QPS以及工做負載的指標自動擴縮容瀏覽器
支持金絲雀發佈、藍綠髮布以及A/B部署安全
支持經過服務網格路由流量cookie
支持縮容至零的serverless工做負載架構
Git觸發的部署
Rio屬於Rancher整套產品生態的一部分,這些產品支持從操做系統到應用程序的應用程序部署和容器運維。當Rio和諸如Rancher 2.三、k3s和RKE等產品結合使用時,企業能夠得到完整的部署和管理應用程序及容器的體驗。
要了解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標識的服務,而且流量根據服務的權重進行路由。
默認狀況下,全部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%
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.<rio domain>。Rio將始終使用命名空間資源,所以在這種狀況下,主機名測試已在默認命名空間中進行了命名。要在其餘命名空間中建立路由器,請將-n <namespace>
傳遞給rio命令:
rio -n <namespace> route add ...
爲了定義一個基於路徑的路由,當調用rio route add時,指定一個主機名加上一個路徑。這能夠是新路由器,也能夠是現有路由器。
$ rio route add testing/old to demo-service@v1
以上命令能夠建立一個基於路徑的路由,它會在https://testing-default.<rio-domain>/old接收流量,而且轉發流量到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的名稱、自定義構建的鏡像名稱以及將鏡像推送到指定的鏡像倉庫。
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還有許多功能,例如configs、secrets以及基於角色訪問控制(RBAC)。詳情可參閱:
Rio的beta版本包括了一個全新的儀表盤,使得Rio組件可視化。要訪問此儀表盤,請執行命令:rio dashboard
。在有GUI和默認瀏覽器的操做系統上,Rio將自動打開瀏覽器並加載儀表盤。
你可使用儀表盤來建立和編輯堆棧、服務、路由等。此外,能夠直接查看和編輯用於各類組件技術(Linkerd、gloo等)的對象,儘管不建議這樣作。儀表盤目前處於開發的早期階段,所以某些功能的可視化(如自動縮放和服務網格)尚不可用。
做爲Rio的默認服務網格,Linked附帶了一個儀表盤做爲產品的一部分。該儀表盤能夠經過執行rio linkerd來使用,它將代理本地本地主機流量到linkerd儀表盤(不會在外部公開)。與Rio儀表盤相似,有GUI和默認瀏覽器的操做系統上,Rio將自動打開瀏覽器並加載儀表盤:
Linkerd儀表盤顯示了Rio集羣的網格配置、流量和網格組件。Linkerd提供了Rio路由的某些功能組件,所以這些配置可能會顯示在此儀表盤上。還有一些工具可用於測試和調試網格配置和流量。
Rio爲用戶提供許多功能,是一款強大的應用程序部署引擎。這些組件能夠在部署應用程序時爲開發人員提供強大的功能,使流程穩定而安全,同時輕鬆又有趣。在Rancher產品生態中,Rio提供了企業部署和管理應用程序和容器的強大功能。
若是你想了解Rio的更多信息,歡迎訪問Rio主頁或Github主頁: