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 名稱空間中的 testtest-pod 資源違反 restrict-image-registries 策略中的 detect-deprecated-registryautogen-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 分鐘。其中:

  1. helm install 是用來安裝 Helm Chart 的指令。
  2. kyverno/kyverno 指定了要安裝的 Chart 名稱和來源。
  3. -n kyverno --create-namespace 指定了安裝的名稱空間,如果不存在則自動建立。
  4. --values values.yaml 用於指定自定義的組態檔案。
  5. --set "extraArgs={backgroundScanInterval=30m}" 設定了 Kyverno 的額外引數,將背景掃描間隔設為 30 分鐘。

背景掃描的特點與限制

  1. 與 Kubernetes API Server 請求流程無關:背景掃描不依賴於 API Server 的請求觸發,因此無法使用某些與請求相關的資訊,如 request.userinfo
  2. 限制使用某些欄位:在政策規則的 match 或 exclude 區塊中,不能使用 Subject、Role 和 ClusterRole 欄位。
  3. 對 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 會檢查現有資源並產生合規報告;當停用時,只會檢查新資源並阻擋不合規的資源。

背景掃描的使用場景

  1. 補償 webhook 失敗:當 webhook 超時且 failurePolicy 設定為 ignore 時,背景掃描可以發現未被捕捉的違規行為。
  2. 新政策影響分析:在發布新政策時,可以對現有叢集資源進行影響分析,避免可能的不良後果。
  3. 棕地環境佈署:允許將 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 的測試案例。其中:

  1. policies 欄位指定了要測試的政策檔案(registry-validate.yaml)。
  2. resources 欄位指定了測試所需的資源檔案(resources.yaml)。
  3. results 欄位定義了測試的預期結果,包括政策名稱、規則名稱、資源名稱和預期結果(fail 或 pass)。

使用 Kyverno CLI 進行測試

  1. 安裝 Kyverno CLI:可以透過 kubectl krew plugin 或獨立二進位制檔案安裝。
  2. 建立測試組態檔案:定義要測試的政策、資源和預期結果。
  3. 執行測試:使用 Kyverno CLI 命令執行測試。
$ kyverno test .

程式碼解析:

# Kyverno CLI 測試指令
$ kyverno test .

內容解密:

此指令用於執行當前目錄下的測試組態。其中:

  1. kyverno test 是執行測試的主要命令。
  2. . 表示在當前目錄下尋找測試組態檔案(kyverno-test.yaml)並執行測試。