我正在为 CRD 编写变异并验证准入网络钩子。我正在使用 kubebuilder 来设置 CRD。 规范和状态子资源行为正常。
作为突变的一部分,我有一个要求,我需要更新状态子资源。
例如,考试是我的 CR,状态是考试状态。我想在突变中将状态设置为"未完成"。
我尝试了以下方法
- 此处介绍的 Json 修补方法 https://banzaicloud.com/blog/k8s-admission-webhooks/这会产生未找到自定义资源的错误。 即它需要我们正在为其更新状态的自定义资源。
- 使用 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。而是在创建自定义资源后异步调用它们,以便子资源的失败验证不会阻止创建自定义资源。