Как обновить Kubernetes Cluster без простоя

Ответ

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

Процесс обновления Worker Nodes:

  1. Подготовка узла: Вывести узел из обслуживания, чтобы планировщик не назначал на него новые поды, и эвакуировать существующие поды.
    kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

    Флаг --ignore-daemonsets необходим для DaemonSet'ов (например, сборщиков логов), которые должны оставаться на узле.

  2. Обновление: На самом узле обновить компоненты 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
  3. Возврат в строй: Вернуть узел в рабочее состояние.
    kubectl uncordon <node-name>
  4. Повторить шаги 1-3 для каждого worker-узла.

Процесс обновления Control Plane (для HA-кластера):

  1. Обновить kubeadm на первом control-plane узле.
  2. Выполнить kubeadm upgrade plan для проверки и kubeadm upgrade apply для обновления статических подов control plane.
  3. Обновить kubelet и kubectl на этом узле и перезапустить kubelet.
  4. Повторить для остальных control-plane узлов, выполняя только kubeadm upgrade node (так как кластер уже обновлен).

Важные проверки перед обновлением:

  • Изучить официальную документацию по обновлению для вашей версии.
  • Проверить совместимость версий между kube-apiserver и kubelet (обычно kubelet может быть на одну минорную версию старше).
  • Убедиться, что все критичные приложения имеют Pod Disruption Budgets (PDB) для контроля доступности во время drain.
  • Протестировать процесс на staging-окружении.

Ответ 18+ 🔞

А, ну это ж классика, ёпта! Обновлять кубер без простоев — это как менять колесо на машине на ходу, только вместо машины у тебя целый дата-центр, а вместо колеса — сервера, на которых всё держится. Но ничего, справимся, если делать по уму, а не как мартышлюшка с гранатой.

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

Вот как worker-ноды обновлять, чтобы приложения даже не чихнули:

  1. Подготовка, она же «выгоняем всех с хаты». Сначала надо ноду вывести из игры, чтобы планировщик новых подов на неё не швырял, а старые — аккуратно переехали на другие узлы. Команда вот эта:

    kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

    Флаг --ignore-daemonsets — это святое, чувак. Без него тебе никогда не выгнать с ноды какие-нибудь демонсеты вроде сборщика логов. Они должны там остаться, иначе весь кластер начнёт бздеть, что мониторинга нет.

  2. Сам процесс, «хирургическое вмешательство». Пока нода пустая, можно на ней всё по-взрослому обновить.

    # Допустим, у тебя Ubuntu
    sudo apt-get update && sudo apt-get install -y kubeadm=<новая-версия> kubelet=<новая-версия> kubectl=<новая-версия>
    sudo kubeadm upgrade node
    sudo systemctl restart kubelet

    После этого kubelet перезапустится уже с новой версией. Главное — версии совместимые ставить, а то будет пиздопроебибна, когда kubelet новее аписервера на две версии.

  3. Возвращаем бойца в строй. Всё, нода обновлена, можно разрешать ей снова работать.

    kubectl uncordon <node-name>

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

С control plane нодами (теми, что мозги кластера) история чуть тоньше, особенно если их несколько для отказоустойчивости:

  1. На первой ноде апдейтишь kubeadm, делаешь kubeadm upgrade apply — это обновит статические поды управления (аписервер, контроллер-менеджер и т.д.).
  2. Потом на этой же ноде kubelet с kubectl и перезапуск.
  3. Для остальных control plane нод команда проще — kubeadm upgrade node, потому что кластер уже обновлён с первой ноды. И так же по одной, без спешки.

А теперь, чувак, самое важное — что проверить ДО того, как нажать Enter:

  • Документацию официальную прочитай, ядрёна вошь! Там под каждый релиз свои нюансы, которые могут тебя подставить.
  • Совместимость версий — это не шутки. Kubelet может быть максимум на одну минорную версию старше аписервера, иначе будет удивление пиздец.
  • Pod Disruption Budgets (PDB) для своих важных приложений настрой. Это такая страховка, которая не даст тебе случайно вырубить все копии приложения разом. Без неё — доверия ебать ноль к процессу.
  • На тестовом окружении всё отрепетируй! Прям как перед концертом. Если на staging всё полетит, то на проде есть шанс не накрыться медным тазом.

В общем, план есть. Главное — не суетись, делай по шагам, и тогда обновление пройдёт гладко, а не как у того горе-админа, который все ноды разом drain сделал и сам от себя охуел.