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具有以下功能:
从源代码构建代码,并将其部署到Kubernetes集群
自动为应用程序创建DNS记录,并使用Let’s Encrypt的TLS证书保护这些端点
基于QPS以及工作负载的指标自动扩缩容
支持金丝雀发布、蓝绿发布以及A/B部署
支持通过服务网格路由流量
支持缩容至零的serverless工作负载
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
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将始终使用命名空间资源,因此在这种情况下,主机名测试已在默认命名空间中进行了命名。要在其他命名空间中创建路由器,请将-n <namespace>
传递给rio命令:
rio -n <namespace> route add ...
基于路径的路由
为了定义一个基于路径的路由,当调用rio route add时,指定一个主机名加上一个路径。这可以是新路由器,也可以是现有路由器。
$ rio route add testing/old to demo-service@v1
以上命令可以创建一个基于路径的路由,它会在https://testing-default./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)。详情可参阅:
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://github.com/rancher/rio
Rio手把手教学:如何打造容器化应用程序的一站式部署体验的更多相关文章
- .NET 7 SDK 开始 支持构建容器化应用程序
微软于 8 月 25 日在.NET官方博客上,.NET 7 SDK 将包括对创建容器化应用程序的支持,作为构建发布过程的一部分,从而绕过需要.显式 Docker 构建阶段. 这一决定背后的基本认知是简 ...
- python + docker, 实现天气数据 从FTP获取以及持久化(五)-- 利用 Docker 容器化 Python 程序
背景 不知不觉中,我们已经完成了所有的编程工作.接下来,我们需要把 Python 程序 做 容器化 (Docker)部署. 思考 考虑到项目的实际情况,“持久化天气”的功能将会是一个独立的功能模块发布 ...
- 一次容器化springboot程序OOM问题探险
背景 运维人员反馈一个容器化的java程序每跑一段时间就会出现OOM问题,重启后,间隔大概两天后复现. 问题调查 一查日志 由于是容器化部署的程序,登上主机后使用docker logs Contain ...
- 利用 ELK 搭建 Docker 容器化应用日志中心
利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...
- 详解利用ELK搭建Docker容器化应用日志中心
概述 应用一旦容器化以后,需要考虑的就是如何采集位于Docker容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 收集.本文即将阐述如何利用ELK日志中心来收集容器化应用 ...
- 2019 DevOps 必备面试题——容器化和虚拟化
原文地址:https://medium.com/edureka/devops-interview-questions-e91a4e6ecbf3 原文作者:Saurabh Kulshrestha 翻译君 ...
- ASP.NET Core使用Docker进行容器化托管和部署
一.课程介绍 人生苦短,我用.NET Core!今天给大家分享一下Asp.Net Core以Docker进行容器化部署托管,本课程并不是完完全全的零基础Docker入门教学,课程知识点难免有没覆盖全面 ...
- 从K8S部署示例进一步理解容器化编排技术的强大
概念 Kubernetes,也称为K8s,生产级别的容器编排系统,是一个用于自动化部署.扩展和管理容器化应用程序的开源系统.K8s是一个go语言开发,docker也是go语言开发,可见go语言的是未来 ...
- 微服务SpringCloud容器化案例
前言 当我们在使用微服务的时候,那么有一个问题一定会困扰我们,那就是项目的测试和部署.因为在单体应用下,部署项目很简单,直接打包启动就可以了,而对于微服务来说,因为有各个组件的存在所以让测试和部署都变 ...
随机推荐
- java ThreadLocal线程设置私有变量底层源码分析
前面也听说了ThreadLocal来实现高并发,以前都是用锁来实现,看了挺多资料的,发现其实还是区别挺大的(感觉严格来说ThreadLocal并不算高并发的解决方案),现在总结一下吧. 高并发中会出现 ...
- mysql数据库limit分页,排序操作
看到网上很多朋友在问,limit分页之后按照字段属性排序的问题,在这里分享一下我的用法: 1.网上答案: 每页显示5个,显示第三页信息,按照年龄从小到大排序 select * from student ...
- C#事件浅淡(1)
最近在写C#,感觉事件这个机制很好,可是怎么实现自己定义的事件呢?查了资料有的不全有的不完整,有的太深,自己写一个简单的例子. 原则 1,定义一个事件信息类(标准的都继承EventArgs) 2.定义 ...
- Dubbo配置完全外部化实践,使用动态配置中心的注意事项
问题描述 近期开发项目,将Dubbo的配置全部外部化到动态配置中心.这里配置中心我使用的是Apollo. @Configuration public class DubboConfig { @Bean ...
- 在Linux上安装 nessus
Nessus有三种安装方式 1.源文件安装 源文件安装是最复杂的安装方式,用此方式安装可以修改配置参数. 2.rpm安装 rpm安装比起源文件安装更简单一些,它已经把一些底层的东西写好了,用户只要按步 ...
- 浅谈Retinex
Retinex是上个世纪七十年代由Land提出的色彩理论.我认为其核心思想基于俩点 (1)在颜色感知时,人眼对局部相对光强敏感程度要优于绝对光强. (2)反射分量R(x,y)储存有无光源物体的真实模样 ...
- Python3爬虫(3)_urllib.error
注:参照https://blog.csdn.net/c406495762/article/details/59488464 Learn_ERROR: urllib.error可以接收有urllib.r ...
- 【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework 之让代码更优雅
[前言] 大家好,我是TANZAME.出乎意料的,我们在立冬的前一天又见面了,天气慢慢转凉,朋友们注意添衣保暖,愉快撸码.距离 TZM.XFramework 的首秀已数月有余,期间收到不少朋友的鼓励. ...
- Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...
- win10系统任务栏点击没有反应
今天碰到了一个神奇的bug任务栏上的图标怎么也没反应,鼠标点击不了,win+R命令行也出来不了. 经过一番研究,发现CTRL+ALT+DEL,可以打开任务管理器.所以来了一番操作: 1.先打开任务管理 ...