网络命名空间
网络命名空间(Network Namespace)是 Linux 内核提供的一种网络隔离机制,是 Kubernetes 网络实现的基础。本页将深入介绍网络命名空间的概念、工作原理以及在 Kubernetes 中的应用。
什么是网络命名空间?
网络命名空间是 Linux 内核提供的一种隔离机制,它可以将网络栈进行隔离,使得不同的命名空间拥有独立的:
- 网络设备(如 eth0、lo 等)
- IP 地址
- 路由表
- 防火墙规则
- 套接字
- /proc/net 目录
- 端口空间
通过网络命名空间,可以在同一台物理机上创建多个相互隔离的网络环境,这是容器网络和 Kubernetes 网络的基础。
命名空间与容器的关系
容器技术(如 Docker)使用了多种 Linux 命名空间来实现隔离,包括:
- 网络命名空间(Network Namespace):隔离网络资源
- 进程命名空间(PID Namespace):隔离进程 ID
- 挂载命名空间(Mount Namespace):隔离文件系统挂载点
- UTS 命名空间:隔离主机名和域名
- 用户命名空间(User Namespace):隔离用户和组 ID
- IPC 命名空间:隔离进程间通信资源
本页主要关注网络命名空间,它是 Kubernetes 网络模型的核心组件。
网络命名空间基础操作
在深入了解 Kubernetes 中的应用之前,让我们先学习网络命名空间的基本操作:
1. 创建网络命名空间
2. 在网络命名空间中执行命令
3. 查看网络命名空间中的网络设备
新创建的网络命名空间只有一个 lo(回环)接口,并且默认是关闭状态。
4. 启用回环接口
5. 删除网络命名空间
连接网络命名空间
孤立的网络命名空间没有太大用处,我们需要将它们连接起来或连接到主机网络。有几种方法可以实现这一点:
使用 Veth 对连接网络命名空间
Veth(Virtual Ethernet)对是一对虚拟网络接口,一端连接到一个网络命名空间,另一端连接到另一个网络命名空间或主机网络命名空间。
创建连接两个网络命名空间的 Veth 对:
这样,两个网络命名空间就可以通过 veth 对直接通信了。
使用网桥连接多个网络命名空间
网桥(Bridge)是一个虚拟的二层设备,可以连接多个网络接口,实现它们之间的通信。
使用网桥连接多个网络命名空间:
通过网桥,可以连接多个网络命名空间,形成一个虚拟的局域网。
使用路由连接网络命名空间
除了二层连接(veth 对和网桥),还可以使用三层路由来连接不同子网的网络命名空间。
使用路由连接不同子网的网络命名空间:
通过配置路由,可以实现不同子网的网络命名空间之间的通信。
使用 NAT 连接网络命名空间到外部网络
使用 NAT(网络地址转换)可以让网络命名空间访问外部网络,如互联网。
配置 NAT 使网络命名空间可以访问外部网络:
通过 NAT,网络命名空间中的设备可以访问外部网络,但外部网络无法直接访问命名空间中的设备(除非配置端口转发)。
网络命名空间在 Kubernetes 中的应用
网络命名空间是 Kubernetes 网络模型的基础。在 Kubernetes 中:
Pod 网络命名空间
在 Kubernetes 中,每个 Pod 有自己的网络命名空间,Pod 内的所有容器共享这个网络命名空间。这就是为什么:
- 同一 Pod 内的容器可以通过 localhost 互相访问
- 同一 Pod 内的容器共享同一个 IP 地址
- 同一 Pod 内的容器可能需要协调端口使用
Pause 容器的作用
每个 Kubernetes Pod 都有一个 "pause" 容器,它是 Pod 的第一个容器,主要职责是:
- 创建和维护 Pod 的网络命名空间
- 作为 Pod 内所有容器的父进程,回收僵尸进程
其他容器加入到 pause 容器创建的网络命名空间中,从而共享网络栈。
CNI 与网络命名空间
Kubernetes 的 CNI(容器网络接口)插件负责:
- 为新创建的 Pod 配置网络命名空间
- 将 Pod 的网络命名空间连接到节点网络
- 分配 IP 地址给 Pod
- 配置路由和防火墙规则
不同的 CNI 插件使用不同的方式来连接网络命名空间:
- Flannel:使用 veth 对和网桥(bridge)
- Calico:使用 veth 对和路由
- Weave:使用 veth 对和自定义路由
动手实验:探索网络命名空间
以下是一些实验,帮助你理解网络命名空间和 Kubernetes 网络:
实验 1:创建并连接两个网络命名空间
- 创建两个网络命名空间
- 使用 veth 对连接它们
- 配置 IP 地址并测试连通性
实验 2:使用网桥连接多个网络命名空间
- 创建三个网络命名空间
- 创建一个网桥
- 使用 veth 对将每个命名空间连接到网桥
- 测试所有命名空间之间的连通性
实验 3:探索 Kubernetes Pod 的网络命名空间
- 创建一个简单的 Pod
- 找到 Pod 的网络命名空间
- 检查网络配置
网络命名空间的高级主题
网络命名空间持久化
默认情况下,网络命名空间在系统重启后会消失。要持久化网络命名空间:
网络命名空间和容器运行时
不同的容器运行时(如 Docker、containerd、CRI-O)管理网络命名空间的方式略有不同:
- Docker:使用 libnetwork 创建和管理网络命名空间
- containerd:依赖 CNI 插件管理网络命名空间
- CRI-O:同样使用 CNI 插件管理网络命名空间
但在 Kubernetes 中,无论使用哪种容器运行时,CNI 插件都负责配置 Pod 的网络命名空间。
监控网络命名空间
监控网络命名空间中的网络活动:
相关资源
要了解更多关于网络命名空间和 Kubernetes 网络的信息,可以参考以下资源:
了解 Veth 对