排查网络时在容器里 ping 网关,返回 ping: socket: Operation not permitted。curl 同一个地址是通的。日志里能对上时间点,这种反而好排。
ping 要发 ICMP,需要 NET_RAW 能力,默认的 capability 集合里没有它。能力被裁掉后 socket 创建直接失败,和网络是否连通无关。这一点先确认清楚,后面就不用反复试。
docker run --rm alpine ping -c1 8.8.8.8 docker run --rm --cap-add=NET_RAW alpine ping -c1 8.8.8.8 capsh --print
围绕「容器 ping 权限」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
处理上按这个顺序:先用 curl 或 nc 确认网络本身是通的 把方向定下来;docker run 加 --cap-add=NET_RAW 只补这一个能力;K8s 里在 securityContext.capabilities.add 里写 NET_RAW;不要图省事直接上 privileged 把整个沙箱打开。
结果对不对很好判断,加上 NET_RAW 后 ping 有回包,capsh 里能看到对应能力。
