You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

kube-dns Pod连接拒绝问题求助:Kubernetes v1.9.3(Ubuntu16.04LTS)

排查kube-dns连接拒绝问题(搭配Flannel在K8s v1.9.3)

我之前处理过不少类似的场景,结合你的环境(Ubuntu 16.04 LTS + Kubernetes v1.9.3 + Flannel),kube-dns出现连接拒绝的问题,通常和网络连通性、组件配置、系统防火墙规则这几个核心点有关,下面逐一拆解排查步骤:

1. 先确认Flannel网络是否正常工作

Flannel是集群Pod间通信的基础,如果它没跑起来,kube-dns必然会出问题:

  • 检查所有节点上的Flannel Pod状态:
    kubectl get pods -n kube-system -l app=flannel
    
    确保所有Pod都处于Running状态,如果有CrashLoopBackOff,立刻查看日志定位错误:
    kubectl logs -n kube-system <你的flannel-pod名称>
    
  • 验证节点间的Flannel overlay网络连通性:随便找一个节点,ping另一个节点的Pod网段(Flannel默认是10.244.0.0/16,每个节点会分配一个子网段)。如果不通,大概率是Ubuntu默认的ufw防火墙拦截了UDP 8472端口(Flannel的通信端口),执行以下命令开放:
    ufw allow 8472/udp
    
    同时检查iptables是否有Flannel相关的ACCEPT规则,没有的话重启flanneld Pod试试。

2. 检查kubelet的DNS配置参数

kube-dns的服务IP在K8s 1.9版本里默认是10.96.0.10,必须确认kubelet启动参数里正确指定了这个地址:

  • 打开kubelet的配置文件(一般在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf),检查是否有这两行:
    --cluster-dns=10.96.0.10
    --cluster-domain=cluster.local
    
    如果缺失,添加后重启kubelet:
    systemctl daemon-reload
    systemctl restart kubelet
    
  • 验证kube-dns的实际Service IP是否和配置匹配:
    kubectl get svc -n kube-system kube-dns
    
    如果IP不是10.96.0.10,调整kubelet参数对应这个实际IP即可。

3. 排查kube-dns自身的配置和日志异常

你提到日志有异常,重点关注这几个方向:

  • 先进入kube-dns Pod查看内部的resolv.conf配置:
    kubectl exec -n kube-system <你的kube-dns-pod名称> -c kubedns cat /etc/resolv.conf
    
    正常情况应该包含nameserver 10.96.0.10,且搜索域只有default.svc.cluster.local svc.cluster.local cluster.local,多余的搜索域会导致解析超时。
  • 查看kube-dns各容器的日志:
    kubectl logs -n kube-system <你的kube-dns-pod名称> -c kubedns
    kubectl logs -n kube-system <你的kube-dns-pod名称> -c dnsmasq
    
    如果看到dnsmasq: failed to create listening socket这类错误,说明节点上的53端口被占用了——Ubuntu 16.04默认的systemd-resolved会占用53端口,修改配置关闭它的监听:
    编辑/etc/systemd/resolved.conf,设置DNSStubListener=no,然后重启服务:
    systemctl restart systemd-resolved
    

4. 检查防火墙或iptables规则拦截

Ubuntu的ufw或者自定义iptables规则可能会阻断集群内部流量:

  • 先临时关闭ufw测试:
    ufw disable
    
    如果问题解决,说明需要添加允许集群内部流量的规则,比如开放Pod网段(10.244.0.0/16)和Service网段(10.96.0.0/12)的所有通信。
  • 如果你手动开启了SELinux(Ubuntu默认关闭),临时设置为Permissive模式测试:
    setenforce 0
    

5. 确认Flannel的CNI配置是否正确

kubelet需要加载正确的CNI配置才能让Pod获取网络:

  • 检查节点上的CNI配置目录/etc/cni/net.d/,应该有一个10-flannel.conf文件,内容类似:
    {
      "name": "cbr0",
      "type": "flannel",
      "delegate": {
        "isDefaultGateway": true
      }
    }
    
    如果没有这个文件,从Flannel Pod里复制一份:
    kubectl cp -n kube-system <你的flannel-pod名称>:/etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf
    
    然后重启kubelet生效。

你可以按照这个顺序逐一排查,大部分情况下Flannel初始化异常或者kubelet DNS参数配置错误是最常见的诱因。

内容的提问来源于stack exchange,提问作者Fayas B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:40:04