Ответ
Для обновления кластера Kubernetes без простоя применяется стратегия последовательного обновления узлов. Ключевой принцип — обновлять узлы по одному, перенося поды на другие узлы, чтобы обеспечить непрерывность работы приложений.
Процесс обновления Worker Nodes:
- Подготовка узла: Вывести узел из обслуживания, чтобы планировщик не назначал на него новые поды, и эвакуировать существующие поды.
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-dataФлаг
--ignore-daemonsetsнеобходим для DaemonSet'ов (например, сборщиков логов), которые должны оставаться на узле. - Обновление: На самом узле обновить компоненты
kubeadm,kubeletиkubectl.# Для узла на Ubuntu/Debian sudo apt-get update && sudo apt-get install -y kubeadm=<новая-версия> kubelet=<новая-версия> kubectl=<новая-версия> sudo kubeadm upgrade node sudo systemctl restart kubelet - Возврат в строй: Вернуть узел в рабочее состояние.
kubectl uncordon <node-name> - Повторить шаги 1-3 для каждого worker-узла.
Процесс обновления Control Plane (для HA-кластера):
- Обновить
kubeadmна первом control-plane узле. - Выполнить
kubeadm upgrade planдля проверки иkubeadm upgrade applyдля обновления статических подов control plane. - Обновить
kubeletиkubectlна этом узле и перезапуститьkubelet. - Повторить для остальных control-plane узлов, выполняя только
kubeadm upgrade node(так как кластер уже обновлен).
Важные проверки перед обновлением:
- Изучить официальную документацию по обновлению для вашей версии.
- Проверить совместимость версий между
kube-apiserverиkubelet(обычноkubeletможет быть на одну минорную версию старше). - Убедиться, что все критичные приложения имеют Pod Disruption Budgets (PDB) для контроля доступности во время drain.
- Протестировать процесс на staging-окружении.
Ответ 18+ 🔞
А, ну это ж классика, ёпта! Обновлять кубер без простоев — это как менять колесо на машине на ходу, только вместо машины у тебя целый дата-центр, а вместо колеса — сервера, на которых всё держится. Но ничего, справимся, если делать по уму, а не как мартышлюшка с гранатой.
Смотри, главный принцип — не лезть, как слон в посудную лавку, и не апгрейдить всё разом. Иначе будет тебе не обновление, а полноценная хиросима с нигерсраками. Нужно брать ноды по одной, как консервы из погреба, и аккуратно с ними работать.
Вот как worker-ноды обновлять, чтобы приложения даже не чихнули:
-
Подготовка, она же «выгоняем всех с хаты». Сначала надо ноду вывести из игры, чтобы планировщик новых подов на неё не швырял, а старые — аккуратно переехали на другие узлы. Команда вот эта:
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-dataФлаг
--ignore-daemonsets— это святое, чувак. Без него тебе никогда не выгнать с ноды какие-нибудь демонсеты вроде сборщика логов. Они должны там остаться, иначе весь кластер начнёт бздеть, что мониторинга нет. -
Сам процесс, «хирургическое вмешательство». Пока нода пустая, можно на ней всё по-взрослому обновить.
# Допустим, у тебя Ubuntu sudo apt-get update && sudo apt-get install -y kubeadm=<новая-версия> kubelet=<новая-версия> kubectl=<новая-версия> sudo kubeadm upgrade node sudo systemctl restart kubeletПосле этого kubelet перезапустится уже с новой версией. Главное — версии совместимые ставить, а то будет пиздопроебибна, когда kubelet новее аписервера на две версии.
-
Возвращаем бойца в строй. Всё, нода обновлена, можно разрешать ей снова работать.
kubectl uncordon <node-name>И пошла она принимать поды обратно. И так каждую ноду по очереди, пока все не будут новые. Терпения нужно, блядь, овердохуища, но зато без паники.
С control plane нодами (теми, что мозги кластера) история чуть тоньше, особенно если их несколько для отказоустойчивости:
- На первой ноде апдейтишь kubeadm, делаешь
kubeadm upgrade apply— это обновит статические поды управления (аписервер, контроллер-менеджер и т.д.). - Потом на этой же ноде kubelet с kubectl и перезапуск.
- Для остальных control plane нод команда проще —
kubeadm upgrade node, потому что кластер уже обновлён с первой ноды. И так же по одной, без спешки.
А теперь, чувак, самое важное — что проверить ДО того, как нажать Enter:
- Документацию официальную прочитай, ядрёна вошь! Там под каждый релиз свои нюансы, которые могут тебя подставить.
- Совместимость версий — это не шутки. Kubelet может быть максимум на одну минорную версию старше аписервера, иначе будет удивление пиздец.
- Pod Disruption Budgets (PDB) для своих важных приложений настрой. Это такая страховка, которая не даст тебе случайно вырубить все копии приложения разом. Без неё — доверия ебать ноль к процессу.
- На тестовом окружении всё отрепетируй! Прям как перед концертом. Если на staging всё полетит, то на проде есть шанс не накрыться медным тазом.
В общем, план есть. Главное — не суетись, делай по шагам, и тогда обновление пройдёт гладко, а не как у того горе-админа, который все ноды разом drain сделал и сам от себя охуел.