4.2.5 共享节点的网络名称空间
同一个 Pod 对象的各容器均运行于一个独立的、隔离的 Network 名称空间中,共享同一个网络协议栈及相关的网络设备,如图 4-7a 所示。也有一些特殊的 Pod 对象需要运行于所在节点的名称空间中,执行系统级的管理任务,例如查看和操作节点的网站资源甚至是网络设备等,如图4-7b所示。
通常,以Kubeadm 部署的 Kubernetes 集群中的 kube-apiserver、kube-controller-manager、kube-scheduler,以及 kube-proxy 和 kube-flannel 等通常都是第二种类型的Pod对象。事实上,仅需要设置 spec.hostNetwork 的属性为 true 即可创建共享节点网络名称空间的 Pod 对象,如下面的配置清单所示:
apiVersion: v1
kind: Pod
metadata:
name: pod-use-hostnetwork
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
hostNetwork: true
将上面的配置清单保存与配置文件中,如 pod-use-hostnetwork.yaml,将其创建与集群上,并查看其网络接口的相关属性信息以验证它是否能共享使用工作节点的网络名称空间:
**[terminal]
**[delimiter $ ]**[command kubectl apply -f pod-use-hostnetwork.yaml]
pod/pod-use-hostnetwork created
**[delimiter $ ]**[command kubectl exec -it pod-use-hostnetwork -- sh]
/ # ifconfig
cni0 Link encap:Ethernet HWaddr 72:C6:CF:37:34:8C
inet addr:10.244.3.1 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::70c6:cfff:fe37:348c/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:276 errors:0 dropped:0 overruns:0 frame:0
TX packets:286 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19983 (19.5 KiB) TX bytes:35428 (34.5 KiB)
docker0 Link encap:Ethernet HWaddr 02:42:5C:E0:08:C5
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
ens192 Link encap:Ethernet HWaddr 00:0C:29:AD:A8:D2
inet addr:192.168.0.183 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fead:a8d2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3235233 errors:0 dropped:1 overruns:0 frame:0
TX packets:2402001 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1594050628 (1.4 GiB) TX bytes:237476297 (226.4 MiB)
flannel.1 Link encap:Ethernet HWaddr 36:4D:70:4C:69:47
inet addr:10.244.3.0 Bcast:0.0.0.0 Mask:255.255.255.255
inet6 addr: fe80::344d:70ff:fe4c:6947/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:237 errors:0 dropped:0 overruns:0 frame:0
TX packets:232 errors:0 dropped:8 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:28098 (27.4 KiB) TX bytes:17586 (17.1 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1338 errors:0 dropped:0 overruns:0 frame:0
TX packets:1338 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:81611 (79.6 KiB) TX bytes:81611 (79.6 KiB)
如上述命令的结果显示所示,它打印出的工作节点的网络设备及其相关的接口信息。这就意味着,Pod 对象中运行的容器化应用也将监听与其所在的工作节点的IP地址之上,这可以通过直接向 kube-node-2.localdomain 节点发起请求来验证:
**[terminal]
**[delimiter $ ]**[command curl kube-node-2.localdomain]
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
另外,在 Pod 对象中时还可以分别使用 spec.hostPID 和 spec.hostIPC 来共享工作节点的PID和IPC名称空间。