Kyverno 作為 Kubernetes 原生的策略引擎,不僅提供即時驗證,也具備事後稽核的機制,讓叢集管理更具彈性。策略例外功能允許針對特定資源設定豁免規則,避免因策略過於嚴格而阻礙正常運作。而策略報告則彙整了策略執行結果,提供可讀性高的報告,方便管理者快速掌握叢集安全狀態。此外,背景掃描功能可以彌補 webhook 限制,確保所有資源都符合策略規範,對於已存在的叢集環境尤其實用。搭配 Kyverno CLI 提供的測試功能,更能在佈署前完整驗證策略的有效性,降低上線風險。
Kyverno 策略管理與報告機制詳解
Kyverno 是一個強大的 Kubernetes 策略管理工具,提供了多種策略型別和報告機制來確保叢集的安全性和合規性。本文將探討 Kyverno 的策略管理功能,特別是策略例外(Policy Exceptions)和策略報告(Policy Reporting)。
策略例外(Policy Exceptions)
Kyverno 允許使用者為特定的策略和規則建立例外,而無需修改名稱空間標籤或 webhook 設定。這種靈活性使得使用者可以在不改變策略規則的情況下,允許某些特定的資源違反策略。
策略例外範例
以下是一個策略例外的 YAML 定義:
apiVersion: kyverno.io/v2alpha1
kind: PolicyException
metadata:
name: policy-test-exception
namespace: policy-test
spec:
exceptions:
- policyName: restrict-image-registries
ruleNames:
- detect-deprecated-registry
- autogen-detect-deprecated-registry
match:
any:
- resources:
kinds:
- Pod
- Deployment
namespaces:
- policy-test
names:
- test
- test-pod
這個範例中,policy-test-exception 例外允許 policy-test 名稱空間中的 test 和 test-pod 資源違反 restrict-image-registries 策略中的 detect-deprecated-registry 和 autogen-detect-deprecated-registry 規則。
程式碼解析
import yaml
def create_policy_exception(policy_name, namespace, resources):
policy_exception = {
'apiVersion': 'kyverno.io/v2alpha1',
'kind': 'PolicyException',
'metadata': {
'name': f'{policy_name}-exception',
'namespace': namespace
},
'spec': {
'exceptions': [
{
'policyName': policy_name,
'ruleNames': [
'detect-deprecated-registry',
'autogen-detect-deprecated-registry'
],
'match': {
'any': [
{
'resources': {
'kinds': resources['kinds'],
'namespaces': [namespace],
'names': resources['names']
}
}
]
}
}
]
}
}
return yaml.dump(policy_exception, default_flow_style=False)
# 使用範例
resources = {
'kinds': ['Pod', 'Deployment'],
'names': ['test', 'test-pod']
}
print(create_policy_exception('restrict-image-registries', 'policy-test', resources))
內容解密:
此 Python 指令碼用於動態生成 Kyverno 策略例外的 YAML 定義。指令碼中定義了一個 create_policy_exception 函式,該函式接受策略名稱、名稱空間和資源清單作為輸入引數。函式內部構建了一個符合 Kyverno 策略例外規範的字典結構,並使用 PyYAML 函式庫將其序列化為 YAML 格式的字串。指令碼最後提供了一個使用範例,展示如何呼叫該函式並列印生成的 YAML 定義。
策略報告(Policy Reporting)
Kyverno 提供了策略報告功能,可以產生人類可讀和機器可讀的報告,描述策略對資源的執行結果。這些報告根據 CRD(Custom Resource Definitions)和 CNCF Kubernetes Policy WG 發布的開放格式。
策略報告範例
以下是一個策略報告的 YAML 定義:
apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata:
name: b9d4352c-4c38-4948-bcc6-8cd849c22f1f
namespace: policy-test
results:
- message: 'validation error: The label `app.kubernetes.io/name` is required. rule check-for-labels failed at path /metadata/labels/app.kubernetes.io/name/'
policy: require-labels
result: fail
rule: check-for-labels
scored: true
severity: medium
source: kyverno
summary:
error: 0
fail: 1
pass: 0
skip: 0
warn: 0
圖表說明
graph LR;
A[Kyverno 策略] -->|評估|> B[資源];
B -->|產生|> C[策略報告];
C -->|儲存|> D[名稱空間];
D -->|查詢|> E[Policy Reporter];
圖表翻譯:
此 Mermaid 圖表展示了 Kyverno 策略評估流程及其與策略報告的關聯。首先,Kyverno 策略對叢集中的資源進行評估。評估結果隨後用於生成相應的策略報告。這些報告被儲存在特定的名稱空間中,以便於後續的查詢和分析。最後,Policy Reporter 提供了一個使用者友好的介面,用於查詢和展示這些策略報告,從而幫助使用者更好地理解和管理叢集的安全狀態。
背景掃描(Background Scans)
Kyverno 的背景掃描功能預設在驗證和驗證映像檔策略中啟用。此功能允許 Kyverno 對現有的資源應用策略,即使這些資源在策略建立之前就已經存在於叢集中。
停用背景掃描
spec:
validationFailureAction: Enforce
background: false
Kyverno 背景掃描與政策測試的深入解析
Kyverno 作為一個強大的 Kubernetes 政策管理工具,不僅能夠在資源建立或更新時進行驗證和變更,還能夠透過背景掃描定期檢查現有資源是否符合政策要求。這種機制大大增強了叢集的安全性和合規性。
背景掃描的工作原理
背景掃描是 Kyverno 的一項重要功能,它允許系統定期檢查叢集中的現有資源是否符合已定義的政策。預設情況下,Kyverno 的背景掃描每小時執行一次,但這個間隔可以透過安裝時的 backgroundScanInterval 引數進行調整。例如:
$ helm install kyverno kyverno/kyverno -n kyverno --create-namespace \
--values values.yaml --set "extraArgs={backgroundScanInterval=30m}"
程式碼解析:
# Helm 安裝指令範例
helm install kyverno kyverno/kyverno -n kyverno --create-namespace \
--values values.yaml --set "extraArgs={backgroundScanInterval=30m}"
內容解密:
此 Helm 指令用於安裝 Kyverno,並設定背景掃描間隔為 30 分鐘。其中:
helm install是用來安裝 Helm Chart 的指令。kyverno/kyverno指定了要安裝的 Chart 名稱和來源。-n kyverno --create-namespace指定了安裝的名稱空間,如果不存在則自動建立。--values values.yaml用於指定自定義的組態檔案。--set "extraArgs={backgroundScanInterval=30m}"設定了 Kyverno 的額外引數,將背景掃描間隔設為 30 分鐘。
背景掃描的特點與限制
- 與 Kubernetes API Server 請求流程無關:背景掃描不依賴於 API Server 的請求觸發,因此無法使用某些與請求相關的資訊,如
request.userinfo。 - 限制使用某些欄位:在政策規則的 match 或 exclude 區塊中,不能使用 Subject、Role 和 ClusterRole 欄位。
- 對 PolicyReports 的影響:背景掃描的設定會影響 PolicyReports 和 ClusterPolicyReports 的產生。當背景掃描被停用且
validationFailureAction設定為 Enforce 時,仍然會為透過政策檢查的資源建立報告結果。
圖表說明:Kyverno 背景掃描報告行為
graph LR
A[背景掃描設定] -->|啟用|> B[產生 PolicyReports]
A -->|停用|> C[不產生 PolicyReports]
B --> D[檢查現有資源]
C --> E[僅檢查新資源]
D --> F[產生合規報告]
E --> G[阻擋不合規資源]
圖表翻譯:
此圖表展示了 Kyverno 背景掃描設定對 PolicyReports 產生的影響。當背景掃描啟用時,Kyverno 會檢查現有資源並產生合規報告;當停用時,只會檢查新資源並阻擋不合規的資源。
背景掃描的使用場景
- 補償 webhook 失敗:當 webhook 超時且
failurePolicy設定為 ignore 時,背景掃描可以發現未被捕捉的違規行為。 - 新政策影響分析:在發布新政策時,可以對現有叢集資源進行影響分析,避免可能的不良後果。
- 棕地環境佈署:允許將 Kyverno 政策引入現有叢集,並檢視政策應用於現有資源的結果,而不會造成任何影響。
政策測試
Kyverno CLI 提供了一個強大的工具來測試政策,無論是否在 Kubernetes 叢集中。測試組態檔案(kyverno-test.yaml)定義了測試案例,包括要測試的政策、資源和預期結果。
測試組態範例:
apiVersion: cli.kyverno.io/v1alpha1
kind: Test
metadata:
name: kyverno-test
policies:
- registry-validate.yaml
resources:
- resources.yaml
results:
- policy: restrict-image-registries
rule: restrict-image-registries
resource: policy-test/test-pod-bad
result: fail
程式碼解析:
# Kyverno 測試組態範例
apiVersion: cli.kyverno.io/v1alpha1
kind: Test
metadata:
name: kyverno-test
policies:
- registry-validate.yaml
resources:
- resources.yaml
results:
- policy: restrict-image-registries
rule: restrict-image-registries
resource: policy-test/test-pod-bad
result: fail
內容解密:
此測試組態檔案定義了一個名為 kyverno-test 的測試案例。其中:
policies欄位指定了要測試的政策檔案(registry-validate.yaml)。resources欄位指定了測試所需的資源檔案(resources.yaml)。results欄位定義了測試的預期結果,包括政策名稱、規則名稱、資源名稱和預期結果(fail 或 pass)。
使用 Kyverno CLI 進行測試
- 安裝 Kyverno CLI:可以透過 kubectl krew plugin 或獨立二進位制檔案安裝。
- 建立測試組態檔案:定義要測試的政策、資源和預期結果。
- 執行測試:使用 Kyverno CLI 命令執行測試。
$ kyverno test .
程式碼解析:
# Kyverno CLI 測試指令
$ kyverno test .
內容解密:
此指令用於執行當前目錄下的測試組態。其中:
kyverno test是執行測試的主要命令。.表示在當前目錄下尋找測試組態檔案(kyverno-test.yaml)並執行測試。