0x01 前言

docker的使用是一个大趋势,因为k8s的快速发展以及功能太强大而让人觉得使用比较繁琐,Rancher 2也移除一些与k8s重叠的功能后以k8s管理软件定位继续发展。

Rancher 2主要对k8s的功能进行扩展,实现一些便捷的功能和应用方式,同时可以管理多个k8s集群。我不但用Rancher 2管理k8s集群,我还用它初始化k8s集群,通过这种方式可以快速地部署一套甚至几套集群而不需要参考k8s的相关文档。

0x02 准备

在部署之前先了解Rancher 2的基础架构:

Rancher 2 Cluster其实是由一堆node组成的docker集群,每个node运行着Ingress controller,而Rancher 2一般只有一个,在Ingress controller前面有一个nginx或其他中间件提供4层负载,最终用户自能通过该负载的对外端口访问web GUI或者API。

默认情况下,Ingress controller要求使用TCP 443端口,也就是HTTPS协议,同时开放TCP 80端口,但访问的时候会重定向至HTTPS。

具体要求请留意官方文档:

在部署前需要准备以下信息或软件:

  • 域名:用于访问Rancher 2 Ingress controller;
  • DNS服务器:用于解析域名,如果没用,可以修改本机的hosts文件;
  • kubectl:用于初始化Rancher 2节点,结束后即可移除;
  • rke:Rancher Kubernetes Engine,用于建立k8s集群;
  • helm:k8s包管理器;
  • 阿里云镜像加速器:用于国内网络环境;
  • 清华大学docker yum镜像:用于国内网络环境;
  • 阿里云k8s yum镜像:用于国内网络环境。

我为我的测试环境准备以下4台虚拟机:

  • rancher-lb:10.1.3.1
  • rancher-node1:10.1.3.2
  • rancher-node2:10.1.3.3
  • rancher-node3:10.1.3.4

当然,如果你的资源不足以建立这些虚拟机,你还可以选择只建立一个Rancher 2节点,但建议保留负载均衡部分,也就是只需要建立2台虚拟机即可。

部署的命令只需要在LB机器上运行,命令会调用SSH协议在3个node上执行,根据要求,需要在LB机器上建立SSH私钥和公钥:

然后使用以下命令分别将公钥导入到3个node:

然后准备阿里云镜像加速器,首先登入阿里云控制台的容器镜像服务:

然后在镜像中心找到“镜像加速器”:

注意!这是免费服务,但不要泄露你的镜像地址。

将镜像地址中的id复制到以下脚本中:

然后准备yum源镜像,在这里需要准备Centos、epel、docker-ce与k8s的镜像,为了快速部署到系统中,我特意将他们合成在一个文件里,将以下命令全部复制至LB机器并执行:

然后在LB机器上执行三次以下命令,IP地址分别为三个node的IP

而LB这台机器需要安装kubectl与下载以下文件nginx、rke和helm,你可以在以下地址找到最新发行版,如果不是必须,建议不要选择beta或Pre-release版本:

而kubectl则需要手动添加yum源,相关命令如下:

准备好环境后即可开始部署。

0x03 部署K8S

这里使用RKE部署的方式部署K8S,需要在LB机器上执行命令。首先编写Rancher 2 Cluster的配置文件,采用YMAL格式:

如果在执行上面的命令之前检查过命令的话会发现三台node都创建了一个名为docker的用户,并且用户组为docker,这是因为centos的docker是以root用户运行的,但K8S需要通过非root用户执行命令。所以需要建立一个用户,并将其加入docker组,而这个用户可以实其他名字而不一定为docker。

完成配置文件的编写后即可使用以下命令部署K8S:

如果一切正常,最终的结果如下:

在部署K8S的过程中,可能会遇到以下错误:

而我使用的软件版本如下:

如果遇到类似问题,可以尝试不要改动任何文件,再次执行rke up命令。这可能是因网络问题导致镜像拉取缓慢,最终超时导致的。

确认集群部署完成后,检查rke目录,可以发现多出两个文件:

  • kube_config_rancher-cluster.yml:包含kubectl与helm的证书
  • rancher-cluster.rkestate:包含K8S集群信息

接下来要将kube_config_rancher-cluster.yml放置到指定位置,再检查节点状态:

确认个节点正常,再检查所有Pods的情况:

0x04 部署Tiller

Tiller是Helm的一个组成部分,作为server,主要对接K8S集群,通过chart再K8S集群上部署服务,而Helm则作为客户端,通过Helm操作Tiller server,因此,我们需要将Tiller部署到集群中。

在kube-system空间内ServiceAccount,结果如下:

赋予权限:

最后部署Tiller服务。如果你的节点在国外,直接运行以下命令即可:

如果在国内,则需要打开阿里云容器镜像服务,搜索:

然后点击镜像,找到最新的版本号:

填充在以下命令中:

执行结果如下:

验证Tiller安装是否成功:

验证Helm是否能与Tiller通讯:

至此Tiller的部署以完成。

0x05 Rancher

依然在LB机器上执行命令,这时有两部分需要选择的:

  • Rancher版本:
    • 最新版
    • 稳定版
    • Alpha版
  • SSL配置:
    • Rancher生成
    • Let’s Encrypt
    • 使用现有证书文件

Rancher的版本可以在以下地址找到相应的命令:

因为内部服务不联网,所以我选择证书由Rancher生成,域名为:rancher-dev.t.com。

如果选择使用现有的证书文件,则不需要部署证书管理器,否则请进行以下操作:

  • 安装CustomResourceDefinition 资源:

  • 创建cert-manager名命空间:

  • 关闭资源验证

  • 添加源

  • 刷新缓存

  • 安装cert-manager Helm chart

最终结果为:

  • 验证:

因为网络问题,镜像下载可能需要很长时间,请耐心等待,最终三个pods都需要为ready的状态。

然后安装Rancher,我选择由Rancher签发证书,请注意根据实际情况修改以下命令中的域名:

等待rolled out:

最后检查Rancher状态:

至此,部署Rancher的步骤已全部完成。

0x06 Nginx Load Balancer

其实现在可以使用HTTPS协议访问各个Ingress Controler,但是你会发现返还的是:

或许需要修改hosts文件或使用DNS服务器,用域名访问?这里建议通过nginx实现四层负载均衡。但是nginx的stream模块并不是默认模块,需要手动编译。

在LB机器上下载nginx源码:

完成后请修改以下内容中的IP地址,最后在LB机器中执行:

最后测试nginx的配置文件是否正常,然后启动即可:

0x07 运行

如果一切正常,通过域名打开即可看到初始设置界面:

填写好密码之后点击下一步,再确认Rancher的域名:

成功登入系统后可以看到名为 local 的Cluster正处于Provisioning状态,此时请耐性等待server-url的部署:

各节点状态:

0x08 结语

部署有点繁琐,但不复杂,另外部署过程对网络的依赖性较大,如果网络状况不好或者处于隔离状态,请选择离线部署模式:

ps. 这是一篇写了6小时的文章,每一行命令都经过验证,每一张图片都是实况。