Kubernetes 集群网络从陌生到熟悉,看这一篇就够了

容器网络基础

一个 Linux 容器的网络栈是被隔离在它自己的 Network Namespace 中,Network Namespace 包括了:网卡(Network Interface),回环设备(Lookback Device),路由表(Routing Table)和 iptables 规则,对于服务进程来讲这些就构建了它发起请求和相应的基本环境。而要实现一个容器网络,离不开以下Linux网络功能:

  • 网络命名空间:将独立的网络协议栈隔离到不同的命令空间中,彼此间无法通信
  • Veth Pair:Veth设备对的引入是为了实现在不同网络命名空间的通信,总是以两张虚拟网卡(veth peer)的形式成对出现的。并且,从其中一端发出的数据,总是能在另外一端收到
  • Iptables/Netfilter:Netfilter负责在内核中执行各种挂接的规则(过滤、修改、丢弃等),运行在内核中;Iptables模式是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表;通过二者的配合来实现整个Linux网络协议栈中灵活的数据包处理机制
  • 网桥:网桥是一个二层网络虚拟设备,类似交换机,主要功能是通过学习而来的Mac地址将数据帧转发到网桥的不同端口上
  • 路由: Linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往哪里

基于以上的基础,同宿主机的容器时间如何通信呢?

我们可以简单把他们理解成两台主机,主机之间通过网线连接起来,如果要多台主机通信,我们通过交换机就可以实现彼此互通,在linux中,我们可以通过网桥来转发数据。

在容器中,以上的实现是通过docker0网桥,凡是连接到docker0的容器,就可以通过它来进行通信。要想容器能够连接到docker0网桥,我们也需要类似网线的虚拟设备Veth Pair来把容器连接到网桥上。

我们启动一个容器:


  1. docker run -d –name c1 hub.pri.ibanyu.com/devops/alpine:v3.8 /bin/sh 

然后查看网卡设备:


  1. docker exec -it c1 /bin/sh 
  2.  
  3. / # ifconfig 
  4.  
  5. eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 
  6.  
  7. inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0 
  8.  
  9. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
  10.  
  11. RX packets:14 errors:0 dropped:0 overruns:0 frame:0 
  12.  
  13. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
  14.  
  15. collisions:0 txqueuelen:0 
  16.  
  17. RX bytes:1172 (1.1 KiB) TX bytes:0 (0.0 B) 
  18.  
  19. lo Link encap:Local Loopback 
  20.  
  21. inet addr:127.0.0.1 Mask:255.0.0.0 
  22.  
  23. UP LOOPBACK RUNNING MTU:65536 Metric:1 
  24.  
  25. RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
  26.  
  27. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
  28.  
  29. collisions:0 txqueuelen:1000 
  30.  
  31. RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 
  32.  
  33. / # route -n 
  34.  
  35. Kernel IP routing table 
  36.  
  37. Destination Gateway Genmask Flags Metric Ref Use Iface 
  38.  
  39. 0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0 
  40.  
  41. 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 

可以看到其中有一张eth0的网卡,它就是veth peer其中的一端的虚拟网卡。然后通过route -n 查看容器中的路由表,eth0也正是默认路由出口。所有对172.17.0.0/16网段的请求都会从eth0出去。

我们再来看Veth peer的另一端,我们查看宿主机的网络设备

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章