Kubernetes 1.16 — как обновиться и ничего не сломать

Kubernetes 1.16 — как обновиться и ничего не сломать

Сегодня, 18 сентября, выходит очередная версия Kubernetes — 1.16. Как всегда нас ждет много улучшений и новинок. Но я хотел бы обратить ваше внимание на разделы Action Required файла CHANGELOG-1.16.md. В этих разделах публикуются изменения, которые могут сломать работу вашего приложения, инструментов по обслуживанию кластера или требуют внесения изменений в файлы конфигурации.

В общем, требуют ручного вмешательства…

Начнем сразу с изменения, которое, скорее всего, затронет всех, кто достаточно долго работает с kubernetes. Kubernetes API перестал поддерживать устаревшие версии API ресурсов.

Если кто не знал, или забыл…Версия API ресурса указывается в манифесте, в поле apiVersion: apps/v1

А именно:

Тип ресурса
Старая версия
На что надо заменить

Все ресурсы
apps/v1beta1
apps/v1beta2
apps/v1

deployments
daemonset
replicaset
extension/v1beta1
apps/v1

networkpolicies
extensions/v1beta1
networking.k8s.io/v1

podsecuritypolicies
extensions/v1beta1
policy/v1beta1

Также хочу обратить внимание, что у объектов типа Ingress также сменился apiVersion на networking.k8s.io/v1beta1. Старое значение extensions/v1beta1 еще поддерживается, но есть хороший повод заодно обновить и эту версию в манифестах.

Достаточно много изменений в различных системных метках (Node labels), которые устанавливаются на узлы.

Kubelet запретили устанавливать произвольные метки (раньше их можно было задавать через ключи запуска kubelet --node-labels), оставили только вот этот список разрешенных:

kubernetes.io/hostname
kubernetes.io/instance-type
kubernetes.io/os
kubernetes.io/arch

beta.kubernetes.io/instance-type
beta.kubernetes.io/os
beta.kubernetes.io/arch

failure-domain.beta.kubernetes.io/zone
failure-domain.beta.kubernetes.io/region

failure-domain.kubernetes.io/zone
failure-domain.kubernetes.io/region

[*.]kubelet.kubernetes.io/*
[*.]node.kubernetes.io/*

Метки beta.kubernetes.io/metadata-proxy-ready, beta.kubernetes.io/metadata-proxy-ready and beta.kubernetes.io/kube-proxy-ds-ready больше не добавляются на новые узлы, и различные дополнительные компоненты стали использовать немного другие метки в качестве node selector:

Компонент
Старая метка
Актуальная метка

kube-proxy
beta.kubernetes.io/kube-proxy-ds-ready
node.kubernetes.io/kube-proxy-ds-ready

ip-mask-agent
beta.kubernetes.io/masq-agent-ds-ready
node.kubernetes.io/masq-agent-ds-ready

metadata-proxy
beta.kubernetes.io/metadata-proxy-ready
cloud.google.com/metadata-proxy-ready

kubeadm теперь удаляет за собой файл начальной конфигурации кублета bootstrap-kubelet.conf. Если ваши инструменты обращались к этому файлу, то переключитесь на использование kubelet.conf, в котором хранятся актуальные настройки доступа.

Cadvisor больше не отдает метрики pod_name и container_name, если вы использовали их в Prometheus, переходите на метрики pod и container соответственно.

Убрали ключи командой строки:

Компонент
Убранный ключ

hyperkube
—make-symlink

kube-proxy
—resource-container

Шедулер стал использовать версию v1beta1 Event API. Если вы используете сторонние инструменты для взаимодействия с Event API, переключитесь на актуальную версию.

Минутка юмора. В процессе подготовки релиза 1.16 были сделаны следующие изменения:

  • убрали аннотацию scheduler.alpha.kubernetes.io/critical-pod в версии v1.16.0-alpha.1
  • вернули аннотацию scheduler.alpha.kubernetes.io/critical-pod в версии v1.16.0-alpha.2
  • убрали аннотацию scheduler.alpha.kubernetes.io/critical-pod в версии v1.16.0-beta.1

Используйте поле spec.priorityClassName для указания важности пода.

Источник: habr.com