本页面介绍如何在 Google Kubernetes Engine 中使用 PodSecurityPolicy。
概览
PodSecurityPolicy 是您创建的一种准入控制器资源,用于验证有关在集群上创建和更新 Pod 的请求。PodSecurityPolicy 定义了一组条件,Pod 必须满足这些条件才能被集群接受;如果创建或更新 Pod 的请求不符合 PodSecurityPolicy 中的条件,则系统将拒绝该请求并返回错误。
要使用 PodSecurityPolicy,必须先创建并定义新的和更新后的 Pod 必须满足的政策。然后,必须启用 PodSecurityPolicy 准入控制器,它根据所定义的政策验证创建和更新 Pod 的请求。
当多个 PodSecurityPolicy 可用时,准入控制器将使用第一个成功验证的政策。政策按字母顺序排列,控制器优先使用不可变政策(不更改 Pod 的政策),其次才是可变政策。
PodSecurityPolicy 可以在运行 Kubernetes 1.8.6 或更高版本的 GKE 集群中使用。
准备工作
在开始之前,请确保您已执行以下任务:
- 确保您已启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 确保您已安装 Cloud SDK。
使用以下任一方法设定默认的 gcloud
设置:
- 使用
gcloud init
(如果您想要在系统引导下完成默认设置)。 - 使用
gcloud config
(如果您想单独设置项目 ID、区域和地区)。
使用 gcloud init
如果您收到 One of [--zone, --region] must be supplied: Please specify
location
错误,请完成本部分。
-
运行
gcloud init
并按照说明操作:gcloud init
如果您要在远程服务器上使用 SSH,请使用
--console-only
标志来防止命令启动浏览器:gcloud init --console-only
-
按照说明授权
gcloud
使用您的 Google Cloud 帐号。 - 创建新配置或选择现有配置。
- 选择 Google Cloud 项目。
- 选择默认的 Compute Engine 区域。
使用 gcloud config
- 确保您了解如何在 GKE 中使用基于角色的访问权限控制。
定义 PodSecurityPolicy
您需要先在集群中定义 PodSecurityPolicy 资源,然后 PodSecurityPolicy 控制器才能验证 Pod 并允许其进入集群。
PodSecurityPolicy 指定一个列表,其中包含针对在此策略下创建的 Pod 的限制、要求和默认值。例如,限制特权容器、hostPath
卷和主机网络的使用,或者让所有容器默认通过 seccomp 配置文件运行。PodSecurityPolicy 准入控制器根据可用的 PodSecurityPolicy 验证请求。
以下示例 PodSecurityPolicy my-psp.yaml
会阻止创建特权 Pod。该政策还影响其他几个控制项,例如允许访问所有可用卷:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: my-psp
spec:
privileged: false # Prevents creation of privileged Pods
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
PodSecurityPolicy 规范可以为众多控制项提供保障。此示例中指定的控制项 seLinux
、supplementalGroups
、runAsUser
、fsGroup
均设置为 RunAsAny
,表示这些字段的所有有效值均可以与此政策结合使用。
如需详细了解 PodSecurityPolicy 及其控制项,请参阅 Kubernetes 文档中的“什么是 Pod 安全政策?”和政策参考。
您可以使用 kubectl
命令行工具创建此资源:
kubectl apply -f my-psp.yaml
如需查看配置 PodSecurityPolicy 的更多示例,请参阅 Kubernetes 文档的 PodSecurityPolicy 页面上的示例。
进行政策授权
具有 cluster-admin 角色的帐号可以使用基于角色的访问权限控制来创建 Role 或 ClusterRole,以便为所需服务帐号授予对 PodSecurityPolicy 的访问权限。ClusterRole 可进行集群级授权,而 Role 则可在您定义的命名空间内进行授权。
例如,以下 ClusterRole my-clusterrole.yaml
授予对 verb: use
所指示的 my-psp
PodSecurityPolicy 的访问权限:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my-clusterrole
rules:
- apiGroups:
- policy
resources:
- podsecuritypolicies
verbs:
- use
resourceNames:
- my-psp
运行以下命令可创建 ClusterRole:
kubectl apply -f my-clusterrole.yaml
创建 Role(或 ClusterRole)之后,可创建 RoleBinding(或 ClusterRoleBinding)资源将其与所需服务帐号关联起来。
以下 RoleBinding my-rolebinding.yaml
将 ClusterRole my-clusterrole
绑定到特定命名空间 my-namespace
中的服务帐号:
# Bind the ClusterRole to the desired set of service accounts.
# Policies should typically be bound to service accounts in a namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: my-rolebinding
namespace: my-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: my-clusterrole
subjects:
# Example: All service accounts in my-namespace
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:serviceaccounts
# Example: A specific service account in my-namespace
- kind: ServiceAccount # Omit apiGroup
name: default
namespace: my-namespace
在此 RoleBinding 中:
subjects
字段指定 ClusterRole 所绑定到的帐号。- 第一个主体是 Group
system:serviceaccounts
,它包含集群中的所有服务帐号。 - 第二个主体是单个 ServiceAccount
default
,它指定命名空间中的默认服务帐号。
运行以下命令可创建 RoleBinding:
kubectl apply -f my-rolebinding.yaml
要详细了解 RBAC,请参阅使用 RBAC 授权。
启用 PodSecurityPolicy 控制器
如需使用 PodSecurityPolicy 准入控制器,您必须创建新的集群或更新带有 --enable-pod-security-policy
标志的现有集群。
如需创建具有 PodSecurityPolicy 的新集群,请运行以下命令:
gcloud beta container clusters create cluster-name --enable-pod-security-policy
要更新现有集群,请运行以下命令:
gcloud beta container clusters update cluster-name --enable-pod-security-policy
停用 PodSecurityPolicy 控制器
运行以下命令即可停用 PodSecurityPolicy 控制器:
gcloud beta container clusters update cluster-name --no-enable-pod-security-policy
如果停用控制器,则集群会停止验证现有政策且不再将其设置为默认政策,但不会删除它们。而且,也不删除绑定。
使用 NetworkPolicy
如果您使用的是 NetworkPolicy 且有一个 Pod 受到 PodSecurityPolicy 的约束,请创建有权使用 PodSecurityPolicy 的 RBAC Role 或 ClusterRole。然后将 Role 或 ClusterRole 绑定到 Pod 的服务帐号。在这种情况下,为用户帐号授予权限是不够的。如需了解详情,请参阅进行政策授权。