准入控制(Admission Control)在授权后对请求做进一步的验证或添加默认参数,在对kubernetes api服务器的请求过程中,先经过认证、授权后,执行准入操作,在对目标对象进行操作。这个准入插件代码在apiserver中,而且必须被编译到二进制文件中才能被执行。
在对集群进行请求时,每个准入控制插件都按顺序运行,只有全部插件都通过的请求才会进入系统,如果序列中的任何插件拒绝请求,则整个请求将被拒绝,并返回错误信息。
在某些情况下,为了适用于应用系统的配置,准入逻辑可能会改变目标对象。此外,准入逻辑也会改变请求操作的一部分相关资源。
为什么需要准入控制?
在kubernetes中,一些高级特性正常运行的前提条件为,将一些准入模块处于enable状态。总结下,对于kubernetes apiserver,如果不适当的配置准入控制模块,他就不能称作是一个完整的server,某些功能也不会正常的生效。
如何运行准入控制插件?
在kubernetes apiserver中有一个flag:admission_control,他的值为一串用逗号连接起、有序的准入模块列表,设置后,就可在对象操作前执行一定顺序的准入模块调用。
每个插件都做什么的?
AlwaysAdmit
结束所有的请求。
AlwaysPullImages
该插件修改每个新的Pod,强制pull最新镜像,这在多租户群集中非常有用,以便私有镜像只能由拥有授权凭据的用户使用。
AlwaysDeny
拒绝所有请求,一般用于测试。
DenyExecOnPrivileged(已弃用)
该插件将拦截所有请求。如果pod有一个privileged container,将只执行这个pod中的命令。如果自己的集群支持privileged container,自己又希望限制用户在这些privileged container上执行命令,那么强烈推荐使用它。
此功能已合并到DenyEscalatingExec中。
DenyEscalatingExec
禁止privileged container的exec和attach操作。
ImagePolicyWebhook
通过webhook决定image策略,需要同时配置—admission-control=ImagePolicyWebhook,配置文件格式如下。
配置文件格式
ImagePolicyWebhook使用admission配置文件—admission-control-config-file为Backend Behavior设置配置选项。该文件可以是json或yaml并具有以下格式:
- {
- "imagePolicy": {
- "kubeConfigFile": "path/to/kubeconfig/for/backend",
- "allowTTL": 50, // time in s to cache approval
- "denyTTL": 50, // time in s to cache denial
- "retryBackoff": 500, // time in ms to wait between retries
- "defaultAllow": true // determines behavior if the webhook backend fails
- }
- }
配置文件必须引用一个kubeconfig格式的文件,该文件设置与后端的连接,通过TLS进行通信。
kubeconfig文件的集群字段须指向remote service,users字段须包含returned authorizer。
- # clusters refers to the remote service.
- clusters:
- - name: name-of-remote-imagepolicy-service
- cluster:
- certificate-authority: /path/to/ca.pem # CA for verifying the remote service.
- server: https://images.example.com/policy # URL of remote service to query. Must use 'https'.
- # users refers to the API server's webhook configuration.
- users:
- - name: name-of-api-server
- user:
- client-certificate: /path/to/cert.pem # cert for the webhook plugin to use
- client-key: /path/to/key.pem # key matching the cert
其他HTTP配置,请参考kubeconfig文档。
ServiceAccount
该插件将serviceAccounts 实现了自动化。如果打算使用Kubernetes ServiceAccount对象,那么强烈建议使用此插件。
SecurityContextDeny
该插件会将使用了 SecurityContext的pod中定义的选项全部失效 。
ResourceQuota
该插件将会观察传入的所有请求,并确保它不会违反ResourceQuota对象中枚举的任何限制Namespace。如果在Kubernetes Deployment中使用了ResourceQuota对象,则必须使用此插件来约束Container。
更多详细信息,请参阅resourceQuota design doc和example of Resource Quota。
推荐在Admission Control参数列表中,这个插件排最后一个。
LimitRanger
该插件将会观察传入的所有请求,并确保它不会违反LimitRanger对象中枚举的任何限制Namespace,如果在Kubernetes Deployment中使用了LimitRanger对象,则必须使用此插件。LimitRanger还可使用Apply将default资源请求不指定任何的Pods; 目前LimitRanger对Default Namespace中的所有pod应用要求0.1 CPU
更多详细信息,请参阅limitRange design doc和example of Limit Range 。
InitialResources(试验)
根据镜像的历史使用记录,为容器设置默认资源请求和limits。
更多详细信息,参考 InitialResouces proposal。
NamespaceLifecycle
该插件确保处于Termination状态的Namespace不再接收新的对象创建请求,并拒绝请求不存在的Namespace。该插件还可以防止删除系统保留的Namespace:default,kube-system,kube-public。
DefaultStorageClass
该插件将观察PersistentVolumeClaim,并自动设置默认的Storage Class。
当没有配置默认Storage Class时,此插件不会执行任何操作。当有多个Storage Class被标记为默认值时,它也将拒绝任何创建,管理员必须重新访问StorageClass对象,并且只标记一个作为默认值。此插件不用于PersistentVolumeClaim的更新,仅用于创建。
更多详细信息,参考persistent volume。
DefaultTolerationSeconds
该插件设置Pod的默认forgiveness toleration为5分钟。
PodSecurityPolicy
该插件用于创建和修改pod,使用Pod Security Policies时需要开启。
当 Kubernetes <1.6.0版本时,API服务器需要启用扩展名/ v1beta1 / podsecuritypolicy API扩展组(—runtime-config=extensions/v1beta1/podsecuritypolicy=true)。
更多信息,请参考Pod Security Policy documentation。
NodeRestriction
此插件限制kubelet修改Node和Pod对象,这样的kubelets只允许修改绑定到Node的Pod API对象,以后版本可能会增加额外的限制。
限制kubelet仅可访问node、endpoint、pod、service以及secret、configmap、PV和PVC等相关的资源(仅适用于v1.7+)
不同版本推荐使用的一组插件?
对于Kubernetes> = 1.6.0 版本,建议运行以下的准入控制插件(需要按顺序进行):
- --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds
对于Kubernetes> = 1.4.0 版本,建议运行以下的准入控制插件(需要按顺序进行):
- --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota
对于Kubernetes> = 1.2.0 版本,建议运行以下的准入控制插件(需要按顺序进行):
- --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota
对于Kubernetes> = 1.0.0 版本,建议运行以下的准入控制插件(需要按顺序进行):
- --admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,PersistentVolumeLabel,ResourceQuota