Linux学习29-kubernetes网络

简介

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

下载部署文件

https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset.yml
拉取镜像


上传镜像


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

部署

创建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:

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无法访问

回收策略

相关推荐
~kiss~8 小时前
LangChain 基础学习
学习·langchain
一木 之林8 小时前
提示词工程学习总结:用 Few-shot 把大模型调教成金融文本分类、抽取与匹配的自动化流水线
人工智能·学习·计算机视觉·金融·分类
传奇开心果编程9 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
我命由我123459 小时前
Photoshop - Photoshop 使用对齐功能定位元素
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·学习方法
阳光九叶草LXGZXJ11 小时前
达梦数据库-报错-16-MERGE INTO提示:无效的列名[XX]
linux·运维·数据库·sql·学习
xxwl58511 小时前
RabbitMQ 学习笔记
笔记·学习·rabbitmq
李日华大战鸡红13 小时前
滑膜观测器(学习记录)
stm32·单片机·学习·matlab·机器人
传奇开心果编程14 小时前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
yt004yt15 小时前
园区 VOC 绿岛集中治理项目,管网与监测系统设计要点
大数据·学习