Cilium系列-14-Cilium NetworkPolicy 简介

cilium,系列,networkpolicy,简介 · 浏览次数 : 67

小编点评

**Cilium 网络策略和 NetworkPolicy 资源简介** **Cilium 网络策略** Cilium 网络策略是一种 Kubernetes 网络策略,它允许您定义哪些流量可进入和离开 Kubernetes 集群,哪些流量不可访问。 **NetworkPolicy 资源** NetworkPolicy 是一个 Kubernetes API 对象,它用于定义网络策略。网络Policy 允许您指定以下属性: * **apiGroup**:网络策略的 API 版本。 * **kind**:网络策略的类型。 * **metadata**:网络策略的元数据。 * **ingress**:网络策略的输入。 * **output**:网络策略的输出。 * **policyTypes**:网络策略允许的网络类型。 **CiliumNetworkPolicy 资源** CiliumNetworkPolicy 是一个扩展的 NetworkPolicy 类型,它支持用于定义安全策略的属性。 **租户隔离策略示例** 以下是一个租户隔离策略示例: ```yaml apiVersion: cilium.io/v2kind: CiliumNetworkPolicymetadata: name: allow-same-namespacespec: 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/v2kind: CiliumNetworkPolicymetadata: name: allow-same-namespacespec: 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策略可视化效果如下: ``` 该策略允许来自任何 namespace 的流量进入和离开容器,但不可访问任何来自互联网的流量。 **结论** Cilium 网络策略和 NetworkPolicy 资源是用于定义 Kubernetes 网络策略的强大工具。这些资源允许您创建安全策略,确保您的 Kubernetes 集群是安全的。

正文

系列文章

前言

今天我们进入 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 路径
  • 支持 DNSKafkagRPC 等其他 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 资源。

截图如下:

Networkpolicy.io

在顶部,有一个交互式服务地图可视化,您可以用它来创建新策略。绿线表示当前策略定义允许的流量,红线表示拒绝的流量。您可以使用交互式服务地图用户界面配置针对群集内部端点或群集外部端点的入口和出口策略。

左下方是与上述服务地图描述相匹配的网络策略只读 YAML 描述。你可以选择查看标准的 Kubernetes NetworkPolicy 规范或 CiliumNetworkPolicy 规范。你还可以从这里下载策略,用 kubectl 将其应用到你的群集。你还可以上传两种格式的现有策略定义,策略编辑器会更新可视化服务地图表示法,以显示其工作原理。在服务地图用户界面中可视化策略的作用有助于确保策略规则按预期运行。您将有机会在本节后面的实验室中亲自试用 NetworkPolicy 编辑器。

在右下角,编辑器提供了一个教程界面,其中包含了一些常见的情况,可以帮助你思考如何制定策略。您还可以使用该区域上传 Hubble 流量,并根据 Hubble 观察到的情况生成网络策略。

实战

假设这样一个场景:

Kubernetes 集群有多个 NameSpace, 每一个 NameSpace 代表一个租户, 这些租户需要实现租户隔离, 即: 相互之间不可访问. 但是每个租户都允许:

  1. 来自 Ingress 的流量
  2. 来自互联网的流量
  3. 来自监控的抓取

那么策略应该如何设置?

允许来自 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 的标签.

策略可视化效果如下:

allow-from-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 按需调整.

策略可视化效果如下:

allow-from-outside

允许来自监控的流量

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 的标签.

策略可视化效果如下:

allow-from-monitoring

允许同一 NameSpace 的流量

NetworkPolicy: allow-same-namespace

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-same-namespace
spec:
  podSelector:
  ingress:
  - from:
    - podSelector: {}

策略可视化效果如下:

allow-same-namespace

合起来

把上面的都合起来, 具体如下:

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

策略可视化效果如下:

tenant-isolation

总结

今天我们进入 Cilium 安全相关主题, 介绍 Kubernetes 网络策略以及 CiliumNetworkPolicies 额外支持的内容。介绍了一款好用的可视化 NetworkPolicy 编辑器: <networkpolicy.io>. 同时通过一个实用的"租户隔离"网络策略需求来进行演示.

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

与Cilium系列-14-Cilium NetworkPolicy 简介相似的内容:

Cilium系列-14-Cilium NetworkPolicy 简介

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 今天我们进入 Cilium 安全相关主题, 介绍 Kubernetes 网络策略以及 CiliumNetworkPolicies 额外支持的内容。 ## 网络策略(Netw

Cilium系列-1-Cilium特色 功能及适用场景

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## Cilium 简介 Cilium 是一个开源的云原生解决方案,用于提供、保护(安全功能)和观察(监控功能)工作负载之间的网络连接,由革命性的内核技术 **eBPF** 提供动力。

Cilium 系列-2-Cilium 快速安装

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 在本章中,我们将直接将 Cilium 安装到 Kubernetes 集群中。 在实验中,我们用到的组件及版本为: * Cilium 1.13.4 * K3s v1.26.6

Cilium 系列-3-Cilium 的基本组件和重要概念

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 安装完了,我们看看 Cilium 有哪些组件和重要概念。 ## Cilium 组件 如上所述,安装 Cilium 时,会安装几个运行组件(有些是可选组件), 它们各是什么用

Cilium系列-4-Cilium本地路由

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 在[前文](https://ewhisper.cn/posts/7030/)中我们提到, `cilium install` 默认安装后, Cilium 功能启用和禁用情况如

Cilium系列-5-Cilium替换KubeProxy

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提

Cilium系列-6-从地址伪装从IPtables切换为eBPF

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提

Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能。但是通过对 Cilium 不同模式的切换/功能的启用,可以进一步提升

Cilium系列-8-绕过 IPTables 连接跟踪

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提

Cilium系列-9-主机路由切换为基于 BPF 的模式

## 系列文章 * [Cilium 系列文章](https://ewhisper.cn/tags/Cilium/) ## 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提