Hello Folks! Welcome to Our Blog.

1、简介:

istio 是 service mesh 界的明星项目,今天要试玩的是它的低配版Rio。
Rio 是Rancher新出的一款轻量级service mesh产品,基于linkerd2,相当轻。但麻雀虽小,五脏俱全,基本上istio有的功能,它都有。
github:https://github.com/rancher/rio
由于是低配版,本文集群也选择k8s的低配版k3s
整个环境运行起来只需要2G内存,相比istio要轻量很多,一台2C4G的主机,即可流畅体验service mesh的魅力。

本文主要介绍一下安装过程,然后运行一个bookinfo示例,实现金丝雀发布。

2、应用版本:

  • k3s:1.0.0
  • Rio:0.6.0
  • Rancher:2.3.3

开始之前我们需准备最低配置2C4G主机一台,安装好docker

3、安装k3s:(如果你已有k8s环境,可以跳过此步骤,直接在k8s上体验Rio)

官方介绍的安装方式相当简单,执行如下命令即可

curl -sfL https://get.k3s.io | sh -

(国内网络用这条命令会安装不成功,github上的release包下载不下来)
Rancher的产品易用性做的还是相当不错的,只是这对国内网络的用户不太友好(* ̄︶ ̄)

下载k3s安装包

我们需要先fan qiang把k3s的安装包下载下来,然后再安装
根据服务器的架构类型选择相应的release包下载: https://github.com/rancher/k3s/releases
一般服务器都是x86,选择amd64的即可,arm64是低功耗设备的架构,比如手机

image.png

下载工具推荐:
代理: https://github.com/killgcd/chromego
嫌代理麻烦也可以用这个下载工具:Free Download Manager

安装

把下载的release包上传到服务器的/usr/local/bin/目录下,命名为k3s
然后执行如下命令

chmod +x /usr/local/bin/k3s
export INSTALL_K3S_SKIP_DOWNLOAD=true
export INSTALL_K3S_EXEC="server --docker --no-deploy=traefik" 
curl -sfL https://get.k3s.io | sh -

配置kubectl

k3s安装好之后,集群配置文件在/etc/rancher/k3s/k3s.yaml ,把它放到.kube下即可通过kubectl访问集群

cp /etc/rancher/k3s/k3s.yaml   ~/.kube/config

sudo kubectl get nodes #查看安装主机节点,需要安装kubectl

kubectl下载地址:https://docs.rancher.cn/rancher2x/install-prepare/download/kubernetes.html
下载后放到/usr/local/bin目录下,增加执行权限即可

以上k3s单节点即安装完毕

4、Rancher2安装

(此步骤不是必须,但由于安装Rio时很多镜像是在gcr.io下的,国内无法访问,所以需要安装Rancher后,才能直观的知道哪些镜像需要自己手动去下载)

1.Rancher单节点安装(两种方式都可以)

1、官方文档上的方式安装
2、docker-compose方式安装(需要安装docker-compose,不会安装的自行百度搜索)

version: "2.4"
services:
  rancher:
    image: rancher/rancher:latest
    restart: always
    container_name: rancher2
    volumes:
      - /root/deploy/rancher/rancher2:/var/lib/rancher
      - /root/deploy/rancher/log/auditlog:/var/log/auditlog \
    ports:
      - 8443:443
      - 8000:80

将以上内容保存为/root/deploy/rancher/docker-compose.yaml
然后执行如下命令即可

cd /root/deploy/rancher/
docker-compose build
docker-compose up -d
2.访问Rancher

浏览器打开:https://你的服务器ip:8443/

rancher集群列表页

5、Rancher2导入k3s集群

1.创建集群

点击添加集群,选择导入,然后输入集群名称,点击创建

选择导入

添加集群

2.导入k3s集群

复制最后一条命令

复制图示的最后一条命令,去服务器上执行,然后等待导入完成。

导入完成,并且显示有一台主机

以上为rancher导入k3s集群步骤

6、Rio安装

经过前面这么长的准备,终于来到今天的主角Rio的安装了。
官方介绍Rio的安装也相当简单

$ curl -sfL https://get.rio.io | sh -  
$ rio install
1.同样是国内网络问题,rio的安装包需要手动下载

先下载Rio安装包:https://github.com/rancher/rio/releases
选择amd64下载

image.png

将下载下来的rio安装包复制到/usr/local/bin/目录下,重命名为rio

chmod +x /usr/local/bin/rio #给rio添加执行权限
2.将rio安装到k3s集群上

rio install --ip-address 192.168.3.xx --disable-features build 
#--ip-address 为你服务器节点局域网ip,如果有外网ip请使用外网ip,多个可以逗号分隔。
#--disable-features build 当前rio版本国内安装建议禁用build功能,build功能安装时拉取的镜像是通过签名获取的而不是通过tag,所以下载有点问题,即便是通过修改该下载后的镜像的tag,使得安装成功,运行build功能的时候请求github也有tls的问题,各位有兴趣可以去尝试。
rio -n rio-system pods #查看部署情况
rio -a ps # 查看进程 rio info #查看rio详情

succeeded即为安装成功

不过同样还是国内网络问题,gcr.io的镜像包下载不来,部署进度会卡住

3.查看哪些gcr.io镜像拉不下来

命令行下无法直观看出我们哪些镜像下载不下的,所以需要借助Rancher2
先进入Rancher控制台,进入k3s集群,点击命名空间管理,将linkerd和rio-system两个命名空间移动到default下

将rio的namespace移动到default项目下

然后进入default

此时各位显示的应该是一片飘红,因为镜像拉不下来
点击红色安装有问题的负载,进入pod,点击事件,找到image “gcr.io/linkerd-id/xxxxx” pull失败之类的错误,

可以看到哪些镜像拉不下来

4.手动下载gcr.io镜像

说到这gcr.io镜像的下载,就不得不推荐一下这个项目:https://github.com/zhangguanzhang/gcr.io
一个命令即可将 查找镜像,pull镜像,重命名tag一次性搞定
比如要拉取gcr.io/google_containers/pause:3.1这镜像,则执行如下命令即可

curl -s https://zhangguanzhang.github.io/bash/pull.sh | bash -s -- gcr.io/google_containers/pause:3.1

有了这个神器,则只需要将rancher上飘红的所有拉取失败镜像,自己手动拉取一遍即可
直到全部变绿,就没啥问题了。
执行命令查看安装情况

rio -n rio-system pods #查看部署情况

succeeded即为安装成功

如果发现不是succeeded状态,就需要重新安装,由于之前已经下载好了镜像,重新安装就很顺畅了

rio uninstall # 先卸载
rio install --ip-address 192.168.3.xx --disable-features build  #再重新安装

基本上看到succeeded即表示rio成功安装,接下来就可以部署应用进行体验了

6、部署一个nginx试试

通过rio run 命令即可部署一个nginx服务。

#rio run -p 80:8080 https://github.com/rancher/rio-demo #由于禁用build功能,无法通过源码打包镜像方式部署
rio run -p 80:80 nginx #只能通过镜像库下载镜像部署
rio ps #查看部署情况

刚部署的nginx进程

将图示中的网址复制到浏览器上即可访问服务
rio会自动将*.xxxx.on-rio.io域名解析到安装时配置的ip-address下,所以该域名指向的就是你集群节点的服务器。
如果安装时没有配置ip-address,你也可以将该域名在hosts上配置解析到你的服务器节点ip上,即可访问到。

image.png

7、rio dashboard

rio还提供了一个管理控制台

rio dashboard

image.png

不用管报出来的错(那是无法打开服务器上的浏览器报的错),直接复制打印出来的浏览器地址去访问即可。第一次访问需要设置管理员账号密码。

dashboard

8、linkerd-web

rio内部集成了linkerd2作为微服务治理框架,所以也提供了linkerd-web的管理后台

# rio linkerd # 官方介绍的访问命令是这个,不过对这个命令连文档都没有,应该还不太完善
Forwarding from 127.0.0.1:9999 -> 8084
Forwarding from [::1]:9999 -> 8084

执行这个命令后,会阻塞,然后打开9999端口,可以通过9999端口在去访问linkerd-web
不过它forwarding出来的却不支持外网或局域网访问,只支持ipv4/ipv6的本机访问,服务器上又没有装浏览器,访问个鸟o(╥﹏╥)o
因为linkerd-web目前没有认证鉴权功能,暴露出来不太安全,所以仅本机访问也说的过去。
那就只能另寻办法了,我们通过nginx代理将linkerd-web暴露出来

nginx配置镜像: https://github.com/greper/rio-first/
此代码已经打包成镜像上传到dockerhub上
镜像名称为: xiao5233/linkerd-web-nginx:1.1

在linkerd命名空间部署该镜像,随便暴露一个端口,如下图创建服务即可将linkerd-web代理暴露出来

通过nginx代理将linkerd-web暴露出来

浏览器访问 http://服务器ip:87/ 即可打开linkerd-web
有简单的服务流向图,不过比kiali还是差点儿(目前这个版本rio还没有集成kiali,不过看issue好像快要支持了)

linkerd-web
浏览器访问 http://服务器ip:87/grafana 即可打开grafana

grafana

9、实战,部署一套bookinfo玩玩

打开dashboard,点击services,然后点击create

部署服务

如下图所示,创建productpage服务

服务名称镜像端口
productpagedocker.io/istio/examples-bookinfo-productpage-v1:1.15.09080

productpage

然后创建其他服务,端口都是9080,可以不勾选Exposed,这些都是内部服务,无需暴露访问地址

服务名称镜像端口
detailsdocker.io/istio/examples-bookinfo-details-v1:1.15.09080
ratingsdocker.io/istio/examples-bookinfo-ratings-v1:1.15.09080
reviewsdocker.io/istio/examples-bookinfo-reviews-v1:1.15.09080

部署完成

访问productpage试试

rio ps #找到productpage的访问地址,复制到浏览器访问

也可以在dashboard点击服务,找到endpoints 中点击链接访问

bookinfo v1

linkerd-web会展示如下服务结构图以及流量情况

10、金丝雀发布

接下来给reviews进行v2 v3版本的金丝雀发布

点击Stage New Version

发布v2版本,承担50的流量

再发布一个v3版本,承担33的流量

3个版本分别承担33%的流量

现在访问productpage,评论区会轮流出现不同颜色的星星和v1版本的没有星星

黑星星

红星星

流量图

当v2 v3版本测试没有问题之后,即可逐步将v1版本的weight设置为0,最后下线v1版本,一次新版本发布就完成了

11、总结

本文介绍了k3s、rancher、rio的安装(其中rio禁掉了build功能)
然后部署了一套istio的示例应用bookinfo
然后体验了一下使用rio进行金丝雀发布应用版本

总体来说,除了安装时候镜像下载的问题之外,其他都很流畅
资源消耗来讲,istio动不动8g就没有了,rio部署完只用了2G多
资源占用低,适合小公司使用,等后续istio解决了性能问题,也可以直接无痛转到istio上去。
不过目前rio还是beta版,不建议生产环境使用

好了,本次试玩到此结束,感谢阅读

最阅读
Add your widget here