2. Kubernetes 集群基线配置:Pod安全策略(PSP/PSS)、网络策略(NetworkPolicy)、资源配额(ResourceQuota)的初始配置
Kubernetes 集群的基线配置是保障多租户隔离、资源公平调度与网络安全的第一道防线。本章聚焦三大核心策略组件:Pod 安全策略(PSP/PSS)、网络策略(NetworkPolicy) 与 资源配额(ResourceQuota)。初始配置阶段需要明确策略的生效范围、默认行为以及常见陷阱,避免因配置遗漏导致的安全漏洞或资源争抢。
2.1 三大策略组件概览
| 策略类型 | 作用域 | 核心目标 | K8s 版本演进 |
|---|---|---|---|
| PodSecurityPolicy (PSP) | 集群级别(已弃用) | 控制 Pod 安全上下文(特权、Capabilities、卷类型等) | v1.21 弃用,v1.25 移除 |
| Pod Security Standards (PSS) | 命名空间级别(Admission Controller) | 按 privileged / baseline / restricted 三级准入控制 | v1.23 稳定版(推荐替代 PSP) |
| NetworkPolicy | 命名空间级别(需 CNI 插件支持) | 定义 Pod 间、Pod 与外部服务的网络访问规则 | v1.3+ 稳定版 |
| ResourceQuota | 命名空间级别 | 限制命名空间内 CPU/内存/PVC/对象数量的总上限 | v1.0+ 稳定版 |
迁移提示: 若集群版本 ≥ v1.25,PSP 已被完全移除,必须使用 PSS + OPA/Gatekeeper 或 Kyverno 实现细粒度安全控制。本课程以 PSS 作为安全基线配置标准。
2.2 Pod 安全标准(PSS)初始配置
PSS 通过 PodSecurity Admission Controller 在命名空间级别实施三种安全等级。初始配置推荐采用 warn + audit 模式逐步收紧,避免直接 enforce 导致已有工作负载被拒绝。
2.2.1 命名空间标签配置
# 为命名空间设置 PSS 标签(baseline 等级,warn + audit 模式)
kubectl label ns production \
pod-security.kubernetes.io/enforce=baseline \
pod-security.kubernetes.io/enforce-version=v1.28 \
pod-security.kubernetes.io/warn=baseline \
pod-security.kubernetes.io/audit=baseline
# 查看命名空间 PSS 状态
kubectl get ns production -o yaml | grep pod-security
2.2.2 三种等级对比
| 等级 | 特权容器 | hostPID / hostNetwork | Capabilities | 卷类型限制 |
|---|---|---|---|---|
| privileged | 允许 | 允许 | 无限制 | 无限制 |
| baseline | 禁止 | 禁止 | 仅允许 NET_BIND_SERVICE | 允许 hostPath 等(需显式声明) |
| restricted | 禁止 | 禁止 | 仅允许 NET_BIND_SERVICE | 禁止 hostPath,仅允许 PVC/ConfigMap/Secret |
常见陷阱: 若命名空间同时存在 enforce 和 warn 标签,enforce 会直接拒绝违反策略的 Pod,warn 仅产生告警。初始配置建议先使用
warn=baseline 观察一周,再切换为 enforce=baseline。
2.3 网络策略(NetworkPolicy)初始配置
NetworkPolicy 默认允许所有流量,必须显式创建策略才能实现隔离。初始配置阶段应遵循 默认拒绝 + 白名单放行 原则。
2.3.1 默认拒绝所有入站/出站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
# 无 ingress 和 egress 规则,即拒绝所有流量
2.3.2 白名单放行示例:允许前端访问后端
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
关键检查点:
- 确认 CNI 插件支持 NetworkPolicy(Calico / Cilium / Weave Net 等)。
- 默认 deny 策略必须放在所有白名单策略之前创建,避免窗口期流量泄露。
- Egress 策略需考虑 DNS 解析(通常放行 UDP 53 到 kube-dns)。
2.4 资源配额(ResourceQuota)初始配置
ResourceQuota 防止单个命名空间耗尽集群资源。初始配置需同时设置 计算资源配额 与 对象数量配额。
2.4.1 完整 ResourceQuota 示例
apiVersion: v1
kind: ResourceQuota
metadata:
name: production-quota
namespace: production
spec:
hard:
# 计算资源
requests.cpu: "8"
requests.memory: "16Gi"
limits.cpu: "16"
limits.memory: "32Gi"
# 存储资源
requests.storage: "100Gi"
persistentvolumeclaims: "10"
# 对象数量
pods: "50"
services: "10"
configmaps: "20"
secrets: "20"
replicationcontrollers: "10"
resourcequotas: "1"
2.4.2 配额生效验证
# 查看命名空间当前资源使用量
kubectl describe quota production-quota -n production
# 输出示例(部分):
# Name: production-quota
# Namespace: production
# Resource Used Hard
# -------- --- ---
# requests.cpu 2 8
# requests.memory 4Gi 16Gi
# pods 12 50
最佳实践: 初始配额建议设置为集群总容量的 60%~70%,预留缓冲空间。同时配合 LimitRange 设置默认 request/limit,避免未设置资源限制的 Pod 被 ResourceQuota 拒绝。
2.5 基线配置关系图
下图展示了三大策略在命名空间内的协同关系:PSS 控制 Pod 安全上下文,NetworkPolicy 控制网络访问,ResourceQuota 控制资源上限,三者共同构成运行基线。
2.6 初始配置检查清单
- PSS 标签:为每个命名空间设置
pod-security.kubernetes.io/warn和audit标签,观察一周后启用enforce。 - 默认拒绝 NetworkPolicy:创建
default-deny-all策略,再按需添加白名单规则。 - ResourceQuota 硬限制:设置 CPU/Memory 的 requests 和 limits 上限,同时限制 Pod/Service/PVC 数量。
- LimitRange 默认值:为未设置资源限制的 Pod 提供默认 request 和 limit,避免被 ResourceQuota 拒绝。
- 验证工具:使用
kubectl describe quota、kubectl get networkpolicy、kubectl describe ns确认配置生效。
生产环境警告: 切勿在已有大量工作负载的命名空间直接启用
enforce=restricted 或创建全拒绝 NetworkPolicy,可能导致关键服务中断。建议先在测试命名空间验证策略兼容性。