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: /healthz
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    
5. 检查网络策略
# 查看是否有 NetworkPolicy 阻断流量
kubectl get networkpolicy --all-namespaces

# 临时禁用 NetworkPolicy 测试(不推荐生产环境)
kubectl delete networkpolicy --all
6. 升级 kube-proxy 和内核版本
  • 升级到最新稳定版 kube-proxy(1.24+)
  • 确保内核版本支持 IPVS(3.10+)

四、预防措施

  1. 监控 Endpoints 变化
    使用 Prometheus 监控 kube_endpoint_address_available 指标,检测 Endpoints 异常。

  2. 配置合理的 Probe
    为所有 Pod 设置 Readiness 和 Liveness Probe,确保健康状态被正确检测。

  3. 启用 IPVS 健康检查

    ipvs:
      healthCheckTimeout: 5s  # 健康检查超时时间
      healthCheckInterval: 10s  # 检查间隔
    
  4. 定期清理异常 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 流量正常转发。

### 关于 IPVS 轮询 (RR) 算法下的 'TCP no destination available' 错误 当使用 IPVS 并配置为轮询 (RR) 算法时,可能会遇到 `no destination available` 的错误提示。这种错误通常是由于后端服务不可用或未正确注册到虚拟服务中引起的。 #### 原因分析 1. **后端服务不可达** 如果后端的真实服务器(Real Server)无法正常响应流量,则 IPVS 将不会分配任何请求给这些服务器,并最终触发 `no destination available` 错误[^1]。 2. **健康检查失败** IPVS 可能会定期对真实服务器进行健康检查。如果某个真实服务器未能通过健康检查,则会被标记为不可用状态,从而导致可用的目标数量减少甚至为空[^3]。 3. **未正确添加真实服务器** 即使创建了虚拟服务并指定了调度算法,在实际操作中还需要显式地将真实服务器加入到该虚拟服务中。如果没有完成这一步骤,也会引发上述错误[^2]。 --- ### 解决方案 #### 1. 添加真实服务器至虚拟服务 确保已向虚拟服务添加至少一个有效的真实服务器。可以使用以下命令来实现: ```bash ipvsadm -a -t 172.17.0.1:32016 -r 192.168.1.10:80 -m ``` 其中 `-r` 参数用于指定真实服务器的地址及其监听端口;而 `-m` 表示采用 NAT 模式的转发方式。可以根据实际情况替换参数值以适配具体需求。 #### 2. 启用健康检查机制 为了防止因某些临时性问题而导致整个系统瘫痪,建议启用 IPVS 提供的内置健康检测功能。例如设置超时时间、重试次数等选项可以帮助更精准地判断哪些节点处于异常状况之下: ```bash ipvsadm --set 30 5 2 ``` 这里分别设置了同步间隔时间为 30 秒、最大重传数为 5 和失效阈值为连续两次探测均失败才会被移除。 #### 3. 修改现有规则中的调度策略 假如目前使用的确实是简单的 Round Robin 方法却仍然存在问题的话,不妨尝试切换成 Weighted Least Connection 或者其他更加复杂的负载均衡技术来看看效果是否有改善: ```bash ipvsadm -E -t 172.17.0.1:32016 -s wlc ``` #### 4. 清理无效条目 最后别忘了清理掉那些已经不存在或者不再需要继续保留下来的旧记录项以免干扰后续正常的业务流程运行: ```bash ipvsadm -C # 删除所有现存的服务定义及相关联的信息 ``` --- ### 如何禁用或调整此行为? 对于不想让此类警告消息频繁弹出的情况来说,除了从根本上解决问题之外还可以考虑直接屏蔽这条特定类型的日志输出或者是降低它的严重等级以便更好地集中精力关注更重要的事情上去: 修改 `/etc/sysconfig/ipvsadm` 文件内的 DEBUG_LEVEL 数值即可达到目的(数值越低代表打印出来的内容就越少),比如将其设为 0 则完全关闭调试信息显示: ```bash DEBUG_LEVEL=0 ``` 重启相关服务生效: ```bash systemctl restart ipvsadm.service ``` 另外也可以通过编辑 kernel module 加载参数的方式来全局控制 netfilter 日志级别,不过这种方法相对复杂一点而且可能会影响到更多方面因此需谨慎行事. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alden_ygq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值