RKE2 部署K8S 1.28.x 高可用集群
RKE2 的介绍
RKE2 完美结合了 1.x 版本的 RKE(以下简称 RKE1)和 K3s。
它继承了 K3s 的可用性、易操作性和部署模型。
它还继承了 RKE1 与上游 Kubernetes 的紧密结合关系。为了优化边缘部署,K3s 在某些地方与上游 Kubernetes 有所不同,但 RKE1 和 RKE2 可以与上游保持紧密一致。
重要的是,RKE2 不像 RKE1 一样依赖 Docker。RKE1 使用 Docker 来部署和管理 control plane 组件以及 Kubernetes 的容器运行时。RKE2 将 control plane 组件作为由 kubelet 管理的静态 pod 启动。嵌入式容器运行时是 containerd。
介绍参考,这边省略吧:https://docs.rke2.io/zh/
主机准备
所有主机均需要操作。
参考:https://docs.rke2.io/zh/install/quickstart
硬件要求根据你部署的规模而变化。此处概述了最低建议。
- RAM:最低 4 GB(建议至少 8 GB)
- CPU:最少 2(建议至少 4 CPU)
-
必须以 root 用户或通过
sudo
执行 RKE2 安装。 - 机器之间可以相互
ping
通
# 系统:CentOS7.9x64
192.168.100.11 k01 # 第一个管理节点
192.168.100.12 k02 # 管理节点
192.168.100.13 k03 # 管理节点
192.168.100.21 k04 # agent节点,可选
192.168.100.22 k05 # agent节点,可选
# harbor
# 192.168.111.156 reg-hub.gzeport.com
安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset iptables curl sysstat libseccomp vim net-tools rpcbind nfs-utils
设置主机名
hostnamectl set-hostname k01
hostnamectl set-hostname k02
hostnamectl set-hostname k03
hostnamectl set-hostname k04
hostnamectl set-hostname k05
集群ip映射
vi /etc/hosts
192.168.100.11 k01
192.168.100.12 k02
192.168.100.13 k03
192.168.100.21 k04
192.168.100.22 k05
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# systemctl disable iptables
# systemctl stop iptables
关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && getenforce
禁用linux的透明大页、标准大页
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
禁用swap分区
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
文件数设置
ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* seft memlock unlimited
* hard memlock unlimitedd
EOF
linux内核参数调优
配置内核路由转发及网桥过滤
#将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式【重要】
net.bridge.bridge-nf-call-iptables=1
#开启网桥模式【重要】
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
# 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1
# 开启 OOM
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
#关闭ipv6【重要】
# net.ipv6.conf.all.disable_ipv6=1
# net.netfilter.nf_conntrack_max=2310720
# 下面的内核参数可以解决ipvs模式下长连接空闲超时的问题
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
net.ipv4.tcp_keepalive_time = 600
EOF
sysctl --system
加载网桥过滤模块
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4 #(5.2的内核以上使用:nf_conntrack)
modprobe -- br_netfilter
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 查看网桥过滤模块是否成功加载
lsmod | grep br_netfilter
# 重新刷新配置
sysctl -p /etc/sysctl.d/k8s.conf
# 保证在节点重启后能自动加载所需模块
cat >> /etc/rc.d/rc.local << EOF
bash /etc/sysconfig/modules/ipvs.modules
EOF
chmod +x /etc/rc.d/rc.local
时间同步
yum install ntpdate -y
#ntpdate time.windows.com
ntpdate ntp1.aliyun.com
# 或者配置crontab执行:
# `crontab -e`
# 0 */1 * * * /usr/sbin/ntpdate ntp1.aliyun.com
echo "0 */1 * * * /usr/sbin/ntpdate ntp1.aliyun.com" >> /var/spool/cron/root
关闭及禁用邮件服务
systemctl stop postfix && systemctl disable postfix
设置 rsyslogd 和 systemd journald
# 持久化保存日志的目录
mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
安装rke2时,查看NetworkManager,保证它不会干扰rke2
以下仅需要主节点执行
systemctl is-active NetworkManager
cat <<EOF > /etc/NetworkManager/conf.d/rke2-canal.conf
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:flannel*
EOF
#cali*和flannel*的网卡不被NetworkManager管理
systemctl daemon-reload
systemctl restart NetworkManager
RKE2 安装与配置
rke2版本目录:https://github.com/rancher/rke2/releases
第一台管理节点配置
节点IP
是192.168.100.11
配置 RKE2 配置文件
mkdir -p /etc/rancher/rke2 && vim /etc/rancher/rke2/config.yaml
#查看集群的唯一token -省略
# cat /var/lib/rancher/rke2/server/node-token
# K10f44d7f2c113258c8d96364ed30a0f56ff55132a28a08f8d80f7f5e6e93f9e475::server:e61fc84e9f69b39c38d6abcffd883bce
# 默认情况下RKE2读取 /etc/rancher/rke2/config.yaml配置文件启动
mkdir -p /etc/rancher/rke2 && vim /etc/rancher/rke2/config.yaml
---
token: my-shared-secret-test
tls-san:
- my-kubernetes-domain.com
- another-kubernetes-domain.com
- guoliangjun.com
- k01
- k02
- k03
node-name: k01
node-taint:
- "CriticalAddonsOnly=true:NoExecute"
node-label:
- "node=Master"
- "k01=Master"
system-default-registry: "registry.cn-hangzhou.aliyuncs.com"
kubelet-arg:
- "cgroup-driver=systemd"
- token:用于其他 Server 或 Agent 节点在连接集群时注册的 Secret 令牌;
- tls-san:这个选项在 Server 的 TLS 证书中增加一个额外的主机名或 IP 作为 Subject Alternative Name。如果你想通过 IP 和主机名访问,你可以将它指定为一个列表。
- node-taint: 给主节点打上污点标记,使主节点不执行pod的任务,如果只想从节点执行工作任务,主节点不执行,取消这个注释
- node-label:打上master标记
- system-default-registry: 设置阿里云镜像地址,加速下载
获取rke2
安装程序
curl -sfL https://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn \
INSTALL_RKE2_VERSION=v1.28.8+rke2r1 \
INSTALL_RKE2_TYPE="server" \
sh -
rke2 --version
# 设置开机自启并重启
systemctl daemon-reload
systemctl restart rke2-server
systemctl enable rke2-server.service
# 如有需要,可以查看日志(等待10分种左右没有在报错应该rke2 就启动起来了)
journalctl -u rke2-server -f
查看第一次启动后生成的文件
ll /var/lib/rancher/rke2/
ll /var/lib/rancher/rke2/bin/
ll /etc/rancher/rke2/
设置环境变量
vim /etc/profile
export PATH=/var/lib/rancher/rke2/bin:$PATH
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
#使环境变量生效
source /etc/profile
# 方便查看
ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml
ln -s /run/k3s/containerd/containerd.sock /run/containerd/containerd.sock
查看集群
kubectl get node
crictl -r /run/k3s/containerd/containerd.sock images ps
启动其他 Server 节点
配置过程和第一个server
管理节点一样,不同的地方在于配置/etc/rancher/rke2/config.yaml
文件的时候需要修改一些参数
写入内容如下
server
参数表示第一个管理节点的IP
,注意,这个地方使用https
token
参数保持和第一个管理节点192.168.100.11
的/etc/rancher/rke2/config.yaml
的token
的参数位置一致node-name
配置节点名称,server
节点需要配置为不一样的名称
配置 RKE2 配置文件
mkdir -p /etc/rancher/rke2 && vim /etc/rancher/rke2/config.yaml
# 另外一台
server: https://k01:9345
token: my-shared-secret-test
tls-san:
- my-kubernetes-domain.com
- another-kubernetes-domain.com
- guoliangjun.com
- k01
- k02
- k03
node-name: k02
node-taint:
- "CriticalAddonsOnly=true:NoExecute"
node-label:
- "node=Master"
- "k02=Master"
system-default-registry: "registry.cn-hangzhou.aliyuncs.com"
kubelet-arg:
- "cgroup-driver=systemd"
# 另外一台
----
server: https://k01:9345
token: my-shared-secret-test
tls-san:
- my-kubernetes-domain.com
- another-kubernetes-domain.com
- guoliangjun.com
- k01
- k02
- k03
node-name: k03
node-taint:
- "CriticalAddonsOnly=true:NoExecute"
node-label:
- "node=Master"
- "k03=Master"
system-default-registry: "registry.cn-hangzhou.aliyuncs.com"
kubelet-arg:
- "cgroup-driver=systemd"
获取rke2
安装程序
curl -sfL https://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn \
INSTALL_RKE2_VERSION=v1.28.8+rke2r1 \
INSTALL_RKE2_TYPE="server" \
sh -
# 启动rke2 server
systemctl daemon-reload
systemctl restart rke2-server
systemctl enable rke2-server.service
# 如有需要,可以查看日志(等待10分种左右没有在报错应该rke2 就启动起来了)
journalctl -u rke2-server -f
在保证 Server 节点总数为奇数的情况下,可以添加多个 Server 节点,添加节点步骤和配置均与添加第二个 Server 节点的方式相同。
Agent
节点配置
配置 RKE2 Agent 配置文件
mkdir -p /etc/rancher/rke2 && vim /etc/rancher/rke2/config.yaml
# 另外一台
---
server: https://k01:9345
token: my-shared-secret-test
tls-san:
- my-kubernetes-domain.com
- another-kubernetes-domain.com
- guoliangjun.com
- k01
- k02
- k03
node-name: k04
node-label:
- "node=Worker"
- "k04=Worker"
system-default-registry: "registry.cn-hangzhou.aliyuncs.com"
kubelet-arg:
- "cgroup-driver=systemd"
# 另外一台
---
server: https://k01:9345
token: my-shared-secret-test
tls-san:
- my-kubernetes-domain.com
- another-kubernetes-domain.com
- guoliangjun.com
- k01
- k02
- k03
node-name: k05
node-label:
- "node=Worker"
- "k05=Worker"
system-default-registry: "registry.cn-hangzhou.aliyuncs.com"
kubelet-arg:
- "cgroup-driver=systemd"
获取rke2
安装程序
curl -sfL https://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn \
INSTALL_RKE2_VERSION=v1.28.8+rke2r1 \
INSTALL_RKE2_TYPE="agent" \
sh -
# 然后启动rke2 agent
systemctl daemon-reload
systemctl restart rke2-agent
systemctl enable rke2-agent.service
# 如有需要,可以查看日志(等待10分种左右没有在报错应该rke2 就启动起来了)
journalctl -u rke2-server -f
查看节点运行状态
[root@k01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k01 Ready control-plane,etcd,master 29m v1.28.8+rke2r1
k02 Ready control-plane,etcd,master 16m v1.28.8+rke2r1
k03 Ready control-plane,etcd,master 18m v1.28.8+rke2r1
k04 Ready <none> 13m v1.28.8+rke2r1
k05 Ready <none> 14m v1.28.8+rke2r1
[root@k01 ~]# kubectl describe nodes | grep -i taint
Taints: CriticalAddonsOnly=true:NoExecute
Taints: CriticalAddonsOnly=true:NoExecute
Taints: CriticalAddonsOnly=true:NoExecute
Taints: <none>
Taints: <none>
初始化集群的一些操作
vim /etc/profile
export PATH=/var/lib/rancher/rke2/bin:$PATH
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
#使环境变量生效
source /etc/profile
# 设置软链,方便查看cri
ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml
ln -s /run/k3s/containerd/containerd.sock /run/containerd/containerd.sock
cat >> /etc/rc.d/rc.local << EOF
ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml
ln -s /run/k3s/containerd/containerd.sock /run/containerd/containerd.sock
EOF
chmod +x /etc/rc.d/rc.local
# 导出集群的kubeconfig 文件
mkdir -p ~/.kube && cp -ap /etc/rancher/rke2/rke2.yaml ~/.kube/config && chmod 600 ~/.kube/config
nerdctl 与 buildkit 的 安装
参考:https://www.cnblogs.com/lifuqiang/articles/17850939.html
nerdctl 安装
#nerdctl 安装:
# nerdctl插件下载地址:https://github.com/containerd/nerdctl/releases/
# 上传nerdctl安装包
tar -zxvf nerdctl-1.7.6-linux-amd64.tar.gz -C /usr/local/bin/
# 查看版本
nerdctl -v
# nerdctl命令补全
yum install bash-completion -y
vim /etc/profile
source <(nerdctl completion bash)
source /etc/profile
将nerdctl更名为 docker
cat << 'EOF' > /usr/local/bin/docker
#!/bin/bash
/usr/local/bin/nerdctl $@
EOF
chmod +x /usr/local/bin/docker
# 生成自动补全文件
# nerdctl completion bash > /etc/bash_completion.d/nerdctl
# nerdctl completion bash > /etc/bash_completion.d/docker
安装buildkit
# 下载文件 https://github.com/moby/buildkit
# 上传安装包
# 创建解压的目录
mkdir -p /usr/local/buildkit
# 解压到指定的目录
tar -xf buildkit-v0.13.2.linux-amd64.tar.gz -C /usr/local/buildkit
# 查看解压的目录
yum -y install tree
tree /usr/local/buildkit
# 修改PATH环境变量
# 注意这里的echo 要使用单引号,单引号会原样输出,双引号会解析变量
echo 'export PATH=/usr/local/buildkit/bin:$PATH' >> /etc/profile
cat /etc/profile
# 使刚才配置生效
source /etc/profile
# 创建buildkitd自启动服务
[Unit]
Description=buildkitd
After=network.target
[Service]
ExecStart=/usr/local/buildkit/bin/buildkitd
[Install]
WantedBy=multi-user.target
EOF
# 重新加载Unit file
systemctl daemon-reload
# 启动服务
systemctl start buildkitd
# 开机自启动
systemctl enable buildkitd
rke2 的证书更新问题
systemctl stop rke2-server # 停止服务
rke2 certificate rotate # 更新证书
systemctl restart rke2-server # 启动服务
rke2集群升级问题
########################### rke2升级问题 ############################
# server 升级 再执行
curl -sfL https://get.rke2.io | sh -
# worker 升级
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh -
#server指定版本升级
curl -sfL https://get.rke2.io | INSTALL_RKE2_VERSION=vx.y.z sh -
# worker 指定版升级
https://get.rke2.io | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_VERSION=vx.y.z sh -
配置镜像仓库
配置国内镜像源加快镜像拉取
配置私有镜像仓库
编辑文件/etc/rancher/rke2/registries.yaml
写入如下信息
mirrors:
docker.io:
endpoint:
- "https://docker.mirrors.ustc.edu.cn"
configs:
"reg-hub.gzeport.com":
auth:
username: user
password: pass
tls:
insecure_skip_verify: true
# cert_file: # path to the cert file used to authenticate to the registry
# key_file: # path to the key file for the certificate used to authenticate to the registry
# ca_file: # path to the ca file used to verify the registry's certificate
mirrors
字段说明
- 表示当拉取镜像的时候,会把
docker.io
重定向到国内的镜像网站https://docker.mirrors.ustc.edu.cn
configs
字段说明
- 该段内容表示配置私有镜像仓库,比如自己搭建的
harbor
仓库,如果没有私人仓库,则configs
段配置可以省略 reg-hub.gzeport.com
填写镜像仓库的地址auth
块下面的username
和password
填写仓库的登录账号密码- 如果镜像仓库访问使用
https
(使用了tls
),则需要填写tls
块的信息 - 如果不验证
CA
证书,则tls
下面填写insecure_skip_verify: true
即可,如果要验证证书,则需要填写cert_file
,key_file
,ca_file
三个参数
卸载
如果需要重新加入另外一个集群或者更改第一个管理节点,最简单的还是先卸载再重装rke2
,server
和agent
节点的卸载是一样的
/usr/bin/rke2-uninstall.sh
参考
1.https://blog.51cto.com/ghostwritten/8080370
2.https://blog.csdn.net/weixin_47019045/article/details/126247486
3.https://mp.weixin.qq.com/s/mKvxyvlMpnul5ai7RPa9NA
4.https://segmentfault.com/a/1190000042634480?sort=votes#item-3
5.https://docs.rke2.io/zh/