RKE2 部署K8S 1.28.x 高可用集群

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
小恐龙
花!
上一篇
下一篇