rke2离线部署K8S

下载对应软件包

wget https://github.com/rancher/rke2/releases/download/v1.26.12%2Brke2r1/rke2-images-calico.linux-amd64.tar.zst
wget https://github.com/rancher/rke2/releases/download/v1.26.12%2Brke2r1/rke2-images-core.linux-amd64.tar.zst
wget https://github.com/rancher/rke2/releases/download/v1.26.12%2Brke2r1/rke2-images.linux-amd64.tar.zst
wget https://github.com/rancher/rke2/releases/download/v1.26.12%2Brke2r1/rke2.linux-amd64.tar.gz
wget https://github.com/rancher/rke2/releases/download/v1.26.12%2Brke2r1/sha256sum-amd64.txt
curl -sfL https://get.rke2.io --output install.sh
  • 以下文件为安装时需要的镜像压缩包
    rke2-images-calico.linux-amd64.tar.zst
    rke2-images-core.linux-amd64.tar.zst
    rke2-images.linux-amd64.tar.zst

  • 这个是rke2安装时需要的包
    rke2.linux-amd64.tar.gz

  • 这个是sha256sum的信息,安装过程会读取,如果未读取会无法安装
    sha256sum-amd64.txt

  • 这个是安装脚本
    install.sh

配置服务器环境

  • 配置主机名
hostnamectl set-hostname k8s-prod-master01
hostnamectl set-hostname k8s-prod-master02
hostnamectl set-hostname k8s-prod-master03
hostnamectl set-hostname k8s-prod-worker01
hostnamectl set-hostname k8s-prod-worker02
hostnamectl set-hostname k8s-prod-worker03
#写入/etc/hosts
cat >> /etc/hosts << EOF
#ipv4
172.25.18.70 k8s-prod-master01
172.25.18.71 k8s-prod-master02
172.25.18.72 k8s-prod-master03
172.25.18.73 k8s-prod-worker01
172.25.18.74 k8s-prod-worker02
172.25.18.75 k8s-prod-worker03
#ipv6
2409:8034:5aff:3200::5:70 k8s-prod-master01
2409:8034:5aff:3200::5:71 k8s-prod-master02
2409:8034:5aff:3200::5:72 k8s-prod-master03
2409:8034:5aff:3200::5:73 k8s-prod-worker01
2409:8034:5aff:3200::5:74 k8s-prod-worker02
2409:8034:5aff:3200::5:75 k8s-prod-worker03
EOF
  • 配置DNS(未配置会导致coredns无法启动)
cat >> /etc/resolv.conf << EOF
nameserver 127.0.0.1
EOF
  • 重新生成机器ID
rm -f /etc/machine-id
rm -f /var/lib/dbus/machine-id 
systemd-machine-id-setup
  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 关闭selinux
setenforce 0
sed -i 's/SELINUX\=enforcing/SELINUX\=disabled/g' /etc/selinux/config
  • 关闭交换分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a && sysctl -w vm.swappiness=0
  • 调整limit
cat >> /etc/security/limits.conf << EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
EOF
  • NetworkManager 会控制默认网络命名空间中接口的路由表,配置为忽略 calico/flannel 相关的网络接口
cat > /etc/NetworkManager/conf.d/calico.conf << EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:flannel*
EOF
systemctl reload NetworkManager
  • 配置sysctl
cat > /etc/sysctl.d/90-rke2.conf <<EOF
#ARP缓存条目的超时时间,单位为秒。将过期条目从ARP表中清除的时间设为120秒
net.ipv4.neigh.default.gc_stale_time = 120
#禁用逆向路径过滤(RP过滤)。该选项用于防止IP地址欺骗,0表示关闭。
net.ipv4.conf.all.rp_filter = 0
#对于默认配置,禁用逆向路径过滤
net.ipv4.conf.default.rp_filter = 0
#控制ARP请求中发送的源IP地址的级别,2表示优先选择本地地址进行ARP通告。
net.ipv4.conf.default.arp_announce = 2
#针对回环接口,ARP通告遵循同样的规则,使用更匹配的本地地址
net.ipv4.conf.lo.arp_announce = 2
#全局启用ARP通告的严格地址匹配规则
net.ipv4.conf.all.arp_announce = 2
#在放弃连接前TCP SYN-ACK包的重试次数。此参数设置为2次可加速TCP连接失败的检测。
net.ipv4.tcp_synack_retries = 2
#允许桥接时通过ip6tables过滤IPv6数据包
net.bridge.bridge-nf-call-ip6tables = 1
#允许通过arptables过滤ARP数据包
net.bridge.bridge-nf-call-arptables = 1
#设置系统的交换空间使用倾向。0表示尽可能使用物理内存,只有在非常需要时才使用交换空间
vm.swappiness = 0
#当内核崩溃时,系统将在10秒后自动重启
kernel.panic=10

#允许IPv4数据包转发,使得该机器可以作为路由器使用
net.ipv4.ip_forward = 1
#允许桥接时通过iptables过滤IPv4数据包
net.bridge.bridge-nf-call-iptables = 1
#允许在卸载文件系统时分离挂载点
fs.may_detach_mounts = 1
#控制内存的分配策略。1表示允许内存过度分配,即使物理内存不足也可分配
vm.overcommit_memory = 1
#当系统内存不足时(OOM),内核不会因为此错误崩溃,设置为0表示不触发内核panic
vm.panic_on_oom = 0
#设置单个用户进程允许监视的文件数为89100
fs.inotify.max_user_watches = 89100
#设置系统中打开文件的最大数目,52706963是该系统支持的最大文件句柄数
fs.file-max = 52706963
#设置每个进程可以打开的最大文件描述符数量
fs.nr_open = 52706963
#Netfilter连接跟踪表的最大条目数。较大的值可以支持更多并发连接
net.netfilter.nf_conntrack_max = 3200000

#设置TCP连接的keepalive探测开始前的时间,600秒即10分钟
net.ipv4.tcp_keepalive_time = 600
#在TCP连接断开之前发送的探测包数,设置为3次
net.ipv4.tcp_keepalive_probes = 3
#TCP Keepalive探测包之间的时间间隔,单位为秒
net.ipv4.tcp_keepalive_intvl = 15
#系统中TIME-WAIT状态的TCP连接的最大数目,超过这个值时,旧的连接会被强制关闭
net.ipv4.tcp_max_tw_buckets = 36000
#允许重用处于TIME-WAIT状态的TCP连接
net.ipv4.tcp_tw_reuse = 1
#系统中处于孤儿状态的TCP连接的最大数目,超过该值时,连接会被直接关闭
net.ipv4.tcp_max_orphans = 327680
#在关闭孤儿连接之前,进行的重试次数
net.ipv4.tcp_orphan_retries = 3
#启用TCP SYN Cookies,防止SYN洪水攻击
net.ipv4.tcp_syncookies = 1
#Netfilter连接跟踪表的最大连接数(旧参数,现在使用nf_conntrack_max代替)
net.ipv4.ip_conntrack_max = 65536
#定义监听队列的最大长度,设置为16384有助于提高高并发环境下的网络性能
net.core.somaxconn = 65535
#全局启用IPv6
net.ipv6.conf.all.disable_ipv6 = 0
#对于默认配置,启用IPv6
net.ipv6.conf.default.disable_ipv6 = 0
#针对回环接口,启用IPv6
net.ipv6.conf.lo.disable_ipv6 = 0
#允许IPv6数据包转发,使得该系统可以作为IPv6路由器
net.ipv6.conf.all.forwarding = 1

#增加接受队列的长度,处理高流量时有帮助
net.core.netdev_max_backlog = 65536
#设置最大接收和发送缓冲区的大小 ,提高网络吞吐量
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
#设置TCP的接收和发送缓冲区大小
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
#使用BBR拥塞控制算法来提升高延迟、高带宽网络中的性能
#net.ipv4.tcp_congestion_control = bbr

#禁用TCP TIME-WAIT回收功能。由于tcp_tw_recycle会导致NAT和负载均衡环境中的连接问题,特别是跨多个客户端时。
net.ipv4.tcp_tw_recycle = 0
#缩短FIN_WAIT的超时时间,避免过多的死连接
net.ipv4.tcp_fin_timeout = 30
#保留端口范围30000-32767,避免这些端口被随机分配。这段端口通常用于K8s服务的NodePort
net.ipv4.ip_local_reserved_ports = 30000-32767
#使Netfilter连接跟踪模块在处理TCP连接时更宽松,容忍轻微的协议违规行为,适用于宽松的TCP连接跟踪,减少连接断开的可能性
net.netfilter.nf_conntrack_tcp_be_liberal = 1
#宽松模式下的TCP连接跟踪,可以在某些异常情况下保持连接跟踪表中的条目,建议启用,以容忍更多的TCP协议异常
net.netfilter.nf_conntrack_tcp_loose = 1
#设置TCP连接的TIME-WAIT超时时间,30秒是合理的设置,可以快速清理无用连接
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
#启用TCP时间戳,用于防止旧的重复数据包以及提升TCP性能
net.ipv4.tcp_timestamps = 1
#本地端口分配的范围,设置为5120到65000,适用于高并发连接场景
net.ipv4.ip_local_port_range = 5120 65000
#未确认的SYN请求的最大队列长度,较大的值可以提高在大量连接请求时的处理能力
net.ipv4.tcp_max_syn_backlog = 16384

#设置TCP的默认接收和发送缓冲区大小,提升大数据传输性能
net.core.rmem_default = 262144
net.core.wmem_default = 262144
#启用TCP窗口扩展机制,允许TCP的接收窗口超过默认的64KB
net.ipv4.tcp_window_scaling = 1
#优化TCP性能,优先处理低延迟任务
net.ipv4.tcp_low_latency = 1

#控制系统内存中的“脏”页面比例,影响磁盘写入的频率,调整脏页面比例,减少频繁的I/O写入,适用于大量日志记录和持久性存储的K8s集群
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
#控制内核释放inode和dentry缓存的压力,设置较低的缓存压力,可以让系统更倾向于保留缓存,提高文件系统的访问效率,适合I/O密集型的应用场景
vm.vfs_cache_pressure = 50


#设置任务迁移的开销,单位是纳秒
kernel.sched_migration_cost_ns = 5000000
#禁用自动调度组功能,防止系统在高负载下对进程进行不必要的优先级调整
kernel.sched_autogroup_enabled = 0               
EOF
sysctl -p

去除v6

cat > /etc/sysctl.d/90-rke2.conf <<EOF
#ARP缓存条目的超时时间,单位为秒。将过期条目从ARP表中清除的时间设为120秒
net.ipv4.neigh.default.gc_stale_time = 120
#禁用逆向路径过滤(RP过滤)。该选项用于防止IP地址欺骗,0表示关闭。
net.ipv4.conf.all.rp_filter = 0
#对于默认配置,禁用逆向路径过滤
net.ipv4.conf.default.rp_filter = 0
#控制ARP请求中发送的源IP地址的级别,2表示优先选择本地地址进行ARP通告。
net.ipv4.conf.default.arp_announce = 2
#针对回环接口,ARP通告遵循同样的规则,使用更匹配的本地地址
net.ipv4.conf.lo.arp_announce = 2
#全局启用ARP通告的严格地址匹配规则
net.ipv4.conf.all.arp_announce = 2
#在放弃连接前TCP SYN-ACK包的重试次数。此参数设置为2次可加速TCP连接失败的检测。
net.ipv4.tcp_synack_retries = 2
#允许桥接时通过ip6tables过滤IPv6数据包
net.bridge.bridge-nf-call-ip6tables = 1
#允许通过arptables过滤ARP数据包
net.bridge.bridge-nf-call-arptables = 1
#设置系统的交换空间使用倾向。0表示尽可能使用物理内存,只有在非常需要时才使用交换空间
vm.swappiness = 0
#当内核崩溃时,系统将在10秒后自动重启
kernel.panic=10

#允许IPv4数据包转发,使得该机器可以作为路由器使用
net.ipv4.ip_forward = 1
#允许桥接时通过iptables过滤IPv4数据包
net.bridge.bridge-nf-call-iptables = 1
#允许在卸载文件系统时分离挂载点
fs.may_detach_mounts = 1
#控制内存的分配策略。1表示允许内存过度分配,即使物理内存不足也可分配
vm.overcommit_memory = 1
#当系统内存不足时(OOM),内核不会因为此错误崩溃,设置为0表示不触发内核panic
vm.panic_on_oom = 0
#设置单个用户进程允许监视的文件数为89100
fs.inotify.max_user_watches = 89100
#设置系统中打开文件的最大数目,52706963是该系统支持的最大文件句柄数
fs.file-max = 52706963
#设置每个进程可以打开的最大文件描述符数量
fs.nr_open = 52706963
#Netfilter连接跟踪表的最大条目数。较大的值可以支持更多并发连接
net.netfilter.nf_conntrack_max = 3200000

#设置TCP连接的keepalive探测开始前的时间,600秒即10分钟
net.ipv4.tcp_keepalive_time = 600
#在TCP连接断开之前发送的探测包数,设置为3次
net.ipv4.tcp_keepalive_probes = 3
#TCP Keepalive探测包之间的时间间隔,单位为秒
net.ipv4.tcp_keepalive_intvl = 15
#系统中TIME-WAIT状态的TCP连接的最大数目,超过这个值时,旧的连接会被强制关闭
net.ipv4.tcp_max_tw_buckets = 36000
#允许重用处于TIME-WAIT状态的TCP连接
net.ipv4.tcp_tw_reuse = 1
#系统中处于孤儿状态的TCP连接的最大数目,超过该值时,连接会被直接关闭
net.ipv4.tcp_max_orphans = 327680
#在关闭孤儿连接之前,进行的重试次数
net.ipv4.tcp_orphan_retries = 3
#启用TCP SYN Cookies,防止SYN洪水攻击
net.ipv4.tcp_syncookies = 1
#Netfilter连接跟踪表的最大连接数(旧参数,现在使用nf_conntrack_max代替)
net.ipv4.ip_conntrack_max = 65536
#定义监听队列的最大长度,设置为16384有助于提高高并发环境下的网络性能
net.core.somaxconn = 65535

#增加接受队列的长度,处理高流量时有帮助
net.core.netdev_max_backlog = 65536
#设置最大接收和发送缓冲区的大小 ,提高网络吞吐量
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
#设置TCP的接收和发送缓冲区大小
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
#使用BBR拥塞控制算法来提升高延迟、高带宽网络中的性能
#net.ipv4.tcp_congestion_control = bbr

#禁用TCP TIME-WAIT回收功能。由于tcp_tw_recycle会导致NAT和负载均衡环境中的连接问题,特别是跨多个客户端时。
net.ipv4.tcp_tw_recycle = 0
#缩短FIN_WAIT的超时时间,避免过多的死连接
net.ipv4.tcp_fin_timeout = 30
#保留端口范围30000-32767,避免这些端口被随机分配。这段端口通常用于K8s服务的NodePort
net.ipv4.ip_local_reserved_ports = 30000-32767
#使Netfilter连接跟踪模块在处理TCP连接时更宽松,容忍轻微的协议违规行为,适用于宽松的TCP连接跟踪,减少连接断开的可能性
net.netfilter.nf_conntrack_tcp_be_liberal = 1
#宽松模式下的TCP连接跟踪,可以在某些异常情况下保持连接跟踪表中的条目,建议启用,以容忍更多的TCP协议异常
net.netfilter.nf_conntrack_tcp_loose = 1
#设置TCP连接的TIME-WAIT超时时间,30秒是合理的设置,可以快速清理无用连接
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
#启用TCP时间戳,用于防止旧的重复数据包以及提升TCP性能
net.ipv4.tcp_timestamps = 1
#本地端口分配的范围,设置为5120到65000,适用于高并发连接场景
net.ipv4.ip_local_port_range = 5120 65000
#未确认的SYN请求的最大队列长度,较大的值可以提高在大量连接请求时的处理能力
net.ipv4.tcp_max_syn_backlog = 16384

#设置TCP的默认接收和发送缓冲区大小,提升大数据传输性能
net.core.rmem_default = 262144
net.core.wmem_default = 262144
#启用TCP窗口扩展机制,允许TCP的接收窗口超过默认的64KB
net.ipv4.tcp_window_scaling = 1
#优化TCP性能,优先处理低延迟任务
net.ipv4.tcp_low_latency = 1

#控制系统内存中的“脏”页面比例,影响磁盘写入的频率,调整脏页面比例,减少频繁的I/O写入,适用于大量日志记录和持久性存储的K8s集群
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
#控制内核释放inode和dentry缓存的压力,设置较低的缓存压力,可以让系统更倾向于保留缓存,提高文件系统的访问效率,适合I/O密集型的应用场景
vm.vfs_cache_pressure = 50

#设置任务迁移的开销,单位是纳秒
kernel.sched_migration_cost_ns = 5000000
#禁用自动调度组功能,防止系统在高负载下对进程进行不必要的优先级调整
kernel.sched_autogroup_enabled = 0
EOF
sysctl -p
  • 安装配置ipvsadm
yum install ipvsadm ipset sysstat conntrack libseccomp -y
cat > /etc/modules-load.d/ipvs.conf << EOF 
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
nf_conntrack
br_netfilter
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
overlay
EOF
systemctl enable --now systemd-modules-load.service
systemctl restart systemd-modules-load.service

rke2安装

  • 将包上传到服务器指定位置/root/rke2-artifacts下
mkdir -p /root/rke2-artifacts
#server节点
INSTALL_RKE2_TYPE=server INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts sh install.sh
#agent节点
INSTALL_RKE2_TYPE=agent INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts sh install.sh
  • 复制镜像文件到指定位置
mkdir -p /var/lib/rancher/rke2/agent/images/
cd /root/rke2-artifacts
cp rke2-images* /var/lib/rancher/rke2/agent/images/
  • 编写rke2-server的配置文件,每个master节点都需要编写,根据各节点进行修改
  • 以下参数根据服务器信息调整
#创建etcd快照存储目录
mkdir -p /var/lib/etcd-snapshots
#创建rke2,server节点配置目录
mkdir -p /etc/rancher/rke2/
cat > /etc/rancher/rke2/config.yaml << EOF
write-kubeconfig-mode: "0644"
#等rke2-server成功起来后查看/var/lib/rancher/rke2/server/token文件获得
#token: 
#等master节点都启动并配置好高可用以后重启rke2-server,需要先填写一个ip
server: https://vip:9345
tls-san:
  - "127.0.0.1"
  - "172.25.18.70"
  - "172.25.18.71"
  - "172.25.18.72"
  - "2409:8034:5aff:3200::5:70"
  - "2409:8034:5aff:3200::5:71"
  - "2409:8034:5aff:3200::5:72"
  - "k8s-prod-master01"
  - "k8s-prod-master02"
  - "k8s-prod-master03"
cni: "calico"
cluster-cidr: "192.165.0.0/16,2001:cafe:42::/56"
service-cidr: "172.166.0.0/16,fd00:1111:43::/112"
node-ip: "172.25.18.70,2409:8034:5aff:3200::5:70"
node-name: "k8s-prod-master01"
node-label:
  - "k8s-prod-master01=Master"
  - "k8s-prod-master02=Master"
  - "k8s-prod-master03=Master"
  - "k8s-prod-worker01=Worker"
  - "k8s-prod-worker02=Worker"
  - "k8s-prod-worker03=Worker"
disable-cloud-controller: true
#配置节点未不可调度
node-taint:
  - "CriticalAddonsOnly=true:NoExecute"
kube-api:
- "service_cluster_ip_range=172.166.0.0/16,fd00:1111:43::/112"
kube-proxy-arg:
- "proxy-mode=ipvs"
kubelet-arg:
- "max-pods=110"
kube-controller:
- "service_cluster_ip_range=172.166.0.0/16,fd00:1111:43::/112"
- "cluster_cidr=192.165.0.0/16,2001:cafe:42::/56"
etcd-snapshot-schedule-cron: "0 */4 * * *"
etcd-snapshot-retention: "84"
etcd-snapshot-dir: "/var/lib/etcd-snapshots"
disable:
- "rke2-ingress-nginx"
#- "rke2-metrics-server"
EOF
  • 编写rke2-agent的配置文件,根据实际情况修改
mkdir -p /etc/rancher/rke2/
cat > /etc/rancher/rke2/config.yaml << EOF
write-kubeconfig-mode: "0644"
token: 
server: https://vip:9345
cluster-cidr: "192.165.0.0/16,2001:cafe:42::/56"
service-cidr: "172.166.0.0/16,fd00:1111:43::/112"
node-ip: "172.25.18.70,2409:8034:5aff:3200::5:70"
node-name: "k8s-prod-master01"
node-label:
  - "k8s-prod-master01=Master"
  - "k8s-prod-master02=Master"
  - "k8s-prod-master03=Master"
  - "k8s-prod-worker01=Worker"
  - "k8s-prod-worker02=Worker"
  - "k8s-prod-worker03=Worker"
kube-api:
- "service_cluster_ip_range=172.166.0.0/16,fd00:1111:43::/112"
kube-proxy-arg:
- "proxy-mode=ipvs"
kubelet-arg:
- "max-pods=110"
kube-controller:
- "service_cluster_ip_range=172.166.0.0/16,fd00:1111:43::/112"
- "cluster_cidr=192.165.0.0/16,2001:cafe:42::/56"
EOF
  • 启动rke2-server服务
systemctl enable --now rke2-server.service
#查看启动日志
journalctl -u rke2-server -f
  • 配置集群的kubeconfig文件,命令环境配置
mkdir -p ~/.kube
cp -ap /etc/rancher/rke2/rke2.yaml ~/.kube/config
chmod 600 ~/.kube/config

#/var/lib/rancher/rke2/bin(未特殊设置bin目录在这个下            )
cat >> /etc/profile << EOF
#RKE2
export PATH="\$PATH:/usr/local/bin:/data/rancher/bin"
export CONTAINERD_NAMESPACE=k8s.io
export CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock
EOF
echo 'if [ $( which kubectl >> /dev/null 2>&1; echo ${?} ) = 0 ]; then source <(kubectl completion bash); fi' >> /etc/profile;
echo 'if [ $( which crictl >> /dev/null 2>&1; echo ${?} ) = 0 ]; then source <(crictl completion bash); fi' >> /etc/profile;
touch /etc/crictl.yaml
cat > /etc/crictl.yaml<<EOF
runtime-endpoint: unix:///run/k3s/containerd/containerd.sock
image-endpoint: unix:///run/k3s/containerd/containerd.sock
timeout: 20
debug: false
EOF
  • 启动rke2-agent服务
systemctl enable --now rke2-agent.service
#查看启动日志
journalctl -u rke2-agent -f

参考文档

安装k8s 1.28版本
rke2-server配置
rke2-server配置