Kubernetes: можно ли изменить подресурсы статуса в веб-перехватчиках допуска мутации?
Я пишу веб-перехватчики изменения и проверки допуска для CRD. Я использую 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
но ни один из подходов у меня не работал.
Мне интересно, можно ли вообще обновить подресурсы статуса в веб-перехватчиках допуска?
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
. Он будет пустым для ресурса и будет содержать имя подресурса для подресурса. Это важно для проверки, поскольку мутация на подресурсе будет доступна только тогда, когда для подресурса вызывается веб-перехватчик.