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