前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s集群网络(3)-宿主内网络例子

k8s集群网络(3)-宿主内网络例子

作者头像
TA码字
发布2020-04-01 15:31:05
7170
发布2020-04-01 15:31:05
举报
文章被收录于专栏:TA码字TA码字

上一篇文章中我们介绍了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里。

代码语言:javascript
复制
brctl show

查看veth pair从设备:

在宿主机上运行如下命令,从这里面我们看到在host的default network namespace中确实有4个attach到上面docker0 linux bridge上的设备。

代码语言:javascript
复制
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了。

代码语言:javascript
复制
docker ps

进入容器的network namespace里:

这里我们在宿主机器上选择一个container,用以前文章介绍的kube-debug进入容器内部

代码语言:javascript
复制
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里了。

代码语言:javascript
复制
ip -d link show

查看容器内的路由表:

在容器中运行以下命令,我们可以看到容器network namesapce中的路由表信息。

  • 默认网关为10.1.27.1/32,其实就是host network namespace中的docker0 bridge的ip地址。
  • 对于10.1.27.0/24网络地址空间的访问都是直连访问,不需要下一跳ip地址。
代码语言:javascript
复制
route -n

根据以上信息总结docker宿主中的网络:

  • 宿主中容器的网络地址空间一般为x.x.x.0/24,每一个container属于一个独立的network namespace。
  • 宿主的default network namespace中会有linux bridge,一般名字是docker0,其ip地址为x.x.x.1/32。
  • 每个container会有一个veth pair device对应,这个veth pair一端在container的network namespace中,有ip地址,并且这个ip地址就是容器的ip地址。veth pair的另一端attach到宿主network namespace中的linux bridge docker0上,以完成container network namespace和宿主network namespace之间的数据流动。
  • container的默认网关是x.x.x.1/32,也就是宿主network namespace中的linux bridge docker0的ip地址。
  • container到容器的网络地址空间(x.x.x.0/24)的访问方式为直连,不需要下一跳ip。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TA码字 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档