kubernetes - Kubernetes:是否可以在突变准入 webhook 中对状态子资源进行突变?
问题描述
我正在为 CRD 编写 mutate 和 validate admission webhook。我正在使用 kubebuilder 来设置 CRD。规范和状态子资源的行为正确。
作为突变的一部分,我需要更新状态子资源。
例如,Exam 是我的 CR,status.status 是考试状态。我想在突变中将状态设置为“NotDone”。
我尝试了以下方法
- 此处解释了 Json 修补方法https://banzaicloud.com/blog/k8s-admission-webhooks/这给出了未找到自定义资源的错误。即,它需要我们正在为其更新状态的自定义资源。
- 使用 go 客户端获取和更新状态https://book-v1.book.kubebuilder.io/basics/status_subresource.html
但没有一种方法对我有用。
我想知道是否甚至可以更新 admission webhook 中的状态子资源?
解决方案
当在子资源中设置自定义资源定义 (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 在自定义资源的创建过程中不会被同步调用。相反,它们在自定义资源创建后被异步调用,这样子资源的失败验证不会阻止自定义资源的创建。
推荐阅读
- sorting - 如何从 29 年的数据集中按小时计算一年的中值?
- c# - 这是 C# Monad,问题出在哪里?
- python - 将嵌套字典转换为数据框,键作为行名,值中的字典作为列?
- command-line-interface - 使用 spaCy 命令行训练器管理训练/开发拆分
- arrays - 二维数组中的数组大小不匹配
- sql - PostgreSQL INSERT INTO 表不存在
- python - 关于python导入、函数、子目录的一个非常简单的问题
- java - SharedPreferences:为什么我的值没有被覆盖?
- graphql - 使用 request-promise 将数据发布到 graphql 服务器
- python - 重新采样 Python 熊猫排除某些字段