jsPolicy 策略能以 TypeScript 編寫並透過 npm 封裝,提升策略開發的維護性和模組化。首先,使用 jsPolicy SDK 建立 npm 專案,並利用 npm 安裝和管理依賴套件,過程中可能遇到套件漏洞,需使用 npm audit fix 修復。接著,使用 npm run compile 編譯策略程式碼,並透過 npm run test 進行單元測試,確保策略邏輯的正確性。最後,將編譯後的 jsPolicy 和 jsPolicyBundle 資源佈署至 Kubernetes 叢集,實作根據 JavaScript 的策略管控。Cloud Custodian 則提供另一種 PaC 策略管理方案,它以 Python 為基礎,使用 YAML 定義策略,並支援 CLI 工具和控制器模式。透過 c7n,可以稽核和管理 Kubernetes 資源,並結合動態准入控制器實作即時策略執行。兩種方案各有優勢,jsPolicy 適用於需要 JavaScript 運算能力的場景,而 Cloud Custodian 則更貼近 Python 開發者,並提供更豐富的雲端整合功能。

使用 TypeScript 與 npm 封裝 jsPolicy 策略

在前面的章節中,我們提到了 jsPolicy 支援 JavaScript 以及能夠在 V8 JavaScript 引擎中執行的語言。利用 JavaScript 生態系統和工具(如 npm),有助於策略開發人員像進行其他軟體開發專案一樣建立策略程式碼。在本文中,我們將探討如何在 npm 專案中使用 TypeScript 編譯和封裝策略,然後再將其應用於 Kubernetes。

建立封裝策略的第一步

為了開始使用封裝策略,首先使用了 jsPolicy SDK,並複製了範例 jspolicy-sdk GitHub 專案。該專案展示瞭如何使用 TypeScript 和 npm 建立 jsPolicy 模組,以便分發到在 Kubernetes 中執行的 jsPolicy 引擎。

首先,使用 npm install 命令安裝了 package.json 檔案中宣告的專案依賴項作為 node_modules

程式碼範例:安裝專案依賴項

$ npm install
...
added 794 packages, and audited 795 packages in 15s
49 packages are looking for funding
run `npm fund` for details
63 vulnerabilities (48 moderate, 12 high, 3 critical)

內容解密:

在執行 npm install 命令時,系統檢測到了多個高風險和嚴重漏洞。這是因為專案依賴項中存在已知的安全問題。接下來,我們需要解決這些漏洞。

修復專案依賴項中的漏洞

為了修復專案依賴項中的漏洞,使用了 npm audit fix 命令來減少漏洞數量,包括修復所有高風險和嚴重漏洞。

程式碼範例:修復專案依賴項中的漏洞

$ npm audit fix
added 29 packages, removed 78 packages, changed 92 packages,
and audited 746 packages in 14s
...
36 moderate severity vulnerabilities
...

內容解密:

執行 npm audit fix 命令後,成功減少了漏洞數量,包括修復了所有高風險和嚴重漏洞。然而,這個過程引入了破壞性變更,導致無法成功編譯策略。為了演示目的,重新複製了專案,並安裝了依賴項,然後編譯了策略,而沒有修復漏洞。

編譯與測試策略

使用 npm run compile 命令編譯了 ./src/policies 目錄中的策略,建立了 ./dist./policies 目錄。然後,將 ./policies 目錄中的 jsPolicy 和 jsPolicyBundle 資源安裝到非生產環境的 minikube 叢集中。

程式碼範例:編譯與測試策略

$ npm run compile
$ npm run test
> @jspolicy/jspolicy-typescript-starter@0.0.1 test
> jest --env=node --colors --coverage test
PASS tests/capabilities.ts
Test containerSpec.securityContext.capabilities
✓ Check containers (2 ms)
✓ Check initContainers
✓ Check valid request
...
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 0.605 s, estimated 3 s
Ran all test suites matching /test/i.

內容解密:

在成功編譯後,執行了測試套件,確保策略正確無誤。測試結果顯示,所有測試案例均透過。

安裝 jsPolicy 和 jsPolicyBundle 資源

安裝了 jsPolicy 和 jsPolicyBundle 資源到 Kubernetes 叢集中。首先安裝了 jsPolicy 資源,然後安裝了 jsPolicyBundle 資源。

程式碼範例:jsPolicy 資源

apiVersion: policy.jspolicy.com/v1beta1
kind: JsPolicy
metadata:
  name: validate-namespace.mycompany.tld
spec:
  operations: [CREATE]
  resources: ["*"]
  scope: Namespaced

程式碼範例:jsPolicyBundle 資源

apiVersion: policy.jspolicy.com/v1beta1
kind: JsPolicyBundle
metadata:
  name: validate-namespace.mycompany.tld
spec:
  bundle: H4sIAAAAAAAAE6VTTY...

內容解密:

安裝 jsPolicy 資源後,並沒有自動建立 jsPolicyBundle 資源或 ValidatingWebhookConfiguration 資源。這是因為 jsPolicy 資源中沒有 spec.javascript 元素。當安裝 jsPolicyBundle 資源後,jsPolicy 引擎控制器建立了 ValidatingWebhookConfiguration 資源,並在其中設定了 metadata.ownerReferences 欄位,將其連結到 jsPolicy 資源。

測試封裝策略

測試了封裝策略,嘗試在預設 Namespace 中建立 Pod。

程式碼範例:測試封裝策略

$ kubectl apply -f test/3-test-pod.yaml
Error from server (Forbidden): error when creating "test/3-test-pod.yaml":
admission webhook "validate-namespace.mycompany.tld" denied the request:
Request denied because of the following errors:
-Field metadata.namespace is not allowed to be: default | kube-system

內容解密:

測試結果顯示,封裝策略成功阻止了在預設 Namespace 中建立 Pod。這證明瞭使用 TypeScript 和 npm 封裝 jsPolicy 策略的可行性和有效性。

Cloud Custodian 與 Kubernetes 的整合應用

Cloud Custodian(簡稱 c7n)是一個開源專案,最初由 Capital One 於 2016 年開發,主要用於雲端基礎設施的合規和治理控制。除了支援 AWS、Azure 和 GCP 等雲端供應商外,c7n 也提供了對 Kubernetes 的支援,使其成為一個多功能的 Policy as Code(PaC)解決方案。

c7n 的優勢與特點

  1. Python 生態系統的支援:由於 c7n 是使用 Python 開發的,因此使用者可以充分利用 Python 豐富的生態系統和工具。
  2. YAML 為基礎的政策語言:c7n 使用 YAML 來定義政策,並提供了一個豐富的 schema,使用者可以透過類別似 kubectl explain 的方式來瞭解 Kubernetes API。
  3. CLI 工具與控制器模式:c7n 提供了豐富的 CLI 工具,讓使用者可以直接與 Kubernetes 叢集互動,同時也支援控制器模式,利用動態准入控制器來實施政策。

安裝與設定 c7n

1. 環境準備

首先,需要在系統上安裝 Python。以下是在 MacOS 上安裝和設定 c7n 的步驟:

# 檢查 Python 版本
$ python3 --version
Python 3.11.4

2. 建立 Python 虛擬環境

為了隔離專案依賴,建議建立一個 Python 虛擬環境:

# 建立虛擬環境
$ python -m venv c7n-env

# 檢視虛擬環境目錄結構
$ tree -d -L 1 c7n-env
c7n-env
├── bin
├── include
└── lib

# 啟動虛擬環境
$ source c7n-env/bin/activate

#### 內容解密:

  • python -m venv c7n-env:此命令用於建立一個名為 c7n-env 的虛擬環境,讓我們可以在不影響系統 Python 環境的情況下安裝和管理專案依賴。
  • tree -d -L 1 c7n-env:用於檢視 c7n-env 目錄的結構,展示虛擬環境的基本架構。
  • source c7n-env/bin/activate:啟動虛擬環境,使後續的 Python 相關操作都在這個隔離的環境中進行。

使用 c7n CLI 與 Kubernetes 整合

在啟動虛擬環境後,可以開始安裝和使用 c7n CLI 工具來與 Kubernetes 叢集互動。c7n 提供了一套完整的 CLI 命令,可以用來套用政策、報告和修改叢集資源。

1. 安裝 c7n

# 在虛擬環境中安裝 c7n
$ pip install c7n

#### 內容解密:

  • pip install c7n:此命令在虛擬環境中安裝 Cloud Custodian(c7n),使其成為可執行的 CLI 工具。

2. 使用 c7n CLI

安裝完成後,可以使用以下命令來驗證 c7n 是否正確安裝:

# 檢查 c7n 版本
$ custodian --version

使用 c7n 定義和實施 Kubernetes 政策

c7n 使用 YAML 檔案來定義政策,以下是一個簡單的範例,展示如何定義一個用於稽核 Kubernetes 資源的政策:

policies:
  - name: check-deployment-labels
    resource: k8s.deployment
    filters:
      - type: value
        key: metadata.labels.env
        value: prod
        op: eq

#### 內容解密:

  • policies:定義了一個或多個政策的列表。
  • name:指定政策的名稱,例如 check-deployment-labels
  • resource:指定要稽核的 Kubernetes 資源型別,例如 k8s.deployment
  • filters:定義了一組過濾條件,用於篩選符合特定條件的資源。在此例中,檢查 Deployment 是否具有 metadata.labels.env 且其值為 prod

結合控制器模式實施動態准入控制

除了使用 CLI 工具外,c7n 也支援控制器模式,利用 Kubernetes 的動態准入控制器機制,在資源被建立或修改時自動實施政策。

#### 內容解密:

  • 動態准入控制器:是 Kubernetes 提供的一種機制,可以在資源被建立、更新或刪除時攔截請求並執行自定義邏輯。c7n 利用此機制實作即時的政策執行。

與挑戰

Cloud Custodian 提供了一個強大的 PaC 解決方案,不僅支援多雲環境,也能與 Kubernetes 無縫整合。然而,在採用 c7n 時,也需要考慮其社群支援和成熟度,以確保長期的可維護性和擴充套件性。