RKE简介
- Rancher Kubernetes Engine,简称 RKE,是一个经过 CNCF 认证的 Kubernetes 安装程序。RKE 支持多种操作系统,包括 MacOS、Linux 和 Windows,可以在裸金属服务器和虚拟服务器上运行
- 市面上的其他 Kubernetes 部署工具存在一个共性问题:在使用工具之前需要满足的先决条件比较多,例如,在使用工具前需要完成安装 kubelet、配置网络等一系列的繁琐操作。而 RKE 简化了部署 Kubernetes 集群的过程,只有一个先决条件:只要您使用的 Docker 是 RKE 支持的版本,就可以通过 RKE 安装 Kubernetes,部署和运行 Kubernetes 集群
- RKE 既可以单独使用,作为创建 Kubernetes 集群的工具,也可以配合 Rancher2.x 使用,作为 Rancher2.x 的组件,在 Rancher 中部署和运行 Kubernetes 集群
集群部署说明
- 本次部署教程使用 RKE 单机模式(v1.3.24版本),部署 rancher封装的 v1.23.16-rancher2-3 K8S 版本,系统初始化脚本基于 RockyLinux8.10 官方发布原始镜像版本
- 采用2台虚拟机部署 K8S 集群,分别是 Master 节点(192.168.2.71/24)、Worker 节点(192.168.2.72/24) RKE 和 Master节点复用,1台机器部署 Rancher 应用 (192.168.2.77/24)
系统要求
- RKE 可以在大多数已安装 Docker 的 Linux 操作系统上运行。SSH 用户 使用 SSH 访问节点的用户必须是节点上 docker 用户组的成员
- 禁用所有节点上的交换功能(Swap),建议新部署的操作系统直接不划分 Swap 分区
- 请查看网络插件文件,了解任何额外的要求(例如,内核模块)
- 加载内核模块,下面列举了一些核心参数配置
# 调整内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1 # 开启网络转发
EOF
cat <<EOF | sudo tee /etc/modules-load.d/modules.conf
br_netfilter # 启用Netfilter 框架,允许对桥接网络中的流量进行过滤和 NAT
overlay # 支持 Overlay 虚拟网络
EOF
软件要求
- 请参考 RKE 版本说明 ,获取每个版本的 RKE 支持的 Kubernetes 版本
- 每一个 Kubernetes 版本支持的 Docker 版本都不同,详情请参考,Kubernetes 的版本说明
系统初始化脚本
#!/bin/bash
#*************************************************************************************************************
#Author: kubecc
#Date: 2025-01-08
#FileName: rocky8_init_k8s.sh
#blog: www.kubecc.com
#Description: 本脚用于 k8s 部署前系统初始化工作,基于rocky Linux 8.10版本
#Copyright (C): 2025 All rights reserved
#*************************************************************************************************************
COLOR="echo -e \\033[01;31m"
END='\033[0m'
set_mirror() {
echo "设置阿里云软件源..."
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/Rocky-*.repo
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org && dnf install -y https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
sed -i 's/mirrorlist=/#mirrorlist=/g' /etc/yum.repos.d/elrepo.repo && sed -i 's#elrepo.org/linux#mirrors.tuna.tsinghua.edu.cn/elrepo#g' /etc/yum.repos.d/elrepo.repo
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf clean all && dnf makecache
echo "设置完成,更新源缓存!"
}
install_software() {
echo "正在安装常用工具和服务..."
dnf install telnet lsof vim git unzip wget curl tcpdump bash-completion net-tools epel-release rsyslog dnsutils chrony ipvsadm ipset sysstat conntrack libseccomp perl -y
echo "软件安装完成!"
}
update_kernel() {
echo "更新内核版本..."
dnf --disablerepo=\* --enablerepo=elrepo-kernel list kernel* | grep kernel-lt
sleep 10
dnf --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt.x86_64 kernel-lt-devel.x86_64 echo "当前默认启动内核:(grubby --default-kernel)"
}
datetime_chrony() {
echo "正在配置时间同步..."
sed -i '/^pool 2.rocky.pool.ntp.org iburst/d' /etc/chrony.conf
echo "server ntp.aliyun.com iburst" >>/etc/chrony.conf
echo "server ntp.tuna.tsinghua.edu.cn iburst" >>/etc/chrony.conf
systemctl enable --now chronyd
chronyc -a makestep
echo "当前系统时间:(date)"
}
disable_firewall_selinux() {
echo "正在关闭并禁用防火墙..."
systemctl disable --now firewalld
echo -n "防火墙状态:" && echo -n(firewall-cmd --state)
echo "正在设置SELinux为disabled状态..."
sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config && setenforce 0
echo -n "当前SELinux状态:" && getenforce
}
kernel_system_config() {
echo "优化文件"
echo -e "* soft nofile 65536\n* hard nofile 131072\n* soft nproc 65535\n* hard nproc 655350\n* soft memlock unlimited\n* hard memlock unlimited" >>/etc/security/limits.conf
echo "验证配置结果......"
cat /etc/security/limits.conf | grep -v "#"
cat <<EOF | tee /etc/modules-load.d/modules.conf
overlay
br_netfilter
EOF
cat <<EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
systemctl enable --now systemd-modules-load.service
}
add_k8s_conf() {
cat <<EOF >/etc/sysctl.d/k8s.conf
# 1.文件系统相关参数
fs.may_detach_mounts = 1
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
# 2.内存相关参数
vm.panic_on_oom=0
vm.overcommit_memory=1
# 3.网络相关参数
net.ipv4.conf.all.route_localnet = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl --system
}
execute_all() {
set_mirror
install_software
update_kernel
datetime_chrony
disable_firewall_selinux
kernel_system_config
add_k8s_conf
}
restart_os(){
echo "正在重启服务器,请稍后重新尝试连接服务器..."
shutdown -r now
}
menu() {
while true; do
echo -e "\E[((RANDOM % 7 + 31));1m"
cat <<-EOF
********************************************************************
* k8s初始化脚本菜单
* 1.设置源
* 2.安装必要常用软件
* 3.更新内核
* 4.chrony时间同步
* 5.关闭防火墙&禁用SELinux
* 6.内核优化配置
* 7.添加k8s配置文件
* 8.全部执行
* 9.重启服务器
* 10.退出脚本
********************************************************************
EOF
echo -e '\E[0m'
read -p "请选择相应的编号(1-8): " choice
case{choice} in
1)
set_mirror
;;
2)
install_software
;;
3)
update_kernel
;;
4)
datetime_chrony
;;
5)
disable_firewall_selinux
;;
6)
kernel_system_config
;;
7)
add_k8s_conf
;;
8)
execute_all
;;
9)
restart_os
;;
10)
break
;;
*)
{COLOR}"输入错误,请输入正确的数字(1-8)!"{END}
;;
esac
done
}
main() {
menu
}
main
安装 Docker 服务
# 根据需求安装指定的 docker 版本,本次安装 docker v20.10.24 版本
[root@m01 ~]# dnf list docker-ce.x86_64 --showduplicates | sort -r
Last metadata expiration check: 3:33:06 ago on Tue 21 Jan 2025 03:56:14 PM CST.
Installed Packages
docker-ce.x86_64 3:26.1.3-1.el8 docker-ce-stable
docker-ce.x86_64 3:26.1.2-1.el8 docker-ce-stable
docker-ce.x86_64 3:26.1.1-1.el8 docker-ce-stable
docker-ce.x86_64 3:26.1.0-1.el8 docker-ce-stable
docker-ce.x86_64 3:26.0.2-1.el8 docker-ce-stable
docker-ce.x86_64 3:26.0.1-1.el8 docker-ce-stable
docker-ce.x86_64 3:26.0.0-1.el8 docker-ce-stable
docker-ce.x86_64 3:25.0.5-1.el8 docker-ce-stable
docker-ce.x86_64 3:25.0.4-1.el8 docker-ce-stable
docker-ce.x86_64 3:25.0.3-1.el8 docker-ce-stable
docker-ce.x86_64 3:25.0.2-1.el8 docker-ce-stable
docker-ce.x86_64 3:25.0.1-1.el8 docker-ce-stable
docker-ce.x86_64 3:25.0.0-1.el8 docker-ce-stable
docker-ce.x86_64 3:24.0.9-1.el8 docker-ce-stable
docker-ce.x86_64 3:24.0.8-1.el8 docker-ce-stable
.................................省略..........................................
[root@localhost ~]# dnf install docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io docker-buildx-plugin docker-compose-plugin
Docker CE Stable - x86_64 320 kB/s | 66 kB 00:00
Dependencies resolved.
===================================================================================================================================================================================
Package Architecture Version Repository Size
===================================================================================================================================================================================
Installing:
containerd.io x86_64 1.6.32-3.1.el8 docker-ce-stable 35 M
docker-buildx-plugin x86_64 0.14.0-1.el8 docker-ce-stable 14 M
docker-ce x86_64 3:20.10.24-3.el8 docker-ce-stable 21 M
docker-ce-cli x86_64 1:20.10.24-3.el8 docker-ce-stable 30 M
docker-compose-plugin x86_64 2.27.0-1.el8 docker-ce-stable 13 M
Installing dependencies:
container-selinux noarch 2:2.229.0-2.module+el8.10.0+1896+b18fa106 appstream 70 k
docker-ce-rootless-extras x86_64 26.1.3-1.el8 docker-ce-stable 5.0 M
fuse-overlayfs x86_64 1.13-1.module+el8.10.0+1896+b18fa106 appstream 69 k
fuse3 x86_64 3.3.0-19.el8 baseos 54 k
fuse3-libs x86_64 3.3.0-19.el8 baseos 95 k
libcgroup x86_64 0.41-19.el8 baseos 69 k
libslirp x86_64 4.4.0-2.module+el8.10.0+1896+b18fa106 appstream 69 k
slirp4netns x86_64 1.2.3-1.module+el8.10.0+1896+b18fa106 appstream 55 k
Enabling module streams:
container-tools rhel8
Transaction Summary
===================================================================================================================================================================================
Install 13 Packages
Total download size: 119 M
Installed size: 471 M
Is this ok [y/N]: y
# 启动 docker 服务
systemctl enable --now docker && docker version
# 配置镜像加速服务
[root@m01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub.littlediary.cn",
"https://docker.1ms.run"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 重载配置,重启 docker 服务
systemctl daemon-reload && systemctl restart docker.servic
配置主机名
# 1.设置主机 hostname 和 hosts 解析
hostnamectl set-hostname m01 && bash # master 节点执行
hostnamectl set-hostname n01 && bash # worker 节点执行
# 2.两台主机分别加入 hosts 解析
[root@m01 ~]$ vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.71 m01
192.168.2.72 n01
创建 RKE 用户
# 1.创建 rke 用户并设置用户密码
useradd rke && echo 123.com|passwd --stdin rke # 注意替换为自己的密码
# 2.将 rke 用户加入到 docker 用户组,安装 docker 后可能不会有 docker 这用户组,可以使用 groupadd docker 创建
usermod -aG docker rke
# 3.为了方便后续操作,我们赋予 rke 用户 sudo 权限,此步骤视情况,谨慎操作
echo "rke ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers # rke 添加到 /etc/sudoers 文件中,赋予 rke 用户无需密码即可执行任何 sudo 命令的权限
gpasswd -a rke root # 将用户 rke 添加到 root 组
newgrp root # 切换用户 rke 的主组为 root 组
# 4. m01 节点切换到 rke 用户配置 m01 节点免密登录自己或 n01
[root@m01 ~]# su - rke
Last login: Tue Jan 21 16:02:27 CST 2025 on pts/1
[rke@m01 ~]ssh-keygen -t rsa -b 4096 ## 生成密钥,一路回车即可
[rke@m01 ~] ssh-copy-id rke@m01 # 按照提示输入 rke 用户密码
[rke@m01 ~]$ ssh-copy-id rke@n01 # 按照提示输入 rke 用户密码
部署 RKE
RKE 提供了三种下载安装包的方法:通过 GitHub、Homebrew 或 MacPorts 都可以下载 RKE 安装包,我们通过Github下载二进制安装包 Github
# 在 m01 节点上使用 root 用户执行
# 1.下载 rke 二进制包
wget https://github.com/rancher/rke/releases/download/v1.3.24/rke_linux-amd64 -O /usr/local/bin/rke
# 2.赋予执行权限
chmod +x /usr/local/bin/rke
# 3.核对版本信息
[root@m01 ~]# rke --version
rke version v1.3.24
生成 K8S 集群部署文件
创建集群配置文件 cluster.yml 的方式有2种:
- 使用 minimal cluster.yml 创建集群配置文件,然后将您使用的节点的相关信息添加到文件中
- 使用
rke config命令创建集群配置文件,然后将集群参数逐个输入到该文件中
我们这里使用 rke config --name cluster.yml 创建部署文件,在当前路径下创建 cluster.yml文件。这条命令会引导您输入创建集群所需的所有参数,详情请参考集群配置选项。配置过程如下:
配置文件内容如下,可以根据需求编辑此文件
创建 K8S 集群
安装 Kubectl
部署 Rancher 可视化面板
我们使用 Rancher 来管理 k8s 集群,UI界面比较适合开发的同学,部署 Rancher ,有2种方法:
- 一是在 K8S 集群内部部署,直接配置管理集群
- 二是单独部署 Rancher 应用,导入集群;(不限制 K8S 部署方式)
为了简单快速实现部署,我们直接在 192.168.2.77 服务器上,使用 Docker 服务启动一个 Rancher 应用,启动方法如下:
# 1.启动 Rancher 服务, 注意 rancher 应用与 K8S 版本适配关系
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher:v2.7-head
启动完成后,我们访问 https://192.168.2.77/ ,我们根据界面引导,登入 Rancher 管理界面,在”集群管理“ 功能中根据界面引导、填好相关信息,复制 Agent 部署信息到 m01 节点上执行

# 在界面点击创建后,我们会得到一条部署命令,我们在 m01 节点上执行部署
[rke@m01 ~]curl --insecure -sfL https://192.168.2.77/v3/import/l4b4k94wwzrw8rvgjbpl2hmrpdwrjjdgq8598lvzm9qch92lw5xkv7_c-m-v4vxch7p.yaml | kubectl apply -f -
# 启动完成后如下,我们会发现多了一个 namespace ,我们就可以在面板上看到新加入的集群信息了
[rke@m01 ~] kubectl get pods -n cattle-system
NAME READY STATUS RESTARTS AGE
cattle-cluster-agent-dc6f5d649-9jgwh 1/1 Running 0 10h
cattle-cluster-agent-dc6f5d649-bp7rx 1/1 Running 0 10h
rancher-webhook-f874c7d7-j8cc4 1/1 Running 0 10h

Rancher Agents
Rancher 通过 cluster-agent 与集群进行通信(通过 cattle-cluster-agent 调用 Kubernetes API 与集群通讯),并通过 cattle-node-agent 与节点进行通信
如果 cattle-cluster-agent 无法连接到已有的 Rancher Server 也就是 Server-url,集群将保留在 Pending 状态,错误显示为 Waiting for full cluster configuration
总结
- 我们通过 RKE 单机模式部署了 K8S 集群,并实现了 Rancher 可视化界面的方式管理 K8S 集群,通过这篇文章,大家可以对集群部署过程有个简单的了解
- 后续我会结合这篇文章内容对整个集群的部署方式和部署内容进行扩展,比如,RKE 集群模式、K8S 集群高可用、使用 Helm 部署 Rancher 应用等等

要想成为扫地僧,需要不断的学习进步,这个世界,在悄悄惩罚那些不改变的人