本文永久链接: https://www.xtplayer.cn/rke2/rancher-rke2-kubeproxy-switch-to-ipvs/

在 rancher RKE2 中切换 kube-proxy 从默认的 iptables 模式到 IPVS 模式需要进行一些配置修改。以下是详细步骤:

检查必要的内核模块

确保节点上加载了 IPVS 所需的内核模块:

# 检查已加载的模块
lsmod | grep ip_vs

# 如果需要手动加载
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack

手动安装 rke2 集群

创建或者编辑已有的 RKE2 配置文件

sudo mkdir -p /etc/rancher/rke2/
sudo vim /etc/rancher/rke2/config.yaml

配置 kube-proxy 使用 IPVS

在配置文件中添加以下内容:

kube-proxy-arg:
- "proxy-mode=ipvs"
- "ipvs-scheduler=rr" # 可选:设置调度算法,rr=轮询
- "ipvs-min-sync-period=1s" # 默认 1s
- "ipvs-sync-period=5s"
- "ipvs-strict-arp=true"
- "kube-api-burst=30" # 默认值 10
- "kube-api-qps=15" # 默认值 5

# 如果主机有多网卡,可以通过以下配置指定网卡。
# - "bind-address=你的节点IP"

重启 RKE2 服务

# 如果 RKE2 正在运行,先停止
sudo systemctl stop rke2-server # 对于 server 节点
# 或
sudo systemctl stop rke2-agent # 对于 agent 节点

# 启动 RKE2
sudo systemctl start rke2-server # 对于 server 节点
# 或
sudo systemctl start rke2-agent # 对于 agent 节点

验证配置

等待 RKE2 启动完成后,验证 kube-proxy 模式:

# 检查 kube-proxy pod 日志
kubectl logs -n kube-system -l app=kube-proxy | grep "Using"

# 或者检查 kube-proxy 配置
kubectl get configmap -n kube-system kube-proxy -o yaml | grep mode

# 检查 IPVS 规则
ipvsadm -Ln

验证 IPVS 工作

# 查看 IPVS 规则
ipvsadm -Ln

# 查看统计信息
ipvsadm -L --stats

通过 rancher ui 安装 rke2 集群

在 rancher ui 进入集群管理,点击目标集群右侧的省略号菜单(三个竖点),选择编辑 YAML。

有两种配置场景,

  • 所有节点都切换成 ipvs

    spec.rkeConfig.machineGlobalConfig 下,添加如下的配置

    machineGlobalConfig:
    kube-proxy-arg:
    - proxy-mode=ipvs
    - ipvs-strict-arp=true
    - "ipvs-scheduler=rr" # 可选:设置调度算法,rr=轮询
    - "ipvs-min-sync-period=1s" # 默认 1s
    - "ipvs-sync-period=5s"
    - "kube-api-burst=30" # 默认值 10
    - "kube-api-qps=15" # 默认值 5

    # 如果主机有多网卡,可以通过以下配置指定网卡。
    # - "bind-address=你的节点IP"
  • 某些特定节点切换成 ipvs

    spec.rkeConfig.machineSelectorConfig 下,添加类型如下的配置

        machineSelectorConfig:
    - config:
    protect-kernel-defaults: false
    kubelet-arg:
    - max-pods=100
    # kube-proxy-arg:
    # - proxy-mode=ipvs
    # - ipvs-strict-arp=true
    - machineLabelSelector:
    matchLabels:
    a: b
    config:
    kubelet-arg:
    - max-pods=110
    - machineLabelSelector:
    matchLabels:
    c: d
    config:
    kubelet-arg:
    - max-pods=120
    # kube-proxy-arg:
    # - proxy-mode=ipvs
    # - ipvs-strict-arp=true

    注意:如果一组 config 下没有添加 machineLabelSelector.matchLabels,那么表示匹配所有节点。添加 machineLabelSelector.matchLabels 之后,这组 config 定义的参数将只作用于具有指定标签的主机。

    验证 IPVS 工作

    # 查看 IPVS 规则
    ipvsadm -Ln

    # 查看统计信息
    ipvsadm -L --stats

注意事项

  1. 集群影响:切换模式会导致短暂的网络中断
  2. 内核要求:确保内核支持 IPVS 所需模块
  3. 现有连接:现有连接可能会在切换过程中中断
  4. 备份配置:修改前备份现有配置