轻松玩转K3S多点部署 — Ranch...
 
Notifications
Clear all

轻松玩转K3S多点部署 — Rancher 2.2 + K3S多点/集群部署教程  

  RSS

tai chi
(@taichi)
Reputable Member
Joined: 3 months ago
Posts: 270
27/06/2020 1:53 pm  

在有了上一次的部署后,我们成功的搭建起了属于自己的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

i> 成员节点的配置根据生产环境的规模需求进行调整,此处仅为参考值。

Step 1:概念解读

i> 此教程仅讲解基础概念,并不涉及到高可用(比如etcd高可用部署)!

首先,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:

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

如果使用国内服务器部署,请参考上一篇教程 (传送门 >>),将容器引擎从Containerd修改为Docker,并导入pause镜像。

顺带提一句,由于etcd的集群选举机制,如果需要做K3S主控的高可用,请至少保证主控数量为3台,才能使高可用生效。

在安装完成后,通过以下命令,确认K3S是否正常启动:

 
 
1
k3s kubectl get nodes

当得到类似如下的返回结果时:

NAME STATUS ROLES AGE VERSION
server01 Ready master 2m20s v1.14.5-k3s.1

则说明K3S集群启动成功。

接下来,我们来部署第二台服务器,所有的成员节点均可以参照此方法加入集群。

同样,执行命令,安装K3S:

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

在安装完成后,我们需要做一些小小的改动,使此节点不再成为主控节点(也就是关掉etcd),仅作为成员节点加入集群中。

我们首先回到第一台服务器(主控服务器),执行以下命令,获取注册集群成员的Token:

 
 
1
cat /var/lib/rancher/k3s/server/node-token

我们会得到类似这样的字符串:

K105885a80b64094d1703d638eef8353746ece928d0c6553d553a959403e144bece::node:18ee6b16f6d46b00d52d0315d5870835

保留好这个字符串,后续的节点注册需要依赖此字符串。

然后,在这里需要注意一下,我们需要获取主控服务器的IP地址。

如果你的成员节点和主控节点处在同一VPC下(或者可以内网互访的网络),主控IP请输入内网IP。这样可以节省公网带宽资源,同时在部分云平台,内网通信的流量不收费或者比公网收费低廉。

如果无法内网互访,则必须要输入公网可达的IP地址,如果不知道自己的IP地址的话,可以通过以下命令获取:

 
 
1
curl ip.sb

然后接下来,我们回到成员服务器上。首先,使用命令停止当前的K3S进程:

 
 
1
service k3s stop

之后,执行命令,注册集群:

 
 
1
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

这时候回到我们的主控服务器,输入命令:

 
 
1
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结束进程,然后使用上箭头键翻出来刚才的命令,类似于这样:

 
 
1
k3s agent --server  https://172.31.233.101:6443  --token K105885a80b64094d1703d638eef8353746ece928d0c6553d553a959403e144bece::node:18ee6b16f6d46b00d52d0315d5870835

把这条命令复制到随手就能拿到的地方(比如记事本),然后执行以下命令,修改服务项配置文件:

 
 
1
vim /etc/systemd/system/k3s.service

文件内容大概如下:

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[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 一项。将里面的内容,修改为刚才测试时的命令,比如:

 
 
1
ExecStart=/usr/local/bin/k3s agent --server  https://172.31.233.101:6443  --token K105885a80b64094d1703d638eef8353746ece928d0c6553d553a959403e144bece::node:18ee6b16f6d46b00d52d0315d5870835

之后保存退出,使用命令应用服务项变更:

 
 
1
systemctl daemon-reload

并重新启动K3S服务:

 
 
1
service k3s restart

等待数十秒后,在主控端执行命令,确认是否正常上线:

 
 
1
k3s kubectl get nodes

到此,我们完成了K3S的部署,接下来,我们开始与Rancher进行对接。

打开Rancher控制面板,点击 “添加集群” - “导入现有的Kubernetes集群” ,然后输入一个集群的名称,比如MyCluster,如图所示:

Rancher 2.2 添加K3S集群

Rancher 2.2 添加K3S集群

 

之后点击 “创建”,新建一个集群。

在新弹出的页面中,复制集群注册命令,并在主控服务器上执行:

![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

如果所有的节点都正确配置上线的话,应该会自动进入准备阶段:

Rancher 2.2 正在注册API

Rancher 2.2 正在注册API

 

之后我们会在主机列表中看到我们的服务器:

4.png

4.png

 

则证明集群部署成功。


Quote
Share:
%d bloggers like this: