概述

kube-apiserver是Kubernetes集群的中心,集群中所有资源的创建和更新都是通过APIServer的Restful API实现的。 因此Kubernetes通过一系列的机制来保证APIServer的安全,包括APIServer的认证、授权以及本文我们要学习的准入控制Admission Control。

关于APIServer的认证和授权我们之前分享过两篇《Kubernetes集群安全:Api Server认证》《Kubernetes 1.6新特性学习:RBAC授权》,认证授权就是要识别和认证客户端的身份以及对访问权限的授权。

access-control-overview

上图是APIServer被访问控制的过程,在经过认证和授权之后就进入了准备控制Admission Control。

准入控制器

Kubernetes的Admission Control实际上是一个准入控制器(Admission Controller)插件列表,发送到APIServer的请求都需要经过这个列表中的每个准入控制器插件的检查。 官方文档Using Admission Controllers中介绍了Kubernetes中内置的可以配置的准入控制器插件:

  • AlwaysAdmit:允许所有请求通过
  • AlwaysPullImages:在启动容器之前总是去下载镜像,相当于每当容器启动前做一次用于是否有权使用该容器镜像的检查
  • AlwaysDeny:禁止所有请求通过,用于测试
  • DenyEscalatingExec:拒绝exec和attach命令到有升级特权的Pod的终端用户访问。如果集中包含升级特权的容器,而要限制终端用户在这些容器中执行命令的能力,推荐使用此插件
  • ImagePolicyWebhook
  • ServiceAccount:这个插件实现了serviceAccounts等等自动化,如果使用ServiceAccount对象,强烈推荐使用这个插件
  • SecurityContextDeny:将Pod定义中定义了的SecurityContext选项全部失效。SecurityContext包含在容器中定义了操作系统级别的安全选型如fsGroup,selinux等选项
  • ResourceQuota:用于amespace上的配额管理,它会观察进入的请求,确保在namespace上的配额不超标。推荐将这个插件放到准入控制器列表的最后一个。ResourceQuota准入控制器既可以限制某个namespace中创建资源的数量,又可以限制某个namespace中被Pod请求的资源总量。ResourceQuota准入控制器和ResourceQuota资源对象一起可以实现资源配额管理。
  • LimitRanger:用于Pod和容器上的配额管理,它会观察进入的请求,确保Pod和容器上的配额不会超标。准入控制器LimitRanger和资源对象LimitRange一起实现资源限制管理
  • NamespaceLifecycle:当一个请求是在一个不存在的namespace下创建资源对象时,该请求会被拒绝。当删除一个namespace时,将会删除该namespace下的所有资源对象
  • DefaultStorageClass
  • DefaultTolerationSeconds
  • PodSecurityPolicy

当Kubernetes版本>=1.4.0,官方建议使用这些插件:

1--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota

参考