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/*"
內容解密:
- ClusterPolicy 定義:這是一個名為 restrict-image-registries的策略,用於限制容器映像的來源。
- 匹配規則:該策略只會對 policy-test名稱空間中的 Pod 資源進行檢查。
- 驗證規則:檢查容器映像是否包含 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 ...
內容解密:
- kyverno test .命令:在當前目錄執行測試。
- 載入測試組態:從 kyverno-test.yaml檔案中載入測試組態。
- 應用策略:將定義的策略應用到指定的資源上。
測試結果分析
測試結果如下表所示:
| 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 | 
內容解密:
- 測試結果:兩個測試案例均透過驗證。
- 資源檢查:test-pod-bad和test-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 }}"
內容解密:
- 變異策略:該策略會將容器映像中的 k8s.gcr.io字串替換為registry.k8s.io。
- 匹配規則:對所有 Pod 資源進行變異操作。
再次執行測試
$ kyverno test .
Loading test ( kyverno-test.yaml ) ...
Loading values/variables ...
Loading policies ...
Loading resources ...
Applying 2 policies to 2 resources ...
Checking results ...
內容解密:
- 多策略應用:同時應用驗證和變異策略。
- 測試結果分析:儘管變異策略修改了資源,但測試仍然透過。
使用 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
內容解密:
- kyverno apply命令:將策略應用到指定的資原始檔。
- 結果分析:資源驗證失敗,因為它使用了已棄用的映像倉函式庫。
對叢集資源進行乾跑
$ kyverno apply registry-validate.yaml --cluster -p
Applying 3 policy rule(s) to 11 resource(s)...
內容解密:
- --cluster選項:對叢集中的資源進行檢查。
- -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
內容解密:
- PolicyReport 結構:包含檢查結果的詳細資訊。
- 檢查結果:顯示哪些資源未透過驗證及其原因。
隨著 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 解決方案,以提供更全面的比較和分析。
 
            