Привлекательность использования Kubernetes это то, что вы абстрагируете детали где Ваши приложения работают и оставляют его в руках K8S. Это запланирует контейнеры после некоторых заданных ограничений и перезапустите их, если они сбой.
Тем не менее, кластер Kubernetes не является идеальной абстракцией. Это особенно видно как оператор. Даже если вы используете управляемое решение, такое как AWS EKS , вам все еще нужно выполнить какое -то обслуживание самостоятельно.
Как оператор, я хочу, чтобы это техническое обслуживание было регулярно, чтобы избежать застоя и предотвратить отказ. Как разработчик, я избегаю нежелательных перерывов для моих приложений. Бюджет нарушения POD (PDB) — это ресурс в Kubernetes, который гармонизирует обе потребности. Я хочу поговорить о том, как использовать его в этой статье.
Бюджеты на нарушение стручков на спасение
Классический сценарий обслуживания в мире Kubernetes — это замена рабочего узла. Есть много причин: обновление версии, новая AMI, развертываемая или регулировка в размере экземпляра. Когда старый узел заменяется, бегущие там стручки будут выселены и перенесены. На языке K8, это называется Добровольное разрушение Анкет Если ваше приложение получит незапланированное время нежелательного простоя, вы думаете об этом как чертовски непроизвольно. Клятву может произойти.
К счастью, кто -то подумал об этом. С помощью PDB вы определяете, сколько стручков должны оставаться доступными в любое время в развертывании (или аналогичном). Если вы замените рабочие узлы один за другим, планировщик гарантирует, что приложение по -прежнему запускает несколько стручков в оставшихся узлах на протяжении всего процесса, избегая страшного времени простоя.
Кластская часть заключается в том, что этого достаточно, чтобы определить его как дополнительный ресурс и применить его как часть выпуска вашего заявления. Он отделен от любых оперативных действий, что делает его очень удобным в использовании. Вот Официальная документация Анкет
Вам действительно нужно использовать PDB?
Он не сделал бы этого
Это справедливый вопрос. PDB должны быть зарезервированы для приложений, которые нужен оставаться в сети.
Если ваше приложение может позволить некоторое небольшое время простоя, это может быть легче, вместо того, чтобы нанести несправедливую нагрузку на операторов вашего кластера.
Как мы немного увидим, если вы неправильно настроены, узлы PDB не могут быть истощены, что избавило от вас безымянных операторов. Никто не хочет быть блокировщиком. Давайте не будем этого делать.
Создание PDB
Хорошо, так давайте перейдем к основам и создадим один такой PDB. Обычно у вас будет одно развертывание, которое вы хотите защитить от дачи.
Простое развертывание
Давайте покажем немного Terraform код.
locals { app = "hello-world" image = "nginx:1.14.2" port = 80 } resource "kubernetes_namespace" "this" { metadata { name = "${local.app}-namespace" } } resource "kubernetes_deployment" "this" { metadata { name = "${local.app}-deployment" namespace = kubernetes_namespace.this.metadata.0.name labels = { app = local.app } } spec { replicas = 2 selector { match_labels = { app = local.app } } template { metadata { labels = { app = local.app } } spec { container { name = local.app image = local.image port { container_port = local.port } } } } } }
Это упрощенное развертывание изображения Nginx. Мы запускаем две копии, чтобы обеспечить доступность. Теперь давайте создадим PDB для этого развертывания.
PDB
PDB является еще одним ресурсом в Kubernetes. На дату этого поста это Apiversion
все еще Политика/V1Beta1
Анкет
Вам нужна цель. Он использует то же самое Селектор
как развертывание, которое мы повторно используем. Стручки, созданные нашим предыдущим развертыванием, подлежат этому PDB.
Важнейшей частью этого ресурса является указание, сколько стручков вы хотите постоянно не отставать. Вы должны предоставить один из Maxunavailable
или MinaVailable
, но не оба. Они делают то, что вы ожидаете. В моем примере я хочу убедиться, что всегда работает хотя бы один экземпляр.
resource "kubernetes_pod_disruption_budget" "this" { metadata { name = local.app namespace = kubernetes_namespace.this.metadata.0.name labels = kubernetes_deployment.this.metadata.0.labels } spec { min_available = "1" selector { match_labels = kubernetes_deployment.this.spec.0.selector.0.match_labels } } }
Вот и все. Как только я применил этот ресурс, Kubernetes уважает ограничение при истощении узла. Теперь мы можем заменить эти узлы, зная, что мое приложение не будет испытывать время простоя в процессе. Я имею в виду, пока мы не уничтожаем все узлы одновременно, вы знаете.
Не блокируйте техническое обслуживание!
Когда вы используете PDB, вы должны помнить о том, чтобы не создавать невозможные сценарии. Например, если у вас есть развертывание только с одной копией, настройка MinaVailable
гарантирует, что POD никогда не будет добровольно выселен.
Это плохо! Поддержание узла необходимо. Ваши стручки должны быть гибкими входить и выходить из системы. Кроме того, PDB не предотвращает непроизвольный Выселение. Если хостинг EC2 узел уходит, вы облажались. Не делай этого.
Резюме
Добавив ресурс бюджета с нарушениями POD, мы убедитесь, что наше приложение остается онлайн во время Windows. Это экономит много координационных усилий между людьми, управляющими системой, и людьми, управляющими приложениями, которые должны оставаться в сети.
Оригинал: «https://dev.to/sirech/be-a-good-kubernetes-citizen-and-use-pod-disruption-budgets-37k8»