当前位置: 首页 > news >正文

K8S的NetworkPolicy使用教程

K8S的NetworkPolicy介绍与使用

注:typora的markdown导入,可能部分显示格式有问题

NetworkPolicy介绍

NetworkPolicy 是 Kubernetes 中用于控制 Pod 间网络流量的资源对象,它通过定义规则来允许或阻止 Pod 之间、Pod 与外部服务之间的网络通信。简单来说,它就像 Kubernetes 集群内部的 “防火墙规则”,用于实现精细化的网络访问控制。

在K8S中是不具备NetworkPolicy功能的,就像是部署好k8s集群之后网络打通那样,需要单独安装网络CNI组件接入进来负责集群中Pod的通信问题,哪怕是最新版本想要使用NetworkPolicy同样需要CNI组件的支持,而部分CNI组件不支持NetworkPolicy功能,所以想要使用此功能的基础就是安装拥有此功能的网络组件并版本与K8S兼容。

例如:Calico1.0版本开始支持,Cilium1.0版本开始支持,Kubeovn1.1X版本开始支持,Flannel不支持

NetworkPolicy特性与使用

  1. VPC与NetworkPolicy概念区分:VPC可以看作是不同的网络环境,NetworkPolicy是同网络环境下的ACL流量规则。
  2. 命名空间隔离:NetworkPolicy 是命名空间级别的资源,仅对同一命名空间的 Pod 生效,也可作用整个命名空间,但无法跨命名空间使用。
  3. 默认行为:
    • 若 Pod 未被任何 NetworkPolicy 匹配,允许所有流量。
    • 若被至少一个 NetworkPolicy 匹配,则仅允许规则明确允许的流量。
  4. 规则累加:多个 NetworkPolicy 可同时匹配一个 Pod,规则会合并生效。
  5. 策略逻辑:不管是入站还是出站都像是防火墙策略,只要是声明但不匹配就全部为拒绝,不设置就相当于是关闭防火墙。

这个策略逻辑可能有点绕,但意思就是我如果不配置任何NetworkPolicy就相当于关闭防火墙没有任何限制的状态,但我只要配置规则,那只要绑定生效的Pod的流量就会受到NetworkPolicy中声明的规则限制,加入出站配置了允许访问某个地址,那么除此之外其他地址都无法访问,入站同理,允许了含有某个标签的Pod访问,其他标签不匹配的机会全部拒绝。

如果在policyTypes启用Ingress(入站)或者Engress(出站)但未配置任何规则,那么将会拒绝入站或者出站的所有流量。

入站方式筛选规则

Pod 选择器(PodSelector)
通过标签匹配同一命名空间内的特定 Pod,只有这些 Pod 的流量被允许进入目标 Pod。
示例:

ingress:- from:- podSelector:matchLabels:app: frontend  # 允许标签为app=frontend的Pod访问

命名空间选择器(NamespaceSelector)

通过标签匹配特定命名空间,该命名空间内的所有 Pod 的流量都被允许进入目标 Pod。
示例:

ingress:- from:- namespaceSelector:matchLabels:env: production  # 允许标签为env=production的命名空间内的Pod访问

Pod 选择器 + 命名空间选择器(组合)
同时匹配特定命名空间和该命名空间内的特定 Pod(逻辑 “与” 关系)。
示例:

ingress:- from:- podSelector:matchLabels:app: backendnamespaceSelector:matchLabels:env: staging  # 允许staging命名空间中标签为app=backend的Pod访问

IP 块(IPBlock)
通过 CIDR 范围指定允许访问的外部 IP 或网段,支持排除特定 IP(except字段)。
示例:

ingress:- from:- ipBlock:cidr: 192.168.0.0/16  # 允许192.168网段的IP访问except:- 192.168.1.0/24  # 排除192.168.1网段

**端口(Port) **

允许访问的端口和协议,限制流量只能通过指定端口进入 Pod。支持的协议包括 TCP、UDP(部分网络插件支持)等。

示例:

ingress:- ports:- protocol: TCPport: 80  # 允许TCP协议的80端口- protocol: UDPport: 53  # 允许UDP协议的53端口

出站方式筛选规则

Pod 选择器(PodSelector)
允许访问同一命名空间内具有特定标签的 Pod。
示例:

egress:- to:- podSelector:matchLabels:app: database  # 允许访问标签为app=database的Pod

命名空间选择器(NamespaceSelector)
允许访问特定命名空间内的所有 Pod(通过命名空间标签匹配)。
示例:

egress:- to:- namespaceSelector:matchLabels:env: external  # 允许访问标签为env=external的命名空间内的Pod

Pod 选择器 + 命名空间选择器(组合)
同时匹配特定命名空间和该命名空间内的特定 Pod(逻辑 “与” 关系)。
示例:

egress:- to:- podSelector:matchLabels:app: cachenamespaceSelector:matchLabels:env: shared  # 允许访问shared命名空间中标签为app=cache的Pod

IP 块(IPBlock)
允许访问指定的外部 IP 或网段(通过 CIDR 表示),支持排除特定 IP(except字段)。
示例:

egress:- to:- ipBlock:cidr: 10.0.0.0/8  # 允许访问10.0.0.0网段except:- 10.96.0.0/12  # 排除Kubernetes服务网段

端口(Port)

允许访问的目标端口和协议(如 TCP、UDP),限制流量只能通过指定端口发送到外部。
示例:

egress:- ports:- protocol: TCPport: 443  # 允许通过TCP 443端口访问外部- protocol: UDPport: 53  # 允许通过UDP 53端口(DNS)访问外部

NetworkPolicy模版

以下是个完整NetworkPolicy模版

apiVersion: networking.k8s.io/v1  # 固定API版本
kind: NetworkPolicy
metadata:name: <策略名称>namespace: <目标命名空间>  # 策略仅在当前命名空间生效
spec:podSelector:  # 匹配哪些Pod(通过标签)matchLabels:app: <目标Pod标签>policyTypes:  # 规则类型:Ingress(入站)、Egress(出站)- Ingress- Egressingress:  # 入站规则(允许哪些流量进入匹配的Pod)- from:  # 流量来源- podSelector:  # 来自特定标签的PodmatchLabels:app: <来源Pod标签>- namespaceSelector:  # 来自特定标签的命名空间matchLabels:env: prod- ipBlock:  # 来自特定IP范围cidr: 192.168.0.0/16except:  # 排除某个IP段- 192.168.1.0/24ports:  # 允许访问的端口和协议- protocol: TCPport: 8080egress:  # 出站规则(允许哪些流量从匹配的Pod发出)- to:  # 流量目的地(格式同from)- podSelector:  #到特定标签的PodmatchLabels:app: dbports:  #允许访问的端口和协议- protocol: TCPport: 5432

案例yaml配置文件以及调用进行说明

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: networkpolicy-a  #规则名称namespace: ns-a   #指定网络策略在哪个命名空间
spec:#podSelector网络策略要应用到哪个pod上,通过标签的方式来控制pod,只能应用到和网络策略相同namespace的podpodSelector:#如果matchLabels下面没写标签,则应用网络策略到当前namespace下的所有podmatchLabels:#nginx-a:把网络策略应用到标签为app:nginx-a的pod上app: nginx-a#policyTypes:启用的是入站规则还是出站规则,只有Ingress表示只定义入站规则policyTypes:- Ingress#ingress:入站规则ingress:#允许哪些客户端可以访问- from:#标签为app: netshoot-a的pod可以访问- podSelector:matchLabels:app: netshoot-aports:#可以访问TCP协议为80的端口- protocol: TCPport: 80

NetworkPolicy应用案例

准备环境

创建两个命名空间

kubectl create ns ns-a
kubectl create ns ns-b

每个命名空间跑个nginx用于测验

nginx-a

[root@k8smaster network]# cat ns-a-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-anamespace: ns-a
spec:selector:matchLabels:app: nginx-atemplate:metadata:labels:app: nginx-aspec:containers:- name: nginx-aimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.14.2ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-anamespace: ns-a
spec:selector:app: nginx-aports:- protocol: TCPport: 80targetPort: 80

nginx-b

[root@k8smaster network]# cat ns-b-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-bnamespace: ns-b
spec:selector:matchLabels:app: nginx-btemplate:metadata:labels:app: nginx-bspec:containers:- name: nginx-bimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.14.2ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-bnamespace: ns-b
spec:selector:app: nginx-bports:- protocol: TCPport: 80targetPort: 80

每个命名空间创建个测试客户端用于访问

netshoot-a

[root@k8smaster network]# cat netshoot-a.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: netshoot-anamespace: ns-a
spec:selector:matchLabels:app: netshoot-areplicas: 1template:metadata:labels:app: netshoot-aspec:containers:- name: pod1image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nicolaka/netshoot:v0.13imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"] # 容器启动后保持运行状态

netshoot-b

[root@k8smaster network]# cat netshoot-b.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: netshoot-bnamespace: ns-b
spec:selector:matchLabels:app: netshoot-breplicas: 1template:metadata:labels:app: netshoot-bspec:containers:- name: pod1image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nicolaka/netshoot:v0.13imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"] # 容器启动后保持运行状态

写入不同页面用于区分

kubectl -n ns-a exec -it nginx-a-7dc4fc6fdb-tq8jz  -- sh -c "echo nginx-a >/usr/share/nginx/html/index.html"
kubectl -n ns-b exec -it nginx-b-6bfcdf79d8-gl69j  -- sh -c "echo nginx-b >/usr/share/nginx/html/index.html"

默认情况下不同命名空间的Pod是可以互通的,例如ns-a的工具pod访问ns-b的nginx,ns-b的工具pod访问ns-a的nginx。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同命名空间入站策略

接下来通过配置networkpolicy策略来进行限制,例如ns-a的nginx只允许带有标签app: netshoot-a的pod访问80端口。

内容就是模版中的那个案例

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: networkpolicy-a  #规则名称namespace: ns-a   #指定网络策略在哪个命名空间
spec:#podSelector网络策略要应用到哪个pod上,通过标签的方式来控制pod,只能应用到和网络策略相同namespace的podpodSelector:#如果matchLabels下面没写标签,则应用网络策略到当前namespace下的所有podmatchLabels:#nginx-a:把网络策略应用到标签为app:nginx-a的pod上app: nginx-a#policyTypes:启用的是入站规则还是出站规则,只有Ingress表示只定义入站规则policyTypes:- Ingress#ingress:入站规则ingress:#允许哪些客户端可以访问- from:#标签为app: netshoot-a的pod可以访问- podSelector:matchLabels:app: netshoot-aports:#可以访问TCP协议为80的端口- protocol: TCPport: 80

规则加载后指定命名空间查看

kubectl get networkpolicy -n ns-a

在这里插入图片描述

这样规则就已经生效,可以再次测验查看效果。

ns-a的工具pod有app: netshoot-a的标签可以访问,ns-b的标签是app: netshoot-b不匹配所以无法访问。

在这里插入图片描述

结果就是ns-b的工具pod访问卡住直到超时,ns-a的工具pod不受影响。

跨命名空间入站策略

现在我们是想要netshoot-b这个ns-b的命名空间来访问nginx-a Pod,接下来我们继续修改networkpolicy文件配置

这个入站规则就相当于是白名单,默认只匹配自己命名空间下的pod,如果是跨命名空间,要先允许对应命名空间的流量进来,然后再通过标签的形式精准指定某个pod可以访问。

[root@k8smaster network]# cat networkpolicy-a.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: networkpolicy-a  #规则名称namespace: ns-a   #指定网络策略在哪个命名空间
spec:#podSelector网络策略要应用到哪个pod上,通过标签的方式来控制pod,只能应用到和网络策略相同namespace的podpodSelector:#如果matchLabels下面没写标签,则应用网络策略到当前namespace下的所有podmatchLabels:#nginx-a:把网络策略应用到标签为app:nginx-a的pod上app: nginx-a#policyTypes:启用的是入站规则还是出站规则,只有Ingress表示只定义入站规则policyTypes:- Ingress#ingress:入站规则ingress:#允许哪些客户端可以访问- from:#标签为app: netshoot-a的pod可以访问- podSelector:matchLabels:app: netshoot-aports:#可以访问TCP协议为80的端口- protocol: TCPport: 80- from:           #标签为app: netshoot-b的pod可以访问- podSelector:matchLabels:app: netshoot-bnamespaceSelector:matchLabels:kubernetes.io/metadata.name: ns-b  # 匹配netshoot-b所在的命名空间ports:#可以访问TCP协议为80的端口- protocol: TCPport: 80

改好之后查看规则是否生效

在这里插入图片描述

测验结果

在这里插入图片描述

全命名空间入站策略

例如只允许同命名空间Pod访问

[root@k8smaster network]# cat namespace-wide-policy.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: namespace-wide-policynamespace: ns-a  # 策略所在的命名空间
spec:# 关键:空的podSelector表示应用于ns-a中的所有PodpodSelector: {}  # 不指定任何标签,匹配所有PodpolicyTypes:- Ingressingress:- from:# 只允许同一命名空间内的Pod访问- podSelector: {}  # 匹配当前命名空间(ns-a)的所有Pod

查看策略是否生效

在这里插入图片描述

配置之后在此命名空间的所有Pod都会生效,但之前我们配置的NetworkPolicy-a已经允许netshoot-b访问,所以现在也是可以访问的。

因为入站规则就相当于是白名单,可以在此基础上继续增加,匹配这个入站规则的流量就会进入,不匹配才会拒绝。

先删除掉NetworkPolicy-a策略,然后测验

kubectl delete  networkpolicy networkpolicy-a  -n ns-a

在这里插入图片描述

把规则删除后netshoot-b就不能访问nginx-a了,现在把规则NetworkPolicy-a加上再次测验。

在这里插入图片描述

跨命名空间出站策略

使用方法也类似,在policyTypes启用出站策略,然后配置规则。

例如允许出站规则netshoot-a工具访问ns-b的nginx-b策略

[root@k8smaster network]# cat netshoot-a-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: netshoot-a-egressnamespace: ns-a  # 策略应用在ns-a命名空间
spec:# 目标Pod:ns-a中标签为app: netshoot-a的PodpodSelector:matchLabels:app: netshoot-apolicyTypes:- Egress  # 仅启用出站规则控制egress:- to:# 目标条件1:匹配ns-b命名空间- namespaceSelector:matchLabels:kubernetes.io/metadata.name: ns-b  # 匹配ns-b命名空间# 目标条件2:该命名空间中标签为app: nginx-b的PodpodSelector:matchLabels:app: nginx-b# 限制端口:仅允许访问TCP 80端口ports:- protocol: TCPport: 80

应用查看是否生效

在这里插入图片描述

进行测验

在这里插入图片描述

可以看到netshoot-a不能访问ns-a命名空间的nginx-a,但可以访问ns-b的nginx-b,这就是策略已经生效

NetworkPolicy注意事项

NetworkPolicy使用时要注意调用顺序,NetworkPolicy要应用到某个符合标签的Pod或命名空间上,这样互相匹配后才会绑定生效。

允许哪些pod或者命名空间入站或者出站的设置,关于对端的标签也要核对匹配,出现不相同的情况不会生效。

然后在NetworkPolicy中设置的规则是针对这个Pod或者命名空间的,入站就是允许谁来访问自己,出站就是允许自己来访问谁。

入站和出站可以同时启用,根据实际情况和自己的需求来更改这些配置。

http://www.dtcms.com/a/315526.html

相关文章:

  • ubuntu24中部署k8s 1.30.x-底层用docker
  • 本机部署K8S集群
  • 基于k8s环境下的pulsar常用命令(下)
  • 查看部署在K8S服务的资源使用情况
  • docker构建镜像并运行容器详细过程
  • HTML总结全览
  • JDK安装教程
  • 机器学习 集成学习之随机森林
  • 攻击实验(ARP欺骗、MAC攻击、报文洪水攻击、DNS欺骗)
  • 调用com对象的坑
  • 自由学习记录(77)
  • 【递归完全搜索】USACO Bronze 2023 January - 牛栏降温 IIAir Cownditioning II
  • 水库安全“守护者”:智能雨水情监测预报系统
  • 联发科芯片组曝高危漏洞:越界写入缺陷危及智能手机与物联网设备安全
  • 论文阅读笔记:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》
  • table行内--图片预览--image
  • 防御保护07-08
  • 2025年服务器漏洞生存指南:从应急响应到长效免疫的实战框架
  • 多层Model更新多层ListView
  • 4. 什么是字节码采用字节码的好处是什么
  • avue---upload 图片上传
  • 南柯电子|直流电机EMC整改:从干扰源到解决方案的实战指南
  • DHCP 握手原理
  • Laravel The requested URL /hellowzy was not found on this server. 404 问题的解决
  • gRPC Keepalive 机制详解与最佳实践
  • 本地部署文档管理平台 BookStack 并实现外部访问( Windows 版本)
  • C# LINQ(标准询运算符)
  • Windows 电脑远程访问,ZeroTier 实现内网穿透完整指南(含原理讲解)
  • 汽车OBD定位器:即插即用车辆管理省心又实用
  • CodeBuddy IDE 使用测评——半小时做一个web可视化数据工具