Kubernetes 管制立体由几个组件组成。其中一个组件是 kube-apiserver,简略的 API server。 它公开了一个 REST 端点,用户、集群组件以及客户端应用程序能够通过该端点与集群进行通信。总的来说,它会进行以下操作:
- 从客户端应用程序(如 kubectl)接管规范 HTTP 申请。
- 验证传入申请并利用受权策略。
- 在胜利的身份验证中,它能依据端点对象(Pod、Deployments、Namespace 等)和 http 动作(Create、Put、Get、Delete 等)执行操作。
- 对 etcd 数据存储进行更改以保留数据。
- 操作实现,它就向客户端发送响应。
申请流程
当初让咱们思考这样一种状况: 在申请通过身份验证后,但在对 etcd 数据存储进行任何更改之前,咱们须要拦挡该申请。 例如:
- 拦挡客户端发送的申请。
- 解析申请并执行操作。
- 依据申请的后果,决定对 etcd 进行更改还是回绝对 etcd 进行更改。
Kubernetes 准入控制器就是用于这种状况的插件。在代码层面,准入控制器逻辑与 API server 逻辑解耦,这样用户就能够开发自定义拦截器(custom interceptor),无论何时对象被创立、更新或从 etcd 中删除,都能够调用该拦截器。
有了准入控制器,从任意起源到 API server 的申请流将如下所示:
准入控制器阶段(来自官网文档)
官网文档地址:https://kubernetes.io/blog/20…
依据准入控制器执行的操作类型,它能够分为 3 种类型:
- Mutating(变更)
- Validating(验证)
- Both(两者都有)
Mutating: 这种控制器能够解析申请,并在申请向下发送之前对申请进行更改(变更申请)。
示例:AlwaysPullImages
Validating: 这种控制器能够解析申请并依据特定数据进行验证。
示例:NamespaceExists
Both: 这种控制器能够执行变更和验证两种操作。
示例:CertificateSigning
无关这些控制器更多信息,查看官网文档:https://kubernetes.io/docs/re…
准入控制器过程包含按程序执行的 2 个阶段:
- Mutating(变更)阶段 (先执行)
- Validation(验证)阶段 (变更阶段后执行)
Kubernetes 集群曾经在应用准入控制器来执行许多工作。
Kubernetes 附带的准入控制器列表:https://kubernetes.io/docs/re…
通过该列表,咱们能够发现大多数操作,如 AlwaysPullImages、DefaultStorageClass、PodSecurityPolicy 等,实际上都是由不同的准入控制器执行的。
如何启用或禁用准入控制器?
要启用准入控制器,咱们必须在启动 kube-apiserver 时,将以逗号分隔的准入控制器插件名称列表传递给 --enable-ading-plugins
。对于默认插件,命令如下所示:
要禁用准入控制器插件,能够将插件名称列表传递给 --disable-admission-plugins
。它将笼罩默认启用的插件列表。
默认准入控制器
- 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…