3. K8s多租户隔离策略:Namespace隔离、网络策略、资源配额、Pod安全策略在多租户中的应用
在多租户Kubernetes集群中,隔离是保障租户间安全与公平的首要任务。本章深入剖析四种核心隔离机制:Namespace(逻辑边界)、NetworkPolicy(网络隔离)、ResourceQuota(资源公平)与Pod Security Policy / Pod Security Admission(工作负载安全)。这四层策略共同构建了纵深防御体系,确保租户A的流量不会意外到达租户B,租户C的突发负载不会挤占租户D的资源。
3.1 Namespace:多租户的逻辑边界
Namespace是Kubernetes多租户隔离的第一道防线。它为每个租户提供一个独立的虚拟集群,租户只能看到和操作自己Namespace内的资源(Pod、Service、ConfigMap等)。
- 资源命名隔离:不同Namespace允许同名资源共存,避免命名冲突。
- 权限边界:RBAC规则绑定到Namespace级别,租户无法跨Namespace操作。
- 资源配额作用域:ResourceQuota和LimitRange绑定到特定Namespace,实现资源公平。
{tenant-id}-{environment} 格式,例如 acme-prod、acme-staging。避免使用 default Namespace承载租户工作负载。
3.2 NetworkPolicy:微隔离与流量控制
Namespace提供了逻辑边界,但默认情况下,不同Namespace的Pod可以互相通信。NetworkPolicy实现了微隔离,通过标签选择器定义Pod级别的入站(Ingress)和出站(Egress)规则。
| 策略类型 | 作用方向 | 典型场景 |
|---|---|---|
| Ingress | 控制进入Pod的流量 | 只允许同Namespace的Pod访问数据库Pod |
| Egress | 控制Pod发出的流量 | 只允许应用Pod访问特定外部API,禁止访问互联网 |
| 双向 | 同时控制入站和出站 | 租户间完全隔离,禁止跨Namespace通信 |
以下是一个典型的租户隔离NetworkPolicy示例,它拒绝所有来自其他Namespace的入站流量,仅允许同Namespace内的通信:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-cross-namespace
namespace: tenant-a
spec:
podSelector: {} # 匹配该Namespace下所有Pod
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: tenant-a
3.3 ResourceQuota & LimitRange:资源公平与限制
资源隔离不仅关乎安全,还关乎公平性。一个租户的突发负载不应导致其他租户的服务降级。ResourceQuota和LimitRange是Kubernetes提供的资源管理工具。
- ResourceQuota: 为Namespace设置聚合资源上限(CPU、内存、PVC数量、Service数量等)。
- LimitRange: 为Namespace内的每个Pod或容器设置默认资源请求/限制,防止单个Pod占用过多资源。
以下是一个完整的ResourceQuota配置示例:
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-quota
namespace: tenant-a
spec:
hard:
requests.cpu: "8"
requests.memory: "32Gi"
limits.cpu: "16"
limits.memory: "64Gi"
persistentvolumeclaims: "10"
pods: "50"
services: "20"
secrets: "20"
configmaps: "20"
3.4 Pod Security:工作负载安全策略
Pod Security是保障租户工作负载安全运行的最后一道防线。它通过限制Pod的运行时行为(如特权模式、主机网络、卷类型、用户ID等),防止恶意或配置不当的Pod破坏宿主机或影响其他租户。
Kubernetes从v1.25开始使用Pod Security Admission (PSA)替代了旧的PodSecurityPolicy (PSP)。PSA定义了三个安全标准:
| 标准级别 | 安全强度 | 典型限制 | 适用场景 |
|---|---|---|---|
| Privileged | 低 | 无限制,允许特权容器、hostNetwork、hostPID等 | 系统组件、监控Agent、需要特殊权限的Pod |
| Baseline | 中 | 禁止特权容器、禁止hostPID/IPC、限制hostPort | 大多数普通应用Pod |
| Restricted | 高 | Baseline基础上,强制非root用户、只读根文件系统、禁止Seccomp未设置 | 高安全要求的金融、医疗应用 |
通过Namespace标签启用PSA:
apiVersion: v1
kind: Namespace
metadata:
name: tenant-a
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: latest
pod-security.kubernetes.io/audit: baseline
pod-security.kubernetes.io/warn: baseline
audit 或 warn 模式观察现有Pod的合规情况,再逐步切换到 enforce 模式。
3.5 四层隔离策略协同工作
在实际多租户环境中,这四层策略需要协同工作,形成完整的隔离矩阵:
下表总结了每层隔离策略的职责与覆盖范围:
| 隔离层 | API资源 | 隔离对象 | 绕过风险 |
|---|---|---|---|
| Namespace | Namespace | 资源命名、权限边界 | ClusterRole绑定到所有Namespace |
| NetworkPolicy | NetworkPolicy | Pod网络流量 | CNI不支持NetworkPolicy |
| ResourceQuota | ResourceQuota, LimitRange | CPU、内存、存储、对象数量 | 未配置LimitRange导致单个Pod超配 |
| Pod Security | PodSecurity Admission | Pod运行时安全配置 | 使用Privileged级别且未审计 |