【kubernetes/k8s概念】kube-apiserver admission webhook

WHY

    在 Kubernetes 中还有 authn/authz,为什么还会引入 admission 这种机制?

    认证鉴权运行在 filter 中,只能获取 http 请求 header 以及证书,并不能获取请求的 body。所以 authn/authz 只能对客户端进行认证和鉴权,不可以对请求的对象进行任何操作

   Admission 运行在 API Server 的增删改查 handler 中,可以操作 API resource

 

      目前 Kubernetes 中有非常多的 Admission 插件, 但并不能保证满足所有的需求。 Kbernetes 可扩展能力功不可没。Admission 也提供了一种 webhook 的扩展机制。

 

WHAT

    Admission Controller(准入控制)是 Kubernetes API Server 用于拦截请求的一种手段。Admission可以做到对请求的资源对象进行校验,修改。

   

  • MutatingAdmissionWebhook:在对象持久化之前进行修改
  • ValidatingAdmissionWebhook:在对象持久化之前进行

 

     引入网上的流程:Admission Controller 工作流程

  •  API Server 接收到客户端请求后首先进行认证鉴权,认证鉴权后才会进行 endpoint handler 处理
  • 当API Server 接收到对象后根据 http 的路径可以得到版本号,然后将 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

 

HOW

     Kubernetes 1.10之前的版本,--admission-control 打开 Admission Controller。同时--admission-control 的顺序决定 Admission 运行的先后

    Kubernetes 1.10之后的版本,--admission-control 已经废弃,建议使用 --enable-admission-plugins --disable-admission-plugins 指定需要打开或者关闭的 Admission Controller。 同时用户指定的顺序并不影响实际 Admission Controllers 的执行顺序

 --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,Priority,ResourceQuota,PodSecurityPolicy   

      Webhook Admission 属于同步调用,需要部署自己的 webhook server,创建自定义的配置资源对象: ValidatingWebhookConfiguration 或 MutatingWebhookConfiguration

# kubectl api-resources | grep webhook
mutatingwebhookconfigurations                  admissionregistration.k8s.io   false        MutatingWebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io   false        ValidatingWebhookConfiguration

  admissionregistration.k8s.io/v1beta1 API enable 状态

# kubectl api-versions | grep admissionregistration.k8s.io/v1beta1
admissionregistration.k8s.io/v1beta1

 

HOW 部署 

 

 定义 ValidatingWebhookConfiguration 或者 MutatingWebhookConfiguration

apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingWebhookConfiguration
metadata:
  name: <name>
  labels:
    app: <label>
webhooks:
  - name: <webhook name, e.g., pod-policy.example.io>  逗号分割,限制必须三段
    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:
      - operations: [ "CREATE" ]
        apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
    namespaceSelector:
      matchLabels:
        <key>: <value>

 

      创建自己的 webhook 程序流程

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

 

参考:

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值