Kyverno(希臘語(yǔ)為“治理”)是專為 Kubernetes 設(shè)計(jì)的策略引擎。它的許多功能中的一些包括:
策略作為 Kubernetes 資源(無(wú)需學(xué)習(xí)新語(yǔ)言!)
驗(yàn)證、變更或生成任何資源
驗(yàn)證軟件供應(yīng)鏈安全的容器鏡像
巡檢鏡像元數(shù)據(jù)
使用標(biāo)簽選擇器和通配符匹配資源
使用疊加層進(jìn)行驗(yàn)證和變更(比如 Kustomize!)
跨命名空間同步配置
使用準(zhǔn)入控制阻止不符合要求的資源囱稽,或報(bào)告違反策略的情況
在應(yīng)用到集群之前,在 CI/CD 管道中使用 Kyverno CLI 測(cè)試策略并驗(yàn)證資源
使用 git 和 kustomize 等熟悉的工具像管理代碼一樣管理策略
Kyverno 允許集群管理員獨(dú)立于工作負(fù)載配置來(lái)管理特定于環(huán)境的配置二跋,并為其集群實(shí)施配置最佳實(shí)踐战惊。 Kyverno 可用于掃描現(xiàn)有工作負(fù)載以使其符合最佳實(shí)踐,也可用于通過(guò)阻止或更改 API 請(qǐng)求來(lái)強(qiáng)制執(zhí)行最佳實(shí)踐扎即。
Kyverno 如何工作吞获?
Kyverno 在 Kubernetes 集群中作為動(dòng)態(tài)準(zhǔn)入控制器運(yùn)行况凉。 Kyverno 從 kube-apiserver 接收驗(yàn)證和修改準(zhǔn)入 webhook HTTP 回調(diào),并應(yīng)用匹配策略返回執(zhí)行準(zhǔn)入策略或拒絕請(qǐng)求的結(jié)果各拷。
Kyverno 策略可以使用資源種類刁绒、名稱和標(biāo)簽選擇器匹配資源。 名稱中支持通配符烤黍。
變更策略可以編寫為overlay(類似于 Kustomize)或 RFC 6902 JSON 補(bǔ)丁知市。 驗(yàn)證策略還使用 overlay 樣式語(yǔ)法,支持模式匹配和條件(if-then-else)處理速蕊。
使用 Kubernetes 事件捕獲策略執(zhí)行結(jié)果嫂丙。 Kyverno 還報(bào)告現(xiàn)有資源的政策違規(guī)行為。
下圖顯示了 Kyverno 的高級(jí)架構(gòu):
Kyverno 的高可用性安裝可以運(yùn)行多個(gè)副本规哲, Kyverno 的每個(gè)副本將具有多個(gè)執(zhí)行不同功能的控制器奢入。Webhook 處理來(lái)自 Kubernetes API Server 的 AdmissionReview 請(qǐng)求,其 Monitor 組件生成和管理所需的配置媳叨。PolicyController 監(jiān)視策略資源并根據(jù)配置的掃描間隔啟動(dòng)后臺(tái)掃描。GenerateController 管理生成的資源的生命周期关顷。
快速開(kāi)始
本小節(jié)將幫助您安裝 Kyverno 并創(chuàng)建您的第一個(gè)策略糊秆。
注意
您的 Kubernetes 集群版本必須高于 v1.14,否則會(huì)增加 webhook 超時(shí)议双。 檢查兼容性矩陣以確保您的 Kubernetes 版本受支持痘番。 要檢查版本,請(qǐng)輸入 kubectl version平痰。
您可以選擇直接從最新版本清單安裝 Kyverno 或使用 Helm汞舱。
要使用最新版本清單(可能是預(yù)發(fā)行版)安裝 Kyverno:
kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml
也可以使用 Helm chart 安裝 Kyverno:
# 添加 Helm 倉(cāng)庫(kù)
helm repo add kyverno https://kyverno.github.io/kyverno/
# 掃描你的 Helm 倉(cāng)庫(kù),以獲取最新可用的 chart
helm repo update
# 將 Kyverno Helm char 安裝到一個(gè)新的叫作 "kyverno" 的命名空間中
helm install kyverno kyverno/kyverno -n kyverno --create-namespace
將以下策略添加到您的集群宗雇。 它包含一個(gè)驗(yàn)證規(guī)則昂芜,要求所有 Pod 都有一個(gè) app.kubernetes.io/name 標(biāo)簽。 Kyverno 支持不同的規(guī)則類型來(lái)驗(yàn)證赔蒲、變更泌神、生成和驗(yàn)證鏡像配置。策略屬性 validationFailureAction 設(shè)置為強(qiáng)制阻止不合規(guī)的 API 請(qǐng)求(使用默認(rèn)值 audit 將報(bào)告違規(guī)但不阻止請(qǐng)求舞虱。)
kubectl create -f- << EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: enforce
rules:
- name: check-for-labels
match:
any:
- resources:
kinds:
- Pod
validate:
message: "label 'app.kubernetes.io/name' is required"
pattern:
metadata:
labels:
app.kubernetes.io/name: "?*"
EOF
嘗試創(chuàng)建一個(gè)沒(méi)有所需標(biāo)簽的 Deployment:
kubectl create deployment nginx --image=nginx
你會(huì)看到如下報(bào)錯(cuò)信息:
error: failed to create deployment: admission webhook "validate.kyverno.svc-fail" denied the request:
resource Deployment/default/nginx was blocked due to the following policies
require-labels:
autogen-check-for-labels: 'validation error: label ''app.kubernetes.io/name'' is
required. Rule autogen-check-for-labels failed at path /spec/template/metadata/labels/app.kubernetes.io/name/'
注意
Kyverno 可以配置為排除系統(tǒng)命名空間欢际,如 kube-system 和 kyverno。 確保在用戶定義的命名空間或默認(rèn)命名空間中創(chuàng)建 Deployment矾兜。
盡管 ClusterPolicy 在 Pod 上匹配损趋,但 Kyverno 智能地將其應(yīng)用于所有能夠默認(rèn)生成 Pod 的源,包括上面的 Deployment椅寺。
創(chuàng)建一個(gè)帶有所需標(biāo)簽的 Pod浑槽。 例如蒋失,使用此命令:
kubectl run nginx --image nginx --labels app.kubernetes.io/name=nginx
此 Pod 配置符合策略,未被阻止括荡。
恭喜高镐,您剛剛在 Kubernetes 集群中實(shí)施了一項(xiàng)策略!
通過(guò)刪除所有集群策略進(jìn)行清理:
kubectl delete cpol --all