在 Kubernetes 中,kube-proxy
使用 IPVS 模式时,流量转发是通过 Linux 内核的 IP Virtual Server (IPVS) 来实现的。kube-proxy
会动态地根据 Kubernetes 服务(Service)和 Endpoints 的变化来更新 IPVS 规则。
修改 IPVS 规则
通常情况下,kube-proxy
会自动管理 IPVS 规则,你可以通过以下方式修改或查看 IPVS 规则:
1. 启用 IPVS 模式
在 Kubernetes 中启用 IPVS 模式,需要在启动 kube-proxy
时进行配置。你可以通过修改 kube-proxy
的配置文件或命令行参数来启用 IPVS 模式。
-
修改
kube-proxy
配置文件(通常是/etc/kubernetes/manifests/kube-proxy.yaml
) ,并设置proxy-mode
为ipvs
。示例配置:
yamlapiVersion: apps/v1 kind: DaemonSet metadata: name: kube-proxy namespace: kube-system spec: template: spec: containers: - name: kube-proxy image: k8s.gcr.io/kube-proxy:v1.23.0 command: - /bin/sh - -c - | # 修改 kube-proxy 启动参数 /usr/local/bin/kube-proxy --proxy-mode=ipvs
这个配置确保了
kube-proxy
启动时会使用 IPVS 模式。 -
如果你使用的是 kubeadm 部署的集群,也可以通过配置文件
/etc/kubernetes/kube-proxy-config.yaml
来设置。vbnetapiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs"
修改完配置后,kube-proxy
会重启并切换到 IPVS 模式。
2. 查看 IPVS 规则
你可以使用 ipvsadm
工具来查看当前的 IPVS 规则。该工具显示的是当前节点上 IPVS 路由的配置。
-
在每个节点上,执行以下命令来查看当前的 IPVS 规则:
ipvsadm -L -n
这个命令将列出当前的 IPVS 负载均衡规则。输出示例:
diffTCP 10.96.0.1:80 rr 1 1 1 -> 10.244.0.2:80 masq -> 10.244.0.3:80 masq
-
解释:
10.96.0.1:80
是 Service 的虚拟 IP 和端口。- 后面跟的是实际 Pod 的 IP 地址和端口(如
10.244.0.2:80
和10.244.0.3:80
),它们是该 Service 后端的 Pod。 masq
表示使用源地址伪装。
3. 手动修改 IPVS 规则
如果你需要手动修改 IPVS 规则(例如,调整负载均衡策略或进行故障排查),可以使用 ipvsadm
工具。
添加一条新的 IPVS 规则:
css
ipvsadm -A -t 10.96.0.1:80 -s rr
ipvsadm -a -t 10.96.0.1:80 -r 10.244.0.2:80 -m
ipvsadm -a -t 10.96.0.1:80 -r 10.244.0.3:80 -m
这会向 IPVS 中添加一个新的服务,绑定虚拟 IP 10.96.0.1:80
,并将流量均匀地负载到两个 Pod(10.244.0.2:80
和 10.244.0.3:80
)上,采用轮询负载均衡策略(-s rr
)。
删除 IPVS 规则:
ipvsadm -D -t 10.96.0.1:80
这会删除虚拟 IP 10.96.0.1:80
的规则。
4. 修改负载均衡策略
如果你希望修改负载均衡算法,可以通过 ipvsadm
工具来更改负载均衡策略。
-
修改为
最少连接数
:
cssipvsadm -A -t 10.96.0.1:80 -s lc
-
修改为
基于源 IP 的哈希
:
cssipvsadm -A -t 10.96.0.1:80 -s sh
-s
参数后跟的负载均衡策略选项:
rr
: 轮询 (Round Robin)lc
: 最少连接数 (Least Connections)sh
: 源地址哈希 (Source Hashing)
5. 重新应用 IPVS 规则
由于 kube-proxy
会自动更新 IPVS 规则,修改规则后需要确保 kube-proxy
重新加载配置并应用新的规则。
-
你可以通过重新启动
kube-proxy
来确保它重新加载和应用新的 IPVS 配置:
perlkubectl -n kube-system rollout restart daemonset kube-proxy
总结
kube-proxy
使用 IPVS 模式时,负责在集群节点上配置和管理 IPVS 规则来实现负载均衡。- 通过
ipvsadm
工具,可以查看、修改和删除 IPVS 规则。 - 如果需要修改
kube-proxy
的行为或负载均衡策略,可以通过修改配置文件来实现。 - 一般情况下,不建议手动修改
kube-proxy
的 IPVS 规则,除非你在进行故障排查或高级定制配置。