Kubernetes 准入控制器详解!

二次元码农
• 阅读 1723

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

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

Kubernetes 准入控制器详解!

请求流程

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

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

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

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

Kubernetes 准入控制器详解!

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

官方文档地址:https://kubernetes.io/blog/20...

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

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

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

示例:AlwaysPullImages

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

示例:NamespaceExists

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

示例:CertificateSigning

有关这些控制器更多信息,查看官方文档:https://kubernetes.io/docs/re...

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

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

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

Kubernetes 附带的准入控制器列表:https://kubernetes.io/docs/re...

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

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

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

Kubernetes 准入控制器详解!

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

Kubernetes 准入控制器详解!

默认准入控制器

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

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

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

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

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

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

原文链接:https://mp.weixin.qq.com/s/tj...

点赞
收藏
评论区
推荐文章
Stella981 Stella981
4年前
Minikube之Win10单机部署
Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作。如果你曾经用过Docker部署容器,那么可以将Docker看成Kubernetes底层使用的组件,Kubernetes是Docker的上层封装,通过它可以很方便的进行Docker集群的管理。今天我们使用minikube在单机上进行Kubern
Stella981 Stella981
4年前
Kubernetes 集群日志管理
Kubernetes开发了一个Elasticsearch附加组件来实现集群的日志管理。这是一个Elasticsearch、Fluentd和Kibana的组合。Elasticsearch是一个搜索引擎,负责存储日志并提供查询接口;Fluentd负责从Kubernetes搜集日志并发送给Elasticsearch;Kibana提供了一个
Wesley13 Wesley13
4年前
(三)Kubernetes 快速入门
 Kubernetes的核心对象APIServer提供了RESTful风格的编程接口,其管理的资源是KubernetesAPI中的端点,用于存储某种API对象的集合,例如,内置Pod资源是包含了所有Pod对象的集合。资源对象是用于表现集群状态的实体,常用于描述应于哪个节点进行容器化应用、需
Wesley13 Wesley13
4年前
K8S各知识点整理
一、k8s组成部分Master1、  kubeapiserver封装了核心对象的增删改查操作,以RESTAPI接口方式提供给外部和内部组件调用。它维护的REST对象将持久化到Etcd中2、  kubecontroller负责执行各种控制器,目前已经实现很多控制器来
Stella981 Stella981
4年前
Kubernetes 调度器实现初探
Kubernetes调度器Kubernetes是一个基于容器的分布式调度器,实现了自己的调度模块。在Kubernetes集群中,调度器作为一个独立模块通过pod运行。从几个方面介绍Kubernetes调度器。调度器工作方式Kubernetes中的调度器,是作为单独组件运行,一般运行在Master中,和Master数量保持
Stella981 Stella981
4年前
K8s(7)
仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,以及管理集群资源。您可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如部署,作业,守护进程等)。例如,您可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序
Wesley13 Wesley13
4年前
K8S知道,K9S呢?
k9s是用于管理Kubernetes集群的CLI。通过封装kubectl功能,k9s可以让开发者快速查看并解决运行Kubernetes时的日常问题。部分特性跟踪在Kubernetes集群运行的资源的实时活动处理Kubernetes标准资源和自定义资源跟踪与资源相关联的
Stella981 Stella981
4年前
Kubernetes 中 kubectl.sh 各种参数(待译)
kubectl是控制Kubernetes的集群管理器。详情查看https://github.com/kubernetes/kubernetes用法: kubectl\flags\ kubectl\command\可用命令: get                
Stella981 Stella981
4年前
Kubernetes
1、Kubernetes中的用户所有的系统都存在访问和使用其的用户,Kubernetes也一样,在Kubernetes集群中有存在两类用户:serviceaccounts:由Kubernetes进行管理的特殊用户;普通用户:普通用户是由外部应用进行管理的用户。对于普通用户,
Stella981 Stella981
4年前
FinBus
1\.一个程序应该建立几个收发的传输端点?一个传输端点可以用来传输一类消息,每个传输端点关联的传输通道数则要根据发送端和接收端的分区个数来确定,一般为两者的乘积。两个不同名称的传输端点也可以关联到同一传输通道的不同端。2\.只启动发送端或接收端组件,是否会收到对方的超时事件?对于发送端组件,有消息发出后,接收端组件还未启动
京东云开发者 京东云开发者
5个月前
【前沿技术探索与应用赛道】借助京东AI言犀提升Kubernetes集群巡检的效率和准确性
介绍目前k8sclusterinspector组件可以自动化完成Kubernetes集群巡检,并在巡检结果中给出当前集群存在的问题,问题分级,问题类型,问题解决方法。示例巡检数据结构如下:"name":"colocationwebhookrole","na