kubernetes Admission Control 机制

Admission Control准入控制是什么

  • kubernetes ApiServer 收到一个请求,在将数据持久化到etcd之前,会依次经过:Authentication认证、Authorization鉴权、Admission Control准入控制 。
    • Authentication:验证用户或实体的身份,并确保其声称的身份是有效的
    • Authorization:确保当前用户具有对其 访问资源 的访问权限
    • Admission Control:对请求本身进行 验证、转换 和 审查

Admission Control 插件机制

  • Admission Control 是由一系列插件组成的,apiserver的请求,需要通过所有插件,才能最终存储到etcd
  • api server 启动时,使用参数控制插件的开启
    • kubernetes 1.10及以上版本,apiserver使用 参数 –enable-admission-plugins 控制插件启动
    • kubernetes 1.9及以下版本,apiserver使用 参数 –admission-control 控制插件启动
  • 我们今天要学习的webhook,涉及到 Admission Control 的两个插件:MutatingAdmissionWebhook、ValidatingAdmissionWebhook,这两个插件都是默认开启的,我们无需再去更改apiserver启动参数重启

Webhook介绍

webhook是什么

顾名思义,webhook就是 网络钩子,在特殊条件下自动触发执行。
在kubernetes中,通过使用 webhook,用户可以编写自定义的业务逻辑,并将其部署为独立的 HTTP 服务,然后将其注册到 Kubernetes 中。
Kubernetes 将根据配置,将到达 apiserver 的请求发送到相应的 webhook 服务,并根据 webhook 返回的结果来决定是否允许请求继续进行,以及是否需要对请求进行修改。

kubernetes webhook的三种类型

在kubernetes中,webhook共分为三种

  • admission webhook
    • 属于admission control插件,在请求进入admission control插件链时,依次调用
  • authorization webhook
    • 对 API Server 中的请求进行授权判断
  • CRD conversion webhook
    • 用于对 多版本的crd 资源,进行版本间数据转换
      其中,controller-runtime 支持 admission webhook 和 CRD conversion webhook 两种
      我们进行Operator开发,也只要是涉及到这两种webhook

为webhook提供证书

为什么需要为webhook提供证书
admission webhook 和 CRD conversion webhook,api Server 通过 https post 访问 webhook server, 因此 webhook server 必须要监听在 https 协议上.因此 这三种 webhook 都需要做好证书配置,推荐使用 cert-manager 为Webhook提供证书

  • 安装cert-manager
    1
    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml	
  • 查看安装结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@localhost cert-manager]# kubectl get pod -n cert-manager
    NAME READY STATUS RESTARTS AGE
    cert-manager-7fb948f468-r5dj2 1/1 Running 0 142m
    cert-manager-cainjector-75c5fc965c-shtx6 1/1 Running 0 142m
    cert-manager-webhook-757c9d4bb7-vhgt7 1/1 Running 0 142m

    [root@localhost cert-manager]# kubectl get ValidatingWebhookConfiguration
    NAME WEBHOOKS AGE
    cert-manager-webhook 1 143m

    [root@localhost cert-manager]# kubectl get MutatingWebhookConfiguration
    NAME WEBHOOKS AGE
    cert-manager-webhook 1 143m

admission webhook

  • admission webhook 包括两个阶段:

    • MutatingAdmissionWebhook:请求修改阶段,可以对 请求资源的元数据 进行修改,比如为一些没有值的字段设置默认值等
    • ValidatingAdmissionWebhook:请求验证阶段,不会再修改 资源的数据,而是对资源字段数据进行一些检验,比如 资源metadata.name长度不可超过52个字符等
  • 二者调用顺序:MutatingAdmissionWebhook 阶段在前,ValidatingAdmissionWebhook 阶段在后

CRD conversion webhook

  • 除了admission webhook,我们开发Operator的时候,还会用到一种webhook,即 CRD conversion webhook
  • 当创建了一个多版本的 CRD API,要求多个版本之间能够相互转换,相互兼容,就需要额外启动一个服务,暴露转换功能接口,供apiserver调用
  • CRD conversion webhook可以在kubernetes集群外启动,也可以在集群内启动,只需要做好证书配置,让apiserver能够正确访问即可。