简介

Pod 通过网络命名空间(Network Namespace)与宿主机网络、跨节点网络通信的整体架构:
区域一:Pod 的网络命名空间(Network Namespace)
这是最左边的灰色框,代表一个 Pod 内部的独立网络环境。
pause Pod 的"基础设施容器",它持有这个 Network Namespace,是整个 Pod 的网络骨架。所有其他容器都共享它的网络栈。
web-frontend 业务容器A(前端),共享 pause 的网络。
db-backend 业务容器B(后端),共享 pause 的网络。
关键设计:Pod 内所有容器共享同一个 IP、同一个端口空间。pause 容器负责"撑住"这个网络命名空间,即使业务容器重启,网络也不会丢失。
区域二:宿主机网络(Host Network)
这是中间最大的绿色框,代表 Pod 所在的那台物理/虚拟机的网络栈。
veth pair (一对虚拟网卡) 每创建一个 Pod,CNI 插件就会生成一对 veth 网卡:一个放进 Pod 里变成 eth0,另一个留在宿主机上。它们就像一根虚拟网线的两端,Pod 发出的数据包通过这根"网线"传到宿主机。
Routing or Switching 宿主机上的 Linux 路由表或网桥(bridge)。数据包到达宿主机后,由它决定是转发到本地其他 Pod,还是发往外部网络。
eth0 宿主机的第一张物理网卡,通常负责集群内部 Pod 之间的通信(经过 IP Masq 地址伪装)。
eth1 宿主机的第二张物理网卡,通常用于跨节点通信(比如连到另一个节点)。
IP Masq(IP 伪装/源地址转换) 类似家用路由器的 NAT 功能。当 Pod 需要访问外网(如互联网)时,把 Pod 的私有 IP 伪装成宿主机的 IP,让外部网络能正常回包。
区域三:跨节点通信的隧道技术(最右侧)
这是最右边的绿色框,代表另一个节点的网络栈,展示了两个节点之间如何打通。
VXLAN 一种二层隧道协议。把整个以太帧封装进 UDP 包里,通过三层网络传输。适合跨不同子网的节点通信。
IPIP 一种三层隧道协议。把 IP 包再套一个 IP 头,在两个节点之间建立隧道。开销比 VXLAN 小,但只能传 IP 流量。
BGP 边界网关路由协议。不用隧道,而是让每个节点直接广播自己的 Pod 网段路由,其他节点学到路由后直接转发。这是 Calico 的核心技术,性能最高(无封装开销)。
工作流程:节点A的 Pod 发送数据 → 经过 veth 到达宿主机 → 宿主机查路由决定走VXLAN/IPIP/BGP → 数据通过 eth1 发出 → 到达节点B的 eth1 → 解封装 → 通过宿主机路由到对应 Pod 的 veth → 进入目标 Pod。
CNI 插件负责把 Pod 的 eth0 接入到宿主机的网络拓扑中,再通过隧道或路由实现跨节点通信

Kubernetes 生态中主流的 CNI 网络插件:
CNI 插件 特点
Calico 基于 BGP 路由,支持 NetworkPolicy,性能高
Flannel 最简单的覆盖网络,基于 VXLAN 或 host-gw
Cilium 基于 eBPF,高性能,支持 L3-L7 安全策略
Kube-Router 集成路由、NetworkPolicy 和 Service 代理
Contiv 提供策略驱动的网络,支持 VLAN/VXLAN
Tungsten Fabric 企业级 SDN 方案

K8s 标准网络模型的核心设计------每个 Pod 只有一个网卡(eth0):
- Pod 内部只有一个
eth0接口,由 CNI 插件分配。 - 所有类型的流量都走这一个 eth0 :
- 与 API Server 通信的流量
- 探针(liveness/readiness)流量
- 用户业务流量
核心要点 :标准 K8s 模型下,一个 Pod 只能接入一个网络。这也正是 Multus CNI 存在的意义------它突破了这一限制,允许一个 Pod 拥有多个网卡(eth0、eth1、eth2...),从而同时接入多个网络(如业务网、存储网、管理网隔离)

Multus CNI 是 Kubernetes 生态中一款 多网络接口管理插件,它允许单个 Pod 同时拥有多个网络接口(默认 CNI 插件仅支持一个主网络接口),从而满足复杂网络隔离、多平面通信、高性能网络等复杂场景需求。
核心价值:突破单网络限制
默认情况下,Kubernetes 的 CNI 插件(如 Calico、Flannel)只能为 Pod 分配一个主网络接口(通常是 eth0),所有流量都通过该接口传输。而 Multus 作为 CNI 插件的编排器,可以:
- 让 Pod 同时挂载多个网络接口(如 eth0、net1、net2),分别接入不同物理网络(如业务网、管理网、存储网)。
- 兼容主流 CNI 插件(Calico、Macvlan、SR-IOV 等),将它们作为 "从网络" 插件组合使用。
- 满足 NFV(网络功能虚拟化)、多租户隔离、高性能计算等场景的特殊网络需求。
工作原理:分层协作
Multus 自身不直接提供网络功能,而是通过 "主 CNI + 从 CNI" 的分层架构协调配合其他插件:
- 主 CNI 插件:负责 Pod 的主网络接口(eth0),通常是集群默认 CNI(如 Calico),提供 Pod 与集群内其他资源的基础通信。
- 从 CNI 插件:通过 Multus 为 Pod 添加额外接口(如 net1),可选用 Macvlan、SR-IOV、Weave 等插件,接入独立网络平面。
- 配置入口:通过 Kubernetes CRD NetworkAttachmentDefinition 定义从网络的配置(如子网、插件类型),Pod 通过注解引用这些网络。
部署 Multus
官网:https://github.com/k8snetworkplumbingwg/multus-cni
下载部署文件

上传镜像




修改部署文件中的两处镜像位置


部署


创建macvlan从网络

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-static
spec:
config: '{
"cniVersion": "0.4.0",
"type": "macvlan",
"master": "eth0", #根据实际网卡填写
"mode": "bridge",
"ipam": {
"type": "static",
"addresses": { "address": "192.168.154.71/24", "gateway": "192.168.154.2" }
}
}'
#这里的address确定未被占用,可以ping一下确认,如果ping不同就可以使用


创建多网络接口 Pod

apiVersion: "v1"
kind: "Pod"
metadata:
name: "multus-web"
labels:
app: "multus"
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-static
spec:
containers:
- name: "apache-frontend"
image: "reg.westos.org/library/httpd:dns"
ports: - containerPort: 80
查看

可以看到pod分配了两个地址
kubectl describe pod multus-web

访问ip可以直接到达业务pod

这种资源可以定义多个,根据自己的需要选择

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-pool
spec:
config: '{
"cniVersion": "0.4.0",
"type": "macvlan",
"master": "ens33",
"mode": "bridge",
"ipam": {
"type": "host-local",
"subnet": "192.168.154.0/24",
"rangeStart": "192.168.154.220",
"rangeEnd": "192.168.154.250",
"gateway": "192.168.154.2"
}
}'


apiVersion: "v1"
kind: "Pod"
metadata:
name: "multus-web2"
labels:
app: "multus"
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-pool
spec:
containers:
- name: "apache-frontend"
image: "reg.westos.org/library/httpd:dns"
ports:
- containerPort: 80

添加工作节点
与之前相同
禁用swap

设置yum源

安装epel包

修改内核参数

修改系统限制

安装ipvs依赖



部署container

kubeadm部署集群


安装containerd

这里从k8s2复制更好


配置crictl连接containerd

k8s1生成token

使用该token加入集群

成功加入k8s3

网络策略
https://v1-33.docs.kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
网络策略通过网络插件来实现。 要使用网络策略,你必须使用支持 NetworkPolicy 的网络解决方案。 创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的。
Pod 隔离的两种类型:
- Pod 有两种隔离:出口的隔离和入口的隔离。
- 默认情况下,一个 Pod 的出口是非隔离的,即所有外向连接都是被允许的。
- 默认情况下,一个 Pod 对入口是非隔离的,即所有入站连接都是被允许的。
限制pod流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: networkpolicy-test1
namespace: default
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
-
from:
-
podSelector:
matchLabels:
run: test #筛选标签
ports:
- protocol: TCP
port: 80
创建策略


创建测试pod
注意先上传测试镜像busyboxplus
查看webserver的ip


此时访问webserver是不通的

查看标签

修改pod标签,符合网络策略中定义的标签

访问成功

限制namespace流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: networkpolicy-test2
namespace: default
spec:
podSelector:
matchLabels:
app: web1
policyTypes:
- Ingress
ingress:
-
from:
-
namespaceSelector:
matchLabels:
project: test
- podSelector:
matchLabels:
run: test
ports:
- protocol: TCP
port: 80
创建网络策略并查看

创建ns

创建secret

apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJyZWcud2VzdG9zLm9yZyI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJ3ZXN0b3MiLCJlbWFpbCI6Inlha2V4aTAwN0B3ZXN0b3Mub3JnIiwiYXV0aCI6IllXUnRhVzQ2ZDJWemRHOXoifX19
kind: Secret
metadata:
name: myregkey
type: kubernetes.io/dockerconfigjson

绑定sa

apiVersion: v1
kind: ServiceAccount
metadata:
name: default
imagePullSecrets:
- name: myregkey


此时访问是不通的,应该为web1的ip

为ns打上符合条件的标签

成功

同时限制namespace和pod

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: networkpolicy-test3
namespace: default
spec:
podSelector:
matchLabels:
app: web2
policyTypes:
- Ingress
ingress:
-
from:
-
namespaceSelector:
matchLabels:
project: test
podSelector:
matchLabels:
run: test
ports:
- protocol: TCP
port: 80

ns和pod都要打上标签才能通


成功

限制集群外部流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: networkpolicy-test4
namespace: default
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
-
from:
-
ipBlock:
cidr: 192.168.0.0/16
except:
-
192.168.154.208/32 #只限制了k8s3
-
namespaceSelector:
matchLabels:
project: test
podSelector:
matchLabels:
run: test
ports:
- protocol: TCP
port: 80


k8s3无法访问

回收策略
