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 以及可观测性组件实例。下图展示了典型的多租户物理隔离架构:

基于 Namespace 的物理隔离架构 基于 Namespace 的物理隔离架构 租户 A Namespace Prometheus Server (独立实例) Alertmanager (独立告警规则) Grafana (独立数据源) NetworkPolicy (入站/出站规则) ResourceQuota (CPU/内存/存储) 租户 B Namespace Prometheus Server (独立实例) Alertmanager (独立告警规则) Grafana (独立数据源) NetworkPolicy (入站/出站规则) ResourceQuota (CPU/内存/存储) 共享基础设施 Thanos Receiver (全局聚合层) MinIO / S3 (长期存储桶) Kubernetes API (RBAC 鉴权) 说明:每个租户拥有独立的 可观测性组件实例,共享 Thanos 与对象存储层
关键优势:物理隔离模式下,一个租户的 Prometheus 实例故障不会影响其他租户;NetworkPolicy 可以精确控制跨 Namespace 的流量;ResourceQuota 确保单个租户不会耗尽集群资源。

3.3 基于 Label 的逻辑隔离架构

逻辑隔离通过 Kubernetes Label 和 Selector 实现租户资源的软划分。所有租户共享同一套可观测性基础设施,通过标签进行数据路由与权限控制。这种模式特别适合内部团队或开发测试环境。

基于 Label 的逻辑隔离架构 基于 Label 的逻辑隔离架构 共享可观测性栈(单一 Namespace) Prometheus Server 标签路由:tenant=team-a 标签路由:tenant=team-b Grafana 数据源标签过滤 Dashboard 权限控制 Alertmanager 告警规则标签匹配 接收者按租户路由 租户 A 资源:Deployment / Service / Pod 标签:tenant=team-a, env=prod 租户 B 资源:Deployment / Service / Pod 标签:tenant=team-b, env=staging 说明:所有租户共享同一套可观测性组件,通过标签(tenant=team-a, tenant=team-b)实现数据隔离与权限控制 优点:资源利用率高,运维简单;缺点:故障半径大,隔离性弱
风险提示:逻辑隔离模式下,如果 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 隔离模式选择决策树

在实际项目中,选择哪种隔离模式取决于多个因素。以下决策树可以帮助你快速判断:

  1. 是否有合规/审计要求? → 是 → 选择 Namespace 物理隔离
  2. 租户数量是否超过 20 个? → 是 → 优先考虑 Label 逻辑隔离(降低运维成本)
  3. 是否需要跨租户数据聚合? → 是 → 选择 Label 逻辑隔离(共享 Thanos/Thanos Query)
  4. 租户间是否有严格的网络隔离需求? → 是 → 选择 Namespace 物理隔离 + NetworkPolicy
  5. 预算是否有限? → 是 → 选择 Label 逻辑隔离(节省资源开销)
最终建议:对于生产环境,推荐采用 Namespace 物理隔离 + 共享存储层 的混合架构。每个租户拥有独立的 Prometheus 和 Alertmanager,但共享 Thanos Receiver 和对象存储。这样既保证了数据隔离,又实现了长期存储的统一管理。