升级至Ubuntu 20.04后MicroK8s本地DNS解析失效,UFW规则异常导致Pod无法访问本地DNS服务器
我碰到过不少类似的情况,Ubuntu 20.04的UFW默认规则确实比之前的版本更严格,而且升级过程中很可能把MicroK8s之前配置的网络规则给冲掉了。咱们一步步来排查和解决:
1. 先确认UFW的转发策略与当前规则
首先查看UFW的详细状态,重点看转发策略和现有规则:
sudo ufw status verbose
如果看到Forwarding: deny,这大概率是问题根源——Ubuntu 20.04默认会阻止跨网络接口的转发,而MicroK8s的Pod运行在独立的虚拟子网(比如cbr0接口),无法直接访问主机的DNS服务。
2. 定位MicroK8s的容器子网
你需要先确定MicroK8s给Pod分配的IP范围,执行以下命令查看节点的PodCIDR:
microk8s kubectl get nodes -o wide
输出里的PodCIDR字段就是容器子网,比如常见的10.1.0.0/16或者10.152.183.0/24。
3. 添加精准的UFW规则允许DNS访问
针对容器子网和主机DNS端口(53,UDP和TCP都要覆盖)添加规则,假设你的容器子网是10.1.0.0/16,主机IP是192.168.0.50:
# 允许容器子网访问主机UDP 53端口(DNS主要用UDP) sudo ufw allow from 10.1.0.0/16 to 192.168.0.50 port 53 proto udp # 允许容器子网访问主机TCP 53端口(用于大尺寸DNS响应) sudo ufw allow from 10.1.0.0/16 to 192.168.0.50 port 53 proto tcp
如果知道MicroK8s的虚拟网卡(通常是cbr0),也可以用网卡来限定规则,更安全:
sudo ufw allow in on cbr0 to 192.168.0.50 port 53 proto udp sudo ufw allow in on cbr0 to 192.168.0.50 port 53 proto tcp
4. 验证规则是否生效
添加规则后,重启UFW确保生效:
sudo ufw disable && sudo ufw enable
然后进入一个测试Pod验证DNS解析:
microk8s kubectl run -it --rm busybox --image=busybox:1.35 -- nslookup your-local-service-domain
如果能正常返回IP,说明问题解决。
5. 备选方案:调整UFW全局转发策略(更开放)
如果上面的精准规则没起作用,你可以临时放宽UFW的全局转发策略来排查:
编辑/etc/default/ufw文件,找到以下行:
DEFAULT_FORWARD_POLICY="DENY"
修改为:
DEFAULT_FORWARD_POLICY="ACCEPT"
保存后重启UFW:
sudo ufw disable && sudo ufw enable
注意:这种方式会允许所有转发流量,排查完成后建议换回精准规则,保证安全性。
6. 特殊情况:UFW与nftables冲突
Ubuntu 20.04默认可能用nftables代替了传统iptables,而MicroK8s依赖iptables规则,可能导致冲突。你可以切换回iptables-legacy:
update-alternatives --set iptables /usr/sbin/iptables-legacy update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
然后重启UFW和MicroK8s:
sudo systemctl restart ufw sudo microk8s stop && sudo microk8s start
备注:内容来源于stack exchange,提问作者irwinr

