前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 准入控制器详解!

Kubernetes 准入控制器详解!

作者头像
CNCF
发布2021-02-23 15:40:12
6410
发布2021-02-23 15:40:12
举报
文章被收录于专栏:CNCFCNCFCNCF

Kubernetes 准入控制器是什么?为什么要使用准入控制器?如何使用?本文对 Kubernetes 准入控制器进行了详细解释。

作者:Arun Prasad 翻译:Bach(才云) 校对:FogDong(才云)

Kubernetes 控制平面由几个组件组成。其中一个组件是 kube-apiserver,简单的 API server。它公开了一个 REST 端点,用户、集群组件以及客户端应用程序可以通过该端点与集群进行通信。总的来说,它会进行以下操作:

  1. 从客户端应用程序(如 kubectl)接收标准 HTTP 请求。
  2. 验证传入请求并应用授权策略。
  3. 在成功的身份验证中,它能根据端点对象(Pod、Deployments、Namespace 等)和 http 动作(Create、Put、Get、Delete 等)执行操作。
  4. 对 etcd 数据存储进行更改以保存数据。
  5. 操作完成,它就向客户端发送响应。

请求流程

现在让我们考虑这样一种情况:在请求经过身份验证后,但在对 etcd 数据存储进行任何更改之前,我们需要拦截该请求。例如:

  1. 拦截客户端发送的请求。
  2. 解析请求并执行操作。
  3. 根据请求的结果,决定对 etcd 进行更改还是拒绝对 etcd 进行更改。

Kubernetes 准入控制器就是用于这种情况的插件。在代码层面,准入控制器逻辑与 API server 逻辑解耦,这样用户就可以开发自定义拦截器(custom interceptor),无论何时对象被创建、更新或从 etcd 中删除,都可以调用该拦截器。

有了准入控制器,从任意来源到 API server 的请求流将如下所示:

准入控制器阶段(来自官方文档)

官方文档地址:https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/

根据准入控制器执行的操作类型,它可以分为 3 种类型:

  • Mutating(变更)
  • Validating(验证)
  • Both(两者都有)

Mutating:这种控制器可以解析请求,并在请求向下发送之前对请求进行更改(变更请求)。

示例:AlwaysPullImages

Validating:这种控制器可以解析请求并根据特定数据进行验证。

示例:NamespaceExists

Both:这种控制器可以执行变更和验证两种操作。

示例:CertificateSigning

有关这些控制器更多信息,查看官方文档:https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do

准入控制器过程包括按顺序执行的2个阶段:

  1. Mutating(变更)阶段(先执行)
  2. Validation (验证)阶段(变更阶段后执行)

Kubernetes 集群已经在使用准入控制器来执行许多任务。

Kubernetes 附带的准入控制器列表:https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do

通过该列表,我们可以发现大多数操作,如 AlwaysPullImages、DefaultStorageClass、PodSecurityPolicy 等,实际上都是由不同的准入控制器执行的。

K8sMeetup

如何启用或禁用准入控制器?

要启用准入控制器,我们必须在启动 kube-apiserver 时,将以逗号分隔的准入控制器插件名称列表传递给 --enable-ading-plugins。对于默认插件,命令如下所示:

要禁用准入控制器插件,可以将插件名称列表传递给 --disable-admission-plugins。它将覆盖默认启用的插件列表。

K8sMeetup

默认准入控制器

  • NamespaceLifecycle
  • LimitRanger
  • ServiceAccount
  • TaintNodesByCondition
  • Priority
  • DefaultTolerationSeconds
  • DefaultStorageClass
  • StorageObjectInUseProtection
  • PersistentVolumeClaimResize
  • RuntimeClass
  • CertificateApproval
  • CertificateSigning
  • CertificateSubjectRestriction
  • DefaultIngressClass
  • MutatingAdmissionWebhook
  • ValidatingAdmissionWebhook
  • ResourceQuota

K8sMeetup

为什么要使用准入控制器?

准入控制器能提供额外的安全和治理层,以帮助 Kubernetes 集群的用户使用。

执行策略:通过使用自定义准入控制器,我们可以验证请求并检查它是否包含特定的所需信息。例如,我们可以检查 Pod 是否设置了正确的标签。如果没有,那可以一起拒绝该请求。某些情况下,如果请求中缺少一些字段,我们也可以更改这些字段。例如,如果 Pod 没有设置资源限制,我们可以为 Pod 添加特定的资源限制。通过这样的方式,除非明确指定,集群中的所有 Pod 都将根据我们的要求设置资源限制。Limit Range 就是这种实现。

安全性:我们可以拒绝不遵循特定规范的请求。例如,没有一个 Pod 请求可以将安全网关设置为以 root 用户身份运行。

统一工作负载:通过更改请求并为用户未设置的规范设置默认值,我们可以确保集群上运行的工作负载是统一的,并遵循集群管理员定义的特定标准。这些就是我们开始使用 Kubernetes 准入控制器需要知道的所有理论。

原文链接:https://medium.com/cloudlego/kubernetes-admission-controllers-request-interceptors-47a9b12c5303

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档