Kubernetes:是否可以在突变许可网络钩子中突变状态子资源?

时间:2020-01-02 14:10:01

标签: kubernetes kubebuilder

我正在编写CRD的变异和验证录取Webhooks。我正在使用kubebuilder来设置CRD。规格和状态子资源运行正常。

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

例如,Exam是我的CR和status.status是Exam状态。我想将状态更改为“ NotDone”。

我尝试了以下方法

  1. Json修补方法在这里https://banzaicloud.com/blog/k8s-admission-webhooks/中进行了说明,这会产生错误,即找不到自定义资源。也就是说,它需要我们为其更新状态的自定义资源。
  2. 使用go客户端https://book-v1.book.kubebuilder.io/basics/status_subresource.html获取和更新状态

但没有一种方法对我有用。

我想知道是否甚至有可能在录取Webhooks中更新状态子资源?

1 个答案:

答案 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。而是在创建自定义资源后异步调用它们,以便子资源验证失败不会阻止创建自定义资源。