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

11月19日,业界应用最为广泛的Kubernetes管理平台创建者Rancher Labs(以下简称Rancher)宣布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 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
[email protected]     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 [email protected]=5%
$ rio ps
NAME                IMAGE                   ENDPOINT                    WEIGHT
[email protected]     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 [email protected]
[email protected] promoted

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

$ rio ps
NAME                IMAGE                   ENDPOINT                    WEIGHT
[email protected]     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 [email protected]

br/>以上命令可以创建一个基于路径的路由,它会在https://testing-default.<rio-domain>/old接收流量,并且转发流量到`[email protected]`服务。

标头和基于方法的路由

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

原文地址:https://blog.51cto.com/12462495/2453190

时间: 2024-10-08 20:55:42

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

容器和应用程序:扩展、重构或重建?

技术领域是不断变化的,因此,任何应用程序都可能在很短时间内面临过时甚至淘汰,更新换代的速度之快给人的感觉越来越强烈,我们如何使传统应用程序保持活力不落伍?工程师想的可能是从头开始重建传统应用程序,这与公司的业务目标和产品时间表通常是相悖的.如果现阶段正在运行的应用程序是正常工作的,这时候你很难找到正当而充分的理由让技术人员花六个月重写应用程序.代码债似乎注定意味着失败. 众所周知,产品开发向来都不是非黑即白那么简单,必须要权衡各方妥协折衷进行,虽然完全重写的可行性不大,但应用程序现代化的长远利益

利用 ELK 搭建 Docker 容器化应用日志中心

利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志收集. 本文即将阐述如何利用ELK日志中心来收集容器化应用程序所产生的日志,并且可以用可视化的方式对日志进行查询与分析,其架构如下图所示: 架构图 镜像准备 ElasticSearch镜像 Logstash镜像 Kibana镜像 Nginx镜像(作为容器化应用来生产日志) 开启Linux系统Rsys

2019 DevOps 必备面试题——容器化和虚拟化

原文地址:https://medium.com/edureka/devops-interview-questions-e91a4e6ecbf3 原文作者:Saurabh Kulshrestha 翻译君:CODING 戴维奥普斯 让我们看看你对容器和虚拟机的了解程度. Q1. 什么是容器? 容器提供了从开发人员的笔记本电脑到测试环境.从类生产环境到生产环境一致的运行环境. 接下来给出容器的定义,容器由一个完整的运行环境组成:将一个应用程序,以及它所有的依赖项.库和其他二进制文件,以及运行它所需的配

【巨杉数据库SequoiaDB】巨杉 Tech | 几分钟实现巨杉数据库容器化部署

随着业务负载的不断加重,容器化.虚拟化也成为各类在线应用必须要具备的能力.对于分布式数据库,容器化也是提升快速部署.提高运维效率的一个很好的路径. 我们重新优化了 Docker部署的方式,帮助大家更快的上手SequoiaDB集群,本文就将介绍基于 Docker 的SequoiaDB分布式集群快速部署. 1.集群配置 我们将在六个容器中部署一个多节点,高度可用的 SequoiaDB 集群,如下所示: (本文以 SequoiaDB v3.2.3 版本为例) ? 该集群包括一个协调器节点.一个目录节点

微服务SpringCloud容器化案例

前言 当我们在使用微服务的时候,那么有一个问题一定会困扰我们,那就是项目的测试和部署.因为在单体应用下,部署项目很简单,直接打包启动就可以了,而对于微服务来说,因为有各个组件的存在所以让测试和部署都变得很麻烦,而容器化是微服务的部署一把利剑. PS:本文不介绍具体docker使用的各种基础,以及微服务的各种基础,就是给出相应的案例,你可以根据这样的案例快速学会如何将你的微服务容器化. 实际案例 让我们先来看看,实现之后如果本地要进行测试,是多么方便. ? 只需要一个命令,就能将我们的服务都启动起

唯品会RPC服务框架与容器化演进--转

原文地址:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=405781868&idx=1&sn=cbb10d37e25c76a1845f593a222da3c9&scene=0#wechat_redirect 编者按:本文是邱戈川在 3 月 27 日数人云"百万并发"活动的演讲,授权「高可用架构」首发.转载请注明来自高可用架构公众号「ArchNotes」.   邱戈川,唯品会分布式架构平台产品经理

Docker管理套件使容器化变得更加井然有序

Docker之前发布了一个新的容器控制中心,称为Docker数据中心(DDC),其设计目的是用于大型和小型企业创建.管理和分发容器的一个集成管理控制台. DDC是由包括Docker Universal Control Plane(也是同时发布的)和Docker Trusted Registry等不同的商业组件组成,它也包括了开源组件比如Docker Engine.这个产品让企业在一个中心管理界面中就可以管理整个Docker化程序的生命周期,更加方便. 负责产品管理的SVP Scott Johns

从研发到生产的容器化

Coding-Job:从研发到生产的容器化融合实践 大家好,我是来自 CODING 的全栈开发工程师,我有幸在 CODING 参与了 Coding-Job 这个容器化的编排平台的研发.大家对 CODING 可能比较了解, Coding.net 是一个一站式开发平台,具有代码托管,任务管理,产品演示和 WebIDE 等功能.整体功能看起来比较复杂且较为分散. 这是我们 Coding 的架构演进流程.那么怎么评判一个系统复不复杂,个人觉得看两个指标,一个就是运维人员用多久时间可以把新的代码部署上线.

Virtual Studio 2015发布利器:通过IDE直接发布容器化ASP.NET 5 到云中

Docker容器化趋势目前已经进入了快速发展阶段,关于Docker容器数据中心级别大规模应用集群及编排管理,应用微服务化都是业界广泛讨论的议题:不过除了上述热点以外,对于容器化最为开发运维人员推崇的,莫过于DevOps开发测试场景的对应:开发,构建,运行,保证配置运行环境及打包代码转移运行的一致性!不过之前多数情况下,我们看到的Docker打包并非开发工具直接集成的,需要开发运维人员手工编写,现在已经开始逐渐过渡和改观,对.NET开发者而言Visual Studio 2015 Tools for