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