凯撒,别走 2024-06-11 17:54 采纳率: 0%
浏览 99
已结题

k8s集群通过master+NodePort无法访问服务

现有运行正常的k8s集群信息如下:
10.172.xx.1 master
10.172.xx.2 work1
10.172.xx.3 work2

最近新增加了两个work节点,10.172.xx.3(work3) 和10.172.xx.4(work4)

问题如下:
当pod运行在work1或work2时,
可以通过masterIP:service的NodePort访问
可以通过workIP:service的NodePort访问

当pod运行在work3或work4时,
不可以通过masterIP:service的NodePort访问
可以通过workIP(pod所在的机器IP):service的NodePort访问

已排查过的点:
pod、service可以正常运行
k8s各个节点系统日志无异常
各个节点/etc/hosts 配置一致
各个节点ipv4转发规则配置一致
以上配置修改后,均重启了network服务
均重启了proxy、fannel、coreDns

版本信息如下
k8s版本:1.22
docker版本:20.10
linux版本:centos7.6
k8s转发规则:iptables

之前在网上看过一些文章,说把k8s的转发规则改成ipvs就行,但是目前我的linux版本不支持,升级起来又太麻烦。所以想问一下还能朝哪个方向排查。

  • 写回答

23条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-11 17:54
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    面对当前的问题,首先确认几个关键点是否正确设置与工作,以确保Kubernetes集群中的NodePort服务可以在所有工作节点上正常访问。以下是一些详细的检查步骤和可能的解决方案:

    1. 验证kube-proxy配置

    • 确保kube-proxy在所有节点上的配置正确,并且在work3和work4上没有被错误地禁用或配置不当。kube-proxy是负责实现NodePort服务的关键组件。

      检查kube-proxy的配置文件(通常位于/etc/kubernetes/manifests/kube-proxy.yaml),并确保它包含了正确的参数,例如:

      spec:
        containers:
        - name: kube-proxy
          image: k8s.gcr.io/kube-proxy:v1.22.0
          command:
          - /usr/local/bin/kube-proxy
          - --config=/etc/kubernetes/kube-proxy.conf
      

      并且确认kube-proxy.conf文件中的配置适合你的环境,特别是clusterCIDRnodePortAddresses等设置。

    2. 检查网络插件状态

    • 确认Fannel或其他网络插件在所有节点上都运行正常。Fannel应该在所有节点上都有对应的容器运行,并且没有报错。

      使用命令kubectl get pods -n kube-system检查Fannel pod的状态。

    3. iptables规则检查

    • 由于你提到使用的是iptables模式,需要检查iptables规则是否正确应用到所有节点。这包括确保NodePort的端口转发规则在work3和work4上正确存在。

      在每个工作节点上执行iptables -L -n -v,查找与Kubernetes相关的链和规则,特别是KUBE-SERVICES链,确认NodePort的规则是否存在。

    4. 检查NodePort服务定义

    • 确保你的服务定义中NodePort范围是在所有节点上可用的。Kubernetes默认的NodePort范围是30000-32767,但这个范围可以在kube-apiserver的启动参数中被覆盖。

      查看服务定义是否包含type: NodePort以及ports部分是否正确配置了nodePort字段。

    5. 防火墙设置

    • 确认工作节点的防火墙规则允许从外部访问NodePort范围内的端口。在CentOS上,这可能涉及到使用firewall-cmd命令添加相应的规则。

      例如,添加一个NodePort规则:

      firewall-cmd --permanent --add-port=30000-32767/tcp
      firewall-cmd --reload
      

    6. 网络配置一致性

    • 虽然你已经提到了/etc/hosts和IPv4转发规则的一致性,这里再次强调检查所有节点的网络配置是否完全相同,包括路由表、网络接口设置等。

    进一步调试建议

    如果上述步骤都无法解决问题,尝试以下更深入的调试:

    • 使用kubectl describe svc <your-service>查看服务的详细信息,确认所有节点的端口映射是否正确。
    • 在问题节点上使用netstat -an | grep <nodePort>检查端口是否被正确监听。
    • 查看kube-proxy的日志,通过journalctl -u kube-proxy寻找任何可能的错误信息。
    • 如果可能,尝试在问题节点上手动创建一个简单的测试服务和pod,观察其NodePort是否可从其他节点访问。

    通过这些步骤,你应该能够找到问题所在,并进行相应的修复。如果问题仍然存在,考虑升级内核或网络插件至支持IPVS的版本,尽管这可能会涉及较多的配置调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月19日
  • 创建了问题 6月11日

悬赏问题

  • ¥15 如何解除Uniaccess管控
  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏