关于云计算:浅识k8s中的准入控制器

49次阅读

共计 3555 个字符,预计需要花费 9 分钟才能阅读完成。

背景

在 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/125…
作者:leveryd

前线平安平台:https://www.huoxian.cn/

前线 Zone 社区:https://zone.huoxian.cn/?sort…

正文完
 0