Kubernetes: можно ли изменить подресурсы статуса в веб-перехватчиках допуска мутации?

Я пишу веб-перехватчики изменения и проверки допуска для CRD. Я использую kubebuilder для настройки CRD. Подресурсы спецификации и статуса работают правильно.

В рамках мутации у меня возникла потребность в обновлении субресурсов статуса.

Например, Exam - это мой CR, а status.status - это статус экзамена. Я хочу установить статус "NotDone" в мутации.

Я пробовал следующие подходы

  1. Подход к исправлению Json, описанный здесь https://banzaicloud.com/blog/k8s-admission-webhooks/ Это дает ошибку, что пользовательский ресурс не найден. т.е. ожидает пользовательский ресурс, для которого мы обновляем статус.
  2. Получение и обновление статуса с помощью клиента go https://book-v1.book.kubebuilder.io/basics/status_subresource.html

но ни один из подходов у меня не работал.

Мне интересно, можно ли вообще обновить подресурсы статуса в веб-перехватчиках допуска?

1 ответ

Когда настраиваемое определение ресурса (CRD) установлено в .spec.versions[].subresources субресурс, который изменяющие и проверяющие веб-перехватчики допуска должны включать в .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"]

Затем изменяющий и проверяющий веб-перехватчик в этом примере будет вызываться дважды при создании. Первый раз для ресурса и второй раз для субресурса. Вы можете выяснить в запросе, относится ли вызов к ресурсу или субресурсу, прочитав поле .request.subResource. Он будет пустым для ресурса и будет содержать имя подресурса для подресурса. Это важно для проверки, поскольку мутация на подресурсе будет доступна только тогда, когда для подресурса вызывается веб-перехватчик.

Другие вопросы по тегам