Kubernetes 策略管理日益重要,本文探討 Kyverno CLI 和 jsPolicy 兩種工具的應用。Kyverno CLI 提供完整的測試流程,從策略定義、資源匹配到結果驗證,確保策略佈署前的可靠性。其乾跑功能允許預覽策略影響,降低風險。jsPolicy 則引入 JavaScript 撰寫策略,讓更廣泛的開發者參與策略管理,簡化學習成本並提升維護效率。兩種工具各有千秋,滿足不同團隊的需求。

Kyverno CLI 的應用與測試

Kyverno CLI 是 Kyverno 的命令列工具,提供強大的策略測試與應用功能。本文將探討如何使用 Kyverno CLI 進行策略測試、應用與驗證。

Kyverno 策略測試

Kyverno CLI 允許開發者對定義的 ClusterPolicy 進行測試,確保其正確性和有效性。以下是一個具體的測試範例:

# restrict-image-registries ClusterPolicy 定義
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: restrict-image-registries
spec:
  rules:
  - name: restrict-image-registries
    match:
      any:
      - resources:
          kinds:
          - Pod
          namespaces:
          - policy-test
    validate:
      message: "The 'k8s.gcr.io' image registry is deprecated. 'registry.k8s.io' should now be used."
      pattern:
        spec:
          containers:
          - image: "!k8s.gcr.io/*"

內容解密:

  1. ClusterPolicy 定義:這是一個名為 restrict-image-registries 的策略,用於限制容器映像的來源。
  2. 匹配規則:該策略只會對 policy-test 名稱空間中的 Pod 資源進行檢查。
  3. 驗證規則:檢查容器映像是否包含 k8s.gcr.io 字串,若包含則觸發驗證失敗。

執行 Kyverno 策略測試

執行測試的命令如下:

$ kyverno test .
Loading test ( kyverno-test.yaml ) ...
Loading values/variables ...
Loading policies ...
Loading resources ...
Applying 1 policy to 2 resources ...
Checking results ...

內容解密:

  1. kyverno test . 命令:在當前目錄執行測試。
  2. 載入測試組態:從 kyverno-test.yaml 檔案中載入測試組態。
  3. 應用策略:將定義的策略應用到指定的資源上。

測試結果分析

測試結果如下表所示:

ID Policy Rule Resource Result Reason
1 restrict-image-registries restrict-image-registries policy-test/Pod/test-pod-bad Pass OK
2 restrict-image-registries restrict-image-registries policy-test/Pod/test-pod-good Pass OK

內容解密:

  1. 測試結果:兩個測試案例均透過驗證。
  2. 資源檢查test-pod-badtest-pod-good 兩個 Pod 資源被檢查。

新增變異策略後的測試

新增一個變異策略後,重新執行測試:

# Deprecated image registry mutation ClusterPolicy spec
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: change-deprecated-containers
spec:
  rules:
  - name: change-deprecated-containers
    match:
      any:
      - resources:
          kinds:
          - Pod
    mutate:
      foreach:
      - list: "request.object.spec.containers"
        patchStrategicMerge:
          spec:
            containers:
            - name: "{{ element.name }}"
              image: "registry.k8s.io/{{ images.containers.'{{element.name}}'.path }}:{{ images.containers.'{{element.name}}'.tag }}"

內容解密:

  1. 變異策略:該策略會將容器映像中的 k8s.gcr.io 字串替換為 registry.k8s.io
  2. 匹配規則:對所有 Pod 資源進行變異操作。

再次執行測試

$ kyverno test .
Loading test ( kyverno-test.yaml ) ...
Loading values/variables ...
Loading policies ...
Loading resources ...
Applying 2 policies to 2 resources ...
Checking results ...

內容解密:

  1. 多策略應用:同時應用驗證和變異策略。
  2. 測試結果分析:儘管變異策略修改了資源,但測試仍然透過。

使用 Kyverno CLI 進行乾跑(Dry-run)

Kyverno CLI 可以在不實際應用策略的情況下,進行乾跑測試:

$ kyverno apply registry-validate.yaml --resource 3-test-deploy.yaml
Applying 3 policy rule(s) to 1 resource(s)...
pass: 0, fail: 1, warn: 0, error: 0, skip: 0
Error: exit as fail or error count > 0

內容解密:

  1. kyverno apply 命令:將策略應用到指定的資原始檔。
  2. 結果分析:資源驗證失敗,因為它使用了已棄用的映像倉函式庫。

對叢集資源進行乾跑

$ kyverno apply registry-validate.yaml --cluster -p
Applying 3 policy rule(s) to 11 resource(s)...

內容解密:

  1. --cluster 選項:對叢集中的資源進行檢查。
  2. -p 選項:輸出 PolicyReport。

PolicyReport 分析

輸出的 PolicyReport 如下:

apiVersion: wgpolicyk8s.io/v1alpha2
kind: ClusterPolicyReport
metadata:
  name: merged
results:
- category: Best Practices
  message: "validation failure: The 'k8s.gcr.io' image registry is deprecated. 'registry.k8s.io' should now be used."
  policy: restrict-image-registries
  resources:
  - apiVersion: v1
    kind: Pod
    name: test-pod
    namespace: policy-test
    uid: 9e43d3e3-8c2c-4fbf-b54a-4405dc121dc4
  result: fail
  rule: restrict-image-registries
  scored: true
  severity: medium
  source: kyverno

內容解密:

  1. PolicyReport 結構:包含檢查結果的詳細資訊。
  2. 檢查結果:顯示哪些資源未透過驗證及其原因。

隨著 Kubernetes 生態系統的不斷發展,Kyverno CLI 的功能也將持續擴充套件,以滿足更多樣化的需求。未來,我們可以期待更多改進,例如更強大的報告功能、更靈活的策略定義以及更好的整合能力。

jsPolicy 與 Kubernetes 的整合應用

在前面的章節中,我們討論了根據策略即程式碼(Policy-as-Code, PaC)的解決方案選擇標準,並介紹了多種 Kubernetes PaC 工具。本章節將重點介紹 jsPolicy,一種利用 JavaScript 撰寫 Kubernetes 策略的 PaC 解決方案。jsPolicy 的出現,讓熟悉 JavaScript 的開發者和維運人員能夠更輕鬆地管理和維護 Kubernetes 環境中的策略。

為何選擇 jsPolicy?

jsPolicy 利用 JavaScript 撰寫 Kubernetes 策略,具有易於理解和維護的特點。JavaScript 是一種無處不在的程式語言,不僅在網頁瀏覽器中扮演重要角色,也廣泛應用於伺服器端(如 Node.js)。許多組織和產業都使用 JavaScript 或編譯/轉譯至 JavaScript 的語言(如 TypeScript)。選擇 jsPolicy 可以減少學習新策略語言的負擔,提高生產力和效率。

jsPolicy 的特點

jsPolicy 是本文介紹的第一個使用廣為人知的程式語言——JavaScript——作為原生策略語言的 PaC 解決方案。jsPolicy 使用 V8 JavaScript 引擎,這是一個由 Google 開源的 JavaScript 和 WebAssembly 引擎。V8 引擎以 C++ 編寫,並針對網頁瀏覽器(如 Chrome)和 JSON-based NoSQL 資料函式庫(如 Couchbase)進行了高度最佳化。

安裝 jsPolicy

要開始使用 jsPolicy,我們可以參考 jsPolicy 的快速入門(Quickstart Guide)。以下是一個安裝 jsPolicy 的 shell 指令碼範例,該指令碼使用 Helm 進行安裝,並將相關命令包裝在 Makefile 中,以便於 DevOps 自動化。

#!/usr/bin/env bash
# 錯誤處理
set -e
trap 'catch $? $LINENO' ERR
catch() {
  if [ "$1" != "0" ]; then
    echo "Error $1 occurred on $2"
  fi
}
KUBECTL="kubectl"
NS=${1:-jspolicy}
helm install jspolicy jspolicy -n $NS \
  --create-namespace --repo https://charts.loft.sh
LABEL=$(${KUBECTL} get ns $NS -oyaml | { grep jspolicy-ignore || true; })
if [[ "$LABEL" == "" ]]
then
  ${KUBECTL} label ns $NS jspolicy-ignore=ignore
  ${KUBECTL} get ns $NS -oyaml | grep jspolicy-ignore
fi
LABEL=$(${KUBECTL} get ns kube-system -oyaml | { grep jspolicy-ignore || true; })
if [[ "$LABEL" == "" ]]
then
  ${KUBECTL} label ns kube-system jspolicy-ignore=ignore
  ${KUBECTL} get ns kube-system -oyaml | grep jspolicy-ignore
fi

#### 內容解密:

此指令碼首先設定了錯誤處理機制,接著定義了 kubectl 命令的別名 KUBECTL。指令碼接受一個引數作為名稱空間,若未提供則預設為 jspolicy。使用 Helm 安裝 jsPolicy,並建立指定的名稱空間。安裝完成後,指令碼為指定的名稱空間和 kube-system 名稱空間新增 jspolicy-ignore=ignore 標籤,以避免 jsPolicy 對這些名稱空間中的資源進行策略檢查。

jsPolicy 提供了一個利用 JavaScript 管理 Kubernetes 策略的有效途徑,降低了學習新策略語言的門檻。透過 jsPolicy,開發者和維運團隊可以更高效地管理和維護 Kubernetes 環境中的策略。

使用 Mermaid 圖表呈現 jsPolicy 工作流程

  graph LR;
    A[開始] --> B[安裝 jsPolicy];
    B --> C[建立名稱空間];
    C --> D[新增 jspolicy-ignore 標籤];
    D --> E[應用 jsPolicy 策略];
    E --> F[檢查資源是否符合策略];

圖表翻譯:

此圖表展示了使用 jsPolicy 的基本工作流程。首先,需要安裝 jsPolicy。安裝完成後,建立所需的名稱空間,並為特定的名稱空間新增 jspolicy-ignore 標籤,以避免不必要的策略檢查。接著,應用 jsPolicy 策略,最後檢查 Kubernetes 環境中的資源是否符合所制定的策略。

隨著 Kubernetes 生態系統的不斷發展,jsPolicy 有望成為管理和維護 Kubernetes 策略的重要工具之一。其利用 JavaScript 的特點,使得更多開發者和維運人員能夠參與到 Kubernetes 策略的管理中,從而提高整個團隊的工作效率和生產力。

結語

本章節介紹了 jsPolicy,一種根據 JavaScript 的 Kubernetes PaC 解決方案。透過實際的安裝和使用範例,我們展示了 jsPolicy 如何簡化 Kubernetes 策略的管理。隨著對 jsPolicy 的深入瞭解,我們將能夠更好地利用其優勢,提高 Kubernetes 環境的管理效率和安全性。接下來的章節將繼續探索其他 Kubernetes PaC 解決方案,以提供更全面的比較和分析。