• 使用rancher rke2配置高可用k8s集群


    1. 前言

    1.1 官方介绍

    RKE2 结合了 RKE1.x 版本(以下简称 RKE1)和 K3s 的优点和特性。

    从 K3s 中,它继承了可用性、易操作性和部署模式。

    从 RKE1 来看,它继承了与上游 Kubernetes 的紧密一致性。在一些地方,K3s 与上游的 Kubernetes 有分歧,以便为边缘部署进行优化,但 RKE1 和 RKE2 可以与上游保持密切一致。

    重要的是,RKE2 不像 RKE1 那样依赖 Docker。RKE1 利用 Docker 来部署和管理控制平面组件以及 Kubernetes 的容器运行时间。RKE2 将控制平面组件作为静态 pod 启动,由 kubelet 管理。嵌入的容器运行时是 containerd。

    rke2高可用集群架构
    在这里插入图片描述

    1.2 说明

    感觉RKE2对比RKE1,主要是不需要再安装docker,在部署的时候会自动下载containerd,管理方式完全不一样了。

    2. 主机环境准备

    本次部署使用3台centos7主机进行,具体配置如下

    主机名IP地址系统内核参数配置信息
    k8s-rke2-worker01172.16.0.101CentOS 7.9 x643.10.0-1160.36.2.el7.x86_644核8G
    k8s-rke2-worker02172.16.0.102CentOS 7.9 x643.10.0-1160.36.2.el7.x86_644核8G
    k8s-rke2-worker03172.16.0.103CentOS 7.9 x643.10.0-1160.36.2.el7.x86_644核8G

    主机配置主要进行下面的设置:

    1. 主机名修改,dns设置,磁盘格式化,LVM分区
    2. 安装常用软件包
    3. 系统参数常见优化
    4. 安全设置:关闭selinux,设置iptables规则或者先关闭firewalld服务
    5. 网络优化与防火墙设置

    2.1 主机初始化

    磁盘格式化,LVM分区,这些就不再写了。有大量的参考文档。

    主机名修改,配置hosts

    hostnamectl set-hostname k8s-rke2-worker01
    
    cat >> /etc/hosts << EOF
    172.16.0.101 k8s-rke2-worker01
    172.16.0.102 k8s-rke2-worker02
    172.16.0.103 k8s-rke2-worker03
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1. 常用软件包安装

    yum -y install epel-release
    # 下面软件包根据需要进行安装配置即可
    yum -y install lrzsz vim gcc glibc openssl openssl-devel net-tools http-tools wget curl  yum-utils telnet
    # 更新一下软件包版本和内核版本
    yum -y update  
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 关闭swap分区

    swapoff -a
    
    • 1

    修改/etc/fstab配置文件,把swap分区挂载的那一行注释掉

    2.3 系统参数设置

    参考:https://docs.rancher.cn/docs/rancher2/best-practices/optimize/os/_index

    echo "
    net.bridge.bridge-nf-call-ip6tables=1
    net.bridge.bridge-nf-call-iptables=1
    net.ipv4.ip_forward=1
    net.ipv4.conf.all.forwarding=1
    net.ipv4.neigh.default.gc_thresh1=4096
    net.ipv4.neigh.default.gc_thresh2=6144
    net.ipv4.neigh.default.gc_thresh3=8192
    net.ipv4.neigh.default.gc_interval=60
    net.ipv4.neigh.default.gc_stale_time=120
    
    # 参考 https://github.com/prometheus/node_exporter#disabled-by-default
    kernel.perf_event_paranoid=-1
    
    #sysctls for k8s node config
    net.ipv4.tcp_slow_start_after_idle=0
    net.core.rmem_max=16777216
    fs.inotify.max_user_watches=524288
    kernel.softlockup_all_cpu_backtrace=1
    
    kernel.softlockup_panic=0
    
    kernel.watchdog_thresh=30
    fs.file-max=2097152
    fs.inotify.max_user_instances=8192
    fs.inotify.max_queued_events=16384
    vm.max_map_count=262144
    fs.may_detach_mounts=1
    net.core.netdev_max_backlog=16384
    net.ipv4.tcp_wmem=4096 12582912 16777216
    net.core.wmem_max=16777216
    net.core.somaxconn=32768
    net.ipv4.ip_forward=1
    net.ipv4.tcp_max_syn_backlog=8096
    net.ipv4.tcp_rmem=4096 12582912 16777216
    
    net.ipv6.conf.all.disable_ipv6=1
    net.ipv6.conf.default.disable_ipv6=1
    net.ipv6.conf.lo.disable_ipv6=1
    
    kernel.yama.ptrace_scope=0
    vm.swappiness=0
    
    # 可以控制core文件的文件名中是否添加pid作为扩展。
    kernel.core_uses_pid=1
    
    # Do not accept source routing
    net.ipv4.conf.default.accept_source_route=0
    net.ipv4.conf.all.accept_source_route=0
    
    # Promote secondary addresses when the primary address is removed
    net.ipv4.conf.default.promote_secondaries=1
    net.ipv4.conf.all.promote_secondaries=1
    
    # Enable hard and soft link protection
    fs.protected_hardlinks=1
    fs.protected_symlinks=1
    
    # 源路由验证
    # see details in https://help.aliyun.com/knowledge_detail/39428.html
    net.ipv4.conf.all.rp_filter=0
    net.ipv4.conf.default.rp_filter=0
    net.ipv4.conf.default.arp_announce = 2
    net.ipv4.conf.lo.arp_announce=2
    net.ipv4.conf.all.arp_announce=2
    
    # see details in https://help.aliyun.com/knowledge_detail/41334.html
    net.ipv4.tcp_max_tw_buckets=5000
    net.ipv4.tcp_syncookies=1
    net.ipv4.tcp_fin_timeout=30
    net.ipv4.tcp_synack_retries=2
    kernel.sysrq=1
    
    " >> /etc/sysctl.conf
    
    cat >> /etc/security/limits.conf <<EOF
    * soft nofile 65535
    * hard nofile 65536
    EOF
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    使内核参数生效执行

    modprobe br_netfilter  # 要先执行这个命令,要不然会报错
    sysctl -p
    
    • 1
    • 2

    2.4 NetworkManager设置

    注意:如果使用NetworkManager管理网络,需要进行如下配置

    参考:https://docs.rancher.cn/docs/rke2/known_issues/_index/#networkmanager

    systemctl status NetworkManager
    cat >> /etc/NetworkManager/conf.d/rke2-canal.conf << EOF
    [keyfile]
    unmanaged-devices=interface-name:cali*;interface-name:flannel*
    EOF
    
    systemctl daemon-reload
    systemctl restart NetworkManager
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.5 防火墙规则

    1. 关闭firewalld服务

    参考:https://docs.rancher.cn/docs/rke2/known_issues/_index/#networkmanager

    systemctl stop firewalld
    systemctl disable firewalld
    systemctl disable iptables
    systemctl stop iptables
    
    • 1
    • 2
    • 3
    • 4

    关闭firewalld服务之后,如果还想用防火墙规则,可以试试csf或者iptables进行规则管理。

    2. 关闭selinux

    getenforce
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    getenforce
    
    • 1
    • 2
    • 3
    • 4

    详细的安装要求,请参考:
    https://docs.rancher.cn/docs/rke2/install/requirements/_index/

    2.6 设置时间同步

    安装ntp相关服务

    yum -y install ntp
    systemctl start ntpd  # 启动时钟同步服务
    systemctl enable  ntpd # 设置开机启动
    ntpq -p # 查看时钟同步状态
    
    • 1
    • 2
    • 3
    • 4

    如果在局域网环境中有ntp时钟服务器,尽量用本地的

    2.7 ipvs配置

    由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
    在所有的Kubernetes节点执行以下脚本:

    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
    EOF
    
    #执行脚本
    chmod 755 /etc/sysconfig/modules/ipvs.modules 
    bash /etc/sysconfig/modules/ipvs.modules 
    lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用

    lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    
    • 1

    命令查看是否已经正确加载所需的内核模块。
    接下来还需要确保各个节点上已经安装了ipset软件包。 为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm。

    yum install ipset ipvsadm -y
    
    • 1

    以上设置完成后,重启主机,确认所有配置都已经生效。

    3. RKE2安装配置

    设置一个 HA 集群需要以下步骤:

    1. 配置一个固定的注册地址
    2. 启动第一个 server 节点
    3. 加入其他 server 节点
    4. 加入 agent 节点

    参考:https://docs.rancher.cn/docs/rke2/install/ha/_index/

    由于主机有限,我们就把第一个启动的节点设置为注册地址,下面只进行2、3步骤。

    3.1 下载安装

    rke2版本信息:https://github.com/rancher/rke2/releases

    使用国内镜像地址下载启动脚本

    在每个节点都执行下面的脚本
    参考:https://docs.rancher.cn/docs/rke2/install/install_options/install_options/_index#%E9%85%8D%E7%BD%AE-linux-%E5%AE%89%E8%A3%85%E8%84%9A%E6%9C%AC

    wget https://rancher-mirror.oss-cn-beijing.aliyuncs.com/rke2/install.sh
    INSTALL_RKE2_CHANNEL=stable
    INSTALL_RKE2_TYPE=server
    # INSTALL_RKE2_VERSION=v1.24.4+rke2r1
    /bin/bash install.sh
    
    # 执行完之后执行命令,如下
    # rke2 --version 
    rke2 version v1.24.4+rke2r1 (749c87a7da6482dec999df44f25578486158b21d)
    go version go1.18.1b7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上面主要是下载一些必要的安装包。

    3.2 第一个节点启动,初始化

    在第一个节点启动服务

    systemctl start rke2-server
    systemctl enable rke2-server
    # 第一次启动可能会比较慢,因为要初始化、生成各种文件 
    #查看第一次启动后生成的文件
    ll /var/lib/rancher/rke2/
    ll /var/lib/rancher/rke2/bin/
    ll /etc/rancher/rke2/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    #查看node节点和pod启动情况
    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
    • 2
    • 3
    • 4

    在主节点1执行上述命令,等待集群启动完成后,pod全部正常,接着在该节点执行以下命令进行集群配置。

    查看集群的唯一token

    # cat /var/lib/rancher/rke2/server/node-token
    K10b725b06fb6c540b67cd04599f1da77ec13ab9deda31b43049f4d4c186a9843ed::server:7023bb140ad16a51416cade94ba888a2
    
    • 1
    • 2

    修改集群配置文件

    vim /etc/rancher/rke2/config.yaml
    
    ### 以下为配置文件内容
    
    server: https://172.16.0.101:9345
    token: K10dc60faa953f87c5f2fb297a70e71b74fb9ea12394b783b468701c96bd9f895ca::server:052642972b201ee388ecb8bbf2ad8f27
    tls-san:
       - 172.16.0.101
       - k8s-rke2-worker01
    
    # 网络设置
    
    # 节点设置
    node-name: k8s-rke2-worker01
    node-label: 
       - "role=master"
    system-default-registry: "registry.cn-hangzhou.aliyuncs.com"  #设置阿里云镜像地址,加速下载
    
    # 设置etcd快照策略
    etcd-snapshot-retention: 2            
    etcd-snapshot-schedule-cron: '*/5 * * * *'
     
    # 自定义垃圾回收机制,添加到所所节点 
    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:
       # apiserver启用metadata.selfLink 字段,配置nfs存储要用到
       - "feature-gates='RemoveSelfLink=false'"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    3.3 另外两个节点

    另外两个节点参考节点1的配置文件,只需要修改node-name这个参数即可。其他配置项完全相同。

    节点2

    server: https://172.16.0.101:9345
    token: K10dc60faa953f87c5f2fb297a70e71b74fb9ea12394b783b468701c96bd9f895ca::server:052642972b201ee388ecb8bbf2ad8f27
    tls-san:
       - 172.16.0.101
       - k8s-rke2-worker01
    
    # 网络设置
    
    # 节点设置
    node-name: k8s-rke2-worker02
    node-label:
       - "role=master"
    system-default-registry: "registry.cn-hangzhou.aliyuncs.com"  #设置阿里云镜像地址,加速下载
    
    # 设置etcd快照策略
    etcd-snapshot-retention: 2
    etcd-snapshot-schedule-cron: '*/5 * * * *'
    
    # 自定义垃圾回收机制,添加到所所节点 
    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:
       # apiserver启用metadata.selfLink 字段
       - "feature-gates='RemoveSelfLink=false'"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    节点3

    server: https://172.16.0.101:9345
    token: K10dc60faa953f87c5f2fb297a70e71b74fb9ea12394b783b468701c96bd9f895ca::server:052642972b201ee388ecb8bbf2ad8f27
    tls-san:
       - 172.16.0.101
       - k8s-rke2-worker01
    
    # 网络设置
    
    # 节点设置
    node-name: k8s-rke2-worker03
    node-label:
       - "role=master"
    system-default-registry: "registry.cn-hangzhou.aliyuncs.com"  #设置阿里云镜像地址,加速下载
    
    # 设置etcd快照策略
    etcd-snapshot-retention: 2
    etcd-snapshot-schedule-cron: '*/5 * * * *'
    
    # 自定义垃圾回收机制,添加到所所节点 
    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:
       # apiserver启用metadata.selfLink 字段
       - "feature-gates='RemoveSelfLink=false'"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    添加好配置文件,在两个节点上启动rke2-server服务

    systemctl daemon-reload
    systemctl start rke2-server
    systemctl enable rke2-server
    
    systemctl status rke2-server -l
    
    • 1
    • 2
    • 3
    • 4
    • 5

    确定两个节点启动完毕后,切换到节点1,执行如下命令确认所有节点都加到了集群中。

    mkdir ~/.kube/
    # /etc/rancher/rke2/rke2.yaml这个配置文件相当于集群的钥匙,管理整个集群
    cp /etc/rancher/rke2/rke2.yaml  ~/.kube/config
    chmod 600 ~/.kube/config
    kubectl get nodes -o wide
    kubectl get cs 
    kubectl get pods -A -o wide
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    配置直接使用相关命令,在三个节点中执行

    # path设置
    vi /etc/profile
    export PATH=$PATH:/var/lib/rancher/rke2/bin
    source /etc/profile
    
    • 1
    • 2
    • 3
    • 4

    kubectl常用命令

    # 查看集群节点信息
    kubectl get nodes -o wide
    # 查看集群组件健康状态
    kubectl get cs
    # 查看pods
    kubectl get pods -A -o wide
    # 查看服务
    kubectl get svc -A -o wide
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    containerd设置

    ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml
    
    • 1

    设置后就不需要使用–runtime-endpoint参数来查看容器情况了

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

    3.4 crictl常用命令

    crictl --help
    crictl info
    crictl ps
    crictl images ls
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    参考:
    https://blog.csdn.net/qq_39360187/article/details/123423928
    https://blog.csdn.net/qq_32907195/article/details/120529037

    4. rke2其它管理常用

    4.1 升级

    参考:https://docs.rancher.cn/docs/rke2/upgrade/basic_upgrade/_index

    升级

    # server 升级
    curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE=server sh - 
    # agent 升级
    curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/rke2/install.sh | INSTALL_RKE2_MIRROR=cn 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 -
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    重启服务,生效

    # Server 节点:
    systemctl restart rke2-server
    
    # Agent 节点:
    systemctl restart rke2-agent
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.2 linux卸载

    参考:https://docs.rancher.cn/docs/rke2/install/linux_uninstall/_index

    /usr/bin/rke2-uninstall.sh
    
    • 1

    5. 总结

    5.1 一些问题

    1. rke2切换到containerd之后,crictl命令跟docker还是有些不同,需要一些熟悉过程,尤其是一些常用的管理命令,排错、查日志等等

    2. 在部署中尝试了两次修改集群pod、service的cidr网络配置,发现并没有修改成功,在官方文件里面也没有例子,只有server配置里有这个参数。如果10.42.0./16和10.43.0./16网段与原有的网段有冲突,这也是一个隐患。实在不行,只能用其它集群部署工具进行集群部署了。
      参考:https://docs.rancher.cn/docs/rke2/install/install_options/server_config/_index

    5.2 rke2部署完成之后nginx-ingress没有映射主机80、443端口的问题

    参考:https://blog.csdn.net/xujiamin0022016/article/details/124648479

    rke1部署完成之后,nginx-ingress用的是DaemonSet的方式进行部署,看了一下rke2也是相同的部署方式。本想在新部署的集群上部署rancher2.5,没想到找不到80、443端口。可能是一个bug,也可能是有其他考虑,但是确实不太方便。

    解决办法:需要修改DaemonSet的配置,添加一个参数:hostNetwork: true

    kubectl edit daemonset -n kube-system rke2-ingress-nginx-controller
    
    # 如下
    spec:
      hostNetwork: true
    
    • 1
    • 2
    • 3
    • 4
    • 5

    等pod重新部署后就可以看到80、443端口已经可以用了。主机的端口映射到了pod上。

    这个问题,应该还可以在集群配置文件里面修改,但我没找到。或者是用helm来修改,但是会比较麻烦,还是直接改DaemonSet配置文件吧。

    6. 参考

    大熊哥哥的运维分享(20210608) - RKE2部署K8S集群方法以及常用功能整理
    https://www.bilibili.com/video/av973516759/

    使用rancher的rke2部署高可用的k8s集群
    https://blog.csdn.net/weixin_47019045/article/details/126247486

  • 相关阅读:
    Elasticsearch 8.10 同义词管理新篇章:引入同义词 API
    ZMUIFramework视屏教程获取&案例使用
    有效需求分析培训梳理(二)
    【技术积累】Python中的PyTorch库【一】
    一文读懂vue3和vue2的API风格对比
    每日一练 | 网络工程师软考真题Day45
    架构师的 36 项修炼第09讲:系统的安全架构设计
    统计学习---第二章 感知机
    ubuntu apt update:The repository ‘xxx‘ is not signed.报错解决办法(未解决)
    【Linux】Linux基本使用和Web程序部署,我奶奶都能看懂
  • 原文地址:https://blog.csdn.net/zhangpfly/article/details/126768997