amzon aws cni 踩坑
最近要把 aws vpc cni 适配到 cluster api 已经适配完成了,发现节点重启过后 aws-node 在重启的节点上不能正常 running 导致节点上的 pod 不能正常运行。
而且使用过在 master 上使用 kubectl logs
获取 pod 运行信息失败。
1 | root@ip-10-0-10-69:/home/admin# kubectl -n kube-system logs aws-node-lm9nx |
也就是说 apiserver 链接不上 10.0.10.207
的 kubelet
.
1 | admin@ip-10-0-10-69:~$ telnet 10.0.10.207 10250 |
使用 telnet 确认一下
登陆到 10.0.10.207
node 发现节点是收到 master 发起到 10250 的请求的,但是至少在网络层没有发现应答。
1 | root@ip-10-0-10-207:/home/admin# tcpdump -i eth0 port 10250 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode |
发现问题不能一下子撸清楚,只能慢慢探索链路。
ip-10-0-10-69
是 master 节点
1 | kubectl -n kube-system logs aws-node-lm9nx |
发现只有出的数据包,并没有回来的数据包。
1 | root@ip-10-0-10-69:/home/admin# tcpdump -i any host 10.0.10.207 and port 10250 -n |
在 ip-10-0-10-207 节点观察,登陆判断数据流向
1 | root@ip-10-0-10-207:/home/admin# ip addr show eth0 |
1 | root@ip-10-0-10-207:/home/admin# ip addr show eth1 |
1 | root@ip-10-0-10-207:/home/admin# tcpdump -n -i eth0 host 10.0.10.69 and port 10250 |
1 | root@ip-10-0-10-207:/home/admin# tcpdump -n -i eth1 host 10.0.10.69 and port 10250 |
1 | root@ip-10-0-10-207:/home/admin# ip rout get 10.0.10.69/24 |
发现出现接受流量的是 eth0, 但是发送的响应的 eth1.
咨询网络同事,发现这个现象已经有专有词汇了叫火星包
, 配置内核参数
1 | root@ip-10-0-10-207:/home/admin# sysctl -w net.ipv4.conf.all.log_martians=1 |
可以看到 kernel 已经打出来日志了。
1 | [ 5210.822567] ll header: 00000000: 02 00 ba 2b 02 3f 02 62 68 47 23 a1 08 00 ...+.?.bhG#... |
目前的修复方案,将来响应请求和接受请求通过修改路由表的方式都换成 eth0.
1 | root@ip-10-0-10-207:/home/admin# ip route |
只要将 eth1 的明细路由删除,影响路由决策让来的数据包走原来的网络接口回去。
当然还有其他方案,比如说在 AWS 的 console 上关闭 ec2 instance 的来源地址检查也可以。