什么是AdmissionWebhook?
什么是AdmissionWebhook,就要先了解K8S中的admission controller, 按照官方的解释是: admission controller是拦截(经过身份验证)API Server请求的网关,并且可以修改请求对象或拒绝请求。简而言之,它可以认为是拦截器,类似web框架中的middleware。
为什么使用 admission webhook?
kubernetes的admission webhook为开发者提供了非常灵活的插件模式,在kubernetes资源持久化之前用户可以对指定资源做校验、修改等操作。应用场景 eg:接入sidecare、设置默认的servceaccount、设置quota等等。
总体来说,admission-plugins分为三大类:
1.修改类型(mutating)
2.验证类型(validating)
3.既是修改又是验证类型(mutating&validating)
这些admission plugin构成一个顺序链,先后顺序决定谁先调用,但不会影响使用。
这里关心的plugin有两个:
一、MutatingAdmissionWebhook, ValidatingAdmissionWebhook
- MutatingAdmissionWebhook: 做修改操作的AdmissionWebhook
- ValidatingAdmissionWebhook: 做验证操作的AdmissionWebhook
引用kubernetes官方博客的一张图来说明MutatingAdmissionWebhook和ValidatingAdmissionWebhook所处的位置:
解释下这个过程:
1.api请求到达K8S API Server
2.请求要先经过认证
- kubectl调用需要kubeconfig
- 直接调用K8S api需要证书+bearToken
- client-go调用也需要kubeconfig
3.执行一连串的admission controller,包括MutatingAdmissionWebhook和ValidatingAdmissionWebhook, 先串行执行MutatingAdmission的Webhook list
4.对请求对象的schema进行校验
5.并行执行ValidatingAdmission的Webhook list
6.最后写入etcd
应用场景:
- 自动打标签 比如启动一个应用,应用包括deployment、service、ingress; 怎么快速过滤出哪些资源属于应用? 在K8S中,pod、service、ingress 都是独立的资源,通过给这些资源打上label,是最快速的方式。
- 自动注入sidecar容器 应用启动后,应用的监控、日志如何处理?借助sidecar容器注入到其pod中
- 设置默认的servceaccount、设置quota等等。