Pod 安全准入
Kubernetes v1.25 [稳定]
Kubernetes 的 Pod 安全标准 定义了 Pod 的不同隔离级别。这些标准使您可以以清晰、一致的方式定义希望如何限制 Pod 的行为。
Kubernetes 提供了一个内置的 *Pod 安全* 准入控制器 来强制执行 Pod 安全标准。Pod 安全限制在创建 Pod 时在 命名空间 级别应用。
内置 Pod 安全准入强制执行
本页是 Kubernetes v1.31 文档的一部分。如果您运行的是其他版本的 Kubernetes,请参阅该版本的文档。
Pod 安全级别
Pod 安全准入根据 Pod 安全标准 定义的三个级别对 Pod 的 安全上下文 和其他相关字段提出要求:privileged
、baseline
和 restricted
。请参阅 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.31).
#
# 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 通常是通过间接创建来创建的,方法是创建 工作负载对象,例如 部署 或 作业。工作负载对象定义了一个 *Pod 模板*,并且工作负载资源的 控制器 基于该模板创建 Pod。为了帮助尽早发现违规行为,审计和警告模式都将应用于工作负载资源。但是,enforce 模式**不会**应用于工作负载资源,而只应用于生成的 Pod 对象。
豁免
您可以定义对 Pod 安全强制执行的 *豁免*,以允许创建由于与给定命名空间关联的策略而原本会被禁止的 Pod。豁免可以在 准入控制器配置 中进行静态配置。
必须明确枚举豁免。满足豁免条件的请求将被 *忽略* 准入控制器(所有 enforce
、audit
和 warn
行为都将被跳过)。豁免维度包括
- 用户名:来自具有豁免身份验证(或模拟)用户名的用户的请求将被忽略。
- RuntimeClassNames:指定了豁免运行时类名的 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 迁移到内置 Pod 安全准入控制器。