导读
Pod容器想要获取集群的资源信息,需要配置角色和ServiceAccount进行授权。为了更精细地控制Pod对资源的使用方式,Kubernetes从1.4版本开始引入了PodSecurityPolicy资源对象对Pod的安全策略进行管理。
Pod特权模式
容器内的进程获得的特权几乎与容器外的进程相同。使用特权模式,可以更容易地将网络和卷插件编写为独立的pod,不需要编译到kubelet中。
PodSecurityPolicy
官网定义
Pod 安全策略(Pod Security Policy) 是集群级别的资源,它能够控制Pod规约 中与安全性相关的各个方面。PodSecurityPolicy 对象定义了一组Pod运行时必须遵循的条件及相关字段的默认值,只有 Pod 满足这些条件才会被系统接受。
Pod 安全策略允许管理员控制如下方面:
Pod 安全策略 由设置和策略组成,它们能够控制 Pod 访问的安全特征。这些设置分为如下三类:
(1)基于布尔值控制 :这种类型的字段默认为最严格限制的值。
(2)基于被允许的值集合控制 :这种类型的字段会与这组值进行对比,以确认值被允许。
(3)基于策略控制 :设置项通过一种策略提供的机制来生成该值,这种机制能够确保指定的值落在被允许的这组值中。
开启
如果需要开启PodSecurityPolicy,需要在kube-apiserver的启动参数中设置如下参数
--enable-admission-plugins=PodSecurityPolicy
在开启PodSecurityPolicy准入控制器后,k8s默认不允许创建任何Pod,需要创建PodSecurityPolicy和RBAC授权策略,Pod才能创建成功。
注:修改kube-apiserver配置文件/etc/kubernetes/manifests/kube-apiserver.yaml,由于是static pod,所以修改就会生效。
系统默认此参数为:
--enable-admission-plugins=NodeRestriction
开启之后创建Pod会出现如下错误:
创建PodSecurityPolicy
下列PodSecurityPolicy表示是不允许创建特权模式的Pod
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp-non-privileged
spec:
privileged: false #不允许特权模式的Pod
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
创建之后查看:
kubectl get psp
或者
kubectl get podSecurityPolicy
之后再次创建Pod就能创建成功
上面的PodSecurytiPolicy是设置了不允许创建特权模式的Pod,例如,在下面的YAML配置文件pod-privileged.yaml中为Pod设置了特权模式:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports: