跳至内容

如何在 Amazon EKS 中配置 ipvs kube-proxy 模式?

3 分钟阅读
0

我想将 Amazon Elastic Kubernetes Service (Amazon EKS) 中的 Kubernetes 网络代理模式由默认的“iptables”更改为“ipvs”。

解决方法

先决条件:

**注意:**如果在运行 AWS CLI 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新版本的 AWS CLI

对于现有的 Amazon EKS 集群

要为现有 EKS 集群配置 ipvs kube-proxy 模式,请完成以下步骤:

  1. 确保为您的 Worker 节点启用 ipvs

    sudo ipvsadm -L

    当代理模式设置为默认的 iptables 时,输出结果类似于以下示例:

    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  2. 要确保您拥有必要的 IPVS 内核模块,请运行以下命令:

    sudo lsmod | egrep -i "ip_vs|ip_vs_rr|ip_vs_wrr|ip_vs_sh|nf_conntrack"
  3. 如果输出中缺少 IPVS 模块,请运行以下命令来安装缺失的内核模块:

    sudo modprobe ip_vs
    sudo modprobe ip_vs_rr
    sudo modprobe ip_vs_wrr
    sudo modprobe ip_vs_sh
    sudo modprobe nf_conntrack  
  4. 要确定您的 kube-proxy 是托管式 Amazon EKS 插件还是自主管理型插件,请运行以下命令:

    aws eks list-addons --cluster-name my-cluster | grep proxy

    **注意:**将 my-cluster 替换为您的集群名称。托管式 Amazon EKS 插件返回 kube-proxy 作为输出。

  5. 根据您的插件,使用 ipvs 模式和轮循机制选项配置 kube-proxy 插件,以将流量平均分配到后备服务器。
    托管式 Amazon EKS 插件

    aws eks update-addon --cluster-name my-cluster --addon-name kube-proxy \
        --addon-version v1.24.17-eksbuild.4 \
        --configuration-values '{"ipvs": {"scheduler": "rr"}, "mode": "ipvs"}' \
        --resolve-conflicts OVERWRITE

    自主管理型插件
    备份 kube-proxy 配置 Configmap:

    kubectl get cm kube-proxy-config -n kube-system -o yaml > kube-proxy-config-old.yml

    编辑 kube-proxy-config Configmap:

    kubectl edit cm kube-proxy-config -n kube-system

    在配置中,将 mode 参数由 iptables 更改为 ipvs,然后将 scheduler 更改为 rr 用于轮循机制。

    ...
        ipvs:
          excludeCIDRs: null
          minSyncPeriod: 0s
          scheduler: "rr"          # add rr
          syncPeriod: 30s
        kind: KubeProxyConfiguration
        metricsBindAddress: 0.0.0.0:10249
        mode: "ipvs"         # change from iptables
    ...

    要应用配置更改,请重新加载您的集群 Worker 节点。使用 eksctl 横向缩减和横向扩展 Worker 节点:

    # get node group names
    eksctl get nodegroup --cluster=my-cluster
    
    # scale-in
    eksctl scale nodegroup --cluster=my-cluster --nodes=0 --name=my-nodegroup-name --nodes-min=0 --nodes-max=3 --wait
    
    # scale-out
    eksctl scale nodegroup --cluster=my-cluster --nodes=2 --name=my-nodegroup-name --nodes-min=2 --nodes-max=3 --wait

    **注意:**将 my-clustermy-nodegroup-name 替换为您的参数。横向扩展时,请根据您的集群需求替换节点数。

  6. 要验证是否已配置 ipvs 模式,请运行以下命令:

    sudo ipvsadm -L

    输出示例:

    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  ip-10-100-0-1.eu-west-1.comp rr
      -> ip-192-168-118-22.eu-west-1. Masq    1      5          0
      -> ip-192-168-187-76.eu-west-1. Masq    1      6          0
    TCP  ip-10-100-0-10.eu-west-1.com rr
      -> ip-192-168-168-152.eu-west-1 Masq    1      0          0         
      -> ip-192-168-183-81.eu-west-1. Masq    1      0          0         
    UDP  ip-10-100-0-10.eu-west-1.com rr
      -> ip-192-168-168-152.eu-west-1 Masq    1      0          0         
      -> ip-192-168-183-81.eu-west-1. Masq    1      0          0

    TCP 和 UDP 条目适用于集群中的 Kubernetes 和 CoreDNS 服务。

  7. 要确保集群中没有 kube-svc*iptables 条目,请运行以下命令:

    sudo iptables-save | grep -i kube-svc

    如果集群中没有 iptables,则前面的命令不会生成输出。

对于新的 Amazon EKS 集群

要为新的 EKS 集群配置 ipvs kube-proxy 模式,请完成以下步骤:

  1. 创建节点组时,引导 Worker 节点用户数据以安装 IPVS 依赖项:

    ...
    #!/bin/bash
    echo "Running custom user data script"
    yum install -y ipvsadm
    ipvsadm -l
    modprobe ip_vs
    modprobe ip_vs_rr
    modprobe ip_vs_wrr
    modprobe ip_vs_sh
    modprobe ip_vs_lc
    modprobe nf_conntrack
    ...
  2. 要使用 IPVS 参数为 kube-proxy 创建托管式 Amazon EKS 插件,请运行以下命令:

    aws eks create-addon --cluster-name my-cluster --addon-name kube-proxy \
        --addon-version v1.29.0-minimal-eksbuild.1 \
        --configuration-values '{"ipvs": {"scheduler": "rr"}, "mode": "ipvs"}' \
        --resolve-conflicts OVERWRITE

    **注意:**将 v1.29.0-minimal-eksbuild.1 替换为与您的 Amazon EKS 集群版本兼容的最新可用 kube-proxy 版本。有关详细信息,请参阅更新 Kubernetes kube-proxy 自主管理型插件

相关信息

Kubernetes 网站上的代理模式

Kubernetes 网站上的在 Kubernetes 集群中使用 NodeLocal DNSCache 的配置

AWS 官方已更新 2 年前