Rio手把手教學(xué):如何打造容器化應(yīng)用程序的一站式部署體驗(yàn)

11月19日,業(yè)界應(yīng)用最為廣泛的Kubernetes管理平臺(tái)創(chuàng)建者Rancher Labs(以下簡(jiǎn)稱(chēng)Rancher)宣布Rio發(fā)布了beta版本谱仪,這是基于Kubernetes的應(yīng)用程序部署引擎蝌焚。它于今年5月份推出脓鹃,現(xiàn)在最新的版本是v0.6.0毡鉴。Rio結(jié)合了多種云原生技術(shù)刁标,從而簡(jiǎn)化了將代碼從測(cè)試環(huán)境發(fā)布到生產(chǎn)環(huán)境的流程井厌,同時(shí)保證了強(qiáng)大而安全的代碼體驗(yàn)蚓庭。

什么是Rio?

下圖是Rio的架構(gòu):

image

Rio采用了諸如Kubernetes仅仆、knative器赞、linkerd、cert-manager墓拜、buildkit以及gloo等技術(shù)港柜,并將它們結(jié)合起來(lái)為用戶提供一個(gè)完整的應(yīng)用程序部署環(huán)境。

Rio具有以下功能:

  1. 從源代碼構(gòu)建代碼咳榜,并將其部署到Kubernetes集群

  2. 自動(dòng)為應(yīng)用程序創(chuàng)建DNS記錄夏醉,并使用Let’s Encrypt的TLS證書(shū)保護(hù)這些端點(diǎn)

  3. 基于QPS以及工作負(fù)載的指標(biāo)自動(dòng)擴(kuò)縮容

  4. 支持金絲雀發(fā)布、藍(lán)綠發(fā)布以及A/B部署

  5. 支持通過(guò)服務(wù)網(wǎng)格路由流量

  6. 支持縮容至零的serverless工作負(fù)載

  7. Git觸發(fā)的部署

Rancher的產(chǎn)品生態(tài)

image

Rio屬于Rancher整套產(chǎn)品生態(tài)的一部分涌韩,這些產(chǎn)品支持從操作系統(tǒng)到應(yīng)用程序的應(yīng)用程序部署和容器運(yùn)維畔柔。當(dāng)Rio和諸如Rancher 2.3、k3s和RKE等產(chǎn)品結(jié)合使用時(shí)臣樱,企業(yè)可以獲得完整的部署和管理應(yīng)用程序及容器的體驗(yàn)靶擦。

深入了解Rio

要了解Rio如何實(shí)現(xiàn)上述功能,我們來(lái)深入了解一些概念以及工作原理雇毫。

安裝Rio

前期準(zhǔn)備

  • Kubernetes版本在1.15以上的Kubernetes集群

  • 為集群配置的kubeconfig(即上下文是你希望將Rio安裝到的集群)

  • 在$PATH中安裝的Rio CLI工具玄捕,可參閱以下鏈接,了解如何安裝CLI:
    https://github.com/rancher/rio/blob/master/README.md

安裝

使用安裝好的Rio CLI工具棚放,調(diào)用rio install枚粘。你可能需要考慮以下情況:

ip-address:節(jié)點(diǎn)的IP地址的逗號(hào)分隔列表。你可以在以下情況使用:

  • 你不使用(或不能使用)layer-4的負(fù)載均衡器

  • 你的節(jié)點(diǎn)IP不是你希望流量到達(dá)的IP地址(例如飘蚯,你使用有公共IP的EC2實(shí)例)

服 務(wù)

在Rio中赌结,service是一個(gè)基本的執(zhí)行單位捞蛋。從Git倉(cāng)庫(kù)或容器鏡像實(shí)例化之后,一個(gè)service由單個(gè)容器以及服務(wù)網(wǎng)格的關(guān)聯(lián)sidecar組成(默認(rèn)啟用)柬姚。例如拟杉,運(yùn)行使用Golang構(gòu)建的一個(gè)簡(jiǎn)單的“hello world”應(yīng)用程序。

rio run https://github.com/ebauman/rio-demo

或者運(yùn)行容器鏡像版本:

rio run ebauman/demo-rio:v1

還有其他選項(xiàng)也可以傳遞給rio run量承,如需要公開(kāi)的任意端口(-p 80:8080/http)搬设,或者自動(dòng)擴(kuò)縮的配置(--scale 1-10)。你可以通過(guò)這一命令rio help run撕捍,查看所有可傳遞的選項(xiàng)拿穴。

想要查看你正在運(yùn)行的服務(wù),請(qǐng)執(zhí)行rio ps

$ rio ps
NAME            IMAGE                               ENDPOINT
demo-service    default-demo-service-4dqdw:61825    https://demo-service...

每次你運(yùn)行一個(gè)新的服務(wù)忧风,Rio將會(huì)為這一服務(wù)生成一個(gè)全局性的端點(diǎn):

$ rio endpoints
NAME           ENDPOINTS
demo-service   https://demo-service-default.op0kj0.on-rio.io:30282

請(qǐng)注意默色,此端點(diǎn)不包括版本——它指向由一個(gè)common name標(biāo)識(shí)的服務(wù),并且流量根據(jù)服務(wù)的權(quán)重進(jìn)行路由狮腿。

自動(dòng)DNS&TLS

默認(rèn)情況下腿宰,所有Rio集群都將為自己創(chuàng)建一個(gè)on-rio.io主機(jī)名扬跋,并以隨機(jī)字符串開(kāi)頭(如lkjsdf.on-rio.io)斥黑。該域名成為通配符域名,它的記錄解析到集群的網(wǎng)關(guān)责语。如果使用NodePort服務(wù)贴硫,則該網(wǎng)關(guān)可以是layer-4負(fù)載均衡器椿每,或者是節(jié)點(diǎn)本身。

除了創(chuàng)建這個(gè)通配符域名英遭,Rio還會(huì)使用Let’s Encrypt為這個(gè)域名生成一個(gè)通配符證書(shū)间护。這會(huì)允許自動(dòng)加密任何HTTP工作負(fù)載,而無(wú)需用戶進(jìn)行配置挖诸。要啟動(dòng)此功能兑牡,請(qǐng)傳遞-p參數(shù),將http指定為協(xié)議税灌,例如:

rio run -p 80:8080/http ...

自動(dòng)擴(kuò)縮容

Rio可以根據(jù)每秒所查詢到的指標(biāo)自動(dòng)擴(kuò)縮服務(wù)均函。為了啟用這一特性,傳遞--scale 1-10作為參數(shù)到rio run菱涤,例如:

rio run -p 80:8080/http -n demo-service --scale 1-10 ebauman/rio-demo:v1

執(zhí)行這個(gè)命令將會(huì)構(gòu)建ebauman/rio-demo并且部署它苞也。如果我們使用一個(gè)工具來(lái)添加負(fù)載到端點(diǎn),我們就能夠觀察到自動(dòng)擴(kuò)縮容粘秆。為了證明這一點(diǎn)如迟,我們需要使用HTTP端點(diǎn)(而不是HTTPS),因?yàn)槲覀兪褂玫墓ぞ卟恢С諸LS:

$ 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除了端點(diǎn)之外還會(huì)顯示其他信息,但我們目前所需要的是端點(diǎn)信息殷勘。使用HTTP端點(diǎn)以及HTTP基準(zhǔn)測(cè)試工具rakyll / hey此再,我們可以添加綜合負(fù)載:

hey -n 10000 http://demo-service-v0-default.op0kj0.on-rio.io:31976

這將會(huì)發(fā)送10000個(gè)請(qǐng)求到HTTP端點(diǎn),Rio將會(huì)提高QPS并適當(dāng)擴(kuò)大規(guī)模玲销,執(zhí)行另一個(gè)rio ps將會(huì)展示已經(jīng)擴(kuò)大的規(guī)模:

$ rio ps
NAME            ...     SCALE       WEIGHT
demo-service    ...     2/5 (40%)   100%

分階段發(fā)布输拇、金絲雀部署以及權(quán)重

注意

對(duì)于每個(gè)服務(wù),都會(huì)創(chuàng)建一個(gè)全局端點(diǎn)贤斜,該端點(diǎn)將根據(jù)基礎(chǔ)服務(wù)的權(quán)重路由流量策吠。

Rio可以先交付新的服務(wù)版本,然后再推廣到生產(chǎn)環(huán)境瘩绒。分階段發(fā)布一個(gè)新的版本十分簡(jiǎn)單:

rio stage --image ebauman/rio-demo:v2 demo-service v2

這一命令使用版本v2猴抹,分階段發(fā)布demo-service的新版本,并且使用容器鏡像ebauman/rio-demo:v2锁荔。我們通過(guò)執(zhí)行rio ps這一命令蟀给,可以看到新階段的發(fā)布:

$ 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%

請(qǐng)注意,新服務(wù)的端點(diǎn)具有v2的新增功能阳堕,因此即使權(quán)重設(shè)置為0%跋理,訪問(wèn)此端點(diǎn)仍將帶你進(jìn)入服務(wù)的v2。這可以讓你能夠在向其發(fā)送流量之前驗(yàn)證服務(wù)的運(yùn)行情況嘱丢。

說(shuō)到發(fā)送流量:

$ 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命令薪介,我們現(xiàn)在將發(fā)送我們5%的流量(從全局的服務(wù)端點(diǎn))到新版本祠饺。當(dāng)我們覺(jué)得demo-service的v2性能感到滿意之后越驻,我們可以將其提升到100%:

$ rio promote --duration 60s demo-service@v2
demo-service@v2 promoted

超過(guò)60秒之后,我們的demo-service@v2服務(wù)將會(huì)逐漸提升到接收100%的流量道偷。在這一過(guò)程中任意端點(diǎn)上缀旁,我們可以執(zhí)行rio ps,并且查看進(jìn)程:

$ 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可以根據(jù)主機(jī)名勺鸦、路徑并巍、方法、標(biāo)頭和cookie的任意組合將流量路由到端點(diǎn)换途。Rio還支持鏡像流量懊渡、注入故障,配置retry邏輯和超時(shí)军拟。

創(chuàng)建一個(gè)路由器

為了開(kāi)始制定路由決策剃执,我們必須首先創(chuàng)建一個(gè)路由器。路由器代表一個(gè)主機(jī)名和一組規(guī)則懈息,這些規(guī)則確定發(fā)送到主機(jī)名的流量如何在Rio集群內(nèi)進(jìn)行路由肾档。你想要要定義路由器,需要執(zhí)行rio router add。例如怒见,要?jiǎng)?chuàng)建一個(gè)在默認(rèn)測(cè)試時(shí)接收流量并將其發(fā)送到demo-service的路由器俗慈,請(qǐng)使用以下命令:

rio route add testing to demo-service

這將創(chuàng)建以下路由器:

$ rio routers
NAME             URL                            OPTS    ACTION      TARGET
router/testing   https://testing-default.0pjk...        to          demo-service,port=80

發(fā)送到https://testing-default...的流量將通過(guò)端口80轉(zhuǎn)發(fā)到demo-service。

請(qǐng)注意遣耍,此處創(chuàng)建的路由為testing-default.<rio domain>闺阱。Rio將始終使用命名空間資源,因此在這種情況下配阵,主機(jī)名測(cè)試已在默認(rèn)命名空間中進(jìn)行了命名馏颂。要在其他命名空間中創(chuàng)建路由器,請(qǐng)將-n <namespace>傳遞給rio命令:

rio -n <namespace> route add ...

基于路徑的路由

為了定義一個(gè)基于路徑的路由棋傍,當(dāng)調(diào)用rio route add時(shí)救拉,指定一個(gè)主機(jī)名加上一個(gè)路徑。這可以是新路由器瘫拣,也可以是現(xiàn)有路由器亿絮。

$ rio route add testing/old to demo-service@v1

以上命令可以創(chuàng)建一個(gè)基于路徑的路由,它會(huì)在https://testing-default.<rio-domain>/old接收流量麸拄,并且轉(zhuǎn)發(fā)流量到demo-service@v1服務(wù)派昧。

標(biāo)頭和基于方法的路由

Rio支持基于HTTP標(biāo)頭和HTTP verbs的值做出的路由策略。如果你想要?jiǎng)?chuàng)建基于特定標(biāo)頭路由的規(guī)則拢切,請(qǐng)?jiān)趓io route add命令中指定標(biāo)頭:

$ rio route add --header X-Header=SomeValue testing to demo-service

以上命令將創(chuàng)建一個(gè)路由規(guī)則蒂萎,它可以使用一個(gè)X-Header的HTTP標(biāo)頭和SomeValue的值將流量轉(zhuǎn)發(fā)到demo-service。類(lèi)似地淮椰,你可以為HTTP方法定義規(guī)則:

$ rio route add --method POST testing to demo-service

故障注入

Rio路由有一項(xiàng)有趣的功能是能夠?qū)⒐收献⑷腠憫?yīng)中五慈。通過(guò)定義故障路由規(guī)則,你可以設(shè)置具有指定延遲和HTTP代碼的失敗流量百分比:

$ rio route add --fault-httpcode 502 --fault-delay-milli-seconds 1000 --fault-percentage 75 testing to demo-service

其他路由選項(xiàng)

Rio支持按照權(quán)重分配流量主穗、為失敗的請(qǐng)求重試邏輯泻拦、重定向到其他服務(wù)、定義超時(shí)以及添加重寫(xiě)規(guī)則忽媒。要查看這些選項(xiàng)争拐,請(qǐng)參閱以下鏈接:

https://github.com/rancher/rio

自動(dòng)構(gòu)建

將git倉(cāng)庫(kù)傳遞給rio run將指示Rio在提交到受監(jiān)控的branch(默認(rèn)值:master)之后構(gòu)建代碼。對(duì)于Github倉(cāng)庫(kù)晦雨,你可以通過(guò)Github webhooks啟動(dòng)此功能架曹。對(duì)于任何其他git repo,或者你不想使用webhooks闹瞧,Rio都會(huì)提供一項(xiàng)“gitwatcher”服務(wù)绑雄,該服務(wù)會(huì)定期檢查您的倉(cāng)庫(kù)中是否有更改。

Rio還可以根據(jù)受監(jiān)控的branch的拉取請(qǐng)求構(gòu)建代碼夹抗。如果你想要進(jìn)行配置绳慎,請(qǐng)將--build-pr傳遞到rio run。還有其他配置這一功能的選項(xiàng),包括傳遞Dockerfile的名稱(chēng)杏愤、自定義構(gòu)建的鏡像名稱(chēng)以及將鏡像推送到指定的鏡像倉(cāng)庫(kù)靡砌。

堆棧和Riofile

Rio使用稱(chēng)為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定義了一個(gè)簡(jiǎn)單的nginx Hello World網(wǎng)頁(yè)所有必要的組件。通過(guò)rio up部署它珊楼,會(huì)創(chuàng)建一個(gè)Stack(堆棧)通殃,它是Riofile定義的資源的集合。

Riofile具有許多功能厕宗,例如觀察Git庫(kù)中的更改以及使用Golang模板進(jìn)行模板化画舌。

其他Rio組件

Rio還有許多功能,例如configs已慢、secrets以及基于角色訪問(wèn)控制(RBAC)曲聂。詳情可參閱:

https://rio.io/

Rio可視化

Rio Dashboard

Rio的beta版本包括了一個(gè)全新的儀表盤(pán),使得Rio組件可視化佑惠。要訪問(wèn)此儀表盤(pán)朋腋,請(qǐng)執(zhí)行命令:rio dashboard。在有GUI和默認(rèn)瀏覽器的操作系統(tǒng)上膜楷,Rio將自動(dòng)打開(kāi)瀏覽器并加載儀表盤(pán)旭咽。

image

你可以使用儀表盤(pán)來(lái)創(chuàng)建和編輯堆棧、服務(wù)赌厅、路由等穷绵。此外,可以直接查看和編輯用于各種組件技術(shù)(Linkerd特愿、gloo等)的對(duì)象仲墨,盡管不建議這樣做。儀表盤(pán)目前處于開(kāi)發(fā)的早期階段洽议,因此某些功能的可視化(如自動(dòng)縮放和服務(wù)網(wǎng)格)尚不可用宗收。

Linkerd

作為Rio的默認(rèn)服務(wù)網(wǎng)格漫拭,Linked附帶了一個(gè)儀表盤(pán)作為產(chǎn)品的一部分亚兄。該儀表盤(pán)可以通過(guò)執(zhí)行rio linkerd來(lái)使用,它將代理本地本地主機(jī)流量到linkerd儀表盤(pán)(不會(huì)在外部公開(kāi))采驻。與Rio儀表盤(pán)類(lèi)似审胚,有GUI和默認(rèn)瀏覽器的操作系統(tǒng)上,Rio將自動(dòng)打開(kāi)瀏覽器并加載儀表盤(pán):

image

Linkerd儀表盤(pán)顯示了Rio集群的網(wǎng)格配置礼旅、流量和網(wǎng)格組件膳叨。Linkerd提供了Rio路由的某些功能組件,因此這些配置可能會(huì)顯示在此儀表盤(pán)上痘系。還有一些工具可用于測(cè)試和調(diào)試網(wǎng)格配置和流量菲嘴。

結(jié) 論

Rio為用戶提供許多功能,是一款強(qiáng)大的應(yīng)用程序部署引擎。這些組件可以在部署應(yīng)用程序時(shí)為開(kāi)發(fā)人員提供強(qiáng)大的功能龄坪,使流程穩(wěn)定而安全昭雌,同時(shí)輕松又有趣。在Rancher產(chǎn)品生態(tài)中健田,Rio提供了企業(yè)部署和管理應(yīng)用程序和容器的強(qiáng)大功能烛卧。

如果你想了解Rio的更多信息,歡迎訪問(wèn)Rio主頁(yè)或Github主頁(yè):

https://rio.io

https://github.com/rancher/rio

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妓局,一起剝皮案震驚了整個(gè)濱河市总放,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌好爬,老刑警劉巖局雄,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異存炮,居然都是意外死亡哎榴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)僵蛛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尚蝌,“玉大人,你說(shuō)我怎么就攤上這事充尉∑裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵驼侠,是天一觀的道長(zhǎng)姿鸿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)倒源,這世上最難降的妖魔是什么苛预? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮笋熬,結(jié)果婚禮上热某,老公的妹妹穿的比我還像新娘。我一直安慰自己胳螟,他們只是感情好昔馋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著糖耸,像睡著了一般秘遏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘉竟,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天邦危,我揣著相機(jī)與錄音洋侨,去河邊找鬼。 笑死倦蚪,一個(gè)胖子當(dāng)著我的面吹牛凰兑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播审丘,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吏够,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了滩报?” 一聲冷哼從身側(cè)響起锅知,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脓钾,沒(méi)想到半個(gè)月后售睹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡可训,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年昌妹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片握截。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飞崖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谨胞,到底是詐尸還是另有隱情固歪,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布胯努,位于F島的核電站牢裳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叶沛。R本人自食惡果不足惜蒲讯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灰署。 院中可真熱鬧判帮,春花似錦、人聲如沸氓侧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)约巷。三九已至,卻和暖如春旱捧,著一層夾襖步出監(jiān)牢的瞬間独郎,已是汗流浹背踩麦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氓癌,地道東北人谓谦。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贪婉,于是被迫代替她去往敵國(guó)和親反粥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容