本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

这是尚未发布的文档。 Admission Controller 1.34-dev.

ValidatingAdmissionPolicy 迁移

从 Kubernetes v1.26 开始,https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/[ValidatingAdmissionPolicy] 提供了一种在 Kubernetes 中编写自定义准入策略的方法。这些策略是使用 通用表达语言 (CEL) 编写的,并扩展了一些 Kubernetes 特定扩展。 ValidatingAdmissionPolicy 在 Kubernetes v1.30 中进入稳定状态。

SUSE Security Admission Controller 提供了一个 CEL 策略,能够在不进行任何修改的情况下运行 Kubernetes VAP 策略。 您可以在 本节 的 Admission Controller 文档中阅读有关 CEL 策略的更多信息。 本段 解释了使用 Admission Controller 运行 VAP 策略的好处。

本指南解释了如何使用 kwctl 工具将 VAP 策略迁移到 Admission Controller。

迁移步骤

您必须使用 kwctl 版本 1.14.0 或更高版本才能遵循本指南。

给定一个包含此 YAML 定义的 ValidatingAdmissionPolicy 的文件:

`ValidatingAdmissionPolicy`定义
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
  name: "force-liveness-probe"
spec:
  failurePolicy: Fail
  variables:
    - name: containers_without_liveness_probe
      expression: |
        object.spec.template.spec.containers.filter(c, !has(c.livenessProbe)).map(c, c.name)
  matchConstraints:
    resourceRules:
      - apiGroups: ["apps"]
        apiVersions: ["v1"]
        operations: ["CREATE", "UPDATE"]
        resources: ["deployments"]
  validations:
    - expression: |
        size(variables.containers_without_liveness_probe) == 0
      messageExpression: |
        'These containers are missing a liveness probe: ' + variables.containers_without_liveness_probe.join(' ')
      reason: Invalid

以及一个包含 ValidatingAdmissionPolicyBinding 资源的文件:

`ValidatingAdmissionPolicyBinding`定义
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "kw-scaffold-demo"
spec:
  policyName: "force-liveness-probe"
  validationActions: [Deny]
  matchResources:
    namespaceSelector:
      matchLabels:
        docs.kubewarden.io/vap-migration: enabled

您可以通过以下步骤将策略迁移到 Admission Controller:

`kwctl`用于策略迁移的命令
$ kwctl scaffold vap \
    -p vap.yml \
    -b vap-binding.yml

该命令产生类似于以下内容的输出:

迁移的输出
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: kw-scaffold-demo
spec:
  module: ghcr.io/kubewarden/policies/cel-policy:latest
  settings:
    failurePolicy: Fail
    variables:
      - expression: |
          object.spec.template.spec.containers.filter(c, !has(c.livenessProbe)).map(c, c.name)
        name: containers_without_liveness_probe
    validations:
      - expression: |
          size(variables.containers_without_liveness_probe) == 0
        messageExpression: |
          'These containers are missing a liveness probe: ' + variables.containers_without_liveness_probe.join(' ')
        reason: Invalid
  rules:
    - apiGroups:
        - apps
      apiVersions:
        - v1
      resources:
        - deployments
      operations:
        - CREATE
        - UPDATE
  mutating: false
  namespaceSelector:
    matchLabels:
      docs.kubewarden.io/vap-migration: enabled

该命令警告用户关于使用 latest 版本的 CEL 策略的情况:

024-06-24T16:00:16.516062Z  WARN kwctl::scaffold:
  Using the 'latest' version of the CEL policy could lead to unexpected behavior.
  It is recommended to use a specific version to avoid breaking changes.

建议使用特定版本以避免破坏性更改。

您可以使用 --cel-policy 标志来做到这一点,像这样:

$ kwctl scaffold vap \
    --cel-policy ghcr.io/kubewarden/policies/cel-policy:v1.0.1 \
    -p vap.yml \
    -b vap-binding.yml