Короткий ответ
Labels — это произвольные пары ключ-значение, прикреплённые к объектам (например, app: web), а selector — это запрос, который по значениям labels выбирает набор объектов; через эту связь Service находит свои Pod, а Deployment — управляемые им Pod.
Как это работает подробнее
labels не имеют встроенного смысла для Kubernetes — это просто метаданные, которые становятся значимыми только тогда, когда другой объект ссылается на них через selector. Selector поддерживает равенство (app=web) и наборные выражения (in, notin, exists) для более гибкой фильтрации.
Пример кода
Команды и вывод
kubectl get pods --show-labels
kubectl get pods -l app=web,tier=frontendЧто использовать на практике
- Практика. labels используют для группировки по приложению, окружению, версии (
app,tier,env,version), а selectors Service/Deployment/NetworkPolicy опираются именно на них для определения "своих" подов. Хорошая схема меток с самого начала экономит время на диагностике и позволяет гибко фильтровать ресурсы командойkubectl get pods -l.
Подводные камни
- Риски. менять labels у уже запущенных Pod, управляемых Deployment, что может вывести их из-под управления контроллера (он их просто не узнает и создаст новые); несовпадение
selectorService иlabelsшаблона Pod по регистру или лишнему пробелу — приводит к пустому списку endpoints без явной ошибки; путатьlabels(для выбора) сannotations(для произвольных метаданных без функции выбора).