1.什么是Admission Controller
Admission Controller(准入控制)是 Kubernetes API Server 用于拦截请求的一种手段。
Admission可以做到对请求的资源对象进行校验,修改。
service mesh最近很火的项目Istio天生支持Kubernetes,利用的就是admission对服务实例自动注入sidecar。
假如对 Kubernetes 有一定的了解的话,应该会知道在 Kubernetes 中还有 authn/authz,为什么还会引入 admission 这种机制?
1): authn/authz 是 Kubernetes 的认证鉴权,运行在 filter 中,只 能获取 http 请求 header 以及证书,并不能获取请求的 body。
所以 authn/authz 只能对客户端进行认证和鉴权,不可以对请求的对象进行任何操作,因为这里根本还获取不到对象。
2): Admission 运行在 API Server 的增删改查 handler 中,可以自然地操作 API resource。
Admission Controller 工作流程详解
- API Server 接收到客户端请求后首先进行认证鉴权,认证鉴权通过后才会进行后续的endpoint handler处理。
- 当API Server 接收到对象后首先根据 http 的路径可以知道对象的版本号,然后将 request body 反序列化成 versioned object.
- versioned object 转化为 internal object,即没有版本的内部类型,这种资源类型是所有 versioned 类型的超集。只有转化为 internal 后才能适配所有的客户端 versioned object 的校验。Admission Controller 具体的 admit 操作,可以通过这里修改资源对象,例如为 Pod 挂载一个默认的 Service Account 等。
- API Server internal object validation,校验某个资源对象数据和格式是否合法,例如:Service Name 的字符个数不能超过63等。
- Admission Controller validate,可以自定义任何的对象校验规则
- internal object 转化为 versioned object,并且持久化存储到 etcd。
2.如何使用 admission controller
如果使用Kubernetes 1.10之后的版本,–admission-control 已经废弃,建议使用 --enable-admission-plugins --disable-admission-plugins 指定需要打开或者关闭的 Admission Controller。 同时用户指定的顺序并不影响实际 Admission Controllers 的执行顺序,对用户来讲非常友好。
值得一提的是,有些 Admission Controller 可能会使用 Alpha 版本的 API,这时必须首先使能其使用的 API 版本。否则 Admission Controller 不能工作,可能会影响系统功能。