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 的包管理器,在跨命名空间网络策略管理中扮演三个关键角色:
- 模板化与参数化:将命名空间名称、标签选择器、端口号等可变部分抽象为 values.yaml 中的参数,避免硬编码。
- 依赖管理与发布顺序:通过 Helm Chart 的依赖机制,确保网络策略在目标服务部署之前或同时被应用。
- 多环境一致性:同一套 Chart 模板,通过不同的 values 文件适配 dev/staging/prod 环境,减少重复劳动。
下图展示了 Helm 如何将抽象的 Chart 模板转化为具体的跨命名空间网络策略资源:
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。