Объектная модель

Что это такое

Kubernetes — это набор декларативных объектов, у каждого из которых есть вид, имя и спецификация. Первыми важны pod — мельчайшая единица выполнения; deployment, который держит работающими несколько одинаковых pod’ов; и service, дающий стабильный адрес тем pod’ам, что сейчас исправны. Чтение манифеста в основном сводится к тому, чтобы увидеть, как эти трое связаны.

Почему это важно

Объектная модель — это тот интерфейс, под который вы на самом деле программируете: рабочая нагрузка — это каталог манифестов, откат — указание на предыдущую версию, а добавление реплики — правка числа. Поскольку модель декларативна, кластер постоянно согласуется с объявленным, поэтому удалённый pod появляется снова без вмешательства. Поймите объекты — и остальная платформа, от конфигурации и масштабирования до ingress и политик, станет вариациями на ту же тему, а не новым словарём.

Ключевые идеи

Pod — единица выполнения и обычно не та единица, которую пишут

Pod — это один или несколько контейнеров, разделяющих сетевое пространство имён и время жизни. Запускать pod напрямую — приём для отладки; в эксплуатации рабочими нагрузками управляет контроллер, который создаёт pod’ы заново, когда они погибают. Понимание того, что pod’ы эфемерны — их имена меняются, их адреса меняются, — и делает объекты более высокого уровня необходимыми.

deployment (нужно 3 реплики)
  pod -> pod -> pod       (имена и адреса не стабильны)
service: одно стабильное имя и виртуальный адрес перед исправными pod'ами

Deployment описывает, что должно работать, а не то, что работает

Deployment объявляет образ, число реплик и шаблон своих pod’ов. Смените образ — и deployment выполнит постепенное обновление: запустит новые pod’ы и выведет старые по выбранной вами политике. Именно эта политика и позволяет избежать простоя, поэтому её значения по умолчанию стоит прочитать, а не предполагать.

Service — абстракция над меняющимися pod’ами

Поскольку pod’ы появляются и исчезают, клиенты не могут адресоваться к ним напрямую. Service даёт стабильное имя и виртуальный адрес и выбирает pod’ы по метке. Поэтому метки несущие: опечатка в селекторе даёт пустой service, который выглядит ровно как сломанное приложение.

Метки и селекторы — механизм связывания

Ничто в Kubernetes не содержит указателя на что-либо другое; объекты связываются метками, сопоставленными селекторами. Это и позволяет service стоять перед набором pod’ов, сетевой политике называть их, а инструменту мониторинга их обнаруживать — без знания друг о друге. Это же и делает объекты трудными для статического чтения, и поэтому при просмотре манифеста нужно проверять селекторы.

Пространства имён делят один кластер на области

Пространство имён группирует объекты для имён, прав и квот. Само по себе оно не граница безопасности, но это единица, которой большинство команд отделяет среды или приложения внутри общего кластера. Именно квоты ресурсов по умолчанию на пространство имён не дают одной команде занять весь кластер.

Объявить — не то же самое, что знать результат

Применённый объект не обязательно работающий: контроллер может добавить значения по умолчанию, политика может отклонить объект, а другой контроллер — изменить статус. Чтение живого объекта и его событий и есть способ увидеть разницу, а привычка проверять живое состояние, а не файл на диске, предотвращает большой класс путаницы.

Практика

Прочитайте один deployment целиком

Возьмите манифест deployment, service и набор pod’ов из работающего кластера и проследите, как селектор service находит pod’ы и что происходит с service, когда pod удаляют.

Готово, когда: вы можете предсказать имя нового pod’а и показать, что адрес service не изменился.

Сломайте селектор намеренно

Измените селектор service так, чтобы он не совпал ни с чем, опишите симптом и восстановите его.

Готово, когда: вы можете назвать два признака — пустые endpoints и исправные pod’ы, — которые отличают ошибку в селекторе от упавшего приложения.

Частые ошибки

  • Запуск голого pod в эксплуатации — при отказе узла его никто не создаст заново; исправить: управляйте pod’ами через контроллер, например deployment.
  • Правка pod вручную — контроллер заменит его, и изменение исчезнет; исправить: правьте шаблон владеющего объекта.
  • Несовпадение меток и селекторов — service молча стоит ни перед чем; исправить: сверяйте селектор с метками pod’ов, когда service сообщает об отсутствии endpoints.
  • Уверенность, что применённый файл и есть работающее состояние — значения по умолчанию и другие контроллеры меняют объект; исправить: читайте живой объект и его события.
  • Всё в пространстве имён по умолчанию — имена конфликтуют, а квоты применить нельзя; исправить: давайте каждому приложению или среде собственное пространство имён.

Что читать дальше

  • Docker (06-cloud-devops/06-docker) — образ, который запускают эти pod’ы, поэтому читайте его первым.
  • Kubernetes (06-cloud-devops/14-kubernetes) — платформа, словарём которой являются эти объекты.
  • Планирование и масштабирование (06-cloud-devops/14-kubernetes/02-scheduling-and-scaling) — что происходит, когда объявленное число реплик встречает конечный набор узлов.