Мы используем куки и предполагаем, что вы согласны, если продолжите пользоваться сайтом
Блог Southbridge

Kubernetes 1.20 — и что же слома.../починили на этот раз?

Release Logo c сайта kubernetes.io


Поздравляем с выходом версии 1.20. Третий релиз в 2020 году, в котором 11 фич объявили stable, 15 перевели в beta и добавили 16 новых в alpha-стадии.

Судя по Release Logo, котики уже захватили мир и даже не скрывают этого. Давайте посмотрим, какие блюдца с молоком они заботливо положили нам под ноги.





Конечно же, начать придется с громкой новости об отказе от dockershim. С одной стороны, дело это не быстрое, и есть еще целый год перед окончательным выпиливанием кода, но, с другой стороны, можно ожидать, что баги при взаимодействии с docker будут исправляться с меньшим приоритетом, чем раньше.

Второе важное изменение, которое может сломать ваш продакшен, заключается в том, что в версии 1.20 починили баг с таймаутами для Probe типа exec.

В описании контейнеров в манифесте подов есть специальный раздел, описывающий каким образом можно узнать, что приложение живое и готово обрабатывать входящие запросы. С помощью HTTP/TCP-запроса или запуска (exec probe) какого-либо процесса внутри контейнера (например, rabbitmqctl status) и анализа кода завершения.

Суть проблемы в следующем:

В манифесте есть поле timeoutSeconds:, которое задает максимальное время ожидания ответа на запрос или время выполнения процесса внутри контейнера. Ошибка была в том, что при выполнении exec probe этот параметр не учитывался и процесс внутри контейнера мог работать бесконечно долгое время, пока сам не завершится.

Ошибку исправили, и в версии 1.20 все стало прекрасно. Но не для всех.

Если вы используете exec probe и указывали timeoutSeconds: в своих манифестах — самое время проверить, укладывается ли время выполнения вашей пробы в таймаут.

А вот если вы не указывали timeoutSeconds:, то у меня для вас не очень хорошая новость. Значение по умолчанию для этого параметра — 1 секунда, если ваша проба выполняется дольше, то успешной она явно не будет.

И как всегда — вишенка на торте. Если вы используете docker, то при наступлении таймаута процесс внутри контейнера может остаться работать дальше. И если это readinessProbe, то со временем количество таких процессов может превзойти все ваши смелые ожидания.

И к другим новостям:

Если вы пользовались alpha feature API Priority and Fairness (APF) в своем мульти-мастер кластере 1.19 — выключайте ее перед обновлением. В 1.20 она переведена в статус beta, но в процессе перевода отломали совместимость с alpha. После обновления она будет включена по умолчанию.

Мастеров больше не будет! Метка node-role.kubernetes.io/master и taint node-role.kubernetes.io/master:NoSchedule, которые по умолчанию ставил kubeadm на узлы с запущенными компонентами control-plane, объявлены deprecated и скоро будут убраны. Вместо них будут использоваться метка node-role.kubernetes.io/control-plane и taint node-role.kubernetes.io/control-plane:NoSchedule.

В kubeadm усилили проверки входящих параметров serviceSubnet и podSubnet.

Сеть для сервисов теперь имеет ограничение на размер и не должна аллоцировать более 20 бит. В переводе на человеческий это означает, что размер сети для IPv4 должен быть /12 или меньше (/13, /14 и т.п.), а для IPv6 — /108, но лучше будет использовать /112.

Сеть для подов теперь проверяется на совместимость с параметром --node-cidr-mask-size, размер сетей, выделяемых на узел должен быть меньше, чем сеть для подов.

Из API сервера убрали возможность беспарольного входа. Теперь не получится восстановить потерянный доступ к кластеру, просто зайдя на мастер и добавив в ключи запуска API сервера ключ --insecure-port 8080

IPv4/IPv6 dual stack был немножко переписан в части реализации сервисов. Один сервис теперь может иметь как IPv4, так и IPv6 адрес (при включении "IPv6DualStack" feature gate). Но это привело к несовместимым изменениям в API. Изменился манифест Kind: Service — вместо одного поля ipFamily теперь будет целых три: ipFamilyPolicy, ipFamilies, clusterIPs. Пишут, что большинству пользователей ничего не надо будет делать, сервисы останутся только IPv4, пока не включен соответствующий feature gate. TODO: Посмотреть, что там с Headless Service, которым в манифесте указываем clusterIP: None

Команда для работы с сертификатам (проверки, генерации или продления kubeadm alpha certs) переименована в kubeadm certs. Старый вариант вызова еще работает, но в следующих релизах его уберут.

Анонсировали фичу GracefulNodeShutdown — при ее включении kubelet будет самостоятельно завершать все запущенные поды, при выключении узла. Соблюдая все обычные gracefulShutdown таймауты и вызывая preStop хуки.

Команда kubectl debug повышена до беты, и в ее описании появилось много различных возможностей. Запуск дополнительных эфемерных дебаг контейнеров в поде, создание копий пода и замена команды запуска. Единственная тонкость — новое название команды конфликтует с плагином debug, и теперь вместо плагина будет выполнятся встроенная команда. Если вы хотите продолжать пользоваться плагином, то его придется переименовать.

В процессе починки CVE-2020-8559 немножко усилили безопасность, что может привести к поломке работы бэкендов расширения API, таких как metrics-server или prometheus adapter.

Выпущен новый CronJob controller v2. Видимо, чинить баги старого контроллера больше не могут, и решили выпустить новый, с новыми багами. Пока в стадии альфа, так что включать его надо с помощью специального feature gate.
Kubernetes DevOps