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 環境中的策略。
使用 Plantuml 圖表呈現 jsPolicy 工作流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Kyverno 與 jsPolicy Kubernetes 策略管理
package "Kubernetes Cluster" {
package "Control Plane" {
component [API Server] as api
component [Controller Manager] as cm
component [Scheduler] as sched
database [etcd] as etcd
}
package "Worker Nodes" {
component [Kubelet] as kubelet
component [Kube-proxy] as proxy
package "Pods" {
component [Container 1] as c1
component [Container 2] as c2
}
}
}
api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2
note right of api
核心 API 入口
所有操作經由此處
end note
@enduml圖表翻譯:
此圖表展示了使用 jsPolicy 的基本工作流程。首先,需要安裝 jsPolicy。安裝完成後,建立所需的名稱空間,並為特定的名稱空間新增 jspolicy-ignore 標籤,以避免不必要的策略檢查。接著,應用 jsPolicy 策略,最後檢查 Kubernetes 環境中的資源是否符合所制定的策略。
隨著 Kubernetes 生態系統的不斷發展,jsPolicy 有望成為管理和維護 Kubernetes 策略的重要工具之一。其利用 JavaScript 的特點,使得更多開發者和維運人員能夠參與到 Kubernetes 策略的管理中,從而提高整個團隊的工作效率和生產力。
結語
本章節介紹了 jsPolicy,一種根據 JavaScript 的 Kubernetes PaC 解決方案。透過實際的安裝和使用範例,我們展示了 jsPolicy 如何簡化 Kubernetes 策略的管理。隨著對 jsPolicy 的深入瞭解,我們將能夠更好地利用其優勢,提高 Kubernetes 環境的管理效率和安全性。接下來的章節將繼續探索其他 Kubernetes PaC 解決方案,以提供更全面的比較和分析。