首页 > 解决方案 > Kubernetes:是否可以在突变准入 webhook 中对状态子资源进行突变?

问题描述

我正在为 CRD 编写 mutate 和 validate admission webhook。我正在使用 kubebuilder 来设置 CRD。规范和状态子资源的行为正确。

作为突变的一部分,我需要更新状态子资源。

例如,Exam 是我的 CR,status.status 是考试状态。我想在突变中将状态设置为“NotDone”。

我尝试了以下方法

  1. 此处解释了 Json 修补方法https://banzaicloud.com/blog/k8s-admission-webhooks/这给出了未找到自定义资源的错误。即,它需要我们正在为其更新状态的自定义资源。
  2. 使用 go 客户端获取和更新状态https://book-v1.book.kubebuilder.io/basics/status_subresource.html

但没有一种方法对我有用。

我想知道是否甚至可以更新 admission webhook 中的状态子资源?

标签: kuberneteskubebuilder

解决方案


当在子资源中设置自定义资源定义 (CRD) 时.spec.versions[].subresources,变异和验证准入 Webhook 必须包含在.webhooks[].rules[].resources两者<custom resource name><custom resource name>/<subresource name>值中,以便对资源和子资源进行变异和验证。

例如对于测试 CRD:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: test.test
spec:
  group: test
  scope: Namespaced
  names:
    kind: Test
    listKind: TestList
    plural: tests
    singular: test
    shortNames:
      - tst
  versions:
    - name: v1
      served: true
      storage: true
      subresources:
        status: { }

您必须像这样定义一个变异的 admission webhook:

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: test
webhooks:
  - name: test
    sideEffects: None
    rules:
      - operations: ["CREATE", "UPDATE"]
        apiGroups: ["test"]
        apiVersions: ["*"]
        resources: ["test", "test/status"]
    failurePolicy: Fail
    clientConfig:
      service:
        namespace: test
        name: test
        path: '/test'
      caBundle: <the certificate in base64>
    admissionReviewVersions: ["v1"]

与验证准入 webhook 类似:

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: test
webhooks:
  - name: test
    sideEffects: None
    rules:
      - operations: ["CREATE", "UPDATE"]
        apiGroups: ["test"]
        apiVersions: ["*"]
        resources: ["test", "test/status"]
    failurePolicy: Fail
    clientConfig:
      service:
        namespace: test
        name: test
        path: '/test'
      caBundle: <the certificate in base64>
    admissionReviewVersions: ["v1"]

本示例中的变异和验证 webhook 将在创建时被调用两次。第一次用于资源,第二次用于子资源。您可以通过读取字段在请求中确定调用是针对资源还是子资源.request.subResource。该资源将为空,并且将包含子资源的子资源名称。这对于验证很重要,因为子资源上的突变仅在为子资源调用 webhook 时才可用。

这里需要特别注意的是,子资源的 mutating 和 Validating webhook 在自定义资源的创建过程中不会被同步调用。相反,它们在自定义资源创建后被异步调用,这样子资源的失败验证不会阻止自定义资源的创建。


推荐阅读