Pod 安全准入
Kubernetes v1.25 [稳定]
Kubernetes Pod 安全标准 为 Pod 定义了不同的隔离级别。这些标准允许你以清晰、一致的方式定义如何限制 Pod 的行为。
Kubernetes 提供了一个内置的 **Pod 安全** 准入控制器 来实施 Pod 安全标准。Pod 安全限制在 Pod 创建时应用于 命名空间 级别。
内置 Pod 安全准入实施
此页面是 Kubernetes v1.34 文档的一部分。如果你运行的是不同版本的 Kubernetes,请查阅该版本的文档。
Pod 安全级别
Pod 安全准入根据 Pod 安全标准 定义的三个级别(privileged
、baseline
和 restricted
)对 Pod 的 安全上下文 和其他相关字段提出要求。有关这些要求的深入了解,请参阅 Pod 安全标准 页面。
命名空间的 Pod 安全准入标签
一旦启用该功能或安装了 webhook,你就可以配置命名空间来定义每个命名空间中 Pod 安全性要使用的准入控制模式。Kubernetes 定义了一组 标签,你可以设置这些标签来定义要用于命名空间的预定义 Pod 安全标准级别。你选择的标签定义了在检测到潜在违规时 控制面 将采取的行动。
模式 | 描述 |
---|---|
enforce(强制) | 策略违规将导致 Pod 被拒绝。 |
audit(审计) | 策略违规将触发在 审计日志 中记录的事件中添加审计注解,但其他方面仍然允许。 |
warn(警告) | 策略违规将触发用户可见的警告,但其他方面仍然允许。 |
一个命名空间可以配置任何或所有模式,甚至可以为不同的模式设置不同的级别。
对于每种模式,都有两个标签决定了所使用的策略
# The per-mode level label indicates which policy level to apply for the mode.
#
# MODE must be one of `enforce`, `audit`, or `warn`.
# LEVEL must be one of `privileged`, `baseline`, or `restricted`.
pod-security.kubernetes.io/<MODE>: <LEVEL>
# Optional: per-mode version label that can be used to pin the policy to the
# version that shipped with a given Kubernetes minor version (for example v1.34).
#
# MODE must be one of `enforce`, `audit`, or `warn`.
# VERSION must be a valid Kubernetes minor version, or `latest`.
pod-security.kubernetes.io/<MODE>-version: <VERSION>
查看 使用命名空间标签强制执行 Pod 安全标准 以查看示例用法。
工作负载资源和 Pod 模板
Pod 通常是通过创建 工作负载对象(例如 Deployment 或 Job)间接创建的。工作负载对象定义了一个 Pod 模板,并且工作负载资源的 控制器 根据该模板创建 Pod。为了帮助及早发现违规,审计和警告模式都应用于工作负载资源。但是,强制模式 不 适用于工作负载资源,仅适用于生成的 Pod 对象。
豁免
你可以定义 Pod 安全强制执行的 豁免,以允许创建原本会因给定命名空间关联的策略而被禁止的 Pod。豁免可以在 准入控制器配置 中静态配置。
豁免必须明确列举。符合豁免条件的请求会被准入控制器 忽略(所有 enforce
、audit
和 warn
行为都会跳过)。豁免维度包括:
- 用户名: 来自具有豁免认证(或模拟)用户名的用户的请求将被忽略。
- RuntimeClassName: 指定豁免运行时类名的 Pod 和 工作负载资源 将被忽略。
- 命名空间: 位于豁免命名空间中的 Pod 和 工作负载资源 将被忽略。
注意
大多数 Pod 都是由控制器响应 工作负载资源 创建的,这意味着豁免最终用户只会使他们在直接创建 Pod 时免于强制执行,但不会在创建工作负载资源时免除。控制器服务账号(例如system:serviceaccount:kube-system:replicaset-controller
)通常不应豁免,因为这样做会隐式豁免任何可以创建相应工作负载资源的用户。以下 Pod 字段的更新不受策略检查的豁免,这意味着如果 Pod 更新请求只更改这些字段,即使 Pod 违反了当前策略级别,也不会被拒绝。
- 任何元数据更新,**除了** seccomp 或 AppArmor 注解的更改
seccomp.security.alpha.kubernetes.io/pod
(已废弃)container.seccomp.security.alpha.kubernetes.io/*
(已废弃)container.apparmor.security.beta.kubernetes.io/*
(已废弃)
.spec.activeDeadlineSeconds
的有效更新.spec.tolerations
的有效更新
指标
以下是 kube-apiserver 暴露的 Prometheus 指标:
pod_security_errors_total
:此指标表示阻止正常评估的错误数量。非致命错误可能导致使用最新的受限配置文件进行强制执行。pod_security_evaluations_total
:此指标表示已发生的策略评估数量,不包括导出期间忽略或豁免的请求。pod_security_exemptions_total
:此指标表示豁免请求的数量,不包括忽略或超出范围的请求。
下一步
如果你运行的是旧版本的 Kubernetes 并希望升级到不包含 PodSecurityPolicies 的 Kubernetes 版本,请阅读 从 PodSecurityPolicy 迁移到内置 PodSecurity 准入控制器。