3. 环境规划与资源隔离:基于 Kubernetes Namespace 的物理隔离 vs 基于 Label 的逻辑隔离,资源配额(ResourceQuota)配置
在多租户可观测性平台中,环境规划与资源隔离是保障数据安全、性能稳定与成本分摊的基石。Kubernetes 提供了两种核心隔离模式:基于 Namespace 的物理隔离与基于 Label 的逻辑隔离。前者通过独立的 API 对象与网络策略实现强边界,后者通过标签选择器实现灵活的软隔离。本章将深入对比两种模式的适用场景,并详细讲解 ResourceQuota 的配置策略。
3.1 隔离模式对比:物理隔离 vs 逻辑隔离
在可观测性场景中,隔离不仅涉及计算资源,还涉及数据存储、API 访问权限与监控指标的可视范围。下表从多个维度对比两种隔离模式:
| 维度 | Namespace 物理隔离 | Label 逻辑隔离 |
|---|---|---|
| 隔离粒度 | 强隔离,独立 API 端点与 DNS | 软隔离,共享 API 端点 |
| 网络策略 | 支持 NetworkPolicy 精细控制 | 依赖外部代理或服务网格 |
| 资源配额 | 原生 ResourceQuota 支持 | 需自定义配额控制器 |
| 可观测性数据 | 独立 Prometheus/Thanos 实例 | 共享实例 + 标签过滤 |
| 运维复杂度 | 较高,需管理多个实例 | 较低,集中管理 |
| 适用场景 | 金融、合规、强安全要求 | 开发测试、内部团队、成本敏感 |
实践建议:在可观测性平台中,推荐采用混合模式——核心生产环境使用 Namespace 物理隔离,非生产环境或内部团队使用 Label 逻辑隔离。这样既能满足合规要求,又能降低运维成本。
3.2 基于 Namespace 的物理隔离架构
物理隔离通过独立的 Namespace 为每个租户创建完整的 Kubernetes 资源边界。每个 Namespace 拥有独立的 ConfigMap、Secret、ServiceAccount 以及可观测性组件实例。下图展示了典型的多租户物理隔离架构:
关键优势:物理隔离模式下,一个租户的 Prometheus 实例故障不会影响其他租户;NetworkPolicy 可以精确控制跨 Namespace 的流量;ResourceQuota 确保单个租户不会耗尽集群资源。
3.3 基于 Label 的逻辑隔离架构
逻辑隔离通过 Kubernetes Label 和 Selector 实现租户资源的软划分。所有租户共享同一套可观测性基础设施,通过标签进行数据路由与权限控制。这种模式特别适合内部团队或开发测试环境。
风险提示:逻辑隔离模式下,如果 Prometheus 实例出现性能瓶颈或故障,所有租户都会受到影响。建议配合 Pod Anti-Affinity 和 Priority Class 来保障关键租户的服务质量。
3.4 ResourceQuota 配置实践
ResourceQuota 是 Kubernetes 原生资源隔离机制,用于限制 Namespace 级别的资源消耗。在可观测性场景中,需要为每个租户的 Namespace 配置合理的配额,防止单个租户的监控数据采集或查询行为影响整个集群。
3.4.1 核心 ResourceQuota 配置示例
apiVersion: v1
kind: ResourceQuota
metadata:
name: observability-quota
namespace: tenant-a
spec:
hard:
# 计算资源
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
# 存储资源
requests.storage: "100Gi"
persistentvolumeclaims: "5"
# 核心对象数量
pods: "20"
services: "10"
configmaps: "15"
secrets: "15"
# 可观测性专用
count/prometheuses.monitoring.coreos.com: "2"
count/alertmanagers.monitoring.coreos.com: "1"
count/grafanainstances.grafana.integreatly.org: "1"
3.4.2 参数调优建议
| 资源类型 | 推荐配额(小租户) | 推荐配额(大租户) | 调优依据 |
|---|---|---|---|
| requests.cpu | 2 核 | 8 核 | Prometheus 采集频率与指标基数 |
| requests.memory | 4 Gi | 32 Gi | WAL 大小与查询缓存 |
| pods | 10 | 50 | 监控组件 + 业务 Pod 数量 |
| persistentvolumeclaims | 3 | 10 | Prometheus TSDB + 日志存储 |
| count/prometheuses | 1 | 2 | 高可用副本数 |
3.4.3 配额监控与告警
ResourceQuota 本身不会触发告警,需要结合 Prometheus 和 kube-state-metrics 来监控配额使用率。以下是一个典型的告警规则:
groups:
- name: resourcequota-alerts
rules:
- alert: ResourceQuotaNearLimit
expr: |
kube_resourcequota{type="hard", resource="requests.cpu"}
- kube_resourcequota{type="used", resource="requests.cpu"}
< 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "Namespace {{ $labels.namespace }} CPU 配额即将耗尽"
description: "剩余 CPU 配额不足 0.5 核,当前使用率 {{ $value | humanizePercentage }}"
最佳实践:建议将 ResourceQuota 使用率指标纳入租户的 Grafana Dashboard,让租户自行监控配额消耗。同时设置 LimitRange 来约束单个 Pod 的资源范围,防止某个 Pod 过度占用配额。
3.5 隔离模式选择决策树
在实际项目中,选择哪种隔离模式取决于多个因素。以下决策树可以帮助你快速判断:
- 是否有合规/审计要求? → 是 → 选择 Namespace 物理隔离
- 租户数量是否超过 20 个? → 是 → 优先考虑 Label 逻辑隔离(降低运维成本)
- 是否需要跨租户数据聚合? → 是 → 选择 Label 逻辑隔离(共享 Thanos/Thanos Query)
- 租户间是否有严格的网络隔离需求? → 是 → 选择 Namespace 物理隔离 + NetworkPolicy
- 预算是否有限? → 是 → 选择 Label 逻辑隔离(节省资源开销)
最终建议:对于生产环境,推荐采用 Namespace 物理隔离 + 共享存储层 的混合架构。每个租户拥有独立的 Prometheus 和 Alertmanager,但共享 Thanos Receiver 和对象存储。这样既保证了数据隔离,又实现了长期存储的统一管理。