k8s的整体认证过程分为3步,本别是认证、授权、准入控制。认证和授权都是工作在短路模式,而准入控制是非短路模式,但拥有一票否决权力,如果其中任何一个准入插件拒绝那其操作就无法执行,但是它会继续向下执行直到检查完每一个准入插件以确保能分析出有哪些步骤发生错误。
k8s支持的准入控制器有数十种之多,但是有3个非常关键:
limitranger
: 为Pod添加默认的计算资源需求和计算资源限制;以及存储资源需求和存储资源限制;支持分别在容器和Pod级别进行限制;
resourcequota
:限制资源数量,限制计算资源总量,存储资源总量;资源类型名称ResourceQuota
。
podsecuritpolicy
:在集群级别限制用户能够在Pod上可配置使用的securityContext
。
limitranger limitrange
与此前在pod上做资源限制的配置方式相同,所不同的是它是在名称空间上做的所有设定.
如果pod没有定义资源限制,则会继承该名称空间上的limitrange中的定义。
示例 1.创建一个limitrange资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 root@k8s-master01:~/yaml/chapter09 apiVersion: v1 kind: LimitRange metadata: name: core-resource-limits namespace: dev spec: limits: - type : Pod max: cpu: "4" memory: "4Gi" min: cpu: "500m" memory: "16Mi" - type : Container max: cpu: "4" memory: "1Gi" min: cpu: "100m" memory: "4Mi" default: cpu: "2" memory: "512Mi" defaultRequest: cpu: "500m" memory: "64Mi" maxLimitRequestRatio: cpu: "4" - type : PersistentVolumeClaim max: storage: "10Gi" min: storage: "1Gi" default: storage: "5Gi" defaultRequest: storage: "1Gi" maxLimitRequestRatio: storage: "5"
2.应用此资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 root@k8s-master01:~/yaml/chapter09 limitrange/core-resource-limits created root@k8s-master01:~/yaml/chapter09 Name: core-resource-limits Namespace: dev Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio ---- -------- --- --- --------------- ------------- ----------------------- Pod cpu 500m 4 - - - Pod memory 16Mi 4Gi - - - Container cpu 100m 4 500m 2 4 Container memory 4Mi 1Gi 64Mi 512Mi - PersistentVolumeClaim storage 1Gi 10Gi 1Gi 5Gi 5
3.手动创建pod测试1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 root@k8s-master01:~/yaml/chapter09 pod/test-pod-12395 created root@k8s-master01:~/yaml/chapter09 apiVersion: v1 kind: Pod metadata: annotations: kubernetes.io/limit-ranger: 'LimitRanger plugin set: cpu, memory request for container test-pod-12395; cpu, memory limit for container test-pod-12395' labels: run: test-pod-12395 name: test-pod-12395 namespace: dev spec: containers: - image: ikuberentes/demoapp:v1.0 name: test-pod-12395 resources: limits: cpu: "2" memory: 512Mi requests: cpu: 500m memory: 64Mi ......
4.手动创建pod测试2
1 2 3 4 5 6 root@k8s-master01:~/yaml/chapter09 Flag --limits has been deprecated, has no effect and will be removed in the future. Flag --requests has been deprecated, has no effect and will be removed in the future. Error from server (Forbidden): pods "testpod-20703" is forbidden: minimum memory usage per Pod is 16Mi, but request is 8388608
ResourceQuota ResourceQuota资源可限制名称空间中处于非终止状态的所有Pod对象的计算资源需求及计算资源限制总量。
cpu或requests.cpu:CPU资源相关请求的总量限额;
memory或requests.memory:内存资源相关请求的总量限额;
limits.cpu:CPU资源相关限制的总量限额;
limits.memory:内存资源相关限制的总量限额;
ResourceQuota资源还支持为本地名称空间中的PVC存储资源的需求总量和限制总量提供限额,它能够分别从名称空间中的全部PVC、隶属于特定存储类的PVC以及基于本地临时存储的PVC三个类别分别进行定义。
requests.storage
:所有PVC存储需求的总量限额;空间限制;
persistentvolumeclaims
:可以创建的PVC总数限额;数量限制;
<storage-class-name>.storageclass.storage.k8s.io/requests.storage
:特定的存储类上可使用的所有PVC存储需求的总量限额;
<storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims
:特定的存储类上可使用的PVC总数限额;
requests.ephemeral-storage
:所有Pod可以使用的本地临时存储资源的requets总量;
limits.ephemeral-storage
:所有Pod可用的本地临时存储资源的limits总量。
在v1.9版本之前的Kubernetes系统上,ResourceQuota仅支持在有限的几种资源集上设定对象计数配额,例如pods、services和configmaps等,而自v1.9版本起开始支持以count/<resource>.<group>
的格式支持对所有资源类型对象的计数配额,例如count/deployments.apps
、count/deployments.extensions
和count/services
等。
示例 1.RescoureQuota资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 root@k8s-master01:~/yaml/chapter09 apiVersion: v1 kind: ResourceQuota metadata: name: resourcequota-demo namespace: dev spec: hard: pods: "5" count/services: "5" count/configmaps: "5" count/secrets: "5" requests.cpu: "2" requests.memory: "4Gi" limits.cpu: "4" limits.memory: "8Gi" count/deployments.apps: "2" count/statefulsets.apps: "2" persistentvolumeclaims: "6" requests.storage: "20Gi" longhorn.storageclass.storage.k8s.io/requests.storage: "20Gi" longhorn.storageclass.storage.k8s.io/persistentvolumeclaims: "6"
2.应用资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 root@k8s-master01:~/yaml/chapter09 resourcequota/resourcequota-demo created root@k8s-master01:~/yaml/chapter09 Name: resourcequota-demo Namespace: dev Resource Used Hard -------- ---- ---- count/configmaps 1 5 count/deployments.apps 0 2 count/secrets 3 5 count/services 1 5 count/statefulsets.apps 0 2 limits.cpu 2 4 limits.memory 512Mi 8Gi longhorn.storageclass.storage.k8s.io/persistentvolumeclaims 0 6 longhorn.storageclass.storage.k8s.io/requests.storage 0 20Gi persistentvolumeclaims 0 6 pods 1 5 requests.cpu 500m 2 requests.memory 64Mi 4Gi requests.storage 0 20Gi
PodSecurityPolicy PodSecurityPolicy是用来在集群级别限制用户能够在Pod上可配置使用的securityContext。
资源清单定义格式如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name <string> spec: allowPrivilegeEscalation <boolean> allowedCSIDrivers <[]Object> allowedCapabilities <[]string> allowedFlexVolumes <[]Object> allowedHostPaths <[]Object> allowedProcMountTypes <[]string> allowedUnsafeSysctls <[]string> defaultAddCapabilities <[]string> defaultAllowPrivilegeEscalation <boolean> forbiddenSysctls <[]string> fsGroup <Object> rule <string> ranges <[]Object> max <integer > min <integer > hostIPC <boolean> hostNetwork <boolean> hostPID <boolean> hostPorts <[]Object> max <integer > min <integer > privileged <boolean> readOnlyRootFilesystem <boolean> requiredDropCapabilities <[]string> runAsGroup <Object> runAsUser <Object> rule <string> ranges <[]Object> max <integer > min <integer > runtimeClass <Object> allowedRuntimeClassNames <[]string> defaultRuntimeClassName <string> seLinux <Object> rule <string> seLinuxOptions <Object> supplementalGroups <Object> volumes <[]string>
由于psp的规则过于严格,一旦启用将会导致k8s上的pod寸步难行,默认k8s没有启用psp准入控制器。
启用PSP kubeadm部署的k8s需要修改其静态pod的配置文件/etc/kubernetes/manifests/kube-apiserver.yaml
,在kube-apiserver
命令中添加--enable-admission-plugins PodSecurityPolicy
但是需要注意一旦加入此参数就意味着psp已经启动,其将会导致所有的pod都无法运行。因为启用了psp控制器但未定义任何psp资源,那就意味着任何pod运行都会被拒绝,包括API Server自身都有可能被拒绝,因此启用psp之前需要先创建资源。
psp创建完毕后还需要对其进行用户的绑定和授权。