Cilium系列-14-Cilium NetworkPolicy 简介
系列文章
前言
今天我们进入 Cilium 安全相关主题, 介绍 Kubernetes 网络策略以及 CiliumNetworkPolicies 额外支持的内容。
网络策略(NetworkPolicy)的类型
默认情况下,Kubernetes 集群中的所有 pod 都可被其他 pod 和网络端点访问。
网络策略允许用户定义 Kubernetes 集群允许哪些流量, 禁止哪些流量。传统的防火墙是根据源或目标 IP 地址和端口来配置允许或拒绝流量的(五元组),而 Cilium 则使用 Kubernetes 的身份信息(如标签选择器、命名空间名称,甚至是完全限定的域名)来定义允许和不允许的流量规则。这样,网络策略就能在 Kubernetes 这样的动态环境中运行,因为在这种环境中,IP 地址会随着不同 pod 的创建和销毁而不断被使用和重复使用。
在 Kubernetes 上运行 Cilium 时,可以使用 Kubernetes 资源定义网络策略(networking.k8s.io/v1 NetworkPolicy)。Cilium Agent 将观察 Kubernetes API 服务器是否有网络策略更新,并加载必要的 eBPF 程序和 map,以确保实施所需的网络策略。启用 Cilium 的 Kubernetes 提供三种网络策略格式:
- 支持第 3 层和第 4 层策略的标准 Kubernetes NetworkPolicy 资源(标准的 Kubernetes NetworkPolicy, Kubernetes 开箱自带, 其他 CNI 如 Calico 也支持)
- 支持第 3、4 和 7 层(应用层)策略的 CiliumNetworkPolicy 资源(Cilium 专有的 CRD: CiliumNetworkPolicy)
- CiliumClusterwideNetworkPolicy 资源,用于指定适用于整个集群而非指定命名空间的策略(Cilium 专有的 CRD: CiliumClusterwideNetworkPolicy, 字面意思, 集群范围的网络策略, 甚至可以进行 Node 级别的网络策略限制.)
Cilium 支持同时使用所有这些策略类型。不过,在使用多种策略类型时应小心谨慎,因为在多种策略类型中理解所允许流量的完整集合可能会造成混乱。如果不密切注意,可能会导致意外的策略行为。因此, 推荐在 Cilium 中, 使用后两种资源.
这次我们主要关注 CiliumNetworkPolicy 资源,因为它代表了标准 Kubernetes NetworkPolicy 功能的超集。
NetworkPolicy 资源
NetworkPolicy 资源是 Kubernetes 的标准资源(networking.k8s.io/v1 NetworkPolicy),可让您在 IP 地址或端口级别(OSI模型第 3 层或第 4 层)控制流量。NetworkPolicy 的功能包括:
- 使用标签(label)匹配的 L3/L4 Ingress 和 Egress 策略
- 集群外部端点使用 IP/CIDR 的 L3 IP/CIDR Ingress 和 Egress 策略
- L4 TCP 和 ICMP 端口 Ingress 和 Egress 策略
Warning
NetworkPolicy 不适用于主机网络命名空间。启用主机网络的 Pod 不受网络策略规则的影响。
网络策略无法阻止来自 localhost 或来自其驻留的节点的流量。
CiliumNetWorkPolicy 资源
CiliumNetworkPolicy 是标准 NetworkPolicy 的扩展。CiliumNetworkPolicy 扩展了标准 Kubernetes NetworkPolicy 资源的 L3/L4 功能,并增加了多项功能:
- L7 HTTP 协议策略规则,将 Ingress 和 Egress 限制为特定的 HTTP 路径
- 支持 DNS、Kafka 和 gRPC 等其他 L7 协议
- 基于服务名称的内部集群通信 Egress 策略
- 针对特殊实体使用实体匹配的 L3/L4 Ingress 和 Egress 策略
- 使用 DNS FQDN 匹配的 L3 Ingress 和 Egress 策略
您可以在 Cilium 项目文档中找到针对几种常见用例的 CiliumNetworkPolicy YAML 清单的具体示例。
要读取网络策略的 YAML 定义并预测它将允许和拒绝哪些流量可能比较困难,而且要使策略精确地达到你想要的效果也并非易事。幸运的是,networkpolicy.io 上的可视化策略编辑器能让这一切变得更容易。
Networkpolicy.io 可视化策略编辑器
NetworkPolicy.io 策略编辑器为您提供了探索和制定 L3 和 L4 网络策略的绝佳方式,它以图形方式描述了一个群集,并让您为所需的网络策略类型选择正确的策略元素。策略编辑器支持标准的 Kubernetes NetworkPolicy 和 CiliumNetworkPolicy 资源。
截图如下:

在顶部,有一个交互式服务地图可视化,您可以用它来创建新策略。绿线表示当前策略定义允许的流量,红线表示拒绝的流量。您可以使用交互式服务地图用户界面配置针对群集内部端点或群集外部端点的入口和出口策略。
左下方是与上述服务地图描述相匹配的网络策略只读 YAML 描述。你可以选择查看标准的 Kubernetes NetworkPolicy 规范或 CiliumNetworkPolicy 规范。你还可以从这里下载策略,用 kubectl 将其应用到你的群集。你还可以上传两种格式的现有策略定义,策略编辑器会更新可视化服务地图表示法,以显示其工作原理。在服务地图用户界面中可视化策略的作用有助于确保策略规则按预期运行。您将有机会在本节后面的实验室中亲自试用 NetworkPolicy 编辑器。
在右下角,编辑器提供了一个教程界面,其中包含了一些常见的情况,可以帮助你思考如何制定策略。您还可以使用该区域上传 Hubble 流量,并根据 Hubble 观察到的情况生成网络策略。
实战
假设这样一个场景:
Kubernetes 集群有多个 NameSpace, 每一个 NameSpace 代表一个租户, 这些租户需要实现租户隔离, 即: 相互之间不可访问. 但是每个租户都允许:
- 来自 Ingress 的流量
- 来自互联网的流量
- 来自监控的抓取
那么策略应该如何设置?
允许来自 Ingress 的流量
NetWorkPolicy: allow-from-ingress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-ingress
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group: ingress
podSelector: {}
policyTypes:
- Ingress
说明如下:
- 通过 labels 匹配的 Ingress 所在的 NameSpace, 所以需要确保 Ingress 所在的 NameSpace 打上了
policy-group: ingress的标签.
策略可视化效果如下:

允许来自互联网的流量
Warning
出于安全考虑, 租户 NameSpace 应该只接收来自 Ingress 的业务流量, 而不应该直接允许来自互联网的流量.
本人建议不要启用这条策略.
NetworkPolicy: allow-from-outside
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: untitled-policy
spec:
podSelector: {}
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0
说明如下:
- cidr 按需调整.
策略可视化效果如下:

允许来自监控的流量
NetworkPolicy: allow-from-monitoring
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-monitoring
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group: monitoring
podSelector: {}
policyTypes:
- Ingress
说明如下:
- 通过 labels 匹配的 Ingress 所在的 NameSpace, 所以需要确保 Ingress 所在的 NameSpace 打上了
policy-group: monitoring的标签.
策略可视化效果如下:

允许同一 NameSpace 的流量
NetworkPolicy: allow-same-namespace
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
spec:
podSelector:
ingress:
- from:
- podSelector: {}
策略可视化效果如下:

合起来
把上面的都合起来, 具体如下:
NetworkPolicy: tenant-isolation
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
spec:
podSelector: {}
ingress:
- from:
- podSelector: {}
- from:
- namespaceSelector:
matchLabels:
policy-group: ingress
- from:
- ipBlock:
cidr: 0.0.0.0/0
- from:
- namespaceSelector:
matchLabels:
policy-group: monitoring
- from:
- podSelector: {}
policyTypes:
- Ingress
转换为 CiliumNetworkPolicy, 内容如下:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-same-namespace
spec:
endpointSelector: {}
ingress:
- fromEndpoints:
- {}
- fromEndpoints:
- matchLabels:
io.kubernetes.pod.namespace.labels.policy-group: ingress
- fromEndpoints:
- matchLabels:
io.kubernetes.pod.namespace.labels.policy-group: monitoring
- fromEntities:
- world
策略可视化效果如下:

总结
今天我们进入 Cilium 安全相关主题, 介绍 Kubernetes 网络策略以及 CiliumNetworkPolicies 额外支持的内容。介绍了一款好用的可视化 NetworkPolicy 编辑器: <networkpolicy.io>. 同时通过一个实用的"租户隔离"网络策略需求来进行演示.
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.
Cilium系列-14-Cilium NetworkPolicy 简介的更多相关文章
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...
- Java 集合系列 14 hashCode
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- Redis系列(一):Redis的简介与安装
原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...
- C#多线程编程系列(一)- 简介
目录 系列大纲 一.前言 二.目录结构 四.章节结构 五.相关链接 系列大纲 目前只整理到第二章,线程同步,笔者后面会慢慢更新,争取能把这本书中精华的知识都分享出来. C#多线程编程系列(一)- 简介 ...
- Chromium源码系列一:Chromium简介及源代码获取和编译
Chromium源码系列一:Chromium简介及源代码获取和编译 Chromium简介 Chromium是一个由Google主导开发的网页浏览器,以BSD许可证等多重自由版权发行并开放源代码.C ...
- SpringBoot系列之@PropertySource用法简介
SpringBoot系列之@PropertySource用法简介 继上篇博客:SpringBoot系列之@Value和@ConfigurationProperties用法对比之后,本博客继续介绍一下@ ...
- ThreeJS系列2_effect插件集简介( 3d, vr等 )
ThreeJS系列2_effect插件集简介( 3d, vr等 ) ThreeJS 官方案例中有一些 js库 可以替代 render 将场景中的物质变换为其他效果的物质 目录 ThreeJS系列2_e ...
- Spring系列14:IoC容器的扩展点
Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...
随机推荐
- 2020-10-09:假如我能拿到别人的URL,然后篡改数据(金额)发送给系统,如何避免这种事情的发生?
福哥答案2020-10-09:#福大大架构师每日一题# [此答案来自知乎:](https://www.zhihu.com/question/424764253) 这种敏感url一般都有安全机制的:1. ...
- 【Qt 6】读写剪贴板
剪贴板是个啥就不用多介绍了,最直观的功能是实现应用程序之间数据共享.就是咱们常说的"复制"."粘贴"功能. 在 Qt 中,QClipboard 类提供了相关 A ...
- 基于Sentinel自研组件的系统限流、降级、负载保护最佳实践探索
作者:京东物流 杨建民 一.Sentinel简介 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentinel 具有以下特征: 丰富的应用场景:秒 ...
- Element Cascader 级联选择器去除空叶子节点
此处以后端获取部门级联List为例 以下为数据结构 { data: { children: [ 0:{childre:[ 0:{}, 1:{} ]}, 1:{}, 2:{}, 3:{}, 4:{}, ...
- Python潮流周刊#6:Python 3.12 有我贡献的代码!
你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 首发于我的博客,https://pyt ...
- 2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。 现在,给定两个正整数 L 和 R (以字符串形式表示), 返回包含在范围 [L, R] 中
2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数. 现在,给定两个正整数 L 和 R (以字符串形式表示), 返回包含在范围 [L, R] 中 ...
- 分享6个SQL小技巧
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 简介 经常有小哥发出疑问,SQL还能这么写?我经常笑着回应,SQL确实可以这么写.其实SQL学起来简单,用起来也 ...
- Java Websocket 01: 原生模式 Websocket 基础通信
目录 Java Websocket 01: 原生模式 Websocket 基础通信 Java Websocket 02: 原生模式通过 Websocket 传输文件 Websocket 原生模式 原生 ...
- java中基本数据类型和包装数据类型
基本数据类型和包装数据类型在 Java 中有着重要的区别和联系,对于 Java 程序员来说,熟悉这两种数据类型的特点和使用方法是非常必要的. 基本数据类型 Java 中的基本数据类型一共有 8 种,分 ...
- 3. @RequestMapping注解
1. @RequestMapping 注解的功能 @RequestMapping 注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系. SpringMVC 接收到指定的请求 , ...