1. Kubernetes介紹(shao)
Kubernetes是一(yi)個開源的(de)(de)容器(qi)編(bian)排平臺,用(yong)于(yu)自(zi)動化部署、擴展和(he)管(guan)理(li)(li)容器(qi)化應用(yong)程序。它(ta)提供(gong)了一(yi)種便(bian)捷的(de)(de)方式來(lai)管(guan)理(li)(li)容器(qi),使得應用(yong)程序可以在(zai)多個主(zhu)機上運(yun)行,并能夠自(zi)動處理(li)(li)容器(qi)的(de)(de)調(diao)度(du)、網絡和(he)存儲等方面的(de)(de)問題。Kubernetes具有高度(du)可擴展性和(he)靈活(huo)性,被廣泛(fan)用(yong)于(yu)構建(jian)和(he)管(guan)理(li)(li)云原生應用(yong)程序。
2.Kubernetes webhook介紹
Kubernetes的Webhook是一種機制,用于與Kubernetes API進行(xing)交互和集(ji)成。它允許開發(fa)人員定(ding)(ding)(ding)義自定(ding)(ding)(ding)義的觸發(fa)器,當(dang)發(fa)生特定(ding)(ding)(ding)事(shi)件時,可以(yi)通過Webhook來執行(xing)一些自定(ding)(ding)(ding)義的邏(luo)輯(ji)。
具體來說(shuo),Kubernetes的Webhook能(neng)夠在以下幾個關鍵事件發生時觸發:
-
Mutating Webhook:在(zai)創建或更新資源之(zhi)前,可以(yi)對(dui)請求(qiu)進行修(xiu)改。通過Webhook,可以(yi)自定義對(dui)請求(qiu)的(de)(de)修(xiu)改,例如自動(dong)注入某些標簽、修(xiu)改容器(qi)的(de)(de)環境變量(liang)等。
-
Validation Webhook:在(zai)創建(jian)或更(geng)新資(zi)源之前,可以對請求(qiu)進(jin)行驗證(zheng)。通過Webhook,可以自定(ding)義(yi)驗證(zheng)邏輯(ji),例如檢查資(zi)源的(de)字段是否符合(he)特定(ding)的(de)規則或策略。
使用Webhook可以擴展和定制(zhi)Kubernetes的行為,使其適(shi)應特定的環境和需求。開發人員可以編寫Webhook服務,并(bing)將其配置到Kubernetes集群中(zhong),從而實現對Kubernetes API請求的自定義處理(li)。
3.應用場景(jing)
-
安(an)全(quan)性增(zeng)強:通過Admission控制Webhook,可以對Kubernetes資源的(de)創(chuang)建、更新或刪(shan)除(chu)進行自定義驗證,確(que)保只有符(fu)合(he)特定條件的(de)請(qing)求被允許(xu)執行。這可以提高(gao)集群的(de)安(an)全(quan)性,防(fang)止惡意(yi)或非法操作。
-
自動(dong)化和標準化:使用(yong)Mutating Webhook,可(ke)以在資(zi)源(yuan)(yuan)創建或更新之(zhi)前對(dui)請求進行修改。這使得(de)可(ke)以對(dui)資(zi)源(yuan)(yuan)應用(yong)一致的(de)配置、標簽或注解(jie),并自動(dong)執行一些常(chang)見的(de)操作,如自動(dong)添(tian)加sidecar容器、注入特定(ding)的(de)環(huan)境變量等。這樣(yang)可(ke)以實現自動(dong)化的(de)部(bu)署和配置管理,提高應用(yong)程序的(de)可(ke)靠(kao)性和一致性。
-
靈(ling)活(huo)性(xing)(xing)和可(ke)擴(kuo)展性(xing)(xing):Webhook機制允許(xu)您根據特定需(xu)求(qiu)或場景自定義驗證和處(chu)理(li)邏輯。這(zhe)樣可(ke)以擴(kuo)展Kubernetes平臺的能力(li),滿(man)足(zu)特定企業或組織的需(xu)求(qiu)。開發人員可(ke)以編寫自定義的Webhook服務,根據業務邏輯對(dui)請求(qiu)進行處(chu)理(li),在Kubernetes集群(qun)中(zhong)實現(xian)個(ge)性(xing)(xing)化的特性(xing)(xing)或定制策略。
-
第三(san)方(fang)集(ji)成和(he)(he)生態系統(tong):Kubernetes的(de)Webhook機制提供了與其他(ta)第三(san)方(fang)工(gong)(gong)具(ju)(ju)和(he)(he)服務集(ji)成的(de)橋梁(liang)。通過(guo)Webhook,可以將Kubernetes與其他(ta)服務或系統(tong)進行集(ji)成,如CI/CD工(gong)(gong)具(ju)(ju)、安(an)全審(shen)計(ji)工(gong)(gong)具(ju)(ju)、配置(zhi)管理工(gong)(gong)具(ju)(ju)等(deng),從而(er)構建更強(qiang)大和(he)(he)完整的(de)開發(fa)和(he)(he)運維生態系統(tong)。
綜上所(suo)述,Kubernetes的(de)(de)Webhook在(zai)增強(qiang)安全性(xing)、實現自動化(hua)、提供靈活性(xing)和(he)促進第三方集成方面具有重要的(de)(de)應(ying)用意(yi)義,可以幫助開發(fa)人員更好地管理和(he)擴展Kubernetes平臺。
4. Validation Webhook 使用介紹:
4.1 資(zi)源(yuan)配置:
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: "pod-policy.example.com"
webhooks:
- name: "pod-policy.example.com"
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods"]
scope: "Namespaced"
clientConfig:
service:
namespace: "example-namespace"
name: "example-service"
caBundle: <CA_BUNDLE>
admissionReviewVersions: ["v1"]
sideEffects: None
timeoutSeconds: 5
以官網提(ti)供的(de)實例為例,要(yao)注冊準入 Webhook,需要(yao)創建 MutatingWebhookConfiguration 或 ValidatingWebhookConfiguration API 對象。 MutatingWebhookConfiguration 或ValidatingWebhookConfiguration 對象的名稱(cheng)必(bi)須是有效的 DNS 子域(yu)名。
每個 Webhook 必(bi)須指(zhi)定(ding)用于(yu)確(que)定(ding)是否(fou)應將對 apiserver 的(de)請求發送到 webhook 的(de)規則列表。 每個規則都指(zhi)定(ding)一個或多個 operations、apiGroups、apiVersions 和 resources 以(yi)及資(zi)源的(de) scope:
-
operations 列(lie)出一個(ge)或多個(ge)要(yao)匹配的操作。 可(ke)以是(shi) CREATE、UPDATE、DELETE、CONNECT 或
*以(yi)匹(pi)配所有內容。 -
apiGroups 列出(chu)了一個(ge)或多(duo)個(ge)要匹配的 API 組(zu)。
""是核心(xin) API 組。"*"匹配所有 API 組。 -
apiVersions 列出了一(yi)個或多個要匹配的 API 版(ban)本。
"*"匹(pi)配所(suo)有 API 版本。 -
resources 列出了(le)一(yi)個或多個要匹(pi)配的(de)資源(yuan)。
-
"*"匹配所有(you)資(zi)源(yuan),但不(bu)包括子資(zi)源(yuan)。 -
"*/*"匹配所有資源,包括(kuo)子資源。 -
"pods/*" 匹配 pod 的所有子資源。
-
"*/status" 匹配所有 status 子資源。
-
-
scope 指定要匹配的范圍。有效值為 "Cluster"、"Namespaced" 和
"*"。 子資源(yuan)匹配(pei)其父資源(yuan)的范圍。默(mo)認值為"*"。-
"Cluster"表示只有集群作用(yong)域(yu)的資源才能匹配此規則(ze)(API 對象 Namespace 是(shi)集群作用(yong)域(yu)的)。
-
"Namespaced"意味著僅具(ju)有名(ming)字(zi)空間的資源(yuan)才符合此(ci)規則(ze)。
-
"*"表示(shi)沒有作用域限制。
-
如果傳入請(qing)求與任何 Webhook 的rules 指定 operations、groups、versions、 resources 和(he) scope 匹配,則該(gai)請求(qiu)將發送到(dao) Webhook。
4.2 請求
Webhook 發送 POST 請求時,會將請求包裝成AdmissionReview,具體(ti)參(can)數(shu)如下所示:
apiVersion: admission.k8s.io/v1
kind: AdmissionReview
request:
# 唯一標識此準入回調的隨機 uid
uid: 705ab4f5-6393-11e8-b7cc-42010a800002
# 傳入完全正確的 group/version/kind 對象
kind:
group: autoscaling
version: v1
kind: Scale
# 修改 resource 的完全正確的的 group/version/kind
resource:
group: apps
version: v1
resource: deployments
# subResource(如果請求是針對 subResource 的)
subResource: scale
# 在對 API 服務器的原始請求中,傳入對象的標準 group/version/kind
# 僅當 Webhook 指定 `matchPolicy: Equivalent` 且將對 API 服務器的原始請求
# 轉換為 Webhook 注冊的版本時,這才與 `kind` 不同。
requestKind:
group: autoscaling
version: v1
kind: Scale
# 在對 API 服務器的原始請求中正在修改的資源的標準 group/version/kind
# 僅當 Webhook 指定了 `matchPolicy:Equivalent` 并且將對 API 服務器的原始請求轉換為
# Webhook 注冊的版本時,這才與 `resource` 不同。
requestResource:
group: apps
version: v1
resource: deployments
# subResource(如果請求是針對 subResource 的)
# 僅當 Webhook 指定了 `matchPolicy:Equivalent` 并且將對
# API 服務器的原始請求轉換為該 Webhook 注冊的版本時,這才與 `subResource` 不同。
requestSubResource: scale
# 被修改資源的名稱
name: my-deployment
# 如果資源是屬于名字空間(或者是名字空間對象),則這是被修改的資源的名字空間
namespace: my-namespace
# 操作可以是 CREATE、UPDATE、DELETE 或 CONNECT
operation: UPDATE
userInfo:
# 向 API 服務器發出請求的經過身份驗證的用戶的用戶名
username: admin
# 向 API 服務器發出請求的經過身份驗證的用戶的 UID
uid: 014fbff9a07c
# 向 API 服務器發出請求的經過身份驗證的用戶的組成員身份
groups:
- system:authenticated
- my-admin-group
# 向 API 服務器發出請求的用戶相關的任意附加信息
# 該字段由 API 服務器身份驗證層填充,并且如果 webhook 執行了任何
# SubjectAccessReview 檢查,則應將其包括在內。
extra:
some-key:
- some-value1
- some-value2
# object 是被接納的新對象。
# 對于 DELETE 操作,它為 null。
object:
apiVersion: autoscaling/v1
kind: Scale
# oldObject 是現有對象。
# 對于 CREATE 和 CONNECT 操作,它為 null。
oldObject:
apiVersion: autoscaling/v1
kind: Scale
# options 包含要接受的操作的選項,例如 meta.k8s.io/v CreateOptions、UpdateOptions 或 DeleteOptions。
# 對于 CONNECT 操作,它為 null。
options:
apiVersion: meta.k8s.io/v1
kind: UpdateOptions
# dryRun 表示 API 請求正在以 `dryrun` 模式運行,并且將不會保留。
# 帶有副作用的 Webhook 應該避免在 dryRun 為 true 時激活這些副作用。
dryRun: False
可以通過反序列化獲取(qu)AdmissionReview對象的(de)所有信息,然(ran)后(hou)根據實際(ji)的(de)業務常見,對相關資(zi)源的(de)屬(shu)性進行驗證。
4.3 響應(ying)
Webhook 會通過狀態碼(ma)、請(qing)求頭參數對應字(zi)段(duan)設置為Content-Type: application/json 和一個包(bao)含(han) AdmissionReview 對象(xiang)的 JSON 序列(lie)化格式來(lai)發送(song)響(xiang)應(ying)。該 AdmissionReview 對象與發送的(de)版本相(xiang)同(tong),且其中包含的(de) response 字段已被(bei)有效填充(chong)。
response 至(zhi)少必須包含以下字段:
-
uid,從發(fa)送到 Webhook 的(de) request.uid 中復制而來
-
allowed,設置為(wei)true或(huo)false
{ "apiVersion": "admission.k8s.io/v1", "kind": "AdmissionReview", "response": { "uid": "<value from request.uid>", "allowed": true } }
Validation Webhook會對請求根(gen)據自己的業務(wu)邏(luo)輯(ji)進行校驗(yan),其中(zhong)allowed字(zi)段為true則代表(biao)(biao)認證通過,alliowed為false則代表(biao)(biao)認證失(shi)敗。
總結:
通過本文,解釋(shi)了(le)(le)Kubernetes的概念,介紹了(le)(le)Kubernetes Webhook的類型(xing)和應用(yong)場景。此外,還以Validation Webhook 為例,介紹資源準入以及(ji)請(qing)求和響(xiang)應。Kubernetes Webhook可以幫助用(yong)戶在Kubernetes平臺上完成更復雜(za)的功能,期待讀者在實際應用(yong)中發揮(hui)Webhook機制的優勢。