写点什么

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:05694

评论

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

龙蜥白皮书精选:面向芯片研发和验证的操作系统 SiliconFastOS

OpenAnolis小助手

开源 操作系统 芯片 龙蜥社区 SiliconFastOS

数字化驱动,低代码引领:探索数智时代的开发新纪元!

EquatorCoco

低代码 数智化 AIGC

打破孤岛运营,增强企业凝聚力

智达方通

数据孤岛 全面预算管理 企业绩效管理 信息孤岛 预算管理

支撑 “千万设备日活” 的创米数联 7 年微服务架构演进之路

阿里巴巴云原生

阿里云 微服务 云原生

云原生应用交付平台 Orbit 主要功能与核心能力

CODING DevOps

Orbit gitops 应用管理

国产替代,本质是价值替代

用友BIP

用友BIP全球司库十问之资金结算如何统一管理?

用友BIP

全球司库 资金管理

8个优秀好用的渠道,帮你找到所想要的资源

高端章鱼哥

技术 分享工具

RocketMQ on openEuler 提供高性能消息队列的稳定性解决方案

openEuler

Linux cpu 操作系统 openEuler 内核

数据交换不失控:华为云EDS,让你的数据你做主

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 6 月 PK 榜

《数据结构》之栈和堆结构及JVM简析

EquatorCoco

数据结构 教程

跑得更快!华为云GaussDB以出色的性能守护“ERP的心脏”

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

Zilliz Cloud 明星级功能详解|解锁多组织与角色管理功能,让你的权限管理更简单!

Zilliz

SaaS 非结构化数据 Zilliz AIGC zillizcloud

有奖问卷 | 2023 中国软件研发效能调查问卷即将截止

CODING DevOps

阿里云顺利通过云原生中间件成熟度评估

阿里巴巴云原生

阿里云 云原生 中间件 成熟度

一个斜杠引发的CDN资源回源请求量飙升

互联网工科生

CDN

企业需要什么样的全面预算管理?

用友BIP

全面预算

人脸识别技术的原理及其应用

来自四九城儿

一次不规范HTTP请求引发的nginx响应400问题分析与解决

高端章鱼哥

nginx HTTP

故障分析 | 从慢日志问题看 MySQL 半一致性读的应用场景

爱可生开源社区

MySQL innodb 事务

精选|Dubbo异步化实践

得物技术

如何在 NGINX 中安全地分发 SSL 私钥

NGINX开源社区

nginx ssl

AI 2.0来袭,AIGC如何重新定义招聘?

用友BIP

AI 招聘

软件测试 | 性能工具规划

测吧(北京)科技有限公司

测试

免费沉浸式Twitter翻译工具 ZipZapAI用AI打破语言障碍

Ricky

ChatGPT GPT-4 ChatGPT4 chatgpt插件

体验超凡速度的美国独立IP虚拟主机服务!

一只扑棱蛾子

美国主机 美国独立IP虚拟主机 美国虚拟主机

11个开源项目,5位技术大咖…华为云亮相2023开放原子全球开源峰会

华为云开发者联盟

开源 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

浅显易懂传统开发与低代码开发的区别

互联网工科生

低代码 JNPF 传统开发

升哲科技受邀出席第十四届夏季达沃斯论坛

SENSORO

深度分析:企业大数据分析的选型需要关注哪些能力

对不起该用户已成仙‖

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