Это было 3 утра в понедельник. Команда испытала бессонные выходные, пытаясь копаться в производственную неудачу. Через несколько часов работала рабочая неделя, и все мы знали, что мир нуждался в этом приложении к работе. Это было бы катастрофой, если этот вопрос не был зафиксирован до того.
Но почему это не удалось? Работало на прошлой неделе. Почему это перестало работать сегодня? Недавнее изменение кода? Но это было абсолютно не связано. Мы проверили это — со всей строгостью. Мы настроили лучшую тестовую автоматизацию, а также несколько ручных тестов. Далее наши микросервисы сканируются и рассмотрены эффективными инструментами. Почему тогда это не удалось?
Мы начали проклинать нашу судьбу и инструменты, которые мы использовали. Руководство начало кричать на нас. Вы сказали, что K8S предназначен для устойчивости, и оно позволяет приложениям, которые никогда не могут потерпеть неудачу. Но мы видели больше проблем, чем решение. Никогда не используйте открытый источник! И все это бла ..
Но после нескольких часов борьбы, судьба улыбнулась — как раз вовремя — и мы обнаружили проблему с конфигурацией YML. Некоторые прогрессивные настроенные разработчики не указали версию встроенного Opensource DB, используемой там — он использовал «последнее» — надеясь получить лучшие функции, поскольку они выпущены. Была доступна новая версия, и это сломало существующую функциональность.
Удача! Наша работа была спасена. Нам удалось решить проблему, а затем разбиться в кровать — поскольку мир начал использовать наше приложение, которое функционирует как раньше.
RCA
Этот звук знаком? Я уверен, что это делает. У нас все видели бедствия, вызванные ошибкой в Кубернетах. Проблема в силе инструмента. С большой властью приходит большая ответственность.
Там так много, что мы настраиваем там, и очень мало разработчиков, которые действительно понимают эти конфигурации достаточно хорошо. Большинство из них делают эти конфигурации, используя другие существующие конфигурации — копию/пасте, с модификацией некоторых частей, которые имеют смысл им. Или авантюристым выбирают файлы YML прямо из некоторых онлайн-учебников — которые были хороши, чтобы доказать точку, но не достаточно зрелая для производства.
Когда мы используем инфраструктуру в качестве кода, мы склонны забывать, что это также является частью кода, который должен пройти все валидацию, как нормальный код приложения. Часто заманчиво использовать ярлыки, которые работают сегодня. Они работают и развернуты в производство. И мы предполагаем, что они будут работать навсегда. Но, к сожалению, это не так с конфигурациями Kubernetes.
Мир по-прежнему новый к узорам Кубератеса. Разработчики все еще борется, хотя это — так и админы. И слишком большая часть конфигурации входит в систему, что позволяет легко закройте такие ошибки. Хуже того, большинство из этих ошибок показывают свое влияние через несколько дней или даже месяцев. Система отлично работает до тех пор, пока она просто не рухнет без предупреждения. Это делает задачу еще сложнее
Общие проблемы
Нет конца нашему творчеству, а нашу способность — представить новые и новые дефекты в системе. Но есть несколько распространенных проблем, которые проявляются очень часто. Давайте посмотрим на них один за другим.
Пространство имен по умолчанию
Это распространенная ошибка, но новые разработчики делают — когда они выбирают конфигурации из учебных пособий и блогах. Большинство из них предназначены для объяснения концепции и синтаксиса. Чтобы сохранить это просто, большинство из них пропускают другие сложности, такие как пространство имен.
Но любые развертывание Kubernetes должны иметь значимое пространство имен в архитектуре. Если мы пропустим это по ошибке, это может привести к тому, что имена столкнулись в будущем.
Устаревшие API
Кубернаны проходят активное развитие. Много разработчиков по всему миру усердно работают над улучшением его и сделать его все более устойчивым. К сожалению, в том, что у нас есть некоторые API устаревшие в более новые релизы.
Нам нужно определить и удалить их, прежде чем они начнут провалиться в производстве.
Голые стручки
Kubernetes обеспечивает «развертывание» — как способ инкапсулировать стручки и все, что им нужно. Но некоторые ленивые разработчики могут захотеть пропустить это и развернуть только стручок в Кубернаны.
Ну, это может работать сегодня. Но это плохая практика, и определенно приведет к катастрофу когда-нибудь.
Распределение пространства имен
Когда объекты на разных уровнях имеют пространство имен, нижняя сущность может получить доступ к соседям высшего объекта — процитировать сеть.
Например, когда контейнер разрешено поделиться пространством имен сетевого пространства своего хоста, он может получить доступ к локальным слушателям сети и использовать его, чтобы проверить локальную сеть хоста.
Это риск безопасности. Даже если это наш собственный код, минимальный принцип доступа рекомендует не допустить. Когда дело доходит до системы безопасности, мы никогда не должны верить ни в кого — даже не сами.
Не уважать абстракцию
Все коммуникации между контейнерами должны проходить через слои абстракции, предоставляемой Kubernetes. Связь между услугами должна пройти через абстракции входа и услуги, определенного в развертывании.
Никогда не управляйте контейнерами с корневой привилегией. Никогда не выставляйте порыты узлов из служб или доступа к файлам хоста непосредственно в коде (с помощью UID). Вход должен пересылать трафик на сервис, а не непосредственно к отдельным стручкам.
Hardcoding IP-адреса или напрямую доступ к сокетам докера и т. Д. Может привести к проблемам. Опять же, они не нарушит систему в самый первый день. Но когда-нибудь появится когда-нибудь, когда мы просто не можем себе это позволить.
Неправильные теги изображения
Это распространенная катастрофа. Разработчики часто соблазны использовать «последние» — с надеждой на улучшение постоянно, получая последнюю и лучшую версию. Такая конфигурация может жить в нашей системе в течение многих месяцев. Но это может привести к неприятности.
Когда тег изображения не описан (например, не хватает тега версии, как 1.19.8), каждый раз, когда изображение вытащена, версия будет другой версией и может нарушить наш код. Кроме того, не описательная тег изображения не позволяет нам легко откатывать (или вперед) на разные версии изображения. Лучше использовать конкретные и значимые метки, такие как версий строки или изображение SHA.
Верить по умолчанию
Это еще одна проблема, которая проявляется очень часто — когда мы не очень уверены в конфигурации, мы склонны верить в по умолчанию. Распределение памяти/процессора, Min/Max Replica считается для автоматического масштабирования … Это некоторые из свойств, которые пропускают слишком часто.
Datree.
Как мы отмечали, существует слишком много конфигураций, которые входят в кластер Куберанес. Хелм пытается уменьшить эту сложность, но делает вещи хуже, когда мы пытаемся настроить саму руля. Для человека невозможно обеспечить качество, которое нам нужно в наших развертывании производства.
Нам нужны хорошие инструменты, которые могут автоматизировать этот процесс и помочь нам с этим.
После некоторого обсуждения на технологических платформах и много Google/Stackoverflow/YouTube мы нашли несколько интересных инструментов. После их сравнения мы выбрали Datree Отказ
Это просто настроить и использовать. Он может быть легко интегрирован с большинством инструментов CI/CD. Это помогает нам определить такие проблемы, прежде чем они могут вызвать проблему. Он имеет блеск свободного уровня и не блокируется — все, что нам нужно в идеальном инструменте.
Давайте проверим это.
Установка
Установка инструмента довольно проста и быстро. Запустите команду ниже. Нам нужны разрешения Sudo.
curl https://get.datree.io | /bin/bash
Несколько секунд, и мы готовы пойти! Большинство из нас неудобно бежать такую команду — мы должны быть. Мы можем просто проверить фактический код, который выполняется скриптом. Просто откройте ссылку https://get.datree.io в браузере.
#!/bin/bash osName=$(uname -s) DOWNLOAD_URL=$(curl --silent "https://api.github.com/repos/datreeio/datree/releases/latest" | grep -o "browser_download_url.*\_${osName}_x86_64.zip") DOWNLOAD_URL=${DOWNLOAD_URL//\"} DOWNLOAD_URL=${DOWNLOAD_URL/browser_download_url: /} OUTPUT_BASENAME=datree-latest OUTPUT_BASENAME_WITH_POSTFIX=$OUTPUT_BASENAME.zip echo "Installing Datree..." echo curl -sL $DOWNLOAD_URL -o $OUTPUT_BASENAME_WITH_POSTFIX echo -e "\033[32m[V] Downloaded Datree" unzip -qq $OUTPUT_BASENAME_WITH_POSTFIX -d $OUTPUT_BASENAME mkdir -p ~/.datree rm -f /usr/local/bin/datree || sudo rm -f /usr/local/bin/datree cp $OUTPUT_BASENAME/datree /usr/local/bin || sudo cp $OUTPUT_BASENAME/datree /usr/local/bin rm $OUTPUT_BASENAME_WITH_POSTFIX rm -rf $OUTPUT_BASENAME curl -s https://get.datree.io/k8s-demo.yaml > ~/.datree/k8s-demo.yaml echo -e "[V] Finished Installation" echo echo -e "\033[35m Usage: $ datree test ~/.datree/k8s-demo.yaml" echo -e " Using Helm? => https://hub.datree.io/helm-plugin" tput init echo
По сути, это просто загружает ZIP-файл и расширяет его в указанные места. Он размещает бинарный в папку/usr/local/bin — для которой ему нужен sudo. Он не связывается с какой-либо конфигурацией системы, и поэтому она очень проста для удаления.
Простое демо
Установка Datree предоставляет образец YAML-файла — для POC.
datree test ~/.datree/k8s-demo.yaml >> File: ../../.datree/k8s-demo.yaml ❌ Ensure each container has a configured memory limit [1 occurrences] 💡 Missing property object `limits.memory` - value should be within the accepted boundaries recommended by the organization ❌ Ensure each container has a configured liveness probe [1 occurrences] 💡 Missing property object `livenessProbe` - add a properly configured livenessProbe to catch possible d eadlocks ❌ Ensure workload has valid label values [1 occurrences] 💡 Incorrect value for key(s) under `labels` - the vales syntax is not valid so it will not be accepted by the Kuberenetes engine ❌ Ensure each container image has a pinned (tag) version [1 occurrences] 💡 Incorrect value for key `image` - specify an image version to avoid unpleasant "version surprises" in the future +-----------------------------------+-------------------------------------------------+ | Enabled rules in policy "default" | 21 | | Configs tested against policy | 1 | | Total rules evaluated | 21 | | Total rules failed | 4 | | Total rules passed | 17 | | See all rules in policy | https://app.datree.io/login?cliId=GStykNg6GkUAS8LfaEt2B8 | +-----------------------------------+-------------------------------------------------+
Интересный? Ну, это было просто проблемой.
Онлайн просмотр
Обратите внимание на URL, который он генерирует в конце таблицы —
https://app.datree.io/login?cliId=GStykNg6GkUAS8LfaEt2B8
Это уникальный идентификатор, назначенный вашей системе. Он хранится в файле конфигурации в домашней папке.
# cat .datree/config.yaml token: t4e73q9ZxkXhKhcg4vYHDF
Откройте ссылку в браузере. Это предложит нам войти в систему с Google/Github. Как мы вощета, этот уникальный идентификатор подключен к новой учетной записи на Datree. Теперь мы можем адаптировать инструмент из веб-пользовательского интерфейса. Кроме того, увидим отчеты от всех испытаний
Фильтры и политики
Там мы можем увидеть подробную настройку для тестов. Мы можем изменить это, и то же самое используется, когда файлы yaml оцениваются. Мы можем выбрать то, что мы чувствуем, важно и пропустить то, что мы чувствуем, можно игнорировать. Если мы хотим, мы можем быть повстанцами и допустить класс ошибок пройти. Datree также дает нам эту гибкость.
Помимо политики по умолчанию, доступной для нас, мы можем определить более пользовательские политики, которые могут быть вызваны согласно нашей потребности.
Datree предоставляет «фильтрам» для всех вышеупомянутых потенциальных проблем, и многие другие.
История
На левой панели мы можем увидеть ссылку для «истории». Нажмите на него, и мы увидим историю всех утверждений, которые она выполнила до сих пор. Таким образом, мы можем просто просмотреть состояние проверки политики прямо здесь — без того чтобы открыть «черный экран»
Каждый раз, когда мы вызываем команду datree, она соединяется с облаком с этим идентификатором и вытаскивает необходимую конфигурацию, а затем загружает отчет для запуска.
Совместим с инструментами
Как мы видели выше, мы можем вызвать Datree в одной команде. Намного больше, чем это также обеспечивает замечательную совместимость с большинством инструментов управления конфигурацией и управляемым развертыванием Kubernetes, таких как AKS, EKS и GKS. И о том, мы не можем забыть руль при работе с Куберанетами. Datree предоставляет простой плагин на руле.
Datree имеет Разработанная документация И набор «Как» учебников на своем сайте. Вы можете обратиться к ним для быстрого настройки любой функции, которую вы хотите.
Не ждите бедствия
Большинство приложений по всему миру имеют много таких ошибок — это наверняка принесет неприятное бедствие в течение нескольких дней. Мы знали, что наше приложение имело эту проблему. Но мы недооценили степень ущерба, что это может вызвать. Мы просто прокластиствовали, сидя на временной бомбе!
Теперь я говорю всем, не делай то, что мы сделали. Не жди катастрофа. Автоматизировать проверки конфигурации и наслаждайтесь выходными.
Оригинал: «https://dev.to/solegaonkar/prevent-configuration-errors-in-kubernetes-30dn»