Ответ 1
Ах! Забавно, я однажды попробовал обернуть голову вокруг концепции селекторов меток, а также раньше. Итак, вот оно...
Прежде всего, к какому черту эти метки используются? Ярлыки внутри кубернетов являются основным средством идентификации объектов. Контроллер управляет контейнерами на основе их ярлыка вместо имени. В этом конкретном случае они, например, предназначены для идентификации модулей, принадлежащих набору реплик развертываний.
Фактически вам не приходилось неявно определять .spec.selector
при использовании расширений v1beta1
. В этом случае значение по умолчанию .spec.template.labels
. Однако, если вы этого не сделаете, вы можете столкнуться с проблемами с kubectl apply
один или несколько меток, которые используются для выбора изменений, потому kubeclt apply
будет рассматривать kubectl.kubernetes.io/last-applied-configuration
при сравнении изменений и этой аннотации будет содержать только пользовательский ввод, когда он создал ресурс, и ни одно из полей по умолчанию. Вы получите ошибку, потому что она не может рассчитать diff как:
spec.template.metadata.labels: Invalid value: {"app":"nginx"}: 'selector' does not match template 'labels'
Как вы можете видеть, это довольно большой недостаток, поскольку это означает, что вы не можете изменить ни одну из меток, которые используются в качестве метки выбора, или полностью разрушит поток развертывания. Он был "исправлен" в apps/v1beta2
, требуя, чтобы селекторы были явно определены, запрещая мутацию в этих полях.
Таким образом, в вашем примере вам фактически не нужно их определять! Создание будет работать и будет использовать ваши .spec.template.labels
по умолчанию. Но да, в ближайшем будущем, когда вам нужно будет использовать v1beta2
, поле будет обязательным. Надеюсь, этот вопрос ответит на ваш вопрос, и я не стал его запутывать;)