为什么要使用 Kubernetes 准入控制器
Kubernetes 準(zhǔn)入控制器是什么?為什么要使用準(zhǔn)入控制器?如何使用?本文對(duì) Kubernetes 準(zhǔn)入控制器進(jìn)行了詳細(xì)解釋。
來(lái)源 | K8sMeetup
作者 |?Arun Prasad
頭圖?|?下載于視覺(jué)中國(guó)
Kubernetes 控制平面由幾個(gè)組件組成。其中一個(gè)組件是 kube-apiserver,簡(jiǎn)單的 API server。它公開(kāi)了一個(gè) REST 端點(diǎn),用戶、集群組件以及客戶端應(yīng)用程序可以通過(guò)該端點(diǎn)與集群進(jìn)行通信。總的來(lái)說(shuō),它會(huì)進(jìn)行以下操作:
從客戶端應(yīng)用程序(如 kubectl)接收標(biāo)準(zhǔn) HTTP 請(qǐng)求。
驗(yàn)證傳入請(qǐng)求并應(yīng)用授權(quán)策略。
在成功的身份驗(yàn)證中,它能根據(jù)端點(diǎn)對(duì)象(Pod、Deployments、Namespace 等)和 http 動(dòng)作(Create、Put、Get、Delete 等)執(zhí)行操作。
對(duì) etcd 數(shù)據(jù)存儲(chǔ)進(jìn)行更改以保存數(shù)據(jù)。
操作完成,它就向客戶端發(fā)送響應(yīng)。
請(qǐng)求流程
現(xiàn)在讓我們考慮這樣一種情況:在請(qǐng)求經(jīng)過(guò)身份驗(yàn)證后,但在對(duì) etcd 數(shù)據(jù)存儲(chǔ)進(jìn)行任何更改之前,我們需要攔截該請(qǐng)求。例如:
攔截客戶端發(fā)送的請(qǐng)求。
解析請(qǐng)求并執(zhí)行操作。
根據(jù)請(qǐng)求的結(jié)果,決定對(duì) etcd 進(jìn)行更改還是拒絕對(duì) etcd 進(jìn)行更改。
Kubernetes 準(zhǔn)入控制器就是用于這種情況的插件。在代碼層面,準(zhǔn)入控制器邏輯與 API server 邏輯解耦,這樣用戶就可以開(kāi)發(fā)自定義攔截器(custom interceptor),無(wú)論何時(shí)對(duì)象被創(chuàng)建、更新或從 etcd 中刪除,都可以調(diào)用該攔截器。
有了準(zhǔn)入控制器,從任意來(lái)源到 API server 的請(qǐng)求流將如下所示:
準(zhǔn)入控制器階段(來(lái)自官方文檔)
官方文檔地址:https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/
根據(jù)準(zhǔn)入控制器執(zhí)行的操作類型,它可以分為 3 種類型:
Mutating(變更)
Validating(驗(yàn)證)
Both(兩者都有)
Mutating:這種控制器可以解析請(qǐng)求,并在請(qǐng)求向下發(fā)送之前對(duì)請(qǐng)求進(jìn)行更改(變更請(qǐng)求)。
示例:AlwaysPullImages
Validating:這種控制器可以解析請(qǐng)求并根據(jù)特定數(shù)據(jù)進(jìn)行驗(yàn)證。
示例:NamespaceExists
Both:這種控制器可以執(zhí)行變更和驗(yàn)證兩種操作。
示例:CertificateSigning
有關(guān)這些控制器更多信息,查看官方文檔:https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do
準(zhǔn)入控制器過(guò)程包括按順序執(zhí)行的2個(gè)階段:
Mutating(變更)階段(先執(zhí)行)
Validation (驗(yàn)證)階段(變更階段后執(zhí)行)
Kubernetes 集群已經(jīng)在使用準(zhǔn)入控制器來(lái)執(zhí)行許多任務(wù)。
Kubernetes 附帶的準(zhǔn)入控制器列表:https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do
通過(guò)該列表,我們可以發(fā)現(xiàn)大多數(shù)操作,如 AlwaysPullImages、DefaultStorageClass、PodSecurityPolicy 等,實(shí)際上都是由不同的準(zhǔn)入控制器執(zhí)行的。
如何啟用或禁用準(zhǔn)入控制器?
要啟用準(zhǔn)入控制器,我們必須在啟動(dòng) kube-apiserver 時(shí),將以逗號(hào)分隔的準(zhǔn)入控制器插件名稱列表傳遞給?--enable-ading-plugins。對(duì)于默認(rèn)插件,命令如下所示:
要禁用準(zhǔn)入控制器插件,可以將插件名稱列表傳遞給?--disable-admission-plugins。它將覆蓋默認(rèn)啟用的插件列表。
默認(rèn)準(zhǔn)入控制器
NamespaceLifecycle
LimitRanger
ServiceAccount
TaintNodesByCondition
Priority
DefaultTolerationSeconds
DefaultStorageClass
StorageObjectInUseProtection
PersistentVolumeClaimResize
RuntimeClass
CertificateApproval
CertificateSigning
CertificateSubjectRestriction
DefaultIngressClass
MutatingAdmissionWebhook
ValidatingAdmissionWebhook
ResourceQuota
為什么要使用準(zhǔn)入控制器?
準(zhǔn)入控制器能提供額外的安全和治理層,以幫助 Kubernetes 集群的用戶使用。
執(zhí)行策略:通過(guò)使用自定義準(zhǔn)入控制器,我們可以驗(yàn)證請(qǐng)求并檢查它是否包含特定的所需信息。例如,我們可以檢查 Pod 是否設(shè)置了正確的標(biāo)簽。如果沒(méi)有,那可以一起拒絕該請(qǐng)求。某些情況下,如果請(qǐng)求中缺少一些字段,我們也可以更改這些字段。例如,如果 Pod 沒(méi)有設(shè)置資源限制,我們可以為 Pod 添加特定的資源限制。通過(guò)這樣的方式,除非明確指定,集群中的所有 Pod 都將根據(jù)我們的要求設(shè)置資源限制。Limit Range 就是這種實(shí)現(xiàn)。
安全性:我們可以拒絕不遵循特定規(guī)范的請(qǐng)求。例如,沒(méi)有一個(gè) Pod 請(qǐng)求可以將安全網(wǎng)關(guān)設(shè)置為以 root 用戶身份運(yùn)行。
統(tǒng)一工作負(fù)載:通過(guò)更改請(qǐng)求并為用戶未設(shè)置的規(guī)范設(shè)置默認(rèn)值,我們可以確保集群上運(yùn)行的工作負(fù)載是統(tǒng)一的,并遵循集群管理員定義的特定標(biāo)準(zhǔn)。這些就是我們開(kāi)始使用 Kubernetes 準(zhǔn)入控制器需要知道的所有理論。
原文鏈接:https://medium.com/cloudlego/kubernetes-admission-controllers-request-interceptors-47a9b12c5303
更多閱讀推薦
都在說(shuō)云原生,它的技術(shù)圖譜你真的了解嗎?
SRE 是如何保障穩(wěn)定性的
如何寫(xiě)出讓 CPU 跑得更快的代碼?
Serverless 在 SaaS 領(lǐng)域的最佳實(shí)踐
云原生人物志|Pulsar翟佳:社區(qū)的信任最重要
阿里的 RocketMQ 如何讓雙十一峰值之下0故障
總結(jié)
以上是生活随笔為你收集整理的为什么要使用 Kubernetes 准入控制器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实现工具自由!开源的桌面工具箱
- 下一篇: 国产数据库技术全面破冰,金融核心系统打破