Kyverno(希臘語為“治理”)是專為 Kubernetes 設計的策略引擎。它的許多功能中的一些包括:
策略作為 Kubernetes 資源(無需學習新語言!)
驗證、變更或生成任何資源
驗證軟件供應鏈安全的容器鏡像
巡檢鏡像元數據
使用標簽選擇器和通配符匹配資源
使用疊加層進行驗證和變更(比如 Kustomize!)
跨命名空間同步配置
使用準入控制阻止不符合要求的資源,或報告違反策略的情況
在應用到集群之前,在 CI/CD 管道中使用 Kyverno CLI 測試策略并驗證資源
使用 git 和 kustomize 等熟悉的工具像管理代碼一樣管理策略
Kyverno 允許集群管理員獨立于工作負載配置來管理特定于環境的配置,并為其集群實施配置最佳實踐。 Kyverno 可用于掃描現有工作負載以使其符合最佳實踐,也可用于通過阻止或更改 API 請求來強制執行最佳實踐。
Kyverno 如何工作?
Kyverno 在 Kubernetes 集群中作為動態準入控制器運行。 Kyverno 從 kube-apiserver 接收驗證和修改準入 webhook HTTP 回調,并應用匹配策略返回執行準入策略或拒絕請求的結果。
Kyverno 策略可以使用資源種類、名稱和標簽選擇器匹配資源。 名稱中支持通配符。
變更策略可以編寫為overlay(類似于 Kustomize)或 RFC 6902 JSON 補丁。 驗證策略還使用 overlay 樣式語法,支持模式匹配和條件(if-then-else)處理。
使用 Kubernetes 事件捕獲策略執行結果。 Kyverno 還報告現有資源的政策違規行為。
下圖顯示了 Kyverno 的高級架構:
Kyverno 的高可用性安裝可以運行多個副本, Kyverno 的每個副本將具有多個執行不同功能的控制器。Webhook 處理來自 Kubernetes API Server 的 AdmissionReview 請求,其 Monitor 組件生成和管理所需的配置。PolicyController 監視策略資源并根據配置的掃描間隔啟動后臺掃描。GenerateController 管理生成的資源的生命周期。
快速開始
本小節將幫助您安裝 Kyverno 并創建您的第一個策略。
注意
您的 Kubernetes 集群版本必須高于 v1.14,否則會增加 webhook 超時。 檢查兼容性矩陣以確保您的 Kubernetes 版本受支持。 要檢查版本,請輸入 kubectl version。
您可以選擇直接從最新版本清單安裝 Kyverno 或使用 Helm。
要使用最新版本清單(可能是預發行版)安裝 Kyverno:
kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml
也可以使用 Helm chart 安裝 Kyverno:
# 添加 Helm 倉庫
helm repo add kyverno https://kyverno.github.io/kyverno/
# 掃描你的 Helm 倉庫,以獲取最新可用的 chart
helm repo update
# 將 Kyverno Helm char 安裝到一個新的叫作 "kyverno" 的命名空間中
helm install kyverno kyverno/kyverno -n kyverno --create-namespace
將以下策略添加到您的集群。 它包含一個驗證規則,要求所有 Pod 都有一個 app.kubernetes.io/name 標簽。 Kyverno 支持不同的規則類型來驗證、變更、生成和驗證鏡像配置。策略屬性 validationFailureAction 設置為強制阻止不合規的 API 請求(使用默認值 audit 將報告違規但不阻止請求。)
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
嘗試創建一個沒有所需標簽的 Deployment:
kubectl create deployment nginx --image=nginx
你會看到如下報錯信息:
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 可以配置為排除系統命名空間,如 kube-system 和 kyverno。 確保在用戶定義的命名空間或默認命名空間中創建 Deployment。
盡管 ClusterPolicy 在 Pod 上匹配,但 Kyverno 智能地將其應用于所有能夠默認生成 Pod 的源,包括上面的 Deployment。
創建一個帶有所需標簽的 Pod。 例如,使用此命令:
kubectl run nginx --image nginx --labels app.kubernetes.io/name=nginx
此 Pod 配置符合策略,未被阻止。
恭喜,您剛剛在 Kubernetes 集群中實施了一項策略!
通過刪除所有集群策略進行清理:
kubectl delete cpol --all