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

回收策略

相关推荐
dadaobusi5 小时前
学习:奈奎斯特
学习
传奇开心果编程7 小时前
【Go入门练中学】第2课:条件与循环
后端·学习·golang
小小de风呀8 小时前
de风——【从零开始学C++】(二十)红黑树封装map和set
c++·学习
爱吃苹果的日记本8 小时前
数据结构第四课—线性表Linear List
数据结构·学习
昌原的儿子LEO8 小时前
ARM 汇编核心知识点总结
嵌入式硬件·学习
Ray Wang8 小时前
Context上下文工程
python·学习·ai编程
百里香酚兰8 小时前
【Unity学习笔记】如何把粉色Prefab还原
笔记·学习·unity
索端阳9 小时前
ARM Day02 学习总结:ARM汇编基础核心知识点梳理
汇编·学习·arm
小叶肥辉9 小时前
LangChain链和LangGraph图的学习笔记【六】——提示语模板(3)——Few-Shot Prompting(少样本提示) 模板类
笔记·python·学习·langchain·prompt·aigc