Automated Kubernetes Certificate Rotation

Это руководство поможет вам установить, понять и управлять Kubernetes Certificate Rotator в для автоматизации ротации сертификатов Kubernetes в ваших кластерах.

Содержание

Installation

Смотрите Cluster Plugin для инструкций по установке.

Примечание:

  • В настоящее время поддерживаются:

    • On-Premises кластеры
    • DCS кластеры

How it works

Этот плагин обрабатывает автоматическую ротацию следующих сертификатов.

Certificate fileFunctionNode Type
apiserver.crtСерверный сертификат для kube-apiserverControl Plane Node
apiserver-etcd-client.crtКлиентский сертификат для kube-apiserver для доступа к etcdControl Plane Node
apiserver-kubelet-client.crtКлиентский сертификат для kube-apiserver для доступа к kubeletControl Plane Node
front-proxy-client.crtКлиентский сертификат для kube-apiserver для доступа к агрегированным API серверамControl Plane Node
etcd/server.crtСерверный сертификат для etcdControl Plane Node
etcd/peer.crtСертификат для взаимодействия между членами etcdControl Plane Node
/root/.kube/config, admin.conf, super-admin.confКлиентский сертификат в kubeconfig для администрирования кластераControl Plane Node
controller-manager.confКлиентский сертификат в kubeconfig для kube-controller-managerControl Plane Node
scheduler.confКлиентский сертификат в kubeconfig для kube-schedulerControl Plane Node
kubelet.crtСерверный сертификат для kubeletAll Nodes
kubelet-client-current.pemКлиентский сертификат для kubelet (ссылается в kubelet.conf)All Nodes

Rotation Process

  1. Загрузка информации о сертификатах

    На первом этапе собирается метаданные для всех целевых сертификатов. Поскольку эти сертификаты хранятся в разных путях на хосте, их содержимое считывается из соответствующих файлов. Для этого на целевом узле создаётся временный Pod с примонтированными каталогами сертификатов, что позволяет Pod'у прочитать информацию. Информация о сертификатах собирается один раз в день. Детали сертификатов (пути, срок действия) хранятся в ConfigMap cpaas-system/node-local-certs-<node-name>. Зашифрованный CA сертификат хранится в Secret cpaas-system/kubernetes-ca.

  2. Условие запуска ротации

    Поля notBefore и notAfter сертификата указывают период его действия. Ротация запускается, если оставшийся срок действия меньше 20% или 30 дней.

  3. Очередь ротации

    Сертификаты, требующие ротации, помещаются в очередь на обработку. Программа ротации оценивает недавние действия по ротации и срочность ожидающих задач, чтобы решить, обрабатывать их немедленно или нет. Это предотвращает возможные проблемы со здоровьем кластера из-за одновременной ротации нескольких сертификатов.

  4. Генерация новых сертификатов

    Программа ротации генерирует новые сертификаты на основе внутренне хранящейся информации CA. В процессе ротации создаётся временный Pod на целевом узле с примонтированными необходимыми каталогами сертификатов, что позволяет контролируемо изменять файлы.

  5. Перезапуск компонентов

    Требующие перезапуска:

    • kube-apiserver: необходимо перезапустить для загрузки новых сертификатов. При перезапуске он регенерирует внутренний loopback сертификат (действительный один год, используется только внутри и не может быть внешне ротирован).
    • kube-controller-manager: необходимо перезапустить для перезагрузки kubeconfig файла.
    • kube-scheduler: необходимо перезапустить для перезагрузки kubeconfig файла.
    • kubelet: необходимо перезапустить для перезагрузки серверного сертификата.

    Метод перезапуска: Добавить аннотации в YAML-файлы соответствующих статических Pod'ов, чтобы вызвать пересоздание Pod'ов kubelet'ом. Для перезапуска kubelet смонтируйте файловую систему хоста с hostPID is true и выполните в контейнере команду "systemctl restart kubelet".

    Автоматическая перезагрузка:

    • Etcd может автоматически перезагружать сертификаты.
  6. Сроки ротации

    • Сертификаты kubelet: ротация через 61 день (срок действия 91 день)
    • Сертификаты контрольной плоскости: ротация через 292 дня (срок действия 365 дней)

Operation Considerations

Если kubelet находится в ненормальном состоянии в окне ротации и не может автоматически ротировать сертификаты, требуется ручная ротация:

Операторы должны вручную обновить сертификаты.

Выполните следующие команды для ручного обновления сертификатов:

cert-renew --ca-cert <ca-cert-path> --ca-key <ca-key-path> --days <days> <certificate or kubeconfig 1> <certificate or kubeconfig 2> ...

Например, чтобы обновить kubelet.crt:

cert-renew --ca-cert /etc/kubernetes/pki/ca.crt --ca-key /etc/kubernetes/pki/ca.key --days 91 /etc/kubernetes/pki/kubelet.crt

Чтобы скачать и подготовить инструмент cert-renew, выполните:

curl "$(kubectl get services -n cpaas-system frontend -o jsonpath='{.spec.clusterIP}'):8080/cluster-cert-rotator/download/cert-renew" -o ./cert-renew && chmod +x ./cert-renew

Опционально, скачайте renew-all.sh для обновления всех сертификатов на узле:

curl "$(kubectl get services -n cpaas-system frontend -o jsonpath='{.spec.clusterIP}'):8080/cluster-cert-rotator/download/renew-all.sh" -o ./renew-all.sh