Rancher宣称 RKE2 结合了 RKE1 和 K3s 的双重优点
它继承了K3s的可用性、易操作性和部署模型,同时兼顾了RKE1对传传统kubernetes的一致性,兼顾边缘系统
但是对于我来说,想了解RKE2 只有一个原因,Kubernetes已经宣称要开始移除 Dockershim,所以像RKE1那种使用Docker来作为运行时的工具,可能在(也许很久)将来要被淹没在历史的长河中了。
RKE2 与 K3s 一样,默认使用的是 Containerd ,完全脱离了原生的 Docker
不过可能是因为习惯了RKE1,这里我觉得RKE2 和 K3s 的模式有点难于应用
RKE1 的模式是,使用一个配置文件,然后创建和更新整个集群,更像是 生命式接口
RKE2 和 K3s 的模式是,在每个节点上使用独立的 service 来启动需要的kubernetes组件来加入集群,更像是 命令式接口
下面是一个RKE2 的例子 (这里demo我参考了官方安装文档,但是实际上,官方文档并不能让我的节点顺利的加入集群,所以我做了很多官方文档没有的步骤,理论上官方文档认为只要连接到9345,就可以动态的获取其他需要的配置,但是这里我需要手动进行一些KUBECONFIG的配置才能顺利加入集群)
- Master 节点
先启动第一个Master节点
1.1 配置 DNS,RKE2 的API Server 在高可用模型下需要一个用户自己配置的,额外的负载均衡器,下面这几种都可以,当然最简单的还是 robin DNS,不过需要注意的是 Nginx 好像是不行,因为明显官方给出的这几种LB都是至少要工作在第四层上的 TCP IP 负载均衡器,也就是 AWS的 NLB
- A layer 4 (TCP) load balancer
- Round-robin DNS
- Virtual or elastic IP addresses
1.1 这里我没有配置LB,我只使用一个 本地DNS
/etc/hosts
192.168.204.145 ubuntu1
1.2 给节点一个唯一的hostname
/etc/hostname
ubuntu1
1.3 创建 config.yaml
如果不自己填写token,RKE2 会自己在/var/lib/rancher/rke2/server/node-token创建一个,不过由于它不能自己配置config.yaml ,所以你得在安装之后自己把值拷贝过来
root@ubuntu1:/var/lib/rancher/rke2/bin# cat /etc/rancher/rke2/config.yaml
token: my-shared-secret
tls-san:
- ubuntu1
1.4 在Master节点1上安装RKE2
curl -sfL https://get.rke2.io | sh -
1.5 创建开机启动service,并且现在就启动它
systemctl enable rke2-server.service
systemctl start rke2-server.service
1.6 查看log,等待启动成功
journalctl -u rke2-server -f
类似下面的截图,但是我这里已经有3个master节点了
1.7 此时RKE2 会生成 kubeconfig 配置文件,把它加入到profile中,以便所有用户都可以使用它
/etc/profile
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml PATH=$PATH:/var/lib/rancher/rke2/bin
1.8 检查节点状态
RKE2 会在 /var/lib/rancher/rke2/bin 路径下生成一些常用的可执行文件
这里你应该只能看见一个节点
2. Master 节点2 和节点3
后续Master节点的配置是一样的,主要区别在于,它们不是第一个节点,所以需要明确第一个主节点的Endpoint
2.1 同样需要在 Master节点2 和 Master 节点3 上配置 本地DNS
/etc/hosts
192.168.204.145 ubuntu1
2.2 给节点一个唯一的hostname
/etc/hostname
ubuntu2
/etc/hostname
ubuntu3
2.3 创建 config.yaml
这里和第一个Master节点开始有些区别了
需要加入 server 9345 的地址 和 Master1 的 token
root@ubuntu2:~# cat /etc/rancher/rke2/config.yaml
server: https://ubuntu1:9345
token: my-shared-secret
tls-san:
- ubuntu1
root@ubuntu2:~#
2.4 在Master节点2、3上安装RKE2
curl -sfL https://get.rke2.io | sh -
2.5 创建开机启动service,并且现在就启动它
systemctl enable rke2-server.service
systemctl start rke2-server.service
2.6 查看log,这里我的理解是,只要能连接到 9345 , Master2和Master3应该自动获取对应的配置信息,加入集群,但是我失败了,两个master节点迟迟无法join
journalctl -u rke2-server -f
2.7 拷贝Master节点1的 KUBECOFIG文件内容到 Master2和Master3,并且修改它们的 /etc/profile
/etc/profile
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
2.8 重新启动rke service,并检查节点状态
journalctl -u rke2-server -f
多等待一会,就可以看到节点成功加入集群了
3. 添加 slave节点
3.1 配置 本地DNS
/etc/hosts
192.168.204.145 ubuntu1
3.2 给节点一个唯一的hostname
/etc/hostname
ubuntu4
3.3 安装 RKE2
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh -
3.4 修改config
mkdir -p /etc/rancher/rke2/
vim /etc/rancher/rke2/config.yaml
server: https://ubuntu1:9345
token: my-shared-secret
3.5 开机启动、启动service
systemctl enable rke2-agent.service
systemctl start rke2-agent.service
3.6 查看log
journalctl -u rke2-server -f
3.7 工作节点已加入集群
以上内容写的有点乱,稍微总结一下最省事的步骤
以3个master节点为例
master1 节点上
- 修改 /etc/hosts , 把所有机器的域名加好
- 修改 /etc/hostname,确保每台主机的名字不要重复,然后重新启动主机,确保主机名生效
- 直接 curl -sfL https://get.rke2.io | sh – 然后等待完成
- systemctl enable rke2-server.service
systemctl start rke2-server.service
journalctl -u rke2-server -f - 在 /etc/profile 中添加 环境变量
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml PATH=$PATH:/var/lib/rancher/rke2/bin - 等待直到启动完成,第一个节点 ready ,使用 kubectl get nodes
- 查看第一个节点自动生成的 token /var/lib/rancher/rke2/server/node-token
master2 节点上
- 修改 /etc/hosts , 把所有机器的域名加好
- 修改 /etc/hostname,确保每台主机的名字不要重复,然后重新启动主机,确保主机名生效
- 创建新文件 /etc/rancher/rke2/config.yaml ,写入
server: https://k1.com:9345
token: K104f88542b04751fc9385eae792b5a042930c89887d64bd0b609cafe54d7d250cb::server:d8aa9cbbfcfdffa9c88bd918b4e06a0
tls-san:
- k1.com
4. curl -sfL https://get.rke2.io | sh – 然后等待完成
5. systemctl enable rke2-server.service
systemctl start rke2-server.service
journalctl -u rke2-server -f
6. 在 /etc/profile 中添加 环境变量
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml PATH=$PATH:/var/lib/rancher/rke2/bin
7. 等待直到启动完成,第一个节点 ready ,使用 kubectl get nodes
master3 节点上
完全重复 master2 的步骤