Назад | Перейти на главную страницу

Обновление сертификата плоскости управления Kubernetes (kubeadm)

kubeadm создает сертификаты для уровня управления Kubernetes, действительные в течение одного года. Они будут обновляться при каждом обновлении Kubernetes.. Поскольку определенно неплохо обновлять кластер Kubernetes хотя бы раз в год, это должно привести к тому, что сертификаты никогда не истечут.

Однако у нас есть некоторые кластеры Kubernetes, работающие в среде с воздушным зазором (абсолютно без подключения к Интернету), где нет гарантии, что они когда-либо увидят обновления. Сертификаты, срок действия которых истекает в течение одного года, в таких условиях неприемлемы. Продление срока действия сертификата было бы одной из идей для исправления этой настройки, но автоматическое продление сертификатов кажется лучшим решением. Это легко сделать с помощью kubeadm alpha certs renew all (Kubernetes 1.15) запускается cron или таймером systemd на каждом главном узле.

Я заметил, что сервер API, диспетчер контроллеров и планировщик не получают новые сертификаты. Есть ли способ уведомить эти компоненты о новых сертификатах? Даже уничтожить модули не так просто, потому что модули уровня управления статичны и kubectl delete pod просто удаляет зеркальный под но не убивает контейнеры. Некоторые подверженные ошибкам docker |grep … мог бы выполнить эту работу, но мне интересно, есть ли вызов API или более разумный способ сделать это. Я не нашел других документов по этой теме.

Я думал, что существовал билет на такое поведение, но я смог найти только тот, что для кубелет и кубе-прокси

Краткая версия заключается в том, что, пока это поведение было «TBD», я не ожидал, что это будет исправлено в ближайшее время. Если ваш кластер представляет собой конфигурацию высокой доступности с несколькими мастерами, я бы ожидал, что будет безопасно перезапускать модули уровня управления в непрерывном режиме. Процесс, который выполняется kubeadm alpha certs renew all может перезапустить машину, чтобы отказаться от выборочного перебрасывания отдельных контейнеров докеров.

Сказав это, я бы не сказал, что идентификация контейнеров докеров плоскости управления "подвержена ошибкам", поскольку kubelet маркирует контейнеры докеров с участием метки, соответствующие имени модуля и пространству имен, позволяя тривиально фильтр для контейнеры, составляющие плоскость управления и убивающие только их:

for comp_name in kube-apiserver kube-controller-manager etcetc; do
  for c_id in $(docker ps -q \
        --filter "label=io.kubernetes.pod.namespace=kube-system" \
        --filter "label=io.kubernetes.pod.name=${comp_name}"); do
    docker kill $c_id
    docker rm   $c_id
  done
done