You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

按教程部署单节点K8s(Canal插件)后,Pod网络访问失败且kube-dns异常

嘿,针对你用kubeadm部署单节点K8s(1.9版本+Canal插件)遇到的这两个问题,我给你梳理下排查和解决的步骤:

一、先搞定kube-dns未完全运行的问题

从你给出的Pod状态来看,kube-dns的信息没显示完整,首先得先拿到它的完整状态和日志:

  • 先获取kube-dns的完整Pod详情:
    kubectl -n kube-system get pods -o wide | grep kube-dns
    
    这里能看到它的READY状态(比如是1/3还是2/3),以及节点、IP等核心信息。
  • 接着查看Pod的事件和容器日志,定位具体哪个容器出了问题:
    # 查看Pod的事件记录,排查是否有启动失败、调度异常等情况
    kubectl -n kube-system describe pod <你的kube-dns完整Pod名称>
    # 1.9版本的kube-dns包含kubedns、dnsmasq、sidecar三个容器,分别查看日志
    kubectl -n kube-system logs <你的kube-dns完整Pod名称> -c kubedns
    kubectl -n kube-system logs <你的kube-dns完整Pod名称> -c dnsmasq
    kubectl -n kube-system logs <你的kube-dns完整Pod名称> -c sidecar
    

常见的坑点:

  • Pod网络未就绪:Canal虽然显示Running,但可能内部的Flannel/Calico组件没正常工作,导致kube-dns无法和集群通信,这也会关联到你第二个访问Pod网络的问题。
  • 权限不足:检查kube-dns的ClusterRoleBinding是否存在:
    kubectl get clusterrolebinding kube-dns
    
    如果不存在,需要创建对应的绑定,确保kube-dns有权限访问Kubernetes API。

二、解决Master节点无法访问Pod网络的问题

这个问题大概率和Canal网络插件的配置或运行状态有关,一步步排查:

  • 先检查节点的网络转发内核参数是否开启:
    sysctl net.ipv4.ip_forward
    sysctl net.bridge.bridge-nf-call-iptables
    
    这两个值都应该是1,如果不是,临时开启并设置永久生效:
    sysctl -w net.ipv4.ip_forward=1
    sysctl -w net.bridge.bridge-nf-call-iptables=1
    # 写入配置文件永久生效
    echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
    echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
    
  • 检查Canal插件的运行细节:
    # 查看Canal三个容器的日志,排查是否有报错信息
    kubectl -n kube-system logs canal-mpzrt -c flannel
    kubectl -n kube-system logs canal-mpzrt -c calico-node
    kubectl -n kube-system logs canal-mpzrt -c calico-kube-controllers
    
    比如Flannel是否成功获取了子网,Calico是否正常同步了网络规则。
  • 检查节点的路由表,确认Pod网络的路由是否存在:
    ip route show
    
    应该能看到一条10.244.0.0/16的路由,指向Flannel的虚拟网卡(比如flannel.1)。
  • 检查iptables规则,确认Kubernetes的网络转发规则是否正常:
    iptables-save | grep KUBE-POD-NETWORK
    
    确保有允许Pod网络流量进出的规则。
  • 验证Canal的配置和kubeadm初始化的CIDR是否一致:
    kubectl -n kube-system get configmap canal-config -o yaml
    
    查看net-conf.json里的Network字段,是否和你kubeadm init时指定的10.244.0.0/16一致,不一致的话需要修改配置并重启Canal Pod。

额外提示:单节点集群的特殊配置

默认情况下,Master节点有污点,不会调度Pod,如果你需要在Master上运行业务Pod,可以去掉污点:

kubectl taint nodes gavin-k8s node-role.kubernetes.io/master-

不过这和你当前的网络问题没有直接关系,只是个实用小提示。

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

火山引擎 最新活动