k8s node 报IPVS no destination available
在 Kubernetes 集群中,IPVS no destination available
错误通常表示 kube-proxy(IPVS 模式)无法为 Service 找到可用的后端 Pod。这会导致流量无法正确转发,影响服务可用性。以下是详细的排查和解决方法:
一、错误原因分析
IPVS 是 kube-proxy 的一种模式,通过内核模块实现 Service 负载均衡。当出现 no destination available
时,可能的原因包括:
Pod 状态异常:
- Pod 未就绪(Readiness/Liveness Probe 失败)
- Pod 处于 CrashLoopBackOff 或 Terminating 状态
Endpoint 对象异常:
- Endpoints 资源未正确生成或更新
- Endpoints 中没有匹配的 IP 地址
IPVS 配置错误:
- kube-proxy 未正确同步 Service 和 Endpoints
- IPVS 规则未正确创建或已过期
网络隔离问题:
- Node 与 Pod 之间网络不通
- 防火墙或 NetworkPolicy 阻断流量
二、排查步骤
1. 检查 Service 和 Endpoints
# 查看 Service 配置
kubectl describe service <service-name># 查看对应的 Endpoints
kubectl get endpoints <service-name> -o yaml
关键验证点:
- Endpoints 是否包含健康的 Pod IP 和端口
- Pod IP 是否与实际运行的 Pod 匹配
2. 检查 Pod 状态
# 查看 Pod 状态
kubectl get pods -l <selector> # selector 为 Service 的标签选择器# 查看 Pod 详细信息
kubectl describe pod <pod-name>
常见问题:
- Pod 是否处于
Running
状态且 Ready 为True
- 是否有 Probe 失败导致 Pod 被标记为不健康
3. 检查 kube-proxy 状态
# 查看 kube-proxy 日志
kubectl logs -n kube-system <kube-proxy-pod-name># 检查 kube-proxy 是否使用 IPVS 模式
kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode
4. 验证 IPVS 规则
# 在 Node 上安装 ipvsadm
yum install ipvsadm # CentOS/RHEL
apt install ipvsadm # Ubuntu/Debian# 查看 IPVS 规则
ipvsadm -L -n# 示例输出(应包含 Service 和后端 Pod):
# IP Virtual Server version 1.2.1 (size=4096)
# Prot LocalAddress:Port Scheduler Flags
# -> RemoteAddress:Port Forward Weight ActiveConn InActConn
# TCP 10.96.0.1:443 rr
# -> 192.168.1.10:6443 Masq 1 0 0
三、解决方法
1. 重启 kube-proxy Pod
kubectl delete pods -n kube-system -l k8s-app=kube-proxy
# Kubernetes 会自动重建 kube-proxy Pod
2. 重建 IPVS 规则
# 在 Node 上执行(需 root 权限)
ipvsadm -C # 清除所有 IPVS 规则
systemctl restart kube-proxy # 重启 kube-proxy 重建规则
3. 检查 kube-proxy 配置
确保 kube-proxy 配置正确(configmap/kube-proxy
):
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs" # 确保使用 IPVS 模式
ipvs:scheduler: "rr" # 负载均衡算法strictARP: true # 启用 strictARP 避免 ARP 冲突
4. 检查 Pod 健康状态
- 确保 Pod 的 Readiness Probe 配置正确:
readinessProbe:httpGet:path: /healthzport: 8080initialDelaySeconds: 5periodSeconds: 10
5. 检查网络策略
# 查看是否有 NetworkPolicy 阻断流量
kubectl get networkpolicy --all-namespaces# 临时禁用 NetworkPolicy 测试(不推荐生产环境)
kubectl delete networkpolicy --all
6. 升级 kube-proxy 和内核版本
- 升级到最新稳定版 kube-proxy(1.24+)
- 确保内核版本支持 IPVS(3.10+)
四、预防措施
-
监控 Endpoints 变化:
使用 Prometheus 监控kube_endpoint_address_available
指标,检测 Endpoints 异常。 -
配置合理的 Probe:
为所有 Pod 设置 Readiness 和 Liveness Probe,确保健康状态被正确检测。 -
启用 IPVS 健康检查:
ipvs:healthCheckTimeout: 5s # 健康检查超时时间healthCheckInterval: 10s # 检查间隔
-
定期清理异常 Pod:
使用 CronJob 或 Operator 自动清理长时间处于异常状态的 Pod。
五、验证修复效果
# 再次检查 IPVS 规则
ipvsadm -L -n# 测试 Service 连通性
kubectl run curl --image=radial/busyboxplus:curl -i --tty --rm
# 在容器内执行:
curl <service-ip>:<port>
通过以上步骤,可定位并解决 IPVS no destination available
问题,确保 Service 流量正常转发。