背景

k8s在1.20之后的版本可以使用rke2来辅助部署。单纯使用rke2部署k8s的好处是可以把k8s集群和rancher解耦合。使rancher只负责管理k8s,即使rancher出问题也不影响k8s本身。


一、RKE2是什么?

RKE2,也称为 RKE Government,是 Rancher 的下一代 Kubernetes 发行版。它是一个完全合规的 Kubernetes 发行版,专注于安全和合规性。
经测试,如果是用kubeadm安装k8s,会存在etcd与api-server漏洞,但是rke2安装的不存在。

二、环境初始化

2.1.主机名与防火墙

master与worker节点都需执行:
设置主机名:便于区分

hostnamectl set-hostname k8s-

设计集群ip映射

vi /etc/hosts

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
systemctl disable iptables
systemctl stop iptables

关闭selinux

getenforce
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
getenforce

2.12.禁用linux的透明大页、标准大页

在 Linux 中大页分为两种:Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 ) 。内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为 4096 bytes 即 4K。1MB 内存等于 256 页;1GB 内存等于 256000 页。

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

2.3.禁用swap分区

echo 0 > /proc/sys/vm/swappiness
echo 'echo 0 > /proc/sys/vm/swappiness' >> /etc/rc.local
swapoff -a
#修改 /etc/fstab文件,注释掉 SWAP 的自动挂载
vi /etc/fstab 
cat <<-EOF >> /etc/sysctl.conf
vm.swappiness=0
EOF
sysctl -p 
free -h
chmod +x /etc/rc.d/rc.local

2.4.配置集群时间同步,同步阿里云服务器时间

yum install -y ntp
date
#修改配置文件:
vim /etc/ntp.conf
#注销默认Server
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
#server 3.rhel.pool.ntp.org iburst
#添加:
server  ntp1.aliyun.com prefer    #阿里云的服务器时间
#保存退出
#启动ntp
systemctl start ntpd
#设置开启启动
systemctl enable ntpd
systemctl status ntpd

2.5.linux内核参数调优

#加载网桥过滤模块
modprobe br_netfilter
#查看是否成功
lsmod | grep br_netfilter
#添加网桥过滤和地址转发功能
cat <<- EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 下面的内核参数可以解决ipvs模式下长连接空闲超时的问题
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
net.ipv4.tcp_keepalive_time = 600
EOF
#重新加载配置
sysctl -p
sysctl -p /etc/sysctl.d/k8s.conf

2.6.配置ipvs

yum install ipset ipvsadm
#需要加载模块写入脚本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
modprobe -- br_netfilter
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
/bin/bash /etc/sysconfig/modules/ipvs.modules
lsmod |grep -e ip_vs -e nf_conntrack_ipv4
lsmod | grep br_netfilter

三、安装步骤

3.1 主从节点执行

安装rke2时,需要查看NetworkManager,保证它不会干扰rke2,保证cali和flannel的网卡不被NetworkManager管理

systemctl is-active NetworkManager
cat <<EOF > /etc/NetworkManager/conf.d/rke2-canal.conf
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:flannel*
EOF
systemctl daemon-reload
systemctl restart NetworkManager

3.2 rke2安装k8s

主节点安装执行

#安装默认最新版本的rke2
curl -sfL https://get.rke2.io|sh - 
#安装指定版本的rke2,这里vx.y.z为rke2版本号
curl -sfL https://get.rke2.io | INSTALL_RKE2_VERSION=vx.y.z sh -
例如安装1.26.15版本
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_VERSION=v1.26.15+rke2r1 sh -

从节点安装执行

#安装默认最新版本
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh -
#指定版本执行以下命令
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_VERSION=vx.y.z sh -

以上安装完成后在主节点1执行(一台主节点)

systemctl start rke2-server
systemctl enable rke2-server
#查看第一次启动后生成的文件
ll /var/lib/rancher/rke2/
ll /var/lib/rancher/rke2/bin/
ll /etc/rancher/rke2/

这里的rke2.yaml 相当于admin.conf 谁拥有该文件就有rke2集群控制权

export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get node
/var/lib/rancher/rke2/bin/kubectl get pod -A

在主节点1执行上述命令,等待集群启动完成后,接着在该节点执行以下命令进行集群配置,查看集群的唯一token

cat /var/lib/rancher/rke2/server/node-token

复制上述token,vim /etc/rancher/rke2/config.yaml 编辑这个文件,/var/lib/rancher/rke2/server/node-token文件里面的token复制到这里

token: K101072d1613abff8f495d42f4dbf9bde60d0ca64d47c6121334289650e55de415a::server:f05fe37b74e19e1e9cb80605e2aed57c
tls-san:
   - 主机IP地址
   - k8s-master01 
node-name: "k8s-master01"
node-taint:                         
   - "CriticalAddonsOnly=true:NoExecute"

node-label:
   - "node=Master"                
cni: "calico" 
etcd-snapshot-retention: 6            
etcd-snapshot-schedule-cron: '*/5 * * * *'
etcd-snapshot-dir: "/data/rke2/db/snapshots"
kube-proxy-arg:
- "proxy-mode=ipvs"
kubelet-arg:
  - "eviction-hard=nodefs.available<1%,memory.available<10Mi"
  - "eviction-soft-grace-period=nodefs.available=30s,imagefs.available=30s"
  - "eviction-soft=nodefs.available<5%,imagefs.available<1%"

kube-controller-manager-extra-env:
  - "cluster-signing-cert-file=/etc/kubernetes/ssl/kube-ca.pem"
  - "cluster-signing-key-file=/etc/kubernetes/ssl/kube-ca-key.pem"

kube-apiserver-extra-env:
  - "feature-gates='RemoveSelfLink=false'"

重新加载配置并重启rke2

systemctl daemon-reload
systemctl restart rke2-server

检查启动情况

/var/lib/rancher/rke2/bin/kubectl get node
/var/lib/rancher/rke2/bin/kubectl get pod -A

3.3 其余主节点加入集群

把主节点1的 /etc/rancher/rke2/config.yaml 文件复制其他主节点
并在其他每一个主节点上进行修改,主要把节点名修改成当前节点主机名

vim /etc/rancher/rke2/config.yaml
server: https://主节点01的ip:9345
token: K101072d1613abff8f495d42f4dbf9bde60d0ca64d47c6121334289650e55de415a::server:f05fe37b74e19e1e9cb80605e2aed57c
tls-san:
    - 主节点01的ip地址
    - k8s-master01
node-name: "k8s-master02"
node-taint:                         
    - "CriticalAddonsOnly=true:NoExecute"
 
node-label:
    - "node=Master"                
cni: "calico" 
etcd-snapshot-retention: 6            
etcd-snapshot-schedule-cron: '*/5 * * * *'
etcd-snapshot-dir: "/data/rke2/db/snapshots"
kube-proxy-arg:
- "proxy-mode=ipvs"
kubelet-arg:
   - "eviction-hard=nodefs.available<1%,memory.available<10Mi"
   - "eviction-soft-grace-period=nodefs.available=30s,imagefs.available=30s"
   - "eviction-soft=nodefs.available<5%,imagefs.available<1%"

kube-controller-manager-extra-env:
   - "cluster-signing-cert-file=/etc/kubernetes/ssl/kube-ca.pem"
   - "cluster-signing-key-file=/etc/kubernetes/ssl/kube-ca-key.pem"

kube-apiserver-extra-env:
   - "feature-gates='RemoveSelfLink=false'"

加载配置并启动rke2

systemctl daemon-reload
systemctl start rke2-server
systemctl enable rke2-server

等待启动完成,可以切换到主节点1查看其他主节点时候加入集群。

systemctl status rke2-server -l
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get node
/var/lib/rancher/rke2/bin/kubectl get pod -A

剩余主节点照上面主节点2的操作添加,主要改动主机名与添加server
3.4 主节点都启动后,接下来在所有从节点的进行以下配置
把主节点1的 /etc/rancher/rke2/config.yaml 文件复制所有从节点
并在其他每一个从节点上进行修改,主要把从点名修改成当前节点主机名

server: https://主节点01的ip:9345
token: K101072d1613abff8f495d42f4dbf9bde60d0ca64d47c6121334289650e55de415a::server:f05fe37b74e19e1e9cb80605e2aed57c
tls-san:
    - 主节点01的ip地址
    - k8s-master01
node-name: "k8s-worker01"
node-label:
    - "node=worker"                
cni: "calico" 
etcd-snapshot-retention: 6            
etcd-snapshot-schedule-cron: '*/5 * * * *'
etcd-snapshot-dir: "/data/rke2/db/snapshots"
kube-proxy-arg:
- "proxy-mode=ipvs"
kubelet-arg:
   - "eviction-hard=nodefs.available<1%,memory.available<10Mi"
   - "eviction-soft-grace-period=nodefs.available=30s,imagefs.available=30s"
   - "eviction-soft=nodefs.available<5%,imagefs.available<1%"

kube-controller-manager-extra-env:
   - "cluster-signing-cert-file=/etc/kubernetes/ssl/kube-ca.pem"
   - "cluster-signing-key-file=/etc/kubernetes/ssl/kube-ca-key.pem"

kube-apiserver-extra-env:
   - "feature-gates='RemoveSelfLink=false'"

加载配置并启动rke2工作节点

systemctl daemon-reload
systemctl start rke2-agent
systemctl enable rke2-agent 

加载配置并启动rke2工作节点

systemctl daemon-reload
systemctl start rke2-agent
systemctl enable rke2-agent 

其余工作节点照上述方法添加,主要修改主机名与去除污点
等待启动完成,可以切换到主节点1查看从节点点时候加入集群的状态。

systemctl status rke2-server -l
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get node
/var/lib/rancher/rke2/bin/kubectl get pod -A

查看本机的containeded启动情况

/var/lib/rancher/rke2/bin/crictl --runtime-endpoint=unix:///run/k3s/containerd/containerd.sock ps

3.4 集群kubectl命令行工具优化

#设置后使用/var/lib/rancher/rke2/bin/kubectl get node等命令
#就不用export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
mkdir ~/.kube
ln -s /etc/rancher/rke2/rke2.yaml ~/.kube/config
chmod 600 ~/.kube/config
#设置后使用/var/lib/rancher/rke2/bin/crictl --runtime-endpoint=unix:///run/k3s/containerd/containerd.sock ps
#不需要--runtime-endpoint=unix:// 
ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml
#path设置
vi /etc/profile
export PATH=$PATH:/var/lib/rancher/rke2/bin
source /etc/profile

现在就可以直接在该节点上执行kubectl get node命令进行操作了。

离线安装

如果是麒麟国产操作系统,就不能是用在线安装的方式,安装会报错,此时可以是用离线安装,在github上下载对应版本的安装包。
下载的文件:rke2.linux-amd64.tar.gz、rke2-images.linux-amd64.tar.zst、sha256sum-amd64.txt从上面的地址
下载:wget https://rancher-mirror.rancher.cn/rke2/install.sh
将这些文件下载到所有集群服务器 ~/rke2-artifacts 目录下面
安装master

cd /root/rke2-artifacts/
chmod +x install.sh 
INSTALL_RKE2_VERSION=v1.26.15+rke2r1 INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts sh /root/install.sh

初始化master节点

systemctl enable rke2-server
systemctl start rke2-server

剩余添加master与worker节点与在线安装方式类似。

总结

初次启动其中一个master节点获取token以添加整个集群节点时,类似于kubeadm安装k8s一样,需要一个引导节点,完成集群的组建。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐