1. 课程导论:为什么需要跨命名空间网络策略?Helm 在其中的角色

1.1 从单命名空间到多命名空间:网络隔离的演进

在 Kubernetes 集群中,命名空间(Namespace)是资源隔离的基本单元。早期实践通常将整个应用部署在单一命名空间内,网络策略(NetworkPolicy)只需管理 Pod 之间的入站(Ingress)和出站(Egress)规则。然而,随着微服务架构的普及和团队职责的划分,多命名空间部署成为标准模式:

  • 环境隔离:dev、staging、prod 分别使用独立命名空间。
  • 团队边界:不同业务线(如支付、用户、订单)拥有各自的命名空间。
  • 安全合规:敏感服务(如数据库、密钥管理)必须与前端服务严格隔离。

这种架构带来了一个核心挑战:跨命名空间的 Pod 通信必须被显式控制。默认情况下,Kubernetes 集群内所有 Pod 可以互相通信(扁平网络),这显然不符合最小权限原则。网络策略(NetworkPolicy)正是解决这一问题的原生机制,但手动编写跨命名空间的 YAML 规则极易出错且难以维护。

关键洞察:跨命名空间网络策略不是简单的“允许所有”或“拒绝所有”,而是需要精确描述“哪个命名空间中的哪些 Pod,可以访问目标命名空间中的哪些 Pod 的哪些端口”。这种规则一旦超过 10 条,人工管理将变得不可持续。

1.2 跨命名空间网络策略的核心要素

一个典型的跨命名空间 NetworkPolicy 包含以下关键字段:

字段 作用 跨命名空间场景下的特殊要求
podSelector 选择目标命名空间内的目标 Pod 通常使用标签选择器,而非 Pod 名称
namespaceSelector 选择源或目标命名空间 必须与 podSelector 配合使用,不能单独生效
ipBlock 基于 CIDR 的 IP 范围控制 不推荐用于跨命名空间场景(IP 易变)
policyTypes 指定策略类型(Ingress / Egress) 跨命名空间通常需要同时定义双向规则
ports 限制允许的端口和协议 必须明确指定,避免开放所有端口

以下是一个允许 frontend 命名空间中带有 app: web 标签的 Pod 访问 backend 命名空间中带有 app: api 标签的 Pod 的 80 端口的策略示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: backend
spec:
  podSelector:
    matchLabels:
      app: api
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: frontend
          podSelector:
            matchLabels:
              app: web
      ports:
        - protocol: TCP
          port: 80
常见陷阱:namespaceSelector 和 podSelector 在同一 from 条目中时,它们是“与”关系(AND),即同时满足两个条件。如果希望“或”关系(OR),需要拆分为多个 from 条目。这一细节在跨命名空间策略中极易被忽略。

1.3 Helm 在跨命名空间网络策略中的角色

Helm 作为 Kubernetes 的包管理器,在跨命名空间网络策略管理中扮演三个关键角色:

  1. 模板化与参数化:将命名空间名称、标签选择器、端口号等可变部分抽象为 values.yaml 中的参数,避免硬编码。
  2. 依赖管理与发布顺序:通过 Helm Chart 的依赖机制,确保网络策略在目标服务部署之前或同时被应用。
  3. 多环境一致性:同一套 Chart 模板,通过不同的 values 文件适配 dev/staging/prod 环境,减少重复劳动。

下图展示了 Helm 如何将抽象的 Chart 模板转化为具体的跨命名空间网络策略资源:

Helm 将 Chart 模板渲染为跨命名空间 NetworkPolicy Helm Chart 模板 templates/networkpolicy.yaml values.yaml Chart.yaml Helm 渲染引擎 模板函数 + 参数注入 依赖解析 + 发布顺序 渲染后的资源 NetworkPolicy (ns: backend) NetworkPolicy (ns: frontend) NetworkPolicy (ns: shared) + 关联的 Service/Deployment Helm 在跨命名空间策略中的关键能力 • 参数化命名空间:通过 .Values.sourceNamespace 和 .Values.targetNamespace 动态生成策略 • 标签选择器模板化:使用 tpl 函数将 values 中的标签表达式注入模板 • 依赖顺序控制:通过 helm dependency 确保网络策略先于工作负载部署 • 多 Chart 协同:一个 Chart 发布网络策略,另一个 Chart 发布应用,通过 Helm 仓库统一管理

1.4 不使用 Helm 的痛点对比

为了更直观地理解 Helm 的价值,下表对比了手动管理跨命名空间网络策略与使用 Helm 管理的差异:

维度 手动 YAML 管理 Helm Chart 管理
命名空间硬编码 每个策略文件写死命名空间名称,环境切换需全局替换 通过 --set namespace=prod 一行命令切换
标签选择器复用 相同标签逻辑在多个策略中重复编写 定义一次 _helpers.tpl,全局引用
版本控制与回滚 依赖 Git 提交记录,回滚需手动 revert helm rollback 一键回滚到任意历史版本
多环境差异 维护 dev/staging/prod 三套 YAML 副本 一套模板 + 三份 values 文件
依赖顺序 手动确保网络策略先于 Pod 创建 Helm 依赖图自动保证顺序
审计与合规 人工审查 YAML 变更 Helm 发布历史 + 策略模板自动化审查

1.5 本课程的学习路径

本课程将围绕以下主线展开:

  • 基础篇(第 2-5 章):深入理解 NetworkPolicy 的 API 语义、跨命名空间选择器的工作原理、以及 Helm Chart 的基本结构。
  • 实战篇(第 6-15 章):从零构建一个跨命名空间的网络策略 Chart,涵盖参数化设计、依赖管理、多环境配置、CI/CD 集成。
  • 进阶篇(第 16-25 章):处理复杂场景——双向策略、大规模集群的性能优化、审计日志、与 Service Mesh 的协同。
  • 案例篇(第 26-30 章):真实企业案例:多租户 SaaS 平台的网络隔离、金融级合规策略、以及故障排查手册。
学习建议:如果你对 Kubernetes 网络策略的基础概念尚不熟悉,建议先阅读第 2 章“NetworkPolicy 核心概念回顾”作为热身。如果你已经具备一定经验,可以直接从第 6 章开始动手构建 Chart。