按教程部署单节点K8s(Canal插件)后,Pod网络访问失败且kube-dns异常
嘿,针对你用kubeadm部署单节点K8s(1.9版本+Canal插件)遇到的这两个问题,我给你梳理下排查和解决的步骤:
一、先搞定kube-dns未完全运行的问题
从你给出的Pod状态来看,kube-dns的信息没显示完整,首先得先拿到它的完整状态和日志:
- 先获取kube-dns的完整Pod详情:
这里能看到它的READY状态(比如是1/3还是2/3),以及节点、IP等核心信息。kubectl -n kube-system get pods -o wide | grep kube-dns - 接着查看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是否存在:
如果不存在,需要创建对应的绑定,确保kube-dns有权限访问Kubernetes API。kubectl get clusterrolebinding kube-dns
二、解决Master节点无法访问Pod网络的问题
这个问题大概率和Canal网络插件的配置或运行状态有关,一步步排查:
- 先检查节点的网络转发内核参数是否开启:
这两个值都应该是sysctl net.ipv4.ip_forward sysctl net.bridge.bridge-nf-call-iptables1,如果不是,临时开启并设置永久生效: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插件的运行细节:
比如Flannel是否成功获取了子网,Calico是否正常同步了网络规则。# 查看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 - 检查节点的路由表,确认Pod网络的路由是否存在:
应该能看到一条ip route show10.244.0.0/16的路由,指向Flannel的虚拟网卡(比如flannel.1)。 - 检查iptables规则,确认Kubernetes的网络转发规则是否正常:
确保有允许Pod网络流量进出的规则。iptables-save | grep KUBE-POD-NETWORK - 验证Canal的配置和kubeadm初始化的CIDR是否一致:
查看kubectl -n kube-system get configmap canal-config -o yamlnet-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




