как повторно использовать проверку 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, однако позже он стал неработоспособным, потому что не удалось создать под.