为什么docker0网桥在带有法兰绒的kubernetes集群中显示?

时间:2019-10-31 10:39:15

标签: linux docker kubernetes kubernetes-pod flannel

我有一个使用kubadm创建的kubernetes集群,其中有1个主服务器和2个工作器。法兰绒被用作网络插件。注意,docker0网桥在所有工作节点和主节点上均已关闭,但集群网络正常运行。如果我们在kubernetes集群中使用诸如法兰绒的任何网络插件,那么docker0网桥是否会被关闭?

docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 02:42:ad:8f:3a:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

1 个答案:

答案 0 :(得分:0)

我正在发布this SO主题的社区Wiki答案,因为我相信它可以回答您的问题。


这里有Docker和Kubernetes两个网络模型。

Docker模型

  

默认情况下,Docker使用主机-专用网络。它创建一个虚拟网桥,默认情况下称为docker0,并从RFC1918中定义的专用地址块之一为该网桥分配一个子网。对于Docker创建的每个容器,它都会分配一个虚拟以太网设备(称为veth),该设备连接到网桥。使用Linux名称空间,veth映射为在容器中显示为eth0。容器内eth0界面从网桥的地址范围获得了一个IP地址。

     

结果是Docker容器只能在其他容器位于同一台机器上(也就是同一虚拟网桥)时才能与其他容器通信。 不同计算机上的容器无法互相访​​问-实际上,它们最终可能具有完全相同的网络范围和IP地址。

Kubernetes模型

  

Kubernetes对任何网络实施都施加以下基本要求(除非有任何故意的网络分段策略):

     
      
  • 所有容器无需NAT即可与所有其他容器通信
  •   
  • 所有节点都可以在不使用NAT的情况下与所有容器通信(反之亦然)
  •   
  • 容器所看到的IP与其他人所看到的IP
  •   
     

Kubernetes在Pod范围内应用IP地址-Pod中的容器共享其网络名称空间-包括其IP地址。这意味着Pod中的容器可以全部到达localhost上彼此的端口。这确实意味着Pod中的容器必须协调端口使用,但这与VM中的进程没有什么不同。这称为“每脚IP”模型。这是使用Docker作为“ pod容器”实现的,该容器使网络名称空间保持打开状态,而“应用容器”(用户指定的内容)通过Docker的--net=container:<id>函数加入该名称空间。

     

与Docker一样,可以请求主机端口,但这被简化为利基操作。在这种情况下,将在主机Node上分配端口,并将流量转发到PodPod本身看不到主机端口的存在或不存在。

为了将平台与基础网络基础架构集成,Kubernetes提供了一个名为Container Networking Interface (CNI)的插件规范。如果满足Kubernetes的基本要求,则供应商可以根据需要使用网络堆栈,通常使用覆盖网络来支持多子网多Az 集群。

下方显示了如何通过Flannel(一种流行的CNI)实现重叠式网络。

flannel

您可以阅读有关其他CNI here的更多信息。 Cluster Networking文档中介绍了Kubernetes方法。我还建议您阅读Kubernetes Is Hard: Why EKS Makes It Easier for Network and Security Architects,其中介绍了Flannel的工作原理,以及另外一个article from Medium

希望这能回答您的问题。