Rio手把手教学:如何打造容器化应用程序的一站式部署体验

11月19日,业界应用最为普遍的Kubernetes管理平台建立者Rancher Labs(如下简称Rancher)宣布Rio发布了beta版本,这是基于Kubernetes的应用程序部署引擎。它于今年5月份推出,如今最新的版本是v0.6.0。Rio结合了多种云原生技术,从而简化了将代码从测试环境发布到生产环境的流程,同时保证了强大而安全的代码体验。
 html

什么是Rio?

 

下图是Rio的架构:
 
Rio手把手教学:如何打造容器化应用程序的一站式部署体验
 
Rio采用了诸如Kubernetes、knative、linkerd、cert-manager、buildkit以及gloo等技术,并将它们结合起来为用户提供一个完整的应用程序部署环境。nginx

 
Rio具备如下功能:git

 

  1. 从源代码构建代码,并将其部署到Kubernetes集群github

  2. 自动为应用程序建立DNS记录,并使用Let’s Encrypt的TLS证书保护这些端点web

  3. 基于QPS以及工做负载的指标自动扩缩容docker

  4. 支持金丝雀发布、蓝绿发布以及A/B部署浏览器

  5. 支持经过服务网格路由流量安全

  6. 支持缩容至零的serverless工做负载cookie

  7. Git触发的部署
     

    Rancher的产品生态

     
    Rio手把手教学:如何打造容器化应用程序的一站式部署体验
     
    Rio属于Rancher整套产品生态的一部分,这些产品支持从操做系统到应用程序的应用程序部署和容器运维。当Rio和诸如Rancher 2.三、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.<rio domain>。Rio将始终使用命名空间资源,所以在这种状况下,主机名测试已在默认命名空间中进行了命名。要在其余命名空间中建立路由器,请将-n &lt;namespace&gt;传递给rio命令:
 

rio -n <namespace> route add ...

 

基于路径的路由

 

为了定义一个基于路径的路由,当调用rio route add时,指定一个主机名加上一个路径。这能够是新路由器,也能够是现有路由器。
 

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

 br/>以上命令能够建立一个基于路径的路由,它会在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的名称、自定义构建的镜像名称以及将镜像推送到指定的镜像仓库。
 

堆栈和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将自动打开浏览器并加载仪表盘。
 
Rio手把手教学:如何打造容器化应用程序的一站式部署体验
 
你可使用仪表盘来建立和编辑堆栈、服务、路由等。此外,能够直接查看和编辑用于各类组件技术(Linkerd、gloo等)的对象,尽管不建议这样作。仪表盘目前处于开发的早期阶段,所以某些功能的可视化(如自动缩放和服务网格)尚不可用。

 

Linkerd

 

做为Rio的默认服务网格,Linked附带了一个仪表盘做为产品的一部分。该仪表盘能够经过执行rio linkerd来使用,它将代理本地本地主机流量到linkerd仪表盘(不会在外部公开)。与Rio仪表盘相似,有GUI和默认浏览器的操做系统上,Rio将自动打开浏览器并加载仪表盘:
 
Rio手把手教学:如何打造容器化应用程序的一站式部署体验
 
Linkerd仪表盘显示了Rio集群的网格配置、流量和网格组件。Linkerd提供了Rio路由的某些功能组件,所以这些配置可能会显示在此仪表盘上。还有一些工具可用于测试和调试网格配置和流量。
 

结 论

 

Rio为用户提供许多功能,是一款强大的应用程序部署引擎。这些组件能够在部署应用程序时为开发人员提供强大的功能,使流程稳定而安全,同时轻松又有趣。在Rancher产品生态中,Rio提供了企业部署和管理应用程序和容器的强大功能。

 

若是你想了解Rio的更多信息,欢迎访问Rio主页或Github主页:

https://rio.io

https://github.com/rancher/rio

相关文章
相关标签/搜索