Рубрики
Uncategorized

Kubernetes развертывание Antipatterns — Часть 3

Это третья и последняя часть в нашей серии Anti-Patterns Kubernetes. Смотрите также часть 1 и часть 2 FO … Помечено Kubernetes, Cloud, DevOps, Docker.

Kubernetes antipatterns (3 серии деталей)

Это третья и последняя часть в нашей серии Anti-Patterns Kubernetes. См. Также часть 1 и часть 2 для предыдущих анти-паттернов.

Anti-Pattern 11-неправильное использование зондов здоровья

Помимо пределов ресурсов, если вы перемещаете свое приложение в Kubernetes, вы должны учитывать Настройки зонда здоровья Анкет

По умолчанию приложение Kubernetes не имеет зондов для здоровья, если вы явно их не настроили. Как и ограничения ресурсов, вы должны рассмотреть вопрос о том, что здоровье дает основную часть вашего развертывания Kubernetes. Это означает, что все ваши приложения должны иметь ограничения ресурсов и зонды здоровья при развертывании в любом кластере любого типа.

Зондовые зонды решают, когда и если ваша заявка готова принять трафик. Как разработчик, вы должны понимать, как Kubernetes будет использовать ваши конечные точки готовности и Lifence и последствия каждого из них (особенно что означает тайм -аут для каждого).

В итоге:

  1. Startup probe => Проверяет начальную загрузку ваших приложений. Он работает только один раз
  2. Gething grove => проверяет, может ли ваше приложение ответить на трафик. Бежит все время. Если это не удастся, Kubernetes прекратит маршрутизацию трафика в ваше приложение (и попробую позже)
  3. Lifine red =>> Проверяет, находится ли ваша заявка в надлежащем рабочем состоянии. Бежит все время. Если он не сможет, Kubernetes предполагает, что ваше приложение застряло и перезапустит его.

Потратьте некоторое время, чтобы понять последствия каждого зонда здоровья и оценить все Лучшие практики для вашей структуры программирования Анкет

Некоторые из распространенных ловушек:

  • Не учитывая внешние услуги (например, DBS) в зонде готовности
  • Используя одну и ту же конечную точку как для готовности, так и для зонд жизни
  • Использование существующей конечной точки «здоровья», которая была создана, когда приложение работало на виртуальной машине (вместо контейнера)
  • Не используя медицинские учреждения вашей структуры программирования (если применимо).
  • Создание слишком сложных проверок здоровья с непредсказуемыми временами (Это вызывает внутреннее отрицание атаки услуги внутри кластера)
  • Создание каскадных сбоев при проверке внешних услуг в зонде здоровья Livine

Создание каскадных неудач по ошибке — это Очень распространенная проблема Это разрушительно даже с виртуальными машинами и балансировщиками нагрузки (то есть это не специфична для Kubernetes).

У вас есть 3 сервиса, которые используют сервис Auth в качестве зависимости. В идеале зонд Liveniation для каждой услуги должен проверять, только ли сама служба может ответить на запросы. Однако, если вы настроите зонд Liveniation для проверки зависимостей, может произойти следующий сценарий:

  1. Первоначально все 4 службы работают правильно.
  2. У сервиса Auths есть икота (возможно, его БД перегружена) и не отвечает на запросы достаточно быстро.
  3. Все 3 службы правильно обнаруживают, что у сервиса Auths есть проблемы.
  4. К сожалению, они установили собственное состояние здоровья вниз (или недоступно), даже если все работают нормально.
  5. Kubernetes управляет датчиками LICEITY и решает, что все 4 службы не работают и перезапускают их все (в то время как на самом деле только у одного из них были проблемы).

Для более продвинутых случаев вы также должны познакомиться с выключатели трассы По мере того, как они позволяют вам отделить «стремимость» к приложению с его способностью отвечать.

Anti-Pattern 12-не используя диспетчер пакетов Helm

Сейчас есть только один менеджер пакетов для Kubernetes, и это руль. Вы можете думать о Helm как об утилите APT/RPM для ваших кластеров Kubernetes.

К сожалению, люди часто неправильно понимают возможности руля и выбирают еще одну «альтернативу». Хелм — менеджер пакетов Это также включает в себя возможности шаблона . Это не шаблонное решение, и сравнение его с одним из различных решений для шаблонов пропускает точку зрения.

Все шаблонные решения для Kubernetes страдают от одной и той же проблемы. Они могут сделать свою магию во время развертывания приложений, но после того, как развертывание закончило Kubernetes, знает только набор манифестов и ничего более. Любая концепция «приложения» потеряна и может быть воссоздана только путем наличия исходных исходных файлов.

Хелм, с другой стороны, знает обо всем приложении и хранит информацию о конкретной приложении в самом кластере. Хелм отслеживает ресурсы приложения после развертывания. Разница тонкая, но важна.

Допустим, вы получаете доступ Kubectl на кластере с 4 приложениями (где каждое из них состоит из нескольких ресурсов) в одном и том же пространстве имен. Ваша задача — удалить одно из этих приложений.

Если вы использовали простое решение для шаблонов (например, Kustomize), вы не можете легко понять структуру приложения, посмотрев на действующие ресурсы. Если у вас нет оригинальных шаблонов (то есть Kustomizations и оригинальные патчи), вам необходимо вручную осмотреть ресурсы с Kubectl и установить корреляции между компонентами приложения.

Руководитель, с другой стороны, отслеживает приложение внутри кластера. Вы можете просто сделать:

  • Хелм LS (Чтобы посмотреть на список приложений в пространстве имен)
  • Хелм удалить мое высвобождение (Чтобы удалить приложение)

Вот и все! Никакого доступа к исходным шаблонам не требуется или к трубопроводу CI.

Сравнение шляпа с kustomize/k8compt/kdeploy и другими инструментами шаблона несправедливы по отношению к руководителю, так как руль гораздо больше, чем решение для шаблона.

Одной из признаков Helm также является функция отката. Вы страдаете в 3 часа ночи утра и хотите выполнить самый быстрый откат в кластере Kubernetes, с которым вы не знакомы. Просто нет времени отслеживать исходные исходные файлы и определить, что такое «предыдущие» версии шаблонов в GIT.

С рулем это тривиально:

  1. Хелм LS (чтобы увидеть выпуски)
  2. История руля мое высвобождение (Чтобы увидеть предыдущие версии развертывания)
  3. Helm Offback My Release My-Previous-версия

Все это, прямо из кластера, потому что Хелм знает, какое приложение не похоже на шаблонные решения, которые останавливают их работу после завершения развертывания.

Другое заблуждение состоит в том, что пакеты управляются Helm Packages с GIT Repos, а изменение диаграммы включает клонирование/копирование диаграммы на локальном уровне. Хульнические диаграммы должны быть на самом деле управляются с репозиториями руля . Это нормально, если у вас также есть копия в GIT (после парадигмы Gitops), но развертывание диаграммы руля в кластер должен произойти из репозитория руля, а не git Repo.

Стоит также отметить, что со времен Helm 3 больше нет компонента на стороне сервера (печально известный румпель), поэтому, если в последний раз, когда вы оценивали руль, у вас были опасения относительно безопасности кластера, вам нужно познакомиться с Второй во второй раз, когда Тиллер ушел.

Если у вас нет действительно странный рабочий процесс, не использование руля — это все равно, что не использовать APT/RPM для управления пакетами. Если вы решите, что руль не для вас, это должен быть сознательный выбор (после тщательного рассмотрения), а не на основе дезинформации о выборе «лучшего решения для шаблона, чем шлем».

Anti-Pattern 13-Не имея метрик развертывания

Мы упоминали метрики несколько раз в предыдущих анти-паттернах. Под «метриками» мы на самом деле имеем в виду всю трилогию:

  • Регистрация-чтобы изучить события и детали запросов (обычно пост-инцидент)
  • отслеживание-чтобы погрузиться в путешествие единого запроса (обычно пост-инцидент)
  • Метрики — чтобы обнаружить инцидент (или даже лучше предсказать его)

Метрики более важны в Kubernetes, чем традиционные виртуальные машины, из-за распределенного характера всех услуг в кластере (особенно если вы используете микро-сервисы). Приложения Kubernetes полностью динамичны (они приходят и уходят в отличие от виртуальных машин), и очень важно, чтобы вы знали, как они адаптируются к вашему трафику.

Точное решение, которое вы выбираете для своих метрик, не так важно, если у вас есть достаточные показатели для всех ваших вариантов использования, таких как:

  • Получение критической информации своевременно вместо использования kubectl (см. Antipattern 6)
  • Понимание того, как трафик попадает в ваш кластер и каково нынешнее узкое место (см. Antipattern 7)
  • Проверка/адаптация пределов ваших ресурсов (см. Antipattern 10)

Однако наиболее важным вариантом использования является то, что вам нужно понять, если ваше развертывание преуспело. Тот факт, что контейнер встал, не означает, что ваше приложение находится в состоянии выполнения или может принимать запросы (см. Также Anti-Pattern 11).

В идеале, метрики не должны быть тем, на что вы смотрите время от времени. Метрики должны быть неотъемлемой частью процесса развертывания. Несколько организаций следуют рабочему процессу, где показатели осматриваются вручную после того, как развертывание происходит, но этот процесс является неоптимальным. Метрики следует обрабатывать автоматическим способом:

  1. Развертывание происходит
  2. Метрики исследуются (и по сравнению с базовым случаем)
  3. Либо развертывание помечено как законченное, либо оно откатится. Обратите внимание, что в этих действиях нет ручного шага.

Создание ваших показателей, влияющих на ваши развертывания, не является легкой задачей. Однако это показывает, какова конечная цель и насколько важны показатели для развертывания Kubernetes.

Anti-Pattern 14-Не имея стратегии для секретов

Во втором анти-паттерне мы объяснили, почему конфигурация выпечки в контейнерах является плохой практикой. Это еще более верно для секретов. Если вы используете динамическую службу для изменений конфигурации, имеет смысл использовать ту же (или аналогичную) службу для обработки секретов.

Секреты должны передаваться во время выполнения в контейнеры. Существует много подходов к тайной обработке от простого хранилища до git (в зашифрованной форме) к полному секретному решению, такому как хранилище Hashicorp.

Некоторые общие ловушки здесь:

  • Использование нескольких способов для секретной обработки
  • Смутные секреты времени выполнения с секретами сборки
  • Использование сложных секретных механизмов инъекции, которые затрудняют или невозможны тестирование местного развития.

Важным моментом здесь является выбрать стратегию и придерживаться ее. Все команды должны использовать один и тот же метод для секретной обработки. Все секреты из всех сред должны обрабатываться одинаково. Это делает секретное отслеживание легким (зная, когда и где использовался секрет).

Вы также должны перейти к каждому приложению только в секретах, в которых она действительно нужна.

Секреты времени выполнения — это секреты, которые требуются приложением после его развертывания. Примерами будут пароли базы данных, сертификаты SSL и частные ключи.

Секреты сборки — это секреты, которые требуются приложением только во время упаковки. Примером могут быть учетные данные вашего репозитория артефакта (например, артефактор или Nexus) или для хранения файлов в ведро S3. Эти секреты не нужны в производстве и никогда не должны быть отправлены в кластер Kubernetes. Каждое развернутое приложение должно получать только те секреты, которые ему нужны (и это верно даже для непроизводственных кластеров).

Как мы также упоминали в Anti-Pattern 3, секретное управление следует обрабатывать гибким способом, что позволяет легко тестировать и локально развернуть ваше приложение. Это означает, что приложение не должно на самом деле заботиться о источнике секретов и должно сосредоточиться только на их использовании.

В качестве примера, хотя у Hashicorp Vault есть Гибкий API Для получения секретов и токенов, ваше приложение Kubernetes не должно использовать этот API напрямую, чтобы получить необходимую информацию. Если вы сделаете это, то тестирование приложения локально становится кошмаром, так как разработчик должен был бы настроить экземпляр Vault Locally или высмеивать ответы Vault только для запуска приложения.

Anti-Pattern 15-Попытка решить все проблемы с Kubernetes

Как и во всех технологиях перед ним, Kubernetes является конкретным решением, которое решает определенный набор проблем. Если у вас уже есть эти проблемы, вы обнаружите, что принятие Kubernetes значительно упрощает ваш рабочий процесс и дает вам доступ к решению кластеризации, которое хорошо спроектировано и поддерживается.

Однако важно понять преимущества и недостатки внедрения Kubernetes. По крайней мере, в начале гораздо проще использовать Kubernetes для без сохранения состояния, которые будут использовать эластичность и масштабируемость кластера.

Несмотря на то, что технически Kubernetes также поддерживает государственные услуги, лучше всего запускать такие услуги за пределами кластера, когда вы начинаете свое миграционное путешествие. Это нормально, если вы сохраняете базы данных, кэширование решений, репозитории артефактов и даже реестры докеров за пределами кластера (либо в виртуальных машинах, либо в облачных сервисах).

Двигаться вперед

Kubernetes — это сложное решение, которое требует нового мышления во всех фронтах (сеть, хранение, развертывание и т. Д.). Развертывание в кластере Kubernetes — это совершенно другой процесс, чем развертывание на виртуальных машинах.

Вместо повторного использования существующих механизмов развертывания вы должны потратить некоторое время на изучение всех последствий приложений Kubernetes и не попасть в ловушки, которые мы видели в этом руководстве:

  1. Развертывание изображений с тегом «Последняя»
  2. Конфигурация хардкодирования внутри контейнеров
  3. Соединение приложения с кластерами конструкциями
  4. Смешивание развертывания инфраструктуры с выпусками приложений
  5. Выполнение ручного развертывания с использованием kubectl
  6. Использование kubectl для отладки кластеров
  7. Не понимание сетевой модели Kubernetes
  8. Тратить ресурсы на статические среды вместо динамических
  9. Смешивание производства и непроизводственных рабочих нагрузок в одном кластере
  10. Не понимание памяти и процессора ограничивает неправильное использование зондов здоровья
  11. Не понимая преимущества руля
  12. Не иметь эффективных показателей применения
  13. Обработка секретов в специальной манере
  14. Принятие Kubernetes, даже если это не является правильным решением.

Счастливого развертывания!

Обложка фото USPLASH Анкет

Kubernetes antipatterns (3 серии деталей)

Оригинал: «https://dev.to/codefreshio/kubernetes-deployment-antipatterns-part-3-56lh»