写点什么

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

  • 2020-05-18
  • 本文字数:4996 字

    阅读完需:约 16 分钟

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

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

什么是 Rio?

下图是 Rio 的架构:



Rio 采用了诸如 Kubernetes、knative、linkerd、cert-manager、buildkit 以及 gloo 等技术,并将它们结合起来为用户提供一个完整的应用程序部署环境。


Rio 具有以下功能:


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

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

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

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

  5. 支持通过服务网格路由流量

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

  7. 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 psNAME            IMAGE                               ENDPOINTdemo-service    default-demo-service-4dqdw:61825    https://demo-service...
复制代码


每次你运行一个新的服务,Rio 将会为这一服务生成一个全局性的端点:


$ rio endpointsNAME           ENDPOINTSdemo-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 psNAME            ...     SCALE       WEIGHTdemo-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 psNAME                IMAGE                   ENDPOINT                    WEIGHTdemo-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 psNAME                IMAGE                   ENDPOINT                    WEIGHTdemo-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@v2demo-service@v2 promoted
复制代码


超过 60 秒之后,我们的 demo-service@v2 服务将会逐渐提升到接收 100%的流量。在这一过程中任意端点上,我们可以执行 rio ps,并且查看进程:


$ rio psNAME                IMAGE                   ENDPOINT                    WEIGHTdemo-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 routersNAME             URL                            OPTS    ACTION      TARGETrouter/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 的名称、自定义构建的镜像名称以及将镜像推送到指定的镜像仓库。

堆栈和 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


2020-05-18 18:05763

评论

发布
暂无评论
发现更多内容

Android知识笔记:记录 2 个 “容易误解(1),【干货】

android 程序员 移动开发

Android第三方库收藏汇总,移动应用开发框架

android 程序员 移动开发

Android系统启动流程(一)解析init进程启动过程,安卓移动开发基础案例教程

android 程序员 移动开发

Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)

android 程序员 移动开发

Android模拟面试,解锁大厂—,这些面试题你会吗

android 程序员 移动开发

Android研发大厂面试记:阿里,字节,腾讯android面试题目

android 程序员 移动开发

Android程序员的Java后台学习建议,2021最新Android中级面试题目汇总解答

android 程序员 移动开发

Android文件系统总结——从-Android-Q-,面试必备知识点

android 程序员 移动开发

Android热修复基础篇(二),android设计模式面试题

android 程序员 移动开发

Android组件化开发的意义何在?,androidui开发框架

android 程序员 移动开发

Android性能优化:这是一份全面&详细的内存优化指南,Flutter最新开源框架

android 程序员 移动开发

Android插件化主流框架和实现原理,一举拿下腾讯美团滴滴offer

android 程序员 移动开发

微信朋友圈的高性能复杂度分析

stars

架构训练营

Android源码-一文带你搞懂OkHttp,kotlin高阶函数

android 程序员 移动开发

Android知识笔记:记录 2 个 “容易误解,网易的朋友给我这份339页的Android面经

android 程序员 移动开发

Android篇:2019初中级Android开发社招面试解答(上,作为Android开发者

android 程序员 移动开发

Android技能树 — Activity小结,【深夜思考

android 程序员 移动开发

Android架构组件JetPack之Room(三),Android大厂74道高级面试合集

android 程序员 移动开发

Android源码解析——Handler,看完直接跪服

android 程序员 移动开发

Android系统架构与系统源码目录,灵魂一问-如何彻底防止APK反编译

android 程序员 移动开发

自动驾驶汽车如何工作? 易筋 ARTS 打卡 Week 74

John(易筋)

ARTS 打卡计划

Android数据库的使用(增删改查),移动开发工程师

android 程序员 移动开发

Android热修复基础篇(一),flutter图片压缩

android 程序员 移动开发

【LeetCode】删除链表中的节点Java题解

Albert

算法 LeetCode 11月日更

Android网络优化攻略,简单了解一下?,图文详解

android 程序员 移动开发

Android架构之LiveData组件,原理竟然是这

android 程序员 移动开发

Android架构设计——MVC,flutterrow居中

android 程序员 移动开发

Android程序员现状:没有架构师的命,却得了架构师的病

android 程序员 移动开发

Android篇:2019初中级Android开发社招面试解答(中,跨平台app开发框架排名

android 程序员 移动开发

Android插件化-Service篇,flutter通知推送

android 程序员 移动开发

Android春招面经分享:一个Android渣渣终于拿到了一个offer

android 程序员 移动开发

Rio手把手教学:如何打造容器化应用程序的一站式部署体验_文化 & 方法_Rancher_InfoQ精选文章