как повторно использовать проверку k8s в моем собственном контроллере CRD

Я создал CRD нравится:

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

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

    PodSpec v1.PodSpec `json:"podSpec"`

    ...
}

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

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

2 ответа

Вы можете повторно использовать вышестоящий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"))

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

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