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 控制资源上限,三者共同构成运行基线。

Kubernetes 基线配置三大策略协同关系 Kubernetes 命名空间基线配置协同图 命名空间:production Pod Security Standards enforce / warn / audit NetworkPolicy Ingress / Egress 规则 ResourceQuota CPU / 内存 / 对象数 安全上下文 网络隔离 Pod 运行基线 = 安全等级 + 网络白名单 + 资源上限 三者同时生效,缺一不可 LimitRange(默认资源限制) 配合使用

2.6 初始配置检查清单

  1. PSS 标签:为每个命名空间设置 pod-security.kubernetes.io/warn 和 audit 标签,观察一周后启用 enforce。
  2. 默认拒绝 NetworkPolicy:创建 default-deny-all 策略,再按需添加白名单规则。
  3. ResourceQuota 硬限制:设置 CPU/Memory 的 requests 和 limits 上限,同时限制 Pod/Service/PVC 数量。
  4. LimitRange 默认值:为未设置资源限制的 Pod 提供默认 request 和 limit,避免被 ResourceQuota 拒绝。
  5. 验证工具:使用 kubectl describe quota、kubectl get networkpolicy、kubectl describe ns 确认配置生效。
生产环境警告: 切勿在已有大量工作负载的命名空间直接启用 enforce=restricted 或创建全拒绝 NetworkPolicy,可能导致关键服务中断。建议先在测试命名空间验证策略兼容性。