为什么kubernetes pod使用none网络而不是工作节点上的网桥?

时间:2017-11-22 11:55:52

标签: kubernetes

有人可以告诉我为什么kubernetes pod使用none网络而不是工作节点上的网桥?

我使用kubo设置kubernetes集群。

The worker node by default will have 3 docker network.

NETWORK ID          NAME                DRIVER
30bbbc954768        bridge              bridge              
c8cb510d1646        host                host                
5e6b770e7aa6        none                null   

docker默认网络是桥接器     $> docker network inspect bridge

"Options": {
        "com.docker.network.bridge.default_bridge": "true",
        "com.docker.network.bridge.enable_icc": "true",

但是如果我使用kubectl run命令启动一个pod

kubectl run -it --image nginx bash

在工作节点上将有两个容器启动

7cf6061fe0b8    40960efd7b8f     "nginx -g 'daemon off"   33 minutes ago      
Up 33 minutes      k8s_bash_bash-325157647-ns4xj_default_9d5ea60e-cf74-11e7-9ae8-00505686d000_2

37c51d605b16        gcr.io/google_containers/pause-amd64:3.0   "/pause"             
35 minutes ago      Up 35 minutes  k8s_POD_bash-325157647-ns4xj_default_9d5ea60e-cf74-11e7-9ae8-00505686d000_0

如果我们运行docker inspect 37c51d605b16 我们可以看到它将使用“无”

"Networks": {
            "none": {
                "IPAMConfig": null,
                "Links": null,

那么为什么kubernetes会使用none网络进行通信?

1 个答案:

答案 0 :(得分:0)

Kubernetes使用覆盖网络来管理相同或不同主机上的Pop-to-Pod通信。每个Pod为该Pod中的所有容器获取一个IP地址。创建一个pause容器来保存网络名称空间,并因此保留IP地址,这在容器重新启动时非常有用,因为它们会获得相同的IP。

该Pod在根网络名称空间中具有自己的以太网适配器,例如eth0,该映射到主机veth0xx上的虚拟以太网适配器,该主机依次连接到网桥docker0cbr0

在我的Kubernetes设置中,使用Project Calico作为覆盖网络CNI插件,calico在每个Pod中创建一个以太网适配器,并将其映射到主机上的虚拟适配器(名称格式calic[0-9a-z])。该虚拟适配器连接到Linux以太网桥。 IP表规则将数据包过滤到该网桥,然后过滤到CNI插件提供程序(在我的情况下为Calico),它能够将数据包重定向到正确的Pod。

因此,由于您的Kubernetes设置中禁用了docker网络,因此您的容器位于none docker网络中,因为它通过CNI插件使用覆盖网络。 Kubernetes不处理网络,但将其委托给底层的CNI插件。