浅识 K8S 中的准入控制器

admin 2025年1月11日14:06:44评论1 views字数 3904阅读13分0秒阅读模式

文章首发于:

火线Zone社区(https://zone.huoxian.cn/)

背景

在 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, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota">>> len(a.split(","))17

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

这些"准入控制器"介绍可以查看 使用准入控制器文档。(https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/ )

在我的实验环境中,可以看到额外开启了NodeRestriction准入控制器,它实现了apiserver对kubelet请求的权限控制。

root@ip-172-31-14-33:~# ps aux|grep kube-apisroot      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调用"准入控制器"

浅识 K8S 中的准入控制器

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

浅识 K8S 中的准入控制器

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

浅识 K8S 中的准入控制器

总结

  • 请求先经过认证、鉴权,然后经过"准入控制器"

  • 默认开启17个"准入控制器";NodeRestriction不是默认开启的

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

【火线Zone云安全社区群】

进群可以与技术大佬互相交流

进群有机会免费领取节假日礼品

进群可以免费观看技术分享直播

识别二维码回复【社区群】进群

浅识 K8S 中的准入控制器

【相关精选文章】

浅识 K8S 中的准入控制器
浅识 K8S 中的准入控制器
浅识 K8S 中的准入控制器

火线Zone是[火线安全平台]运营的云安全社区,内容涵盖云计算、云安全、漏洞分析、攻防等热门主题,研究讨论云安全相关技术,助力所有云上用户实现全面的安全防护。欢迎具备分享和探索精神的云上用户加入火线Zone社区,共建一个云安全优质社区!

如需转载火线Zone公众号内的文章请联系火线小助手:hxanquan(微信)

浅识 K8S 中的准入控制器

//  火线Zone//

微信号 : huoxian_zone

浅识 K8S 中的准入控制器

点击阅读原文,加入社区,共建一个有技术氛围的优质社区!

原文始发于微信公众号(火线Zone):浅识 K8S 中的准入控制器

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月11日14:06:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   浅识 K8S 中的准入控制器https://cn-sec.com/archives/1152788.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息