как повторно использовать проверку k8s в моем собственном контроллере CRD - PullRequest
1 голос
/ 09 апреля 2020

Я создал CRD следующим образом:

import v1 "k8s.io/api/core/v1"

type ApplicationSpec struct {
    Name string `json:"name"`

    PodSpec v1.PodSpec `json:"podSpec"`

    ...
}

обратите внимание, что я повторно использовал PodSpec из ядра apigroup в моей CRD

Чтобы пользователь не мог использовать недопустимые файлы yaml, я решил чтобы добавить логи проверки c в моем контроллере CRD, для простых полей, таких как Name, легко проверить их правильность с помощью регулярных выражений, в то время как для сложного и нативного типа, например PodSpec, поскольку k8s уже имеют логи проверки c для я чувствую, что правильный путь - это использовать его в моем контроллере, но как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Вы можете повторно использовать upstream ValidatePodSpec напрямую .

Сначала вам нужно будет импортировать пару пакетов:

import (
    "k8s.io/kubernetes/pkg/apis/core/validation"
    "k8s.io/apimachinery/pkg/util/validation/field"
)

Затем использовать ValidatePodSpec в вашем методе контроллера:

errs := validation.ValidatePodSpec(instance.podSpec, field.NewPath("podSpec"))
0 голосов
/ 10 апреля 2020

Также желательно, чтобы такая функциональность предоставлялась в виде библиотеки. Есть комментарий об использовании go get для k8s.io/kubernetes upstream. https://github.com/kubernetes/kubernetes/issues/80316#issuecomment -512991205 И проблему, вызванную неправильной настройкой PodTemplateSpe c, можно найти здесь https://github.com/googleforgames/agones/issues/1298 А именно: мы успешно создаем CRD, однако он становится нездоровый позже, потому что стручок не мог быть создан.

...