一、背景说明
在docker+calico环境下,通过抓取数据包的方式简单分析的数据包走向
二、初始环境介绍
2.1 物理环境介绍
| 系统类型 | IP | role | cpu | memory | hostname |
|---|---|---|---|---|---|
| CentOS 7.4.1708 | 172.16.91.195 | master | 4 | 2G | master |
| CentOS 7.4.1708 | 172.16.91.196 | worker | 2 | 1G | slave1 |
| CentOS 7.4.1708 | 172.16.91.197 | worker | 2 | 1G | slave2 |
2.2 运行服务介绍
-
docker 版本介绍
docker版本 -
calico 版本介绍
calico版本 -
etcd 版本介绍
etcd版本
2.3 当前实例运行情况介绍
master节点
slave1节点
slave2节点
2.4 准备测试镜像
-
创建Dockerfile
vim Dockerfile
FROM nginx RUN apt-get update RUN apt-get install -y iputils-ping iproute2 wget -
构建镜像
docker build -t mybusybox .
2.5 测试工具
tcpdump
进行抓包
三、单节点容器流量走向分析
3.1 测试准备阶段
-
创建calico网络net1、net2
docker network create --driver calico --ipam-driver calico-ipam net1 docker network create --driver calico --ipam-driver calico-ipam net2create net1 -
查看net1的默认策略
calicoctl get profile net1 -oyamlnet1 profile -
calico采用的模式
calico网络采用的网络模式 -
创建容器
docker run --net net1 --name web1 -itd mybusybox docker run --net net1 --name web2 -itd mybusybox docker run --net net2 --name web3 -itd mybusyboxcreate container web1, web2, web3
3.2 新生成的网卡说明
- 查看master节点路由信息
ip r smaster节点
web1容器 - 新生成的网卡calif51b85e3399跟容器中的网卡的关系
master新生成的网卡跟web1网卡之间的关系 - 删除直连路由?
删掉直连路由
3.3 测试阶段
3.3.1 同一个calico网络内的容器通信测试
物理机跟容器之间的通信,是如何完成的?
3.3.1.1 master节点 ping web1?
-
数据包流向图
数据包流向图 -
master ping web1
ping 172.20.219.82 -
删除web1的直连路由
route del -host 172.20.219.82 dev calif51b85e3399 -
ens33网卡,calif51b85e3399网卡 抓包
tcpdump -nn -i ens33 icmp and dst tcpdump -nn -i calif51b85e3399 icmpmaster ping web1
tcpdump -
总结:
- 从物理机直接访问本节点上的容器,不会走物理机的网卡eth0或者ens33
- 直接发到容器的网卡
3.3.2 同一节点上,容器之间的通信,是如何完成的?
-
数据包流向图
数据包流向图 -
web1 ping web2
ping命令- 如果数据包的方向是,web1容器 ping web2容器的话,用的是
172.20.219.83 dev cali6eea1d7a4a3 scope link - 如果数据包的方向是,web2容器 ping web1容器的话,用的是
172.20.219.82 dev calif51b85e3399 scope link - 如果ping不通的话,可以查看对应的路由是否存在
- 如果数据包的方向是,web1容器 ping web2容器的话,用的是
3.3.3 不同calico网络间的容器通信测试
- web1 ping web3
不同Calico网络间容器通信
四、跨节点容器流量走向分析
4.1 在slave1节点上,创建一容器b-web1
- 创建容器b-web1(slave1节点操作)
docker run --net net1 --name b-web1 -itd mybusyboxcreate b-web1 container - 查看slave1节点上路由、网卡信息(slave1节点操作)
ip r s ip a s路由,网卡信息 - 查看容器b-web1的网卡信息(slave1节点操作)
docker exec -it b-web1 ip a sb-web1网卡信息
4.2 物理机master节点 ping b-web1
-
数据包流向图
数据包流向图 -
登陆到master节点上(master节点操作)
ping 172.20.140.193物理机ping容器b-web1
物理机ping容器b-web1
4.3 b-web1 ping web1(master节点操作)
- 数据包流向图
数据包流向图 - web1 ping b-web1
docker exec -it web1 ping -c 2 b-web1
- master节点 上 进行抓包
web1 ping b-web1 - slave1节点 上 进行抓包
web1 ping b-web1
4.4 总结:
- 默认情况下,其他节点物理IP不能访问本节点上的容器
- 不同节点上的容器的IP是唯一的,对方可以看的到,不用进行NAT转换,从抓包中可以看出来,ip并没有进行变化。