背景

在 k8s中各组件和kube apiserver通信时的认证和鉴权 中提到"NodeRestriction准入插件",实际上它是一个"准入控制器"。

"准入控制器"是一个重要的概念,在istio、apisix、某些安全产品中都有用到。

本文简要记录一下以下内容:

  • "准入控制器"是什么
  • 怎么开启"准入控制器"
  • 从源码浅析"准入控制器"

本文使用的k8s集群是用kubekey搭建,命令是./kk create cluster --with-kubernetes v1.21.5 --with-kubesphere v3.2.1

分析

"准入控制器"是什么?

它有点类似"插件",为apiserver提供了很好的"可扩展性"。

请求apiserver时,通过认证、鉴权后、持久化("api对象"保存到etcd)前,会经过"准入控制器",让它可以做"变更和验证"。

"变更"可以修改"api对象",比如istio用来实现pod注入。"验证"可以用来校验"api对象",比如 校验当前集群是否有足够多的资源满足"api对象"、校验当前提交的"pod对象"是否合法。

怎么开启"准入控制器"?

root@ip-172-31-14-33:~/kubernetes-1.21.5/_output/bin# ./kube-apiserver --help |grep admission-plugins...--enable-admission-plugins strings       admission plugins that should be enabled in addition to default enabled ones (NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota). Comma-delimited list of admission plugins: AlwaysAdmit, AlwaysDeny, AlwaysPullImages, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, DefaultStorageClass, DefaultTolerationSeconds, DenyServiceExternalIPs, EventRateLimit, ExtendedResourceToleration, ImagePolicyWebhook, LimitPodHardAntiAffinityTopology, LimitRanger, MutatingAdmissionWebhook, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, NodeRestriction, OwnerReferencesPermissionEnforcement, PersistentVolumeClaimResize, PersistentVolumeLabel, PodNodeSelector, PodSecurityPolicy, PodTolerationRestriction, Priority, ResourceQuota, RuntimeClass, SecurityContextDeny, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionWebhook. The order of plugins in this flag does not matter.

根据命令行帮助可以知道,默认会开启17个"准入控制器"。

>>> a="NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, Persis
tentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota"
>>> len(a.split(","))
17

也可以用--enable-admission-plugins开启额外的"准入控制器"。

这些"准入控制器"介绍可以查看 使用准入控制器 文档。在我的实验环境中,可以看到额外开启了NodeRestriction准入控制器,它实现了apiserver对kubelet请求的权限控制。

root@ip-172-31-14-33:~# ps aux|grep kube-apis
root      9567  4.8  7.8 1381988 613048 ?      Ssl  03:49  17:48 kube-apiserver ... --enable-admission-plugins=NodeRestriction ...

从源码浅析"准入控制器"

我们可以通过"断点调试"结合源码分析,验证前面说的两个结论:

  • 请求先经过认证、鉴权,然后经过"准入控制器"
  • 默认开启17个"准入控制器";加上NodeRestriction就是18个

"认证、日志审计、鉴权"在apiserver中都是以filter的形式存在,而"准入控制器"有点像包装了一层servlet。

func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler {handler := filterlatency.TrackCompleted(apiHandler)handler = genericapifilters.WithAuthorization(handler, c.Authorization.Authorizer, c.Serializer) // 鉴权...handler = genericapifilters.WithAudit(handler, c.AuditBackend, c.AuditPolicyChecker, c.LongRunningFunc)  // 日志审计...handler = genericapifilters.WithAuthentication(handler, c.Authentication.Authenticator, failedHandler, c.Authentication.APIAudiences) // 认证...return handler
}

finishRequest函数中会开goroutine调用"准入控制器"

可以看到 admissionHandler切片长度是18,17个"默认开启的准入控制器"加上NodeRestriction

部分控制器代码在plugin/pkg/admission目录中,会实现Admit接口

总结

  • 请求先经过认证、鉴权,然后经过"准入控制器"
  • 默认开启17个"准入控制器";NodeRestriction不是默认开启的

默认开启的"准入控制器"中有两个很特殊的,ValidatingAdmissionWebhook和MutatingAdmissionWebhook。这两个控制器让apiserver有了更多的可扩展性,实现了"动态准入控制"。

文章首发于火线Zone:https://zone.huoxian.cn/d/1255-k8s 作者:leveryd

火线安全平台:https://www.huoxian.cn/

火线Zone社区:https://zone.huoxian.cn/?sort=newest

浅识k8s中的准入控制器相关推荐

  1. k8s中控制器使用详解

    一.什么是控制器 控制器是管理pod的中间层,只需要告诉Pod控制器,想要创建多少个什么样的Pod,它会创建出满足条件的Pod : 控制器相当于一个状态机,用来控制Pod的具体状态和行为 : cont ...

  2. 【云原生 | Kubernetes 系列】K8s 实战 一文学会如何从 PodSecurityPolicy 迁移到内置的 PodSecurity 准入控制器

    PodSecurityPolicy 迁移到内置的 PodSecurity 准入控制器 前言 一.Pod 安全性 二.访问权限 三.标准化 PodSecurityPolicy 3.1.去掉纯粹变更性质的 ...

  3. webapi控制器怎么接收json_新手指南之 Kubernetes 准入控制器

    Kubernetes 准入控制器在安全性方面具有明显优势.为了增进各位读者对它的了解,今天 K8sMeetup 中国社区翻译了工程师 Malte Isberner 的技术博客,以两个生动的演示和相关代 ...

  4. Admission(准入控制器)-2021.12.05

    目录 文章目录 目录 实验环境 实验软件 1.准入控制器 2.admission webhook 是什么 3.创建配置一个 Admission Webhook 1.编写 webhook 2.构建 3. ...

  5. 关于K8s中资源配置范围管理(LimitRange)的一些笔记

    写在前面 分享一些 K8s 中 LimitRange 的笔记 博文内容涉及: LimitRange 简单介绍 LimitRange 资源对象创建使用 准入检查和资源约束的一些 Demo 理解不足小伙伴 ...

  6. 为什么需要 Kubernetes 准入控制器

    Kubernetes 准入控制器是集群管理必要功能.这些控制器主要在后台工作,并且许多可以作为编译插件使用,它可以极大地提高部署的安全性. 准入控制器在 API 请求传递到 APIServer 之前拦 ...

  7. k8s中的Volume

    目录 emptyDir hostPath 存储PV-PVC emptyDir emptyDir用法: - 暂存空间,例如用于基于磁盘的合并排序 - 用作长时间计算崩溃恢复时的检查点 - Web服务器容 ...

  8. 理清 Kubernetes 中的准入控制(Admission Controller)

    大家好,我是张晋涛. 在我之前发布的文章 <云原生时代下的容器镜像安全>(系列)中,我提到过 Kubernetes 集群的核心组件 --  kube-apiserver,它允许来自终端用户 ...

  9. Kubernetes准入控制器指南

    Kubernetes准入控制器指南 作者:Malte Isberner(StackRox) Kubernetes极大地提高了当今生产中后端群集的速度和可管理性.由于其灵活性.可扩展性和易用性,Kube ...

最新文章

  1. CSS结构选择器四种结构关系的范围
  2. restful可以转发么_DRF使用超链接API实现真正RESTful
  3. HttpSessionActivationListener接口 学习笔记
  4. 《信息学奥赛一本通》回文数(Noip 1999)
  5. U盘里的文件夹会以应用程序的方式出现解决
  6. c# 判断是否为数组_c# – 如何检查反射类型是否为数组
  7. 消息透露苹果新款MacBook Pro预计将在第三季度或第四季度发布
  8. IOError: cannot open resource
  9. 《坦克世界》1.0+:使用 CPU 优化的图形和物理丰富用户体验
  10. Lesson5 一阶自治微分方程
  11. Sharepoint对List增删改操作
  12. NiFi+Kylo安装部署
  13. 【深度解局】佛慢你:张小龙的微信成功三字诀
  14. 涛思数据创始人陶建辉荣获“2020中国开源杰出贡献人物”奖
  15. JAVA8 日期和时间(LocalDate、LocalDateTime、ZoneId、Duration、Period、Instant)API 用法详解
  16. java 生成交易快照_Java生成订单号/交易流水号
  17. GetSystemInfo系统信息
  18. 自己整理的Opencore引导版本升级教程【保姆级详细】
  19. matlab中使用ode方法解范德波尔微分方程的数值解
  20. 微信公众号开发 如何发布图文并茂的文章?

热门文章

  1. LIS优化 —— 队列优化 + 二分
  2. 单词统计(哎呦我去!)
  3. scite自动检测文件编码
  4. LabVIEW与MATLAB联合编程之使用dll库文件连接
  5. expdp和impdp需要注意的地方
  6. 无论是开放外链,或是回归实体,不同的互联网平台之间的高墙正在被推倒
  7. React model
  8. ffmpeg源码分析与应用示例(一)——H.264解码与QP提取
  9. 带你一起Piu Piu Piu
  10. lambda表达式——捕获