返回文章列表

TypeScript npm 封裝 jsPolicy 策略與 Cloud Custodian Kubernetes 整合

本文探討如何使用 TypeScript 和 npm 封裝 jsPolicy 策略,並將其應用於 Kubernetes 叢集,同時介紹 Cloud Custodian 作為 Policy as Code 解決方案與 Kubernetes 的整合應用,比較兩者在策略管理和佈署上的差異,並提供實務上的程式碼範例和操

Kubernetes DevOps

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/[email protected] 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 時,也需要考慮其社群支援和成熟度,以確保長期的可維護性和擴充套件性。