REK2 搭建6节点K8S教程(三):RKE节点安装

上一节我们讲解了HAProxy + Keepalived高可用技术,本章将介绍RKE2,也称为 RKE Government,RKE2 是一个专注于安全和合规性Kubernetes 发行版,适合企业环境使用。本章将详细介绍如何通过脚本安装 RKE2。


节点IP/hostname系统
VIP(虚拟IP)10.88.88.70虚拟IP
Master110.88.88.71/k8sm1Ubuntu Server 22.04 LTS
Master210.88.88.72/k8sm2Ubuntu Server 22.04 LTS
Master310.88.88.73/k8sm3Ubuntu Server 22.04 LTS
Worker110.88.88.74/k8sn1Ubuntu Server 22.04 LTS
Worker210.88.88.75/k8sn2Ubuntu Server 22.04 LTS
ManageNode110.88.88.76/k8smgtUbuntu Server 22.04 LTS

1.安装RKE2

建议到 https://github.com/rancher/rke2/releases/ 下载最新版本,上传到服务器,或使用本站代理下载。

mkdir /root/rke2-artifacts && cd /root/rke2-artifacts/
curl -OLs http://procoding.oss-cn-shanghai.aliyuncs.com/blog_download/v1.33.1%2Brke2r1/rke2-images.linux-amd64.tar.zst
curl -OLs http://procoding.oss-cn-shanghai.aliyuncs.com/blog_download/v1.33.1%2Brke2r1/rke2.linux-amd64.tar.gz
curl -OLs http://procoding.oss-cn-shanghai.aliyuncs.com/blog_download/v1.33.1%2Brke2r1/sha256sum-amd64.txt
curl -OLs http://procoding.oss-cn-shanghai.aliyuncs.com/blog_download/v1.33.1%2Brke2r1/install.sh 

1.1 第一个Master 节点安装

执行安装命令:

INSTALL_RKE2_TYPE="server"  INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts sh install.sh

验证安装:

ls /usr/local/bin/
systemctl list-unit-files | grep rke2-server
systemctl list-unit-files | grep rke2-agent.service

创建配置文件:

需要新建配置文件 /etc/rancher/rke2/config.yaml

sudo mkdir -p /etc/rancher/rke2 && touch /etc/rancher/rke2/config.yaml
sudo vim /etc/rancher/rke2/config.yaml
#config.yaml内容
token: F7knSicWvW29Y98  #集群密钥
tls-san:  
  - 10.88.88.70  #集群VIP
  - 10.88.88.71  #本Master节点
  - 127.0.0.1    #本Master节点
#  限制只有关键组件(Critical Addons)才能调度并运行在该节点上,是用于保护关键节点资源的常见做法(工作负载 不允许在该节点上运行)
#node-taint:  
#  - "CriticalAddonsOnly=true:NoExecute"

配置镜像代理/etc/rancher/rke2/registries.yaml

mirrors:
  docker.io:
    endpoint:
      - "https://dockerproxy.net/"

启动服务:

## 设置开机启动
systemctl enable rke2-server
#开启服务
systemctl start rke2-server
## 启动过程耗时会比较久:5-10 分钟,
## 启动失败时,可以借助 "rke2 server --config /etc/rancher/rke2/config.yaml --debug" 查看细节
## 检验节点及服务是否正常
kubectl get node

# 获取server token
cat /var/lib/rancher/rke2/server/node-token

设置配置:

echo "export PATH=$PATH:/var/lib/rancher/rke2/bin" >> /etc/profile && source /etc/profile
# 重新生成 ~/.kube/config
mkdir -p ~/.kube
cp /etc/rancher/rke2/rke2.yaml ~/.kube/config
chmod 600 ~/.kube/config

#添加配置文件
vim ~/.bashrc
#插入
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml 
#保存
source ~/.bashrc

1.2 第2/3个Master 节点安装

和第一个master步骤一样,暂时配Server为master1的地址,因为负载均衡和VIP需要master安装完毕才生效,/etc/rancher/rke2/config.yaml 配置需要变为:

server: https://10.88.88.71:9345  #第一个master地址
token: K10fdxxxxx:server:F7knSicWvW29Y98 #从 master1的/var/lib/rancher/rke2/server/node-token获取
#集群密钥
tls-san:
  - 10.88.88.70  #集群VIP
  - 10.88.88.71  #master1
  - 10.88.88.72  #master2
  - 127.0.0.1    #本Master节点
#  限制只有关键组件(Critical Addons)才能调度并运行在该节点上,是用于保护关键节点资源的常见做法(工作负载 不允许在该节点上运行)
#node-taint:  
#  - "CriticalAddonsOnly=true:NoExecute"
#apiserver-port: 9345

1.3 完成master的安装后,修改三个master的config.yaml为VIP地址

/etc/rancher/rke2/config.yaml 现在可以配置为VIP地址了,这样master三个挂掉2个业务也可以正常运行:

server: https://10.88.88.70:9345  #VIP地址
token: K10fdxxxxx:server:F7knSicWvW29Y98 #从 master1的/var/lib/rancher/rke2/server/node-token获取
tls-san:  
  - 10.88.88.70  #集群VIP
#  限制只有关键组件(Critical Addons)才能调度并运行在该节点上,是用于保护关键节点资源的常见做法(工作负载 不允许在该节点上运行)
#node-taint:  
#  - "CriticalAddonsOnly=true:NoExecute"

1.4 Worker节点安装

执行安装命令:

INSTALL_RKE2_TYPE="agent"  INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts sh install.sh

配置/etc/rancher/rke2/config.yaml

执行创建文件夹命令:
mkdir -p /etc/rancher/rke2/
vi /etc/rancher/rke2/config.yaml 
#/etc/rancher/rke2/config.yaml 
server: https://10.88.88.70:9345  #VIP地址
token: K10fdxxxxx:server:F7knSicWvW29Y98 #从 master1的/var/lib/rancher/rke2/server/node-token获取
tls-san:  
  - 10.88.88.70  #集群VIP

启动服务
#设置开机启动
systemctl enable rke2-agent
#开启服务
systemctl start rke2-agent

1.5 删除对应节点

登录到要删除的节点,执行以下命令

rke2-killall.sh
rke2-uninstall.sh
## 执行删除操作
kubectl delete node {NODE-NAME}

1.6 验证安装

执行kubectl get node

kubectl get node
kubectl get pods --all-namespaces

1.7 命令行管理

RKE2 附带了多个 CLI 工具来帮助你访问和调试集群。启动时,它们会被提取到 /var/lib/rancher/rke2/bin。

kubectl
admin kubeconfig 在 /etc/rancher/rke2/rke2.yaml 处生成。

示例:

export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get nodes

Containerd
RKE2 附带了 ctr 和 crictl。Containerd 套接字位于 /run/k3s/containerd/containerd.sock。

示例:

/var/lib/rancher/rke2/bin/ctr --address /run/k3s/containerd/containerd.sock --namespace k8s.io container ls
export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml
/var/lib/rancher/rke2/bin/crictl ps

上面一长串用起来太麻烦,执行重定向代码:

export SHELLRC=~/.bashrc;
# 添加 crictl 配置
echo "export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml" >> $SHELLRC && \
echo "✅ 已添加 crictl 配置文件" || echo "⚠️ crictl 配置已存在";

# 添加 RKE2 bin 到 PATH
echo "export PATH=\$$PATH:/var/lib/rancher/rke2/bin/" >> $SHELLRC && \
echo "✅ 已添加 RKE2 bin 到 PATH" || echo "⚠️ PATH 配置已存在";

# 定义 ctr 别名(注意转义单引号)
echo "alias ctr='ctr --address /run/k3s/containerd/containerd.sock --namespace k8s.io'" >> $SHELLRC && \
echo "✅ 已设置 ctr 别名" || echo "⚠️ ctr 别名已存在";

# 立即应用配置
source $SHELLRC && \
echo "✅ 配置已生效!运行 'crictl ps' 和 'ctr container ls' 验证"

Helm(可选安装)

sudo apt install git -y

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

chmod 700 get_helm.sh

sudo ./get_helm.sh

2. GPU支持

2.1 安装GPU驱动

首先安装前置项

sudo apt-get -y install g++  gcc  make

建议禁用系统更新,否则会掉驱动

sudo sed -i 's/1/0/g' /etc/apt/apt.conf.d/10periodic
sudo sed -i 's/1/0/g' /etc/apt/apt.conf.d/20auto-upgrades

禁用nouveau 和 Secure Boot:

方法1:/etc/modprobe.d/blacklist.conf 末尾添加如下

blacklist nouveau 
options nouveau modeset=0

方法2:直接执行下面的代码

#或者
echo "options nvidia NVreg_OpenRmEnableUnsupportedGpus=1" >> /etc/modprobe.d/nvidia.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf
echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf
echo "blacklist microcode" >> /etc/modprobe.d/intel-microcode-blacklist.conf

更新并重启系统

update-initramfs -u 
reboot

验证是否成功关闭,如果没有成功关闭进入BIOS/虚拟机设置页面,找到 Secure Boot 选项,并将其关闭(Disable)。

#检查nouveau 状态 
lsmod | grep nouveau
#检查Secure Boot 状态 
mokutil --sb-state 

查看显卡是否存在

lspci | grep -i nvidia

下载显卡驱动(选合适的)

#20250714最新版 cuda 12.9.1
wget https://developer.download.nvidia.com/compute/cuda/12.9.1/local_installers/cuda_12.9.1_575.57.08_linux.run
sudo sh cuda_12.9.1_575.57.08_linux.run

如果安装后执行nvidia-smi提示No devices were found,驱动时需要添加-m=kernel-open参数即可,例如:

bash cuda_12.9.1_575.57.08_linux.run -m=kernel-open

安装完成后配置系统变量:

echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64" >> ~/.bashrc
echo "export PATH=$PATH:/usr/local/cuda/bin" >> ~/.bashrc
echo "export CUDA_HOME=$CUDA_HOME:/usr/local/cuda" >> ~/.bashrc

检查是否安装成功

nvidia-smi
nvcc -V

安装nvidia-container-runtime 和 nvidia-container-toolkit

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo apt-key add - \
    && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update \
    && sudo apt-get install -y nvidia-container-toolkit

2.2 将GPU节点加入集群

如果先安装了nvidia-container-runtime和nvidia-container-toolkit, RKE2会自动添加nvidia runtime到containerd的配置当中。

–执行第本文1.4 Worker节点安装–

安装完成后检查sudo cat /var/lib/rancher/rke2/agent/etc/containerd/config.toml 文件

sudo cat /var/lib/rancher/rke2/agent/etc/containerd/config.toml

查看是否包含

[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.'nvidia']
  runtime_type = "io.containerd.runc.v2"

[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.'nvidia'.options]
  BinaryName = "/usr/bin/nvidia-container-runtime"
  SystemdCgroup = true

[plugins.'io.containerd.cri.v1.images'.registry]
  config_path = "/var/lib/rancher/rke2/agent/etc/containerd/certs.d"

2.3 安装 Nvidia GPU Operator(需要首先安装helm,本文1.7节)

帮助你在 Kubernetes 集群中 自动安装、配置和管理 GPU 驱动、插件和监控组件,从而支持基于 GPU 的 AI/深度学习等工作负载。

GPU Operator 的优势
自动化:无需手动安装 NVIDIA 驱动、CUDA 工具包等繁琐步骤。

一致性:在多节点、多环境中保持配置一致。

可扩展性:支持多种 GPU 型号和不同版本的驱动。

监控能力:自动集成 DCGM Exporter,便于 Prometheus 和 Grafana 的 GPU 监控。

兼容性验证:提供 validator 工具确保组件部署无误。


添加nvidia代码库,在master上执行

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
   && helm repo update

安装gpu-operator, 设置不需要自动安装nvidia驱动,在master上执行:

helm upgrade --install gpu-operator \
     -n gpu-operator --create-namespace \
     nvidia/gpu-operator \
     --set operator.defaultRuntime=containerd \
     --set driver.enabled=false \
     --set toolkit.enabled=false

如果镜像拉不下来,修改镜像地址为registry.k8s.io 改为 k8s.m.daocloud.io

检查是否正确安装,在master上执行:

apt install jq -y
kubectl get node <gpu节点的hostname> -o jsonpath='{.status.allocatable}' | jq

返回:

{
  "cpu": "8",
  "ephemeral-storage": "96292716879",
  "hugepages-1Gi": "0",
  "hugepages-2Mi": "0",
  "memory": "32862000Ki",
  "nvidia.com/gpu": "1",
  "pods": "110"
}

新建pod测试gpu:
gpu-check.yaml

apiVersion: v1
kind: Pod
metadata:
  name: gpu-check
  namespace: default
spec:
  restartPolicy: OnFailure
  runtimeClassName: nvidia #这里是重点。
  containers:
  - name: cuda-container
    command:
        - /bin/sh
        - '-c'
        - tail -f /dev/null
    image: nvcr.io/nvidia/pytorch:25.06-py3
    resources:
      limits:
        nvidia.com/gpu: 1
    env:
    - name: NVIDIA_VISIBLE_DEVICES
      value: all
    - name: NVIDIA_DRIVER_CAPABILITIES
      value: compute,utility

执行

kubectl apply -f gpu-check.yaml

创建成功后,到容器内执行命令:

nvidia-smi
nvcc -V

创建一个gpu验证脚本:
gpu-test.py

import torch
import time

cuda_available = torch.cuda.is_available()
print('CUDA版本:',torch.version.cuda)
print('Pytorch版本:',torch.__version__)
print('显卡是否可用:','可用' if(cuda_available) else '不可用')
print('显卡数量:',torch.cuda.device_count())
print('是否支持BF16数字格式:','支持' if (torch.cuda.is_bf16_supported()) else '不支持')
print('当前显卡型号:',torch.cuda.get_device_name())
print('当前显卡的CUDA算力:',torch.cuda.get_device_capability())
print('当前显卡的总显存:',torch.cuda.get_device_properties(0).total_memory/1024/1024/1024,'GB')
print('是否支持TensorCore:','支持' if (torch.cuda.get_device_properties(0).major >= 7) else '不支持')
print('当前显卡的显存使用率:',torch.cuda.memory_allocated(0)/torch.cuda.get_device_properties(0).total_memory*100,'%')
x = torch.randn(3, 3)  # 创建一个3x3的随机张量
if cuda_available:
    x = x.to('cuda')  # 将张量移动到GPU
    print("张量GPU移动测试-成功:", x)
else:
    print("张量GPU移动测试-失败.")

完成。

TODO(20250708):

  • 储存卷相关及NFS等待补充。
  • helm 相关

本文参考文档:

https://erhwenkuo.github.io/mlops/01-getting-started/learning-env/rancher/k8s-rke2-containerd-gpu/#step-3-kubernetes

https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/getting-started.html

https://docs.rke2.io/advanced#deploy-nvidia-operator

REK2 搭建6节点K8S教程(二):HAProxy + Keepalived 高可用 REK2 搭建6节点K8S教程(一):系统准备 Jenkins + CICD流水线构建指南
View Comments
There are currently no comments.