Kubernetes中的Admission Controller和Admission Webhook

(Proudly powered by QKQ)

Kubernetes中的Admission Controller是做什么的呢?有什么用呢?怎么自己定义一个呢?

Q: 什么是Admission Controller?

A: 官方定义:

An admission controller is a piece of code that intercepts requests to the Kubernetes API server prior to persistence of the object, but after the request is authenticated and authorized.

我理解的:

  • Admission Controller是一个拦截器
  • 拦截发送给Kuberenetes API Server的请求
  • 什么时候拦截?在请求通过认证之后,请求被存储起来之前

所以顺理成章,由于拦截的是发送给API Server的请求,所以Admission Controller存在于API Server内部,即compiled into the kube-apiserver binary(被编译进API Server的可执行文件里)。

kubernetes将AC分为三种:

  • validating,验证型。用于验证k8s的资源定义是否符合规则
  • mutating,修改型。用于修改k8s的资源定义,比如加个label什么的
  • 二者皆是,即同一个AC,既是验证型又是修改型

多个Admission Controller会形成一个Admission Chain(链条),修改型的在前面先执行,验证型的在后面后执行,这样验证型的才能去验证修改的对不对。
K: interceptor, validating, mutating, Admission Chain

Q: Admission Controller有什么用?
A: API Server内置了一些AC,有各种各样的作用[1]。比如:

  • EventRateLimit,用于限制事件的频率
  • LimitRanger,验证所有的请求都没有超出namespace中定义的LimitRange

还有很多其他AC,具体请参考Kubernetes文档。

这些AC中,有两个对用户来说比较有用:

  • MutatingAdmissionWebhook,这是一个webhook,即网络钩子,也就是说该AC会去请求服务端,并执行相应的逻辑
  • ValidatingAdmissionWebhook,也是一个webhook,只是用于验证

Q: 怎么查看哪些AC是打开了的?

A: 文档上写的用:kube-apiserver -h | grep enable-admission-plugins。但是由于本地是minikube,进入虚拟机之后并没有发现kube-apiserver命令。
后来发现api-server是以pod的形式运行的:

kubectl get pods -n kube-system

于是,使用kubectl exec登入pod,然后调用上述的指令,其结果为:

/ # kube-apiserver -h | grep enable-admission-plugins
      --admission-control strings              Admission is divided into two phases. In the first phase, only mutating admission plugins run. In the second phase, only validating admission plugins run. The names in the below list may represent a validating plugin, a mutating plugin, or both. The order of plugins in which they are passed to this flag does not matter. Comma-delimited list of: AlwaysAdmit, AlwaysDeny, AlwaysPullImages, DefaultStorageClass, DefaultTolerationSeconds, DenyEscalatingExec, DenyExecOnPrivileged, EventRateLimit, ExtendedResourceToleration, ImagePolicyWebhook, Initializers, LimitPodHardAntiAffinityTopology, LimitRanger, MutatingAdmissionWebhook, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, NodeRestriction, OwnerReferencesPermissionEnforcement, PersistentVolumeClaimResize, PersistentVolumeLabel, PodNodeSelector, PodPreset, PodSecurityPolicy, PodTolerationRestriction, Priority, ResourceQuota, SecurityContextDeny, ServiceAccount, StorageObjectInUseProtection, ValidatingAdmissionWebhook. (DEPRECATED: Use --enable-admission-plugins or --disable-admission-plugins instead. Will be removed in a future version.)
      --enable-admission-plugins strings       admission plugins that should be enabled in addition to default enabled ones (NamespaceLifecycle, LimitRanger, ServiceAccount, Priority, DefaultTolerationSeconds, DefaultStorageClass, PersistentVolumeClaimResize, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota). Comma-delimited list of admission plugins: AlwaysAdmit, AlwaysDeny, AlwaysPullImages, DefaultStorageClass, DefaultTolerationSeconds, DenyEscalatingExec, DenyExecOnPrivileged, EventRateLimit, ExtendedResourceToleration, ImagePolicyWebhook, Initializers, LimitPodHardAntiAffinityTopology, LimitRanger, MutatingAdmissionWebhook, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, NodeRestriction, OwnerReferencesPermissionEnforcement, PersistentVolumeClaimResize, PersistentVolumeLabel, PodNodeSelector, PodPreset, PodSecurityPolicy, PodTolerationRestriction, Priority, ResourceQuota, SecurityContextDeny, ServiceAccount, StorageObjectInUseProtection, ValidatingAdmissionWebhook. The order of plugins in this flag does not matter.

Q: Admission webhook是啥?

A: 官方定义:

Admission webhooks are HTTP callbacks that receive admission requests and do something with them.

简单来说webhook就是一个HTTP回调,接收admission请求,处理并返回。

用户可以定义两种webhook:

  • validating admission webhook
  • mutating admission webhook
    一个用于验证,另一个用于修改。
    webhook回调,接收API Server发送的admissionReview请求,并返回 admissionResponse。

K: 回调,admissionReview请求,admissionResponse返回。

Q: 如何配置和查看WebhookConfiguration?

A: 以Validating为例,查看:

kubectl get ValidatingWebhookConfiguration

ValidatingWebhookConfiguration的资源定义:

apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
  name: <name of this configuration object>
webhooks:
- name: <webhook name, e.g., pod-policy.example.io>
  rules:
  - apiGroups:
    - ""
    apiVersions:
    - v1
    operations:
    - CREATE
    resources:
    - pods
  clientConfig:
    service:
      namespace: <namespace of the front-end service>
      name: <name of the front-end service>
    caBundle: <pem encoded ca cert that signs the server cert used by the webhook>

其中rules定义了匹配规则,当发给API Server的请求满足该规则的时候,API Server就会给clientConfig中配置的service发送Admission请求。

使用webhook有什么要求?

A: 几点:

  • kubernetes版本最低是v1.9
  • api server使能(enable)了MutatingAdmissionWebhook和ValidatingAdmissionWebhook
  • admissionregistration.k8s.io/v1beta1 API处于enable状态,即使用kubectl api-versions | grep admissionregistration.k8s.io/v1beta1

Q: 如何自己写一个webhook?

A: 需要完成几个事情:

  • 创建TLS Certificate,即证书
  • 编写服务端代码,服务端代码需要使用证书
  • 根据证书创建k8s sercret
  • 创建k8s Deployment和Service
  • 创建k8s WebhookConfiguration,其中需要使用之前创建的证书

具体代码和流程参见[3][4]

参考文献:
[1] https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
[2] https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks
[3] https://banzaicloud.com/blog/k8s-admission-webhooks/
[4] https://github.com/morvencao/kube-mutating-webhook-tutorial
[5] https://github.com/banzaicloud/admission-webhook-example

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容