https://blog.ilemonrain.com/docker/rancher-with-k3s.html
在有了上一次的部署后,我们成功的搭建起了属于自己的K3S服务。
但当业务量逐渐增大后,单点的部署显然并不能满足我们的需要,我们需要对节点进行扩容。
但我们总不会说每增加一台节点,就部署一套K3S平台吧……
管理起来麻烦不说,对系统资源也是极大的浪费。
这次,我们一起来进行Rancher+K3S的多点/集群部署。
Step 0:配置环境要求
同样,本着一(bu)本(hu)正(you)经(ren)的态度,我们先来说下整个环境的配置要求。
Rancher 2.2 控制面板 配置最低需求:
- 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
- CPU:1 核心
- 可用内存:1 GB
- 磁盘空间:10 GB
- 硬件架构:x86_64
K3S 主控节点 配置最低需求:
- 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
- CPU:1 核心
- 可用内存:512 MB
- 磁盘空间:5 GB
- 支持的硬件架构:x86_64, ARMv7, ARM64
K3S 成员节点 (Slave节点) 配置最低需求:
- 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
- CPU:1 核心
- 可用内存:256 MB
- 磁盘空间:5 GB
- 支持的硬件架构:x86_64, ARMv7, ARM64
当然,以上都是支撑Rancher+K3S架构稳定运行的最低配置,仅推荐在测试环境中使用,如果用于生产环境的话,请参考以下配置要求:
Rancher 2.2 控制面板 配置最低需求:
- 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
- CPU:2 核心
- 可用内存:4 GB
- 磁盘空间:50 GB
- 硬件架构:x86_64
K3S 主控节点 配置最低需求:
- 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
- CPU:2 核心
- 可用内存:4 GB
- 磁盘空间:50 GB
- 支持的硬件架构:x86_64, ARMv7, ARM64
K3S 成员节点 (Slave节点) 配置最低需求:
- 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
- CPU:4 核心
- 可用内存:4 GB
- 磁盘空间:100 GB
- 支持的硬件架构:x86_64, ARMv7, ARM64
Step 1:概念解读
首先,K3S集群的部署方式有三种:
- 同一地域(集群)下多台实例(成员节点)
- 多地域(集群)下的单台实例(成员节点)
- 多地域(集群)下的多台实例(成员节点)
听起来是不是很别扭?别急,我一个一个的举例讲解:
第一种,也就是 同一地域(集群)下多台实例(成员节点) :比如我在北京地区,需要投入4台8C16G的服务器用作K3S集群,同时我将这4台服务器全部合并到一个K3S的集群中,然后汇总成一个大集群统一接受Rancher的管理。
这种情况下我们需要部署的组件及其数量:
- Rancher 2.2 管理面板 x1
- K3S 主控节点 x1
- K3S 成员节点 x4
第二种,也就是 多地域(集群)下的单台实例(成员节点) :我在北京,广州,上海,香港各有一台8C16G的服务器用作K3S集群,这种情况下,我可以将K3S主控节点部署在北京的服务器上,通过公网组建K3S集群,这种情况下我们需要部署的组件及其数量:
- Rancher 2.2 管理面板 x1
- K3S 主控节点 x1
- K3S 成员节点 x4
这种情况下其实整个架构是最脆弱的。因为国内的跨ISP甚至跨境互联,稳定性是得不到保证的。一旦与主控节点失联,或者北京的主控节点崩溃,势必会造成单点甚至整个集群的不可控。那还有一种部署方法,是在每一台服务器上都安装K3S主控节点,各自为营。这种情况下我们需要部署的组件及其数量:
- Rancher 2.2 管理面板 x1
- K3S 主控节点 x1
- K3S 成员节点 x4
这种情况的好处是单点的故障并不会影响到整个集群的运行,但相对来讲的话会额外占用资源。如果服务器配置都比较高的话还好,服务器配置较低的话,几乎会吃掉一定的资源量,导致可用于部署生产环境的资源变少。
第三种 多地域(集群)下的多台实例(成员节点) :我在北京,广州,上海,香港各有四台8C16G的服务器用作K3S集群,这种情况下,每个集群各自为营,集群内部实现负载均衡和高可用,单个集群的不可用不会导致其他集群失去控制。这种情况下我们需要部署的组件及其数量:
- Rancher 2.2 管理面板 x1
- K3S 主控节点 x4
- K3S 成员节点 x16
本文将会使用以下两种模拟情境,来讲解K3S多点集群的部署;
- 方案一:Rancher 2.2 管理面板 x1 、 K3S 主控节点 x1 、 K3S 成员节点 x2 ( 同一地域(集群)下多台实例(成员节点) )
- 方案二:Rancher 2.2 管理面板 x1 、 K3S 主控节点 x2 、 K3S 成员节点 x1 ( 多地域(集群)下的单台实例(成员节点) )
Step 2:实战演练 —— 多实例集群
我们首先准备好Rancher 2.2控制面板服务器,具体的过程不在此叙述,可以参考上一篇文章的部署教程:
https://blog.ilemonrain.com/docker/rancher-with-k3s.html
在准备完成后,我们先来部署第一台服务器,这台服务器的角色将会有:
- Rancher 2.2 控制面板
- K3S 主控节点
- K3S 成员节点
如果使用官方提供的一键脚本自动安装的话,默认将会独立成为一个集群(也就是自动启动主控节点),在此我们将第一台服务器作为整个K3S集群的主控服务器,同时也作为整个集群的第一名成员加入其中:
使用以下命令,安装K3S:
curl -sfL https://get.k3s.io | sh -
如果使用国内服务器部署,请参考上一篇教程 (传送门 >>),将容器引擎从Containerd修改为Docker,并导入pause镜像。
顺带提一句,由于etcd的集群选举机制,如果需要做K3S主控的高可用,请至少保证主控数量为3台,才能使高可用生效。
在安装完成后,通过以下命令,确认K3S是否正常启动:
k3s kubectl get nodes
当得到类似如下的返回结果时:
NAME STATUS ROLES AGE VERSION
server01 Ready master 2m20s v1.14.5-k3s.1
则说明K3S集群启动成功。
接下来,我们来部署第二台服务器,所有的成员节点均可以参照此方法加入集群。
同样,执行命令,安装K3S:
curl -sfL https://get.k3s.io | sh -
在安装完成后,我们需要做一些小小的改动,使此节点不再成为主控节点(也就是关掉etcd),仅作为成员节点加入集群中。
我们首先回到第一台服务器(主控服务器),执行以下命令,获取注册集群成员的Token:
cat /var/lib/rancher/k3s/server/node-token
我们会得到类似这样的字符串:
K105885a80b64094d1703d638eef8353746ece928d0c6553d553a959403e144bece::node:18ee6b16f6d46b00d52d0315d5870835
保留好这个字符串,后续的节点注册需要依赖此字符串。
然后,在这里需要注意一下,我们需要获取主控服务器的IP地址。
如果你的成员节点和主控节点处在同一VPC下(或者可以内网互访的网络),主控IP请输入内网IP。这样可以节省公网带宽资源,同时在部分云平台,内网通信的流量不收费或者比公网收费低廉。
如果无法内网互访,则必须要输入公网可达的IP地址,如果不知道自己的IP地址的话,可以通过以下命令获取:
curl ip.sb
然后接下来,我们回到成员服务器上。首先,使用命令停止当前的K3S进程:
service k3s stop
之后,执行命令,注册集群:
k3s agent --server https://[主控服务器的IP地址]:6443 --token [注册Token]
主控服务器的IP地址请输入你刚才得到的IP地址,注册Token请输入主控服务器 /var/lib/rancher/k3s/server/node-token
中得到的字符串。
如果执行成功的话,日志会停在类似下面的地方:
I0816 22:28:19.629641 1160 iptables.go:167] Deleting iptables rule: -s 10.42.0.0/16 ! -d 224.0.0.0/4 -j MASQUERADE --random-fully
I0816 22:28:19.629885 1160 iptables.go:155] Adding iptables rule: -s 10.42.0.0/16 -j ACCEPT
I0816 22:28:19.631487 1160 iptables.go:167] Deleting iptables rule: ! -s 10.42.0.0/16 -d 10.42.1.0/24 -j RETURN
I0816 22:28:19.631922 1160 iptables.go:167] Deleting iptables rule: ! -s 10.42.0.0/16 -d 10.42.0.0/16 -j MASQUERADE --random-fully
I0816 22:28:19.632042 1160 iptables.go:155] Adding iptables rule: -d 10.42.0.0/16 -j ACCEPT
I0816 22:28:19.632306 1160 iptables.go:155] Adding iptables rule: -s 10.42.0.0/16 -d 10.42.0.0/16 -j RETURN
I0816 22:28:19.636677 1160 iptables.go:155] Adding iptables rule: -s 10.42.0.0/16 ! -d 224.0.0.0/4 -j MASQUERADE --random-fully
I0816 22:28:19.637643 1160 iptables.go:155] Adding iptables rule: ! -s 10.42.0.0/16 -d 10.42.1.0/24 -j RETURN
I0816 22:28:19.638442 1160 iptables.go:155] Adding iptables rule: ! -s 10.42.0.0/16 -d 10.42.0.0/16 -j MASQUERADE --random-fully
这时候回到我们的主控服务器,输入命令:
k3s kubectl get nodes
这时候我们会发现,节点列表变成了2个,类似这样:
NAME STATUS ROLES AGE VERSION
server01 Ready master 18m v1.14.5-k3s.1
server02 Ready worker 60s v1.14.5-k3s.1
则说明集群注册成功,但现在革命尚未成功(不是),我们还需要继续完成手头的工作,毕竟不能做豆腐渣工程嘛(跑
回到成员服务器上,使用Ctrl+C结束进程,然后使用上箭头键翻出来刚才的命令,类似于这样:
k3s agent --server https://172.31.233.101:6443 --token K105885a80b64094d1703d638eef8353746ece928d0c6553d553a959403e144bece::node:18ee6b16f6d46b00d52d0315d5870835
把这条命令复制到随手就能拿到的地方(比如记事本),然后执行以下命令,修改服务项配置文件:
vim /etc/systemd/system/k3s.service
文件内容大概如下:
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network-online.target
[Service]
Type=notify
EnvironmentFile=/etc/systemd/system/k3s.service.env
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s \
server \
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
我们来修改 [Service] 中的 ExecStart 一项。将里面的内容,修改为刚才测试时的命令,比如:
ExecStart=/usr/local/bin/k3s agent --server https://172.31.233.101:6443 --token K105885a80b64094d1703d638eef8353746ece928d0c6553d553a959403e144bece::node:18ee6b16f6d46b00d52d0315d5870835
之后保存退出,使用命令应用服务项变更:
systemctl daemon-reload
并重新启动K3S服务:
service k3s restart
等待数十秒后,在主控端执行命令,确认是否正常上线:
k3s kubectl get nodes
到此,我们完成了K3S的部署,接下来,我们开始与Rancher进行对接。
打开Rancher控制面板,点击 “添加集群” - “导入现有的Kubernetes集群” ,然后输入一个集群的名称,比如MyCluster,如图所示:
之后点击 “创建”,新建一个集群。
在新弹出的页面中,复制集群注册命令,并在主控服务器上执行:
Rancher 2.2 注册集群
执行后,命令行会返回如下结果:
clusterrole.rbac.authorization.k8s.io/proxy-clusterrole-kubeapiserver created
clusterrolebinding.rbac.authorization.k8s.io/proxy-role-binding-kubernetes-master created
namespace/cattle-system created
serviceaccount/cattle created
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-ef3a180 created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
deployment.extensions/cattle-cluster-agent created
daemonset.extensions/cattle-node-agent created
如果所有的节点都正确配置上线的话,应该会自动进入准备阶段:
之后我们会在主机列表中看到我们的服务器:
则证明集群部署成功。