4. Resource 模型基础:Kubernetes Resource 模型

Kubernetes 的一切皆资源(Resource)。Resource 模型是声明式 API 的核心,它定义了集群中所有可管理对象的类型、结构、状态与生命周期。在多租户隔离场景中,理解 Resource 模型是设计租户边界、配额控制与安全策略的前提。

本章聚焦 5 个最基础的 Resource 类型:Pod、Deployment、Service、ConfigMap 与 Secret。它们构成了绝大多数工作负载的骨架。

4.1 核心 Resource 概览

下表从作用域、是否命名空间级别、主要用途三个维度对比这 5 种 Resource:

Resource 类型 命名空间级别 主要用途 是否直接运行容器
Pod 是 最小调度单元,运行一个或多个容器 是
Deployment 是 声明式管理 Pod 副本、滚动更新与回滚 否(管理 Pod)
Service 是 提供稳定的网络端点与负载均衡 否
ConfigMap 是 存储非敏感配置数据(键值对或文件) 否
Secret 是 存储敏感数据(密码、、证书) 否
关键认知:Pod 是“活的”计算单元,Deployment 是“控制器”,Service 是“网络抽象”,ConfigMap 与 Secret 是“数据注入层”。在多租户隔离中,这 5 种 Resource 的 RBAC 权限、NetworkPolicy 与 ResourceQuota 通常需要分别配置。

4.2 Pod:最小调度单元

Pod 是 Kubernetes 中可创建和管理的最小部署单元。一个 Pod 可以包含一个或多个容器(Sidecar 模式),这些容器共享同一个网络命名空间、存储卷与生命周期。

Pod 的核心属性:

  • 共享网络:Pod 内所有容器共享同一个 IP 地址和端口空间,通过 localhost 互相通信。
  • 共享存储:通过 Volume 挂载,Pod 内容器可以共享持久化数据。
  • 生命周期短暂:Pod 被设计为“可抛弃的”,不会自愈,通常由控制器(如 Deployment)管理。
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  namespace: tenant-a
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.25
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
多租户注意:Pod 的 spec.nodeName、hostNetwork、hostPID 等字段在共享集群中应严格限制,防止租户突破节点隔离。建议通过 PodSecurityPolicy 或 OPA Gatekeeper 禁止非特权租户使用这些字段。

4.3 Deployment:声明式 Pod 管理

Deployment 是 Kubernetes 中最常用的工作负载控制器。它通过 ReplicaSet 管理 Pod 的期望状态,支持滚动更新、回滚、水平扩缩容。

Deployment 的核心能力:

  • 声明式更新:修改 Pod template 后,Deployment 自动执行滚动更新策略。
  • 回滚:保留历史版本(默认 10 个),支持快速回退到任意旧版本。
  • 副本管理:确保指定数量的 Pod 始终运行。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: tenant-a
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
最佳实践:在多租户环境中,Deployment 的 spec.replicas 应受 ResourceQuota 的 count/pods 限制。同时,建议为每个租户的 Deployment 设置 spec.strategy.rollingUpdate.maxSurge 和 maxUnavailable,避免更新时资源突发。

4.4 Service:稳定的网络抽象

Pod 的 IP 地址是动态的,Pod 重启或迁移后 IP 会变化。Service 为后端 Pod 提供稳定的虚拟 IP(ClusterIP)和 DNS 名称,并实现负载均衡。

Service 的四种类型:

类型 访问范围 典型场景
ClusterIP 集群内部 微服务间内部通信
NodePort 集群外部(通过节点 IP + 端口) 开发测试环境暴露服务
LoadBalancer 集群外部(通过云负载均衡器) 生产环境对外暴露服务
ExternalName 集群外部(通过 CNAME 映射) 将集群外服务映射为集群内 DNS
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: tenant-a
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP
多租户隔离要点:Service 的 spec.selector 决定了流量路由目标。在多租户集群中,务必确保不同租户的 Pod 标签不重叠,避免 Service 错误路由到其他租户的 Pod。建议使用租户专属命名空间 + 标签前缀策略。

4.5 ConfigMap 与 Secret:配置与敏感数据注入

ConfigMap 和 Secret 用于将配置数据与容器镜像解耦。它们可以被 Pod 通过环境变量或Volume 挂载的方式消费。

两者的核心区别:

特性 ConfigMap Secret
数据存储 明文(Base64 编码仅用于 YAML 传输) Base64 编码,支持 etcd 加密
典型内容 配置文件、环境变量、命令行参数 密码、API 、SSH 密钥、TLS 证书
大小限制 1 MiB(etcd 限制) 1 MiB(etcd 限制)
访问控制 标准 RBAC 标准 RBAC + 可选的静态加密 + 审计
# ConfigMap 示例
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: tenant-a
data:
  app.properties: |
    log.level=INFO
    max.connections=100
  APP_ENV: production

---
# Secret 示例
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
  namespace: tenant-a
type: Opaque
data:
  username: YWRtaW4=        # admin
  password: cGFzc3dvcmQxMjM=  # password123
安全警告:Secret 的 Base64 编码不是加密。在多租户集群中,必须启用 etcd 加密(--encryption-provider-config),并严格限制 Secret 的 RBAC 权限(get/list/watch)。建议使用外部密钥管理服务(如 HashiCorp Vault)集成 CSI Secret Store Driver。

4.6 Resource 模型关系图

下图展示了 5 种核心 Resource 之间的依赖与数据流关系:

Kubernetes 核心 Resource 关系图 Kubernetes 核心 Resource 关系图 租户命名空间边界 (Namespace: tenant-a) Deployment 声明式 Pod 管理 ReplicaSet 副本控制 Pod 容器运行单元 Service 稳定网络端点 ConfigMap 非敏感配置 Secret 敏感数据 管理 控制 选择器匹配 注入配置 注入敏感数据 说明 • Deployment 管理 ReplicaSet • ReplicaSet 控制 Pod 副本数 • Service 通过标签选择器 将流量路由到 Pod • ConfigMap/Secret 注入 Pod

4.7 多租户视角的 Resource 模型要点

在多租户隔离集群中,上述 Resource 模型需要额外关注以下约束:

  1. 命名空间隔离:所有 Resource 必须归属于某个命名空间,不同租户使用不同命名空间。
  2. ResourceQuota:限制每个租户的 Pod 数量、CPU/内存总量、ConfigMap/Secret 数量等。
  3. NetworkPolicy:控制 Pod 之间的网络通信,默认拒绝跨租户流量。
  4. RBAC:租户只能操作自己命名空间内的 Resource,不能查看或修改其他租户的 Resource。
  5. PodSecurityPolicy:限制 Pod 的安全上下文(如特权模式、hostPath 挂载)。
课程实践提示:在后续章节中,我们将基于本章的 Resource 模型,构建一个完整的“多租户隔离集群模板蓝图”。届时会演示如何通过 YAML 模板 + Kustomize 或 Helm,为每个租户自动生成隔离的 Deployment、Service、ConfigMap 与 Secret。