Kubernetes:是否可以在突变准入 webhook 中改变状态子资源?



我正在为 CRD 编写变异并验证准入网络钩子。我正在使用 kubebuilder 来设置 CRD。 规范和状态子资源行为正常。

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

例如,考试是我的 CR,状态是考试状态。我想在突变中将状态设置为"未完成"。

我尝试了以下方法

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

但是这种方法都不适合我。

我想知道是否可以更新入场网络钩子中的状态子资源?

当自定义资源定义 (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: { }

您必须定义一个变异的准入网络钩子,如下所示:

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"]

与验证准入网络钩子类似:

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 时,子资源上的突变才可用。

这里需要注意的是,在创建自定义资源期间,不会同步调用子资源的变异和验证 Webhook。而是在创建自定义资源后异步调用它们,以便子资源的失败验证不会阻止创建自定义资源。

最新更新