在上一篇文章中我们介绍了linux network namespace,linux bridge device,linux veth device,以及docker宿主环境中的容器网络。在这里我们主要结合实际例子,来看一下宿主环境中的容器网络。
查看docker0 linux bridge:
在宿主机上运行如下命令,从这里面我们看到docker在host上的linux bridge device,另外这个bridge上attach了4个从设备。当然根据上一篇文章,这些从设备一定是veth pair device的一端,而另一端一定是在docker container的network namespace里。
brctl show
查看veth pair从设备:
在宿主机上运行如下命令,从这里面我们看到在host的default network namespace中确实有4个attach到上面docker0 linux bridge上的设备。
ip addr|grep docker0
查看docker容器:
在宿主机上运行如下命令,我们看到确实是有4个k8s pod容器在运行,根据上一篇文章,每个容器都有一个network namespace,所以也印证了上面命令中的docker0 bridge上attach的4个设备。这里有同学可能会有疑问,明明是8个容器,为什么说是4个呢?细心的同学应该观察出来了,另外4个都是同样的image。没错,这是因为在k8s中,每个pod都需要有infrastructure image的(在以前文章安装kubelet的时候我们通过启动参数--pod-infra-container-image配置过这个基础image),而k8s中这个基础image的container和我们应用程序的image的container是共用同一个network namespace的。所以在k8s的pod之中,infrastructure image产生的container和同一个pod中所有application image产生的container在同一个network namespace里,当然这里就是4个network namespace了。
docker ps
进入容器的network namespace里:
这里我们在宿主机器上选择一个container,用以前文章介绍的kube-debug进入容器内部
kubectl get pods
docker ps
kubectl-debug deployment-nginx-app-69b6bbfd6d-8n69w --namespace default
查看容器内的veth设备:
在容器中运行以下命令,我们可以看到容器内确实有一个veth设备。根据以前文章,这个veth设备就是veth pair在容器的另一端,并且这一端的设备也是有ip地址的,ip地址就是container的ip地址。当然它的另一端是attach在宿主default namesapce中的docker0 bridge device里了。
ip -d link show
查看容器内的路由表:
在容器中运行以下命令,我们可以看到容器network namesapce中的路由表信息。
route -n
根据以上信息总结docker宿主中的网络: