Поделиться через


Смена сертификатов в Службе Azure Kubernetes (AKS)

Служба Azure Kubernetes (AKS) использует сертификаты для проверки подлинности множества своих компонентов. Кластеры с управлением доступом на основе ролей Azure (Azure RBAC), созданные после марта 2022 года, имеют включенную автоматическую ротацию сертификатов. Возможно, вам потребуется периодически повернуть эти сертификаты по соображениям безопасности или политики. Например, у вас может быть политика для смены всех сертификатов каждые 90 дней.

Примечание.

Автоматическая смена сертификатов включена по умолчанию только для кластеров AKS с поддержкой RBAC.

В этой статье показано, как работает смена сертификатов в кластере AKS.

Прежде чем начать

Для этой статьи требуется Azure CLI версии 2.0.77 или более поздней. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Сертификаты AKS, центры сертификации и учетные записи служб

AKS создает и использует следующие сертификаты, центры сертификации (ЦС) и учетные записи служб (SA):

  • Сервер API AKS создает удостоверяющий центр под названием Cluster CA.
  • Сервер API имеет кластерный КЦ, который подписывает сертификаты для односторонней связи от сервера API к модулям kubelet.
  • Каждый kubelet создает запрос на подпись сертификата (CSR), который подписывает ЦС кластера для связи с kubelet на сервер API.
  • Агрегатор API использует ЦС кластера для выдачи сертификатов для взаимодействия с другими API. Агрегатор API также может использовать собственный ЦС для выдачи этих сертификатов, однако в настоящее время используется ЦС кластера.
  • Каждый узел использует токен SA, который подписывает Центр сертификации кластера.
  • Клиент kubectl использует сертификат для взаимодействия с кластером AKS.

Корпорация Майкрософт поддерживает все сертификаты, упомянутые в этом разделе, за исключением сертификата кластера.

Примечание.

  • Кластеры AKS, созданные до мая 2019 года, имеют сертификаты, срок действия которых истекает через два года.
  • Кластеры AKS, созданные после мая 2019 года, имеют сертификаты ЦС кластера, срок действия которых истекает через 30 лет.

Вы можете проверить, когда кластер был создан с помощью kubectl get nodes команды, которая показывает возраст пулов узлов.

Проверка дат окончания срока действия сертификата

Проверка срока действия сертификата кластера

  • Проверьте дату окончания срока действия сертификата кластера с помощью kubectl config view команды.

    kubectl config view --raw -o jsonpath="{.clusters[?(@.name == '')].cluster.certificate-authority-data}" | base64 -d | openssl x509 -text | grep -A2 Validity
    

Проверка срока действия сертификата сервера API

  • Проверьте дату окончания срока действия сертификата сервера API с помощью следующей curl команды.

    curl https://{apiserver-fqdn} -k -v 2>&1 | grep expire
    

Проверьте срок действия сертификата узла агента VMAS

  • Проверьте дату окончания срока действия сертификата узла агента VMAS с помощью az vm run-command invoke команды.

    az vm run-command invoke --resource-group MC_rg_myAKSCluster_region --name vm-name --command-id RunShellScript --query 'value[0].message' -otsv --scripts "openssl x509 -in /etc/kubernetes/certs/apiserver.crt -noout -enddate"
    

Проверка истечения срока действия сертификата для агентского узла масштабируемого набора виртуальных машин.

  • Проверьте дату окончания срока действия сертификата узла агента масштабируемого набора виртуальных машин с помощью az vmss run-command invoke команды.

    az vmss run-command invoke --resource-group "MC_rg_myAKSCluster_region" --name "vmss-name" --command-id RunShellScript --instance-id 1 --scripts "openssl x509 -in  /var/lib/kubelet/pki/kubelet-client-current.pem -noout -enddate" --query "value[0].message"
    

Автоматическая ротация сертификатов

Для автоматической смены сертификатов, отличных от CA, кластер должен иметь загрузку TLS, которая включена по умолчанию во всех регионах Azure.

Примечание.

  • Если у вас есть существующий кластер, необходимо обновить этот кластер, чтобы включить автоматическую смену сертификатов.
  • Не отключайте Bootstrap, чтобы автоматическая смена оставалась включенной.
  • Если кластер находится в остановленном состоянии во время автоматической ротации сертификатов, то обновляются только сертификаты контрольной плоскости. В этом случае необходимо повторно создать пул узлов после смены сертификатов, чтобы инициировать смену сертификата пула узлов.

Для всех кластеров AKS, созданных или обновленных после марта 2022 года, Служба Azure Kubernetes автоматически обновляет сертификаты, не относящиеся к ЦС, как на главном узле управления, так и на узлах агентов, в течение 80% срока действия клиентского сертификата, до истечения его срока, без прерывания работы кластера.

Как проверить, включена ли начальная загрузка TLS для текущего пула узлов агента?

  1. Убедитесь, что в вашем кластере включено TLS Bootstrapping, перейдя по одному из следующих путей:

    • На узле Linux: /var/lib/kubelet/bootstrap-kubeconfig или /host/var/lib/kubelet/bootstrap-kubeconfig
    • На узле Windows: C:\k\bootstrap-config

    Дополнительные сведения см. в разделе "Подключение к узлам кластера Служба Azure Kubernetes" для обслуживания или устранения неполадок.

    Примечание.

    Путь к файлу может измениться по мере развития версий Kubernetes.

  2. После настройки региона создайте новый кластер или обновите существующий кластер, чтобы настроить автоматическую смену сертификата кластера. Чтобы включить эту функцию, необходимо обновить плоскость управления и пул узлов.

Выполните ручную смену сертификатов кластера

Предупреждение

Повторное создание всех узлов, масштабируемых наборов виртуальных машин и дисков с помощью az aks rotate-certs может привести к простою кластера AKS до 30 минут.

  1. Подключитесь к кластеру az aks get-credentials с помощью команды.

    az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
    
  2. Проведите ротацию всех сертификатов, центров сертификации и SAs в вашем кластере с помощью команды az aks rotate-certs.

    az aks rotate-certs --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
    

    Внимание

    Для завершения может потребоваться до 30 минут az aks rotate-certs . Если команду не удалось выполнить, используйте az aks show, чтобы проверить, что кластер имеет статус Ротация сертификата. Если для кластера отображается статус сбоя, повторно выполните az aks rotate-certs, чтобы снова выполнить ротацию сертификатов.

  3. Убедитесь, что старые сертификаты больше не являются допустимыми с помощью любой kubectl команды, например kubectl get nodes.

    kubectl get nodes
    

    Если вы не обновили сертификаты, используемые kubectl, вы увидите ошибку, аналогичную следующему примеру выходных данных:

    Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "ca")
    
  4. Обновите сертификат, используемый kubectlaz aks get-credentials с помощью команды с флагом --overwrite-existing .

    az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME --overwrite-existing
    
  5. Убедитесь, что сертификаты обновлены с помощью kubectl get команды.

    kubectl get nodes
    

    Примечание.

    Если у вас есть службы, запущенные поверх AKS, вам может потребоваться также обновить их сертификаты.

Обновление сертификата Kubelet

Ротация сервера сертификатов Kubelet позволяет AKS задействовать TLS начальную загрузку сервера Kubelet как для начальной загрузки, так и для ротации сертификатов обслуживания, подписанных ЦС кластера.

Ограничения

  • Поддерживается в Kubernetes версии 1.27 и выше.
  • Не поддерживается, если пул узлов использует снимок узлового пула на основе любого образа узла старше 202501.12.0.
  • Эта функция не может быть включена вручную. Существующие пулы узлов будут иметь включенную по умолчанию ротацию сертификата kubelet при первом обновлении до любой версии Kubernetes 1.27 или более поздней. Новые пулы узлов в kubernetes версии 1.27 или более поздних версий будут включать смену сертификата kubelet, включенную по умолчанию. Чтобы узнать, включена ли смена сертификатов kubelet в вашем регионе, см. статью "Выпуски AKS".

Убедитесь, что включена ротация сервирующего сертификата kubelet.

Каждому узлу с включенной функцией автоматически присваивается метка kubernetes.azure.com/kubelet-serving-ca=cluster. Убедитесь, что метки были заданы с помощью kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca команды.

kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca

Убедитесь, что kubelet проходит через процесс начальной загрузки TLS

При включении этой функции каждый kubelet, запущенный на узлах, должен пройти процесс начальной загрузки TLS.

Убедитесь, что процесс начальной загрузки выполняется с помощью kubectl get команды, чтобы получить текущие объекты CSR в кластере.

kubectl get csr --field-selector=spec.signerName=kubernetes.io/kubelet-serving

Все обслуживающие запросы сертификатов (CSR) должны находиться в состоянии Approved,Issued, которое указывает на то, что запрос был утвержден и выпущен подписанный сертификат. Обслуживающие ЦС имеют имя kubernetes.io/kubelet-servingподписывающего элемента.

   NAME        AGE    SIGNERNAME                                    REQUESTOR                    REQUESTEDDURATION   CONDITION
csr-8mx4w   113s   kubernetes.io/kube-apiserver-client-kubelet   system:bootstrap:uoxr9r      none              Approved,Issued
csr-bchlj   111s   kubernetes.io/kubelet-serving                 system:node:akswinp7000000   none              Approved,Issued
csr-sb4wz   46m    kubernetes.io/kubelet-serving                 system:node:akswinp6000000   none              Approved,Issued
csr-zc4wt   46m    kubernetes.io/kube-apiserver-client-kubelet   system:bootstrap:ho7zyu      none              Approved,Issued

Убедитесь, что kubelet использует сертификат, полученный путем инициализации TLS сервера.

Чтобы убедиться, что kubelet узла использует сертификат обслуживания, подписанный ЦС кластера, используйте [][kubectl debugkubectl-debug] для проверки содержимого каталога PKI kubelet.

kubectl debug node/<node> -ti --image=mcr.microsoft.com/azurelinux/base/core:3.0 -- ls -l /host/var/lib/kubelet/kubelet-server-current.pem

kubelet-server-current.pem Если символическая ссылка существует, то kubelet получил или обновил свой собственный сертификат обслуживания через процесс инициализации TLS и подписан Центром сертификации кластера.

Отключение смены сертификата kubelet

Вы можете отключить смену сертификата kubelet, обновив пул узлов с помощью команды az aks nodepool update, чтобы указать необходимый тег, а затем повторно выполнить установку узлов. Повторное создание образа узла можно выполнить с помощью обновления образа узла или масштабирования пула до 0 экземпляров, а затем резервного копирования до требуемого значения.

az aks nodepool update --cluster-name myCluster --resource-group myResourceGroup --name mynodepool --tags aks-disable-kubelet-serving-certificate-rotation=true

Следующие шаги

В этой статье показано, как вручную и автоматически обновить сертификаты кластера, центры сертификации и учетные записи служб. Дополнительные сведения см. в рекомендациях по обеспечению безопасности кластера и обновлений в Служба Azure Kubernetes (AKS).