Cilium 系列 -14-Cilium NetworkPolicy 简介

简介: 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 路径
  • 支持 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
YAML

说明如下:

  • 通过 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
YAML

说明如下:

  • 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
YAML

说明如下:

  • 通过 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: {}
YAML

策略可视化效果如下:

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
YAML

转换为 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
YAML

策略可视化效果如下:

tenant-isolation

总结

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s网络插件—Cilium
【K8S系列】深入解析k8s网络插件—Cilium
3179 1
|
前端开发 网络协议 Dubbo
超详细Netty入门,看这篇就够了!
本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。
96080 33
超详细Netty入门,看这篇就够了!
|
Kubernetes 负载均衡 安全
Cilium使用 (Cilium 3)
Cilium使用 (Cilium 3)
585 6
|
4月前
|
XML 弹性计算 数据库
2026阿里云服务器发票开具全流程指南与常见问题解答
在阿里云平台购买服务器后,开具发票是财务报销与成本核算的关键环节。阿里云支持电子发票与纸质发票两种形式,开票流程需遵循 “实名认证与抬头一致” 原则,不同认证类型(个人 / 企业)在开票权限、流程上存在差异。本文结合官方最新规则,详细拆解开票全流程,并解答税率、抬头修改、报销有效性等常见问题,帮助用户高效完成开票操作。
|
9月前
|
Web App开发 Linux 虚拟化
Omnissa Horizon 8 2506 (8.16) - 虚拟桌面基础架构 (VDI) 和应用软件
Omnissa Horizon 8 2506 (8.16) - 虚拟桌面基础架构 (VDI) 和应用软件
460 0
Omnissa Horizon 8 2506 (8.16) - 虚拟桌面基础架构 (VDI) 和应用软件
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
1265 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)