项目场景:
openstack虚拟机内docker容器网络异常
问题描述
同事反馈虚拟机上docker服务使用bridge网络模式的时候,有网络异常的现象:
1、容器内可以通ping通8.8.8.8
2、可以ping通www.baidu.com
3、无法curl通 www.baidu.com
但是当使用host网络模式的时候可以curl通百度。
解决过程:
虚拟机内curl正常,首先想到的是docker网络的限制,查了下docker-bridge导致curl异常的帖子还挺多,首先从这里入手。
经常使用docker,但是对docker网络还真没有仔细看过。现抓看了下怎么配置容器启动时使用的网络模式。
启动时增加 --net=xxx参数来完成网络模式的选择,不设定参数时默认是bridge模式。
例:
#host模式
docker run -it --net=host xxxxx /bin/bash
#bridge模式
docker run -it --net=bridge xxxxx /bin/bash
然后使用centos8镜像作为测试镜像启动容器进行测试。
1、bridge模式启动
复现了问题,注意看网卡的MTU值
docker run -it --net=bridge centos /bin/bash
2、host模式启动
这里就有区分了,使用host模式时使用的是虚拟机的网卡,MTU值是1450
docker run -it --net=host centos /bin/bash
到这就对比出来问题了,流量走的网卡的MTU值不相同,host模式走的是虚拟机的,是openstack平台默认的1450,bridge模式走的是docker服务默认的1500。
当使用bridge模式的时候,curl的包是1500的,通过网桥到虚拟机上时,大于虚拟机网卡的1450,直接丢包了。
试着修改docker服务创建网络的默认MTU值,使用的是在service文件中新增参数配置的方式
在
/usr/lib/systemd/system/docker.service
文件中的ExecStart配置上新增–mtu=1450参数
修改后再次启动bridge模式的容器,检查MTU及curl的结果
问题解决
最终解决方案:
修改docker服务建立bridge时的MTU配置
看了下修改openstack平台MTU值为1550可以避免这种情况,当平台MTU为1550时,虚拟机内MTU可以为1500,但是这样需要交换机上开启巨帧模式,为了这点事,找网管把汇聚到核心都改的话感觉不现实。还是改服务的了。