我正在编写CRD的变异和验证录取Webhooks。我正在使用kubebuilder来设置CRD。规格和状态子资源运行正常。
作为突变的一部分,我有一个需要更新状态子资源的要求。
例如,Exam是我的CR和status.status是Exam状态。我想将状态更改为“ NotDone”。
我尝试了以下方法
但没有一种方法对我有用。
我想知道是否甚至有可能在录取Webhooks中更新状态子资源?
答案 0 :(得分:0)
当在 .spec.versions[].subresources
子资源中设置自定义资源定义 (CRD) 时,变异和验证准入网络钩子必须包含在 .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 时,子资源的变异才可用。
这里需要特别注意的是,在创建自定义资源的过程中,不会同步调用子资源的mutating和validating webhook。而是在创建自定义资源后异步调用它们,以便子资源验证失败不会阻止创建自定义资源。