Kubernetes 作為雲原生應用的核心基礎架構,其功能持續透過社群貢獻與標準化進化。CEL(Common Expression Language)作為一種輕量級表達語言,近年來在 Kubernetes 中扮演關鍵角色,尤其在 CRD 驗證、准入控制與資源標籤等場景中。本文旨在探討 CEL 在 Kubernetes codebase 中的整合方式,解析其技術細節與應用實踐,協助開發者理解如何有效利用 CEL 提升系統靈活性與可維護性。
CEL(Common Expression Language)由 Google 開發,是一種類 C 語法的輕量級表達語言,支援條件判斷、資料結構操作與類型檢查。其設計目標在於提供一種通用且可擴展的表達方式,用於描述複雜的邏輯規則。在 Kubernetes 中,CEL 主要應用於以下場景:
name starts with \"a\"
:檢查字串是否以 'a' 開頭。\n- array contains \"message\"
:檢查陣列是否包含特定元素。\n- replicas[0] < replicas[1]
:驗證資源字段順序。CEL 的設計強調靈活性與可擴展性,其核心功能包括:
if-else
等邏輯運算,用於動態規則定義。\n2. 資料結構操作:處理陣列、物件嵌套與字串操作,例如 array.filter
或 map
。\n3. 類型整合:與 Kubernetes 資源整合,支援 IP、CIDR、URL 等特定類型。CEL 在 Kubernetes 中的整合歷程可追溯至 KE-2876 與 KE-3962,主要應用於以下領域:
spec.validation
中定義 CEL 表達式。\n- KE-3962:支援 MutatingAdmissionPolicy 的 CEL 表達式,實現動態資源修改。\n- 類型擴展:新增 Kubernetes 特定類型,如 IP、CIDR,並整合至 API Server 的 pkg/apis/core
模組。為解決 JSON Path 的限制,KE-4595 提出新增 expression
字段,與 JSON Path 並列,支援 CEL 表達式。例如:
yaml\nspec:\n validation:\n openAPIV3Schema:\n properties:\n status:\n type: object\n properties:\n duration:\n type: string\n expression: \"timestamp - creationTimestamp\"\n
此方案允許計算時間差、條件顯示不同值,或處理 IP 陣列等複雜需求,並在 API Server 中編譯執行。
CEL 的執行流程包含三個階段:
map[string]interface{}{"name": "Alice"}
。\n2. 編譯:將 CEL 表達式轉換為抽象語法樹(AST),並進行語法與類型檢查。\n3. 執行:將 AST 轉換為可執行程序,對輸入資料進行評估。
Go 程式碼示例如下:go\nimport \"github.com/google/cel-go/cel\"\nenv := cel.EnvIRONMENT.New()\nexpr := \"name starts with 'a'\"\nprogram, issues := env.Compile(expr)\nresult := program.Eval(map[string]interface{}{\"name\": \"Alice\"})\n
錯誤處理在編譯階段進行,確保表達式正確性,避免執行時異常。
shirt
自訂資源假設定義 shirt
自訂資源,包含 color
(字串)與 sizes
(整數陣列)字段,並透過 CEL 表達式實現以下功能:
sizes
存在性:sizes != null
,返回布林值。\n2. 條件顯示 color
:color == \"blue\"
,返回布林值。\n3. 處理陣列:sizes.length > 0
,返回陣列長度。
執行結果:\n- 第三筆資源因無 sizes
陣列,判斷結果為 false
。\n- 第四筆資源因 color
為 blue
,判斷結果為 true
。table converter.go
生成表格。\n4. 表達式根據 CRD schema 評估結果。CEL 在 Kubernetes 中的整合,為 CRD 驗證、准入控制與資源標籤提供了強大的表達能力。透過 KE-4595 的實踐,CEL 表達式已成為解決 JSON Path 限制的關鍵方案。開發者應根據需求選擇 CEL 或 JSON Path,並遵循以下建議: