Kubernetes: NetworkPolicy 的实践应用
一、Network Policy 是什么,在云原生领域有和作用
Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范,用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。
NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用户提供了几点最常用的能力
- 容器网络的出入网管控,最常用的就是控制业务的对公网访问
- 不同业务直接的网络资源隔离,随着集群规模的变大,不可避免的会存在多租户的场景,不同租户之间的网络隔离 network policy 可以做到
- 云原生领域的安全演练能力,例如模拟某些网络异常,可以直接通过NetworkPolicy 功能实现
二、Network Policy 和容器网络关系
云原生领域经过多年的发展,上层的应用各种服务层出不穷,作为云原生底层的基础服务,容器网络也面临更多安全和网络管控的需求。比如在大规模集群中不同业务希望互相禁止访问,一些内部服务希望禁止公网访问或被公网访问。kubernetes 对应这些类似需求给出的解决方案就是 Network Policy 。Network Policy 的实现依赖于容器网络,但是因为不同的 CNI 技术方案和组网方式的不同,Network Policy 实现方式也是不同的,所以 kubernetes 官方只给出了一个 Network Policy 的格式规范,并没有给出具体的实现方案,示例如下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test-network-policynamespace: default
spec:podSelector:matchLabels:role: dbpolicyTypes:- Ingress- Egressingress:- from:- ipBlock:cidr: 172.17.0.0/16except:- 172.17.1.0/24- namespaceSelector:matchLabels:project: myproject- podSelector:matchLabels:role: frontendports:- protocol: TCPport: 6379egress:- to:- ipBlock:cidr: 10.0.0.0/24ports:- protocol: TCPport: 5978
三、Kubernetes 原生的Network Policy
kubernetes 原生的 Network Policy 功能相对简单只支持 namespace 级别,功能且相对简单,支持 L3 和 L4 基础的网络策略。
3.1 匹配规则
- Ingress : 顾名思义,外部流量流入 Pod
ingress:-from:-ipBlock:
cidr: 172.17.0.0/16
except:- 172.17.1.0/24-namespaceSelector:
matchLabels:
project: myproject-podSelector:
matchLabels:
role: frontend
ports:-protocol: TCP
port: 6379
Ingress 通过 From 关键字来配置规则,可以通过ipBlock、namespaceSelector、podSelector、Ports 来选择该策略所使用的对象。
podSelector:此选择器将在与 NetworkPolicy 相同的 namespace 中选择特定的 Pod,应将其允许作为入站流量来源或出站流量目的地。
namespaceSelector:此选择器将选择特定的 namespace,应将所有 Pod 用作其入站流量来源或出站流量目的地。
namespaceSelector 和 podSelector:一个指定 namespaceSelector 和 podSelector 的 to/from 条目选择特定 namespace 中的特定 Pod。
Egress: Pod 的出向流量
Egress 匹配策略和 ingress 基本一致,只是from 字段改为to
3.2 官方案例
- 默认拒绝所有的入站流量,在 default namespace 下生效
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: default-deny-ingress
spec:podSelector: {}policyTypes:- Ingress
- 允许所有入站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-all-ingress
spec:podSelector: {}ingress:- {}policyTypes:- Ingress
- 默认拒绝所有的出站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: default-deny-egress
spec:podSelector: {}policyTypes:- Egress
- 允许所有出站
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-all-egress
spec:podSelector: {}egress:- {}policyTypes:- Egress
- 默认拒绝所有的入站和出站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: default-deny-all
spec:podSelector: {}policyTypes:- Ingress- Egress
四、开源组件拓展Network Policy
kubernetes 提供的原生的Network Policy 所能实现的功能相对较少,很难满足日益复杂的容器网络管控需求,所以各家CNI 基本上都有自己标准的Network Policy
4.1 Calico Network Policy
Calico 的Network Policy 相较于Kubernetes 原生的Network Policy 有两点需要特别注意,第一个是增加了集群级别的网络策略,第二个是对于流量的处理处理正常的allow 和 deny 还多了一个log 用来记录被network policy 匹配到的流量 注:这里只介绍Calico 开源版本,企业版本的calico 不在本文的介绍范围内。
- 集群级别的网络策略 相较于k8s 原生的namespace 级别的网络策略,集群级别网络策略是一种非namespace 资源,可以应用于独立于命名空间的任何类型的端点(pod、VM、主机接口)。
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:name: allow-tcp-port-6379
- 标准的Calico Network Policy 在以下示例中,传入到应用程序的 TCP 流量被拒绝,并且每个连接尝试都记录到系统日志中
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:name: allow-tcp-6379namespace: production
spec:selector: role == 'database'types:- Ingress- Egressingress:- action: Logprotocol: TCPsource:selector: role == 'frontend'- action: Denyprotocol: TCPsource:selector: role == 'frontend'
4.2 Cilium Network Policy
Cilium CNI 提供的Network Policy 的功能相对较多,它不仅支持3层、四层、7层,同时还支持通过自定义实体身份来选择Network Policy 生效位置
4.2.1 三层Network Policy
****Cilium 的 Network Policy 支持多种模式,这里只选两个经典的来介绍
4.2.1.1 基于 ipBlock
此示例显示所有含 app=myservice 的 Pod 访问 20.1.1.1/32 和除了 10.96.0.0/12 所有 10.0.0.0/8 范围的地址
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:name: "cidr-rule"
spec:endpointSelector:matchLabels:app: myServiceegress:- toCIDR:- 20.1.1.1/32- toCIDRSet:- cidr: 10.0.0.0/8except:- 10.96.0.0/12
4.2.1.2 基于 DNS 下面的示例表示,允许 default namespace 下标签为 app=test-app 的 pod 向 kube-system namespace 下标签为 k8s:k8s-app=kube-dns 的 pod 的 53 端口发送请求”my-remote-service.com“的域名解析请求
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:name: "to-fqdn"
spec:endpointSelector:matchLabels:app: test-appegress:- toEndpoints:- matchLabels:"k8s:io.kubernetes.pod.namespace": kube-system"k8s:k8s-app": kube-dnstoPorts:- ports:- port: "53"protocol: ANYrules:dns:- matchPattern: "*"- toFQDNs:- matchName: "my-remote-service.com"
4.2.2 四层的Cilium Network Policy
四层的网络策略和 K8S 原生的规范除个别字段名称之外基本一致,所以只给出一个基本的例子 以下规则限制所有具有app=myService标签的 pod 只能使用端口 80-444 上的 TCP 向任何第 3 层目的地发送数据包:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:name: "l4-port-range-rule"
spec:endpointSelector:matchLabels:app: myServiceegress:- toPorts:- ports:- port: "80"endPort: 444protocol: TCP
4.2.3 七层的Cilium Network Policy
7层的Network Policy 目前支持的有 HTTP 协议,Kafka 相关以及DNS相关
// L7Rules is a union of port level rule types. Mixing of different port
// level rule types is disallowed, so exactly one of the following must be set.
// If none are specified, then no additional port level rules are applied.
type L7Rules struct {// HTTP specific rules.//// +optionalHTTP []PortRuleHTTP `json:"http,omitempty"`// Kafka-specific rules.//// +optionalKafka []PortRuleKafka `json:"kafka,omitempty"`// DNS-specific rules.//// +optionalDNS []PortRuleDNS `json:"dns,omitempty"`
}
4.2.3.1 HTTP 相关的L7 Network Policy
http 相关的NetworkPolicy 可以匹配path、method、host、headers 等信息,使用起来非常灵活
- 基于 url& path
下面的例子允许从带有“env=prod”标签的 Pod 到带有“app=service”标签的 Pod 的 GET 请求访问 URL /public,但对其他任何 URL 或使用其他方法的请求将被拒绝。除端口 80 以外的其他端口上的请求将被丢
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:name: "rule1"
spec:description: "Allow HTTP GET /public from env=prod to app=service"endpointSelector:matchLabels:app: serviceingress:- fromEndpoints:- matchLabels:env: prodtoPorts:- ports:- port: "80"protocol: TCPrules:http:- method: "GET"path: "/public"
- 基于 path & method & header
下面的例子限制了所有带有标签“app=myService”的 Pod 只能通过 TCP 协议接收端口 80 上的数据包。在使用这个端口进行通信时,仅允许以下两个 API :GET /path1 和 PUT /path2,并且必须在 HTTP 头“X-My-Header”中设置值为 true。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:name: "l7-rule"
spec:endpointSelector:matchLabels:app: myServiceingress:- toPorts:- ports:- port: '80'protocol: TCPrules:http:- method: GETpath: "/path1$"- method: PUTpath: "/path2$"headers:- 'X-My-Header: true'
4.2.3.2 KafKa相关的L7 Network Policy(beta) • 允许使用“produce” role 创建 topic
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:name: "rule1"
spec:description: "enable empire-hq to produce to empire-announce and deathstar-plans"endpointSelector:matchLabels:app: kafkaingress:- fromEndpoints:- matchLabels:app: empire-hqtoPorts:- ports:- port: "9092"protocol: TCPrules:kafka:- role: "produce"topic: "deathstar-plans"- role: "produce"topic: "empire-announce"
• 允许使用 apiKeys 生成 topic
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:name: "rule1"
spec:description: "enable empire-hq to produce to empire-announce and deathstar-plans"endpointSelector:matchLabels:app: kafkaingress:- fromEndpoints:- matchLabels:app: empire-hqtoPorts:- ports:- port: "9092"protocol: TCPrules:kafka:- apiKey: "apiversions"- apiKey: "metadata"- apiKey: "produce"topic: "deathstar-plans"- apiKey: "produce"topic: "empire-announce"
4.2.3.3 DNS 相关的L7 Network Policy
下面的示例表示,允许 default namespace 下标签为 org=alliance 的 pod 向 kube-system namespace 下标签为 k8s:k8s-app=kube-dns 的 pod 的 53 端口发送请求”my-remote-service.com“的域名解析请求,允许的域名为 cilium.io *. cilium.io .api.cilium.io 同时允许 cilium.io sub.cilium.io service1.api.cilium.io specialservice.api.cilium.io 的外部请求
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:name: "tofqdn-dns-visibility"
spec:endpointSelector:matchLabels:any:org: allianceegress:- toEndpoints:- matchLabels:"k8s:io.kubernetes.pod.namespace": kube-system"k8s:k8s-app": kube-dnstoPorts:- ports:- port: "53"protocol: ANYrules:dns:- matchName: "cilium.io"- matchPattern: "*.cilium.io"- matchPattern: "*.api.cilium.io"- toFQDNs:- matchName: "cilium.io"- matchName: "sub.cilium.io"- matchName: "service1.api.cilium.io"- matchPattern: "special*service.api.cilium.io"toPorts:- ports:- port: "80"protocol: TCP
4.2.4 集群联邦(Cluster Federation)的Cilium Network Policy
kubernetes 在 1.8 版本起就声称单个集群最多可支持 5000 个 node 和 15 万个 Pod,但是实际上我们关注近几年互联网上因为服务崩溃而上的几次热搜就应该明白,大规模集群一旦底层组件出现异常,带来的影响是非常大的。这个时候我们就需要用到集群联邦(Cluster Federation)。有了集群联邦,同样就需要考虑联邦级别的 Network Policy ,恰巧 Cilium 就提供了对应的这一能力。 以下策略说明如何允许特定 pod 在两个集群之间进行通信。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:name: "allow-cross-cluster"
spec:description: "Allow x-wing in cluster1 to contact rebel-base in cluster2"endpointSelector:matchLabels:name: x-wingio.cilium.k8s.policy.cluster: cluster1egress:- toEndpoints:- matchLabels:name: rebel-baseio.cilium.k8s.policy.cluster: cluster2
相关文章:
Kubernetes: NetworkPolicy 的实践应用
一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范,用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...
HTML5滑块(Slider)
HTML5 的滑块(Slider)控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例: <…...
数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)
编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...
洪水灾害多智能体分布式模拟示例代码
1. 环境定义:支持灾害动态、地理数据和分布式架构 import numpy as np import random import matplotlib.pyplot as plt# 新疆主要城市及邻接关系 XINJIANG_CITIES {Urumqi: [Changji, Shihezi],Changji: [Urumqi, Shihezi, Turpan],Shihezi: [Urumqi, Changji, K…...
【前端】Node.js使用教程
目录 一、?Node.js开发环境和编译 1.1 安装Node.js 1.2 创建一个Node.js项目 1.3 编写Node.js程序 1.4 运行Node.js程序 1.5 使用Node.js模块 二、高级的Node.js编程概念和示例 2.1 异步编程 2.2 错误处理 2.3 网络请求 2.4 构建Web服务器 2.5 数据库交互 三、No…...
django33全栈班2025年004 录入数据
前言 通过前面的学习, 我们已经算是Python基本入门了. 如果你能熟练的掌握的话, 至少让你换台电脑, 在新电脑上搭建Python的开发环境肯定是没问题的. 我们呢也学习了第一行Python代码, 但是我们不知道这行代码是什么意思, 为什么能够运行, 怎么就能输出到控制台呢? 还有, …...
小白投资理财 - 看懂 EPS 每股收益
小白投资理财 - 看懂 EPS 每股收益 什么是 EPSEPS 缺陷EPS 优点EPS 跟自己比EPS 跟别人比 总结 投资一家公司就要选择会赚钱的公司,我们最为关心的莫过于公司的盈利能力,只有会下蛋的鸡才是好鸡,买股票为的就是获得利润。想成为一位成功的投资…...
Pandas-apply自定义函数
文章目录 一. Series的apply方法1. 一个元素一个元素的传入2. apply传入一个参数函数2.apply传入多个参数函数 二. DataFrame的apply方法1. axis参数指定按行/ 按列(默认)传入数据2. apply使用 三. apply 使用案例1. 栗子12. 栗子2-列3. 栗子3-行 四. 向量化函数1. 使用np.vect…...
github 项目分享
今天和大家分享一些github上面搜到关于卫星遥感和水环境相关的项目。 一、WaterDetect 使用端到端算法去识别水体范围的算法,针对哨兵2卫星遥感数据可用。 项目地址: https://github.com/cordmaur/WaterDetect 二、DeepWaterMap 深度卷积神经网络去…...
与你共度的烟火日常
见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... 我和她一起收拾完屋子,忙完已经中午了。她说:“咱们去趟超市吧&…...
基于Python的社交音乐分享平台
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Kafka的acks机制和ISR列表
Kafka 是一个流行的分布式流处理平台,用于构建实时数据流管道和应用程序。在 Kafka 中,acks 机制和 ISR(In-Sync Replicas)列表是两个重要的概念,它们共同确保消息的持久性和可靠性。 acks 机制 acks 机制是 Kafka 生…...
FreeRTOS: ISR(中断服务例程)和 TCB(任务控制块)
在讨论 ISR(中断服务例程)和 TCB(任务控制块,Task Control Block)时,我们实际上是在探讨 FreeRTOS 中两个不同但又相互关联的概念:一个是用于处理硬件或软件触发的中断事件,另一个是…...
【Spring】Spring DI(依赖注入)详解—自动装配—byType实现原理
一、引言 依赖注入(Dependency Injection, DI)是Spring框架的核心特性之一,它通过控制反转(Inversion of Control, IoC)来管理对象的生命周期和依赖关系。在实际应用中,DI不仅提高了代码的可维护性和可测试…...
015-spring-动态原理、AOP的xml和注解方式
强制使用cglib动态代理 spring-AOP的使用...
linux更换yum源
1.备份系统源文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2.下载国内的yum源到/etc/yum.repos.d/CentOS-Base.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo如无法使用wget命令也可以…...
跨年战揭开本地生活新赛季:美团、抖音和快手争夺冰雪经济
元旦将至,冬季文旅消费渐至高潮。 2024年的文旅消费市场延续了去年冰雪游的热度,不断创下年内话题和热度新高。美团旅行数据显示,12月以来,雪场夜滑搜索热度同比增长65%,TOP5搜索城市分别是北京、乌鲁木齐、张家口、吉…...
文件传输工具FTransferor<优化篇>
在上一篇文章中,我们详细探讨了FTransferor文件传输工具的设计与实现,并展示了它在局域网文件传输方面的高效性。然而,随着互联网应用场景的不断丰富,传统的基于 TCP/UDP 的传输方式已经无法满足部分开发者的需求。特别是在跨平台…...
【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )
17个Apache SeaTunnel案例下载见附件! 开发篇 1.Apache SeaTunnel——OLAP 引擎的数据动脉 1.1项目定位——EtLT 时代的新一代数据集成平台 1.2Apache SeaTunnel 核心功能 1.3Apache SeaTunnel 在 OLAP 场景下的应用 1.4WhaleTunnel 产品特性 2.教你从头到尾开发一…...
【每日学点鸿蒙知识】子窗口方向、RichEdit不居中、本地资源缓存给web、Json转对象丢失方法、监听状态变量数组中内容改变
1、HarmonyOS 应用新建子窗口设置显示方向未生效? 子窗口getPreferredOrientation获取到的是横向 设置没问题,但是ui显示还是纵向的 直接设置主窗口的方向即可。参考demo: import window from ohos.window;Entry Component struct Index {…...
从Excel到预测:5分钟搞定Python读取本地iris.csv文件并完成分类
从Excel到预测:5分钟搞定Python读取本地iris.csv文件并完成分类 当你第一次接触机器学习时,最令人沮丧的往往不是算法本身,而是那些看似简单却总出问题的数据准备环节。我至今记得自己对着一个简单的CSV文件折腾了整个下午的狼狈经历——列名…...
半波整流电路:从原理到实践,掌握AC-DC转换基础
1. 项目概述:从交流到直流的第一步在电子电路的世界里,我们常常需要将交流电(AC)转换为直流电(DC),这个过程我们称之为“整流”。而半波整流电路,可以说是所有整流电路中最基础、最经…...
从MSP430到MSPM0L1306:嵌入式工程迁移实战与SDK应用指南
1. 项目概述:从零理解MSPM0L1306的工程迁移最近在帮一个朋友处理一个老项目升级,核心需求是把一个基于TI老款MSP430系列MCU的温控器,迁移到TI新推出的MSPM0L1306这颗芯片上。朋友的原话是:“老芯片快买不到了,新出的MS…...
中间件简单题目教学
题目1:环境搭建与简单模式使用 Docker 启动 RabbitMQ 4.x 容器,用户 guest,密码 123456,映射管理端口 15672。编写 Java 原生生产者,向队列 test_queue 发送消息 "Hello Exam"。编写 Java 原生消费者&#x…...
STM32F103驱动TM1650数码管:从硬件连接到完整代码的保姆级避坑指南
STM32F103驱动TM1650数码管:从硬件连接到完整代码的保姆级避坑指南 第一次接触STM32F103和TM1650数码管模块时,我像大多数嵌入式新手一样,以为按照教程连接几根线、复制几段代码就能轻松点亮数码管。直到实际动手才发现,从硬件连接…...
Perplexity被操控?数据溯源能力全解析,3类高危误判场景+实时交叉验证方案
更多请点击: https://kaifayun.com 第一章:Perplexity被操控?数据溯源能力全解析,3类高危误判场景实时交叉验证方案 Perplexity 作为语言模型评估与推理可信度的关键指标,正面临日益隐蔽的数据污染与人为诱导风险。当…...
Envoy 详解:云原生时代的高性能网络代理
Envoy 详解:云原生时代的高性能网络代理 文章目录Envoy 详解:云原生时代的高性能网络代理前言核心特性架构与设计哲学核心组件与术语xDS 协议:动态配置的基石主要使用场景与其他代理的对比(Envoy vs Nginx)部署模式与未…...
4种颠覆性组合:重构Pixelle-Video的模块化潜能
4种颠覆性组合:重构Pixelle-Video的模块化潜能 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 想象一下:输入&qu…...
TruckSim 仿真工作流实战:从参数修改到结果对比
1. TruckSim仿真工作流基础入门 第一次打开TruckSim时,很多新手会被复杂的界面吓到。其实只要掌握几个核心概念,就能快速上手这个强大的车辆动力学仿真工具。我刚开始使用时也走过不少弯路,现在把这些经验分享给大家。 TruckSim的工作流可以简…...
当AI开始‘看图说话’打假:多模态谣言检测是怎么一步步进化到att-RNN的?
多模态谣言检测的技术演进:从关键词匹配到att-RNN的跨越 社交媒体上每天产生数十亿条内容,其中夹杂着大量真假难辨的信息。传统的人工审核早已无法应对这种规模的信息洪流,而AI技术正逐步成为平台内容治理的核心工具。特别是在视觉内容占比越…...
