Обязательное поле для определения пользовательского ресурса kubernetes
Я пытаюсь написать схему валидации cd kubernetes. У меня есть массив (vc) структур, и одно из полей в этих структурах является обязательным (name
поле).
Я пытался просмотреть различные примеры, но это не выдает ошибку, когда name
не там. Любые предложения, что не так?
vc:
type: array
items:
type: object
properties:
name:
type: string
address:
type: string
required:
- name
1 ответ
Если вы используете v1.8, вам необходимо включить CustomResourceValidation
Функция Gate для использования функции проверки. Это можно сделать с помощью следующего флага на kube-apiserver:
--feature-gates=CustomResourceValidation=true
Вот пример того, как это работает (я проверял это на v1.12, но это должно работать и на более ранних версиях):
CRD:
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: foos.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
version: v1
scope: Namespaced
names:
plural: foos
singular: foo
kind: Foo
validation:
openAPIV3Schema:
properties:
spec:
properties:
vc:
type: array
items:
type: object
properties:
name:
type: string
address:
type: string
required:
- name
Пользовательский ресурс:
apiVersion: "stable.example.com/v1"
kind: Foo
metadata:
name: new-foo
spec:
vc:
- address: "bar"
- Создайте CRD.
kubectl create -f crd.yaml
customresourcedefinition.apiextensions.k8s.io/foos.stable.example.com created
- Получите CRD и проверьте, существует ли поле проверки в выходных данных. Если этого не произойдет, возможно, у вас не включены функции.
kubectl get crd foos.stable.example.com -oyaml
- Попробуйте создать собственный ресурс. Это должно потерпеть неудачу с:
kubectl create -f cr-validation.yaml
The Foo "new-foo" is invalid: []: Invalid value: map[string]interface {}{"metadata":map[string]interface {}{"creationTimestamp":"2018-11-18T19:45:23Z", "generation":1, "uid":"7d7f8f0b-eb6a-11e8-b861-54e1ad9de0be", "name":"new-foo", "namespace":"default"}, "spec":map[string]interface {}{"vc":[]interface {}{map[string]interface {}{"address":"bar"}}}, "apiVersion":"stable.example.com/v1", "kind":"Foo"}: validation failure list:
spec.vc.name in body is required