首页 > 其他分享 >k8s 准入控制器介绍

k8s 准入控制器介绍

时间:2023-08-08 11:22:08浏览次数:42  
标签:控制器 请求 Webhook 默认 准入 Pod k8s

准入控制概述

准入控制器是一段代码,它在对象持久化之前、请求经过身份验证和授权之后拦截对 Kubernetes API 服务器的请求。
准入控制器可以执行验证(Validating)、变异(Mutating)或两者兼而有之。 变更(mutating)控制器可以根据被其接受的请求更改相关对象;验证(validating)控制器则不行。
准入控制器限制创建、删除、修改对象的请求。 准入控制器也可以阻止自定义动作,例如通过 API 服务器代理连接到 Pod 的请求。 准入控制器不会 (也不能)阻止读取(get、watch 或 list)对象的请求。

准入控制阶段

准入控制过程分两个阶段进行。在第一阶段,运行变异准入控制器。在第二阶段,运行验证准入控制器。再次注意,有些控制器两者兼而有之。
    例如,LimitRanger准入控制器可以使用默认资源请求和限制(变异阶段)来扩展Pod,也能够校验有着显式资源需求定义的Pod是否超出LimitRange对象(验证阶段)的定义。

如果任一阶段中的任何控制器拒绝该请求,则整个请求将立即被拒绝,并向最终用户返回错误。

最后,除了有时会改变相关对象之外,准入控制器有时可能会产生副作用,即在请求处理过程中改变相关资源。增加配额使用是说明为什么需要这样做的典型示例。任何此类副作用都需要相应的回收或协调过程,因为给定的准入控制器不确定给定的请求是否会通过所有其他准入控制器。

准入控制器作用

Kubernetes 的几个重要功能需要启用准入控制器才能正确支持该功能。因此,未正确配置正确的准入控制器集的 Kubernetes API 服务器是一个不完整的服务器,并且不会支持您期望的所有功能。
Kubernetes正是依赖LimitRange资源和相应的LimitRanger准入控制器、ResourceQuota资源和同名的准入控制器,以及PodSecurity资源和同名的准入控制器为多租户或多项目的集群环境提供了基础的安全策略框架。

启用准入控制器

Kubernetes API 服务器标志enable-admission-plugins采用逗号分隔的准入控制插件列表,以便在修改集群中的对象之前调用。例如,以下命令行启用NamespaceLifecycle和LimitRanger 准入控制插件:
kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...
注意:根据 Kubernetes 集群的部署方式以及 API 服务器的启动方式,您可能需要以不同的方式应用设置。例如,如果 API 服务器部署为 systemd 服务,则可能需要修改 systemd 单元文件;如果 Kubernetes 以自托管方式部署,则可能需要修改 API 服务器的清单文件。

禁用准入控制器

Kubernetes API 服务器标志disable-admission-plugins采用逗号分隔的要禁用的准入控制插件列表,即使它们位于默认启用的插件列表中。
kube-apiserver --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...

默认启用的插件

# kube-apiserver -h | grep enable-admission-plugins
默认启用的插件有:
  CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, DefaultStorageClass, DefaultTolerationSeconds, LimitRanger, MutatingAdmissionWebhook, NamespaceLifecycle, PersistentVolumeClaimResize, PodSecurity, Priority, ResourceQuota, RuntimeClass, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionPolicy, ValidatingAdmissionWebhook
注意:准入ValidatingAdmissionPolicy插件默认启用,但仅在启用ValidatingAdmissionPolicy 功能门 和 API时才会激活admissionregistration.k8s.io/v1alpha1。

常见的准入控制器介绍

AlwaysPullImages

该准入控制器会修改每个新创建的 Pod,将其镜像拉取策略设置为 Always。 这在多租户集群中是有用的,这样用户就可以放心,他们的私有镜像只能被那些有凭证的人使用。 如果没有这个准入控制器,一旦镜像被拉取到节点上,任何用户的 Pod 都可以通过已了解到的镜像的名称 (假设 Pod 被调度到正确的节点上)来使用它,而不需要对镜像进行任何鉴权检查。 启用这个准入控制器之后,启动容器之前必须拉取镜像,这意味着需要有效的凭证。

NamespaceLifecycle

该准入控制器禁止在一个正在被终止的 Namespace 中创建新对象,并确保针对不存在的 Namespace 的请求被拒绝。该准入控制器还会禁止删除三个系统保留的名字空间,即 default、 kube-system 和 kube-public。

Namespace 的删除操作会触发一系列删除该名字空间中所有对象(Pod、Service 等)的操作。 为了确保这个过程的完整性,我们强烈建议启用这个准入控制器。

LimitRanger

此准入控制器会监测传入的请求,并确保请求不会违反 Namespace 中 LimitRange 对象所设置的任何约束。 如果你在 Kubernetes 部署中使用了 LimitRange 对象,则必须使用此准入控制器来执行这些约束。 LimitRanger 还可以用于将默认资源请求应用到没有设定资源约束的 Pod; 当前,默认的 LimitRanger 对 default 名字空间中的所有 Pod 都设置 0.1 CPU 的需求。

ServiceAccount

用于实现服务账户管控机制的自动化,实现创建Pod对象时自动为其附加相关的Service Account对象。强烈推荐为 Kubernetes 项目启用此准入控制器。

DefaultStorageClass

此准入控制器监测没有请求任何特定存储类的 PersistentVolumeClaim 对象的创建请求, 并自动向其添加默认存储类。 这样,没有任何特殊存储类需求的用户根本不需要关心它们,它们将被设置为使用默认存储类。

当未配置默认存储类时,此准入控制器不执行任何操作。如果将多个存储类标记为默认存储类, 此控制器将拒绝所有创建 PersistentVolumeClaim 的请求,并返回错误信息。 要修复此错误,管理员必须重新检查其 StorageClass 对象,并仅将其中一个标记为默认。 此准入控制器会忽略所有 PersistentVolumeClaim 更新操作,仅处理创建操作。

DefaultTolerationSeconds

此准入控制器基于 k8s-apiserver 的输入参数 default-not-ready-toleration-seconds 和 default-unreachable-toleration-seconds 为 Pod 设置默认的容忍度,以容忍 notready:NoExecute 和 unreachable:NoExecute 污点 (如果 Pod 尚未容忍 node.kubernetes.io/not-ready:NoExecute 和 node.kubernetes.io/unreachable:NoExecute 污点的话)。 default-not-ready-toleration-seconds 和 default-unreachable-toleration-seconds 的默认值是 5 分钟。

ValidatingAdmissionWebhook

此准入控制器调用与请求匹配的所有验证性 Webhook。 匹配的 Webhook 将被并行调用。如果其中任何一个拒绝请求,则整个请求将失败。 该准入控制器仅在验证(Validating)阶段运行;与 MutatingAdmissionWebhook 准入控制器所调用的 Webhook 相反,它调用的 Webhook 不可以变更对象。

如果以此方式调用的 Webhook 有其它副作用(如:减少配额),则它 必须 具有协调机制。 这是因为无法保证后续的 Webhook 或其他验证性准入控制器都允许请求完成。

如果你禁用了 ValidatingAdmissionWebhook,还必须通过 --runtime-config 标志来禁用 admissionregistration.k8s.io/v1 组/版本中的 ValidatingWebhookConfiguration 对象。

MutatingAdmissionWebhook

此准入控制器调用任何与请求匹配的变更(Mutating) Webhook。匹配的 Webhook 将被顺序调用。 每一个 Webhook 都可以自由修改对象。

MutatingAdmissionWebhook,顾名思义,仅在变更阶段运行。

如果由此准入控制器调用的 Webhook 有副作用(如:减少配额), 则它 必须 具有协调系统,因为不能保证后续的 Webhook 和验证准入控制器都会允许完成请求。

如果你禁用了 MutatingAdmissionWebhook,那么还必须使用 --runtime-config 标志禁止 admissionregistration.k8s.io/v1 组/版本中的 MutatingWebhookConfiguration, 二者都是默认启用的。

PodSecurity

PodSecurity 准入控制器在新 Pod 被准入之前对其进行检查, 根据请求的安全上下文和 Pod 所在名字空间允许的 Pod 安全性标准的限制来确定新 Pod 是否应该被准入。

PersistentVolumeClaimResize

此准入控制器检查传入的 PersistentVolumeClaim 调整大小请求,对其执行额外的验证检查操作。

建议启用 PersistentVolumeClaimResize 准入控制器。除非 PVC 的 StorageClass 明确地将 allowVolumeExpansion 设置为 true 来显式启用调整大小。 否则,默认情况下该准入控制器会阻止所有对 PVC 大小的调整。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gluster-vol-default
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://192.168.10.100:8080"
  restuser: ""
  secretNamespace: ""
  secretName: ""
allowVolumeExpansion: true

参考文档

https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/

标签:控制器,请求,Webhook,默认,准入,Pod,k8s
From: https://www.cnblogs.com/wangguishe/p/17606485.html

相关文章

  • k8s 学习笔记之数据存储——高级存储
    高级存储前面已经学习了使用NFS提供存储,此时就要求用户会搭建NFS系统,并且会在yaml配置nfs。由于kubernetes支持的存储系统有很多,要求客户全都掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用,kubernetes引入PV和PVC两种资源对象。PV(PersistentVolume......
  • K8S使用ceph-csi持久化存储之RBD
    Kubernetes集成Ceph一般有两种方案:Ceph组件运行在Kubernetes中,可以使用Rook;还有就是Kubernetes集成外部的Ceph集群。Ceph版本[root@master~]#ceph-vcephversion14.2.22(ca74598065096e6fcbd8433c8779a2be0c889351)nautilus(stable)Kubernetes版本[root@master~]#k......
  • 钡铼技术嵌入式ARM控制器BBL302上运行Node-RED
    嵌入式ARM控制器BL301/BL302系列是工业级坚固型工业控制器,采用NXP的高性能处理器I.MX6ULL,搭配先进的ARMCortex-A7构架,运行速度高达800MHz,具有高度的稳定性。本产品最高可提供4路RS485/RS232,1路CAN口,2路网口,2路DI口,2路PWM口输出以及1路USB接口,1路电源输入/输出接口、1路HDMI视频显......
  • k8s安装prometheus
    安装在目标集群上,执行如下命令:kubectlapply-fhttps://github.com/512team/dhorse/raw/main/conf/kubernetes-prometheus.yml使用1.在浏览器访问地址:http://master_ip:30000,如下图所示:2.查看k8s自带的指标数据,如下图所示:3.点击“Execute”按钮,并切换到“Graph”选项卡,......
  • 【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
    问题描述在前两篇文章中,创建了Disk+PV+PVC+POD方案后,并且进入POD中增加文件。【AzureK8S|AKS】在AKS集群中创建PVC(PersistentVolumeClaim)和PV(PersistentVolume)示例【AzureK8S|AKS】进入AKS的POD中查看文件,例如PVCVolumeMounts使用情况但是,当预定的文件夹已经被......
  • 【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
    问题描述在前两篇文章中,创建了Disk+PV+PVC+POD方案后,并且进入POD中增加文件。【AzureK8S|AKS】在AKS集群中创建PVC(PersistentVolumeClaim)和PV(PersistentVolume)示例【AzureK8S|AKS】进入AKS的POD中查看文件,例如PVCVolumeMounts使用情况但是,当预定的文件......
  • 搭建k8s集群错误
    1etcd8月1014:12:32k8master-1etcd[23435]:{"level":"warn","ts":"2022-08-10T14:12:32.069+0800","caller":"rafthttp/http.go:500","msg":"requestclusterIDmismatch","loc......
  • 使用 RKE 方式搭建 K8s 集群并部署 NebulaGraph
    本文由社区用户Albert贡献,首发于NebulaGraph论坛,旨在提供多一种的部署方式使用NebulaGraph。在本文,我将会详细地记录下我用K8s部署分布式图数据库NebulaGraph的过程。下面是本次实践的内容规划:一到十章节为K8s集群搭建过程;十一到十五章节为参考NebulaGraph官......
  • k8s x509数字证书
    证书生成方式手动证书生成工具在使用客户端证书认证的场景下,可以通过easyrsa、openssl或cfssl等工具以手工方式生成证书。证书API可以通过certificates.k8s.ioAPI提供x509证书,用来做身份验证。证书和证书签名请求Kubernetes证书和信任包(trustbundle)API可以通过为Kub......
  • k8s 创建普通用户访问dashboard
    签发用户证书创建私钥#(umask077;opensslgenrsa-outuser1.key2048)创建CSR文件下面的脚本展示了如何生成PKI私钥和CSR。设置CSR的CN和O属性很重要。CN是用户名,O是该用户归属的组。#opensslreq-new-keyuser1.key-outuser1.csr-subj"/CN=user1/O=develop......