当在子资源中设置自定义资源定义 (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 在自定义资源的创建过程中不会被同步调用。相反,它们在自定义资源创建后被异步调用,这样子资源的失败验证不会阻止自定义资源的创建。