有人可以让我知道为什么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
Run Code Online (Sandbox Code Playgroud)
docker默认网络是桥接器$> docker network inspect bridge
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用kubectl run命令启动一个pod
kubectl run -it --image nginx bash
Run Code Online (Sandbox Code Playgroud)
在工作节点上将有两个容器启动
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
Run Code Online (Sandbox Code Playgroud)
如果我们运行docker inspect 37c51d605b16,我们可以看到它将使用"none"
"Networks": {
"none": {
"IPAMConfig": null,
"Links": null,
Run Code Online (Sandbox Code Playgroud)
那么为什么kubernetes将使用none网络进行通信?
Kubernetes 使用覆盖网络来管理相同或不同主机上的 Pod 到 Pod 的通信。每个 Pod 都会为该 Pod 中的所有容器获取一个 IP 地址。pause创建一个容器来保存网络命名空间,从而保留 IP 地址,这在容器重新启动时很有用,因为它们获得相同的 IP。
Pod 有自己的以太网适配器,假设eth0它映射到主机上的虚拟以太网适配器veth0xx(位于根网络命名空间中),而主机又连接到网桥docker0或cbr0。
在我的 Kubernetes 设置中,使用 Project Calico 作为覆盖网络 CNI 插件,calico 在每个 pod 中创建一个以太网适配器,并将其映射到主机上的虚拟适配器(名称格式calic[0-9a-z])。该虚拟适配器连接到 Linux 以太网桥。IP 表规则将数据包过滤到该网桥,然后过滤到 CNI 插件提供程序,在我的例子中,Calico 能够将数据包重定向到正确的 pod。
因此,您的容器位于nonedocker 网络中,因为 Kubernetes 设置中禁用了 docker 网络,因为它通过 CNI 插件使用覆盖网络。Kubernetes 不处理网络,而是将其委托给底层 CNI 插件。
| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |