RKE2 部署K8S 1.28.x 高可用集群
本文最后更新于 421 天前,其中的信息可能已经有所发展或是发生改变。

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

第一台管理节点配置

节点IP192.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.yamltoken的参数位置一致
  • 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块下面的usernamepassword填写仓库的登录账号密码
  • 如果镜像仓库访问使用https(使用了tls),则需要填写tls块的信息
  • 如果不验证CA证书,则tls下面填写insecure_skip_verify: true即可,如果要验证证书,则需要填写cert_filekey_fileca_file三个参数

卸载

如果需要重新加入另外一个集群或者更改第一个管理节点,最简单的还是先卸载再重装rke2serveragent节点的卸载是一样的

/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/

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇