這篇文章已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 1.26:介紹驗證許可政策

在 Kubernetes 1.26 中,驗證准入政策的第一個 Alpha 版本已發布!

驗證准入政策使用 通用表達語言 (CEL),以提供宣告式、程序內替代方案來取代驗證准入 Webhook

CEL 首次引入 Kubernetes 是為了CustomResourceDefinitions 的驗證規則。此增強功能擴展了 CEL 在 Kubernetes 中的使用,以支援更廣泛的准入使用案例。

准入 Webhook 的開發和操作可能很繁重。Webhook 開發人員必須實作和維護 Webhook 二進位檔,以處理准入請求。此外,准入 Webhook 的操作也很複雜。每個 Webhook 都必須部署、監控,並具有明確定義的升級和回滾計畫。更糟糕的是,如果 Webhook 超時或變得不可用,Kubernetes 控制平面可能會變得不可用。此增強功能透過將 CEL 表達式嵌入 Kubernetes 資源中,而不是調用遠端 Webhook 二進位檔,避免了准入 Webhook 的大部分複雜性。

例如,若要設定 Deployment 可以擁有的副本數限制。首先定義驗證政策

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicy
metadata:
  name: "demo-policy.example.com"
spec:
  matchConstraints:
    resourceRules:
    - apiGroups:   ["apps"]
      apiVersions: ["v1"]
      operations:  ["CREATE", "UPDATE"]
      resources:   ["deployments"]
  validations:
    - expression: "object.spec.replicas <= 5"

expression 欄位包含用於驗證准入請求的 CEL 表達式。matchConstraints 宣告此 ValidatingAdmissionPolicy 可能驗證的請求類型。

接下來將政策繫結到適當的資源

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "demo-binding-test.example.com"
spec:
  policyName: "demo-policy.example.com"
  matchResources:
    namespaceSelector:
      matchExpressions:
      - key: environment
        operator: In
        values:
        - test

ValidatingAdmissionPolicyBinding 資源僅將上述政策繫結到 environment 標籤設定為 test 的命名空間。建立此繫結後,kube-apiserver 將開始強制執行此准入政策。

為了強調此方法比准入 Webhook 簡單得多,如果此範例改為使用 Webhook 實作,則需要開發和維護整個二進位檔,僅僅為了執行 <= 檢查。在我們審查生產環境中使用的各種准入 Webhook 時,絕大多數都執行相對簡單的檢查,所有這些檢查都可以輕鬆地使用 CEL 表達。

驗證准入政策是高度可配置的,使政策作者能夠定義可參數化且可根據叢集管理員需要將範圍限定於資源的政策。

例如,可以修改上述准入政策以使其可配置

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicy
metadata:
  name: "demo-policy.example.com"
spec:
  paramKind:
    apiVersion: rules.example.com/v1 # You also need a CustomResourceDefinition for this API
    kind: ReplicaLimit
  matchConstraints:
    resourceRules:
    - apiGroups:   ["apps"]
      apiVersions: ["v1"]
      operations:  ["CREATE", "UPDATE"]
      resources:   ["deployments"]
  validations:
    - expression: "object.spec.replicas <= params.maxReplicas"

在此,paramKind 定義用於配置政策的資源,而 expression 使用 params 變數來存取參數資源。

這允許定義多個繫結,每個繫結的配置都不同。例如

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "demo-binding-production.example.com"
spec:
  policyName: "demo-policy.example.com"
  paramRef:
    name: "demo-params-production.example.com"
  matchResources:
    namespaceSelector:
      matchExpressions:
      - key: environment
        operator: In
        values:
        - production
apiVersion: rules.example.com/v1 # defined via a CustomResourceDefinition
kind: ReplicaLimit
metadata:
  name: "demo-params-production.example.com"
maxReplicas: 1000

此繫結和參數資源對將 environment 標籤設定為 production 的命名空間中的 Deployment 限制為最多 1000 個副本。

然後,您可以使用單獨的繫結和參數對,為 test 環境中的命名空間設定不同的限制。

我希望這能讓您一窺驗證准入政策的可能性!我們還有許多尚未觸及的功能。

若要了解更多資訊,請閱讀驗證准入政策

我們正努力新增更多功能到准入政策,並使此增強功能更易於使用。請試用看看,向我們發送您的意見回饋,並幫助我們建置更簡單的准入 Webhook 替代方案!

我該如何參與?

如果您想參與准入政策的開發、討論增強功能藍圖或報告錯誤,您可以透過 SIG API Machinery 與開發人員聯繫。