环境
操作系统:centos7
内核:3.10.0-957.el7.x86_64
k3s版本: v1.25.7+k3s1
问题描述
pod无法访问外网ip
第一次排查
通过查看iptables规则发现缺少10.42.0.0/16的转发规则,手动增加后正常:
iptables -t nat -A POSTROUTING -s 10.42.0.0/16 -j MASQUERADE
第一次只排查了iptables添加的规则,没找到真正原因
第二次排查
查看/var/log/messages日志发现存在如下报错:
Apr 23 03:37:17 qjzjapp k3s: I0423 03:37:17.346090 125311 iptables.go:405] Some iptables rules are missing; deleting and recreating rules
Apr 23 03:37:17 qjzjapp k3s: E0423 03:37:17.388682 125311 iptables.go:304] Failed to ensure iptables rules: error setting up rules: failed to setup iptables-restore payload: failed to check rule existence: running [/usr/sbin/iptables -t nat -C FLANNEL-POSTRTG -s 10.42.0.0/16 ! -d 224.0.0.0/4 -m comment --comment flanneld masq -j MASQUERADE --wait]: exit status 2: Bad argument `’
原来是iptables版本兼容问题,“/usr/sbin/iptables -t nat -C FLANNEL-POSTRTG -s 10.42.0.0/16 ! -d 224.0.0.0/4 -m comment --comment flanneld masq -j MASQUERADE --wait”这条命令的“flanneld masq”之间的空格在低版本的iptables中不能被解析
解决方式
添加–prefer-bundled-bin参数并重启
vim /etc/systemd/system/k3s.service
ExecStart=/usr/local/bin/k3s
server --prefer-bundled-bin \
重启
systemctl daemon-reload
systemctl restart k3s