5 основных ошибок кодирования Kubernetes и способы их решения
1 июня 2022 г.
Kubernetes может быть сложным в использовании, поскольку существует множество потенциальных проблем, влияющих на целостность вашего кода. Устранение неполадок Kubernetes также может быть сложной задачей. Например, вы можете легко выявить такие проблемы, как недоступный кластер контейнеров или не отвечающий модуль. Однако может быть сложнее определить причину и решить проблему.
В этой статье описаны некоторые распространенные сценарии устранения неполадок в Kubernetes и способы их решения.
Топ-5 ошибок кода Kubernetes
Ниже приведены наиболее распространенные ошибки кодирования в Kubernetes.
Код выхода 1
Этот код ошибки указывает на то, что завершение работы контейнера произошло из-за недопустимой ссылки или ошибки приложения:
- Ошибки приложений — они варьируются от простых ошибок программирования в коде, который запускает контейнер (например, «деление на ноль»), до сложных ошибок, связанных со средой выполнения (например, Python, Java и т. д.).
- Недопустимые ссылки — это происходит, когда файл, указанный в спецификации образа, не находится в соответствующем образе контейнера.
Решение:
Если вы столкнулись с кодом ошибки 1, выполните следующие действия:
- Проверьте, все ли файлы, указанные в спецификации образа, присутствуют в журнале контейнера. Если вы не можете найти один из файлов, существует проблема с недопустимой ссылкой. Отредактируйте спецификацию изображения, чтобы она указывала на правильное имя файла и путь.
- Если нет недопустимой ссылки на файл, найдите другие проблемы, такие как ошибка приложения. Проверьте журналы контейнера, чтобы определить библиотеку с ошибкой и отладить ее.
Код выхода 125
Этот код ошибки указывает на то, что контейнер не удалось запустить. Это происходит, когда Kubernetes вызывает команду в системной оболочке и не может выполнить ее должным образом. Например, вы можете использовать команду docker
run
, но вам не удается ее запустить. Общие причины кода выхода 125 включают в себя:
- Использование неопределенного флага в команде, например,
docker run --abcd
.
- У пользователя, указанного в спецификации образа, нет необходимых разрешений.
- Механизм контейнера несовместим с оборудованием хоста или операционной системой.
Решение:
Если ваш контейнер был завершен с кодом выхода 125, выполните следующие действия:
- Убедитесь, что команда, пытающаяся запустить контейнер, имеет правильный синтаксис.
- Убедитесь, что пользователь, пытающийся запустить контейнер, имеет соответствующие разрешения. Разрешения пользователя должны включать создание контейнера на хосте в контексте выполнения команды в спецификации образа.
- Реализуйте дополнительные параметры запуска контейнера, предлагаемые механизмом вашего контейнера, чтобы найти альтернативные команды. Например, вы можете использовать команду «docker start» вместо «docker run» в Docker.
- Проверьте, можете ли вы использовать тот же контекст или имя пользователя для запуска других контейнеров на хосте. Если на узле не удается успешно запустить какой-либо контейнер, рассмотрите возможность переустановки ядра контейнера. В качестве альтернативы устраните основные проблемы совместимости между установкой хоста и ядром контейнера.
Код выхода 126
Этот код ошибки указывает на сбой при вызове команды в спецификации вашего контейнера. Типичными причинами ошибок вызова команды являются отсутствующие зависимости и недостатки в сценарии непрерывной интеграции, в котором запущен контейнер.
Решение:
Если ваш контейнер завершается с кодом выхода 126, выполните следующие шаги:
- Найдите в журналах контейнера команду, которую системе не удалось вызвать.
- Вы можете убедиться, что команда является источником ошибки, выполнив пробный запуск спецификации контейнера без нее и проверив успешность выполнения.
- Убедитесь, что команда имеет правильный синтаксис и может получить доступ ко всем зависимостям.
- После устранения неполадок вы можете настроить спецификацию контейнера и снова запустить контейнер, чтобы убедиться, что проблема устранена.
Проблемы с PVC в Kubernetes
Эти ошибки влияют на Kubernetes PersistentVolumeClaims (PVC), которые представляют собой сложные механизмы, подверженные трудно идентифицируемым ошибкам. PVC позволяет модулю монтировать Kubernetes PersistentVolume. Ошибки PVC часто сложно диагностировать и устранить. Обычно они попадают в одну из следующих категорий:
- Проблемы с созданием PV — Kubernetes не удается создать постоянный том или разрешить доступ к нему, несмотря на наличие необходимых базовых ресурсов хранения.
- Проблемы с предоставлением PV — Kubernetes не удается создать постоянный том из-за недоступности необходимых ресурсов хранения.
- Изменения спецификаций — Kubernetes не может подключить постоянный том к поду из-за изменений конфигурации спецификаций PVC или PV.
Различные проблемы с PVC могут возникать на разных этапах жизненного цикла постоянного тома. Примеры распространенных ошибок в этой категории:
- FailedAttachVolume — том не удается отсоединить от предыдущего узла, что препятствует его подключению к текущему узлу.
- FailedMount — том не удается смонтировать по указанному пути. Эта ошибка часто является результатом ошибки FailedAttachVolume, но не всегда. В некоторых случаях том успешно отсоединяется и доступен для подключения, а другая проблема не позволяет подключить его по нужному пути.
- CrashLoopBackOff — модуль постоянно перезагружается и аварийно завершает работу. Эта ошибка часто возникает из-за проблем с PVC (т. е. повреждения), хотя она также может быть вызвана другими причинами.
Проблемы с набором демонов
Kubernetes DaemonSets управляет жизненным циклом и планированием модулей, чтобы обеспечить выполнение одного модуля на каждом узле. в каждом кластере.
Наборы демонов считаются неработоспособными, если у них не ровно один модуль на узел. Наборы демонов часто неработоспособны из-за ожидающих выполнения модулей или модулей, застрявших в циклах сбоя. Ошибки установки демона часто возникают из-за узлов, запланированных для запуска модулей.
Pod может испытывать цикл сбоев по разным причинам, например из-за нехватки ресурсов. Проверьте спецификацию, чтобы определить ресурсы, которые вы можете увеличить — например, увеличение памяти или ЦП и ограничение значений могут позволить модулям работать дольше. Вы можете проверить журналы модуля, чтобы полностью устранить неполадки. Если нет явных проблем с использованием ресурсов, вам следует проверить команду модуля. Если контейнер завершается раньше, чем это предполагается, найдите изображение, используемое в спецификации, чтобы убедиться, что оно правильное.
Если один или несколько модулей в DaemonSet находятся в ожидании, это может указывать на то, что ресурсов недостаточно для планирования модуля на каждом узле. Вы можете использовать следующие шаги для решения этой проблемы:
- Уменьшите запрошенную память и процессор DaemonSet.
- Снимите несколько модулей с затронутых узлов, чтобы освободить ресурсы.
- Увеличьте масштаб своих узлов, чтобы освободить место для модулей DaemonSet.
Вы можете запретить запуск наборов демонов на определенных узлах, изменив признаки каждого узла или допуски набора демонов. Этот подход помогает предотвратить планирование модулей DaemonSet для специализированных узлов, которые могут не иметь необходимых ресурсов.
Предположим, вам не требуется функциональность DaemonSet (т. е. один модуль на узел). В этом случае вместо этого вы можете использовать развертывание — этот вариант предлагает большую гибкость для определения количества модулей в их местоположении.
Вывод
В этой статье я рассказал о наиболее распространенных ошибках кодирования Kubernetes и о том, что с ними можно сделать:
- Код выхода 1 — проблемы с приложением и недопустимые ссылки, возникающие из-за ошибки в спецификации изображения или проблемы в приложении, работающем в контейнере.
- Код выхода 125 — не удалось запустить контейнер, что указывает на проблему в спецификации образа или несовместимость компонентов образа и остальной среды.
- Код выхода 126 — ошибка вызова команды, указывающая на то, что команда, выданная контейнером, недействительна или использует неправильный синтаксис.
- Проблемы Kubernetes PVC — невозможность отсоединить PersistentVolume от предыдущего узла, чтобы присоединить его к новому узлу.
- Проблемы DaemonSet — сбой при запуске ресурсов, необходимых в кластере Kubernetes, что обычно указывает на нехватку ресурсов.
Я надеюсь, что это будет полезно, поскольку вы улучшите качество и надежность своих кластеров Kubernetes.
Оригинал