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


Устранение неполадок с сертификатом ЦС для надстройки в сетке службы Istio

В этой статье рассматриваются распространенные проблемы с устранением неполадок, связанных с функцией сертификатов центра сертификации (ЦС) надстройки Istio, и она предлагает решения для устранения этих проблем. В этой статье также рассматривается общий процесс настройки сертификатов подключаемых модулей ЦС для надстройки сетки служб.

Примечание.

В этой статье предполагается, что редакция asm-1-21 Istio развертывается в кластере.

Предварительные требования

  • Azure CLI.

  • Средство Kubernetes kubectl или аналогичное средство для подключения к кластеру. Чтобы установить kubectl с помощью Azure CLI, выполните команду az aks install-cli .

  • Следующие стандартные средства оболочки в стиле Linux:

    • grep
    • sort
    • tail
    • awk
    • xargs
  • Средство jq для запроса данных JSON.

Общий процесс установки

  • Прежде чем включить надстройку Istio для использования функции сертификатов ЦС подключаемого модуля, необходимо включить поставщик Azure Key Vault для надстройки Хранилища секретов в кластере. Убедитесь, что Azure Key Vault и кластер находятся в одном клиенте Azure.

  • После включения надстройки поставщика секретов Azure Key Vault необходимо настроить доступ к Azure Key Vault для управляемого удостоверения, назначаемого пользователем, созданного надстройкой.

  • После предоставления разрешения управляемому удостоверению, назначаемого пользователем, для доступа к Azure Key Vault можно использовать функцию сертификатов ЦС подключаемых модулей вместе с надстройкой Istio. Дополнительные сведения см. в разделе "Включение надстройки Istio" для использования раздела сертификата ЦС подключаемого модуля.

  • Чтобы кластер автоматически обнаруживать изменения в секретах Azure Key Vault, необходимо включить автоматическую смену для надстройки поставщика секретов Azure Key Vault.

  • Хотя изменения промежуточного сертификата применяются автоматически, изменения корневого сертификата получаются только в плоскости управления после istiod перезапуска развертывания cronjob, который развертывается надстройкой, как описано в разделе "Развернутые ресурсы ". Этот cronjob выполняется в 10-минутном интервале.

Включение надстройки Istio для использования сертификата ЦС подключаемого модуля

Функция сертификатов ЦС подключаемого модуля Istio позволяет настроить корневые и промежуточные сертификаты подключаемого модуля для сетки. Чтобы предоставить сведения о сертификате подключаемого модуля при включении надстройки, укажите следующие параметры для команды az aks mesh enable в Azure CLI.

Параметр Описание
--key-vault-id<resource-id> Идентификатор ресурса Azure Key Vault. Ожидается, что этот ресурс находится в том же клиенте, что и управляемый кластер. Этот идентификатор ресурса должен находиться в формате идентификатора ресурса Azure Resource Manager (шаблон ARM).
--root-cert-object-name<root-cert-obj-name> Имя объекта корневого сертификата в Azure Key Vault.
--ca-cert-object-name<inter-cert-obj-name> Имя промежуточного объекта сертификата в Azure Key Vault.
--ca-key-object-name<inter-key-obj-name> Имя объекта закрытого ключа промежуточного сертификата в Azure Key Vault.
--cert-chain-object-name<cert-chain-obj-name> Имя объекта цепочки сертификатов в Azure Key Vault.

Если вы хотите использовать функцию сертификатов ЦС подключаемого модуля, необходимо указать все пять параметров. Ожидается, что все объекты Azure Key Vault имеют тип Secret.

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

Развертываемые ресурсы

В рамках развертывания надстройки для функции подключаемых сертификатов в кластере развертываются следующие ресурсы:

  • cacerts Секрет Kubernetes создается в aks-istio-system пространстве имен во время развертывания надстройки. Этот секрет содержит синхронизированные секреты Azure Key Vault:

    kubectl describe secret cacerts --namespace aks-istio-system
    
    Name:         cacerts
    Namespace:    aks-istio-system
    Labels:       secrets-store.csi.k8s.io/managed=true
    Annotations:  <none>
    
    Type:  opaque
    
    Data
    ====
    ca-cert.pem:     1968 bytes
    ca-key.pem:      3272 bytes
    cert-chain.pem:  3786 bytes
    root-cert.pem:   3636 bytes
    
  • Объект istio-spc-asm-1-21 SecretProviderClass создается в aks-istio-system пространстве имен во время развертывания надстройки. Этот ресурс содержит параметры, относящиеся к Azure, для драйвера интерфейса хранилища контейнеров хранилища секретов (CSI):

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-21   14h
    
  • Конфигурация istio-ca-root-cert создается в aks-istio-system пространстве имен и всех пространствах имен, управляемых пользователем. Этот файл конфигурации содержит корневой сертификат, используемый центром сертификации, и он используется рабочими нагрузками в пространствах имен для проверки связи между рабочими нагрузками следующим образом:

    kubectl describe configmap istio-ca-root-cert --namespace aks-istio-system
    
    Name:         istio-ca-root-cert
    Namespace:    aks-istio-system
    Labels:       istio.io/config=true
    Annotations:  <none>
    
    Data
    ====
    root-cert.pem:
    ----
    -----BEGIN CERTIFICATE-----
    <certificate data>
    -----END CERTIFICATE-----
    
  • Объект istio-cert-validator-cronjob-asm-1-21 cronjob создается в aks-istio-system пространстве имен. Этот cronjob должен выполняться каждые 10 минут, чтобы проверить наличие обновлений корневого сертификата. Если корневой сертификат, который находится в cacerts секрете Kubernetes, не соответствует istio-ca-root-cert конфигурации в aks-istio-system пространстве имен, он перезапускает istiod-asm-1-21 развертывание:

    kubectl get cronjob --namespace aks-istio-system
    
    NAME                                    SCHEDULE       SUSPEND   ACTIVE
    istio-cert-validator-cronjob-asm-1-21   */10 * * * *   False     0     
    

    Чтобы проверить журналы cronjob для последнего запуска, выполните следующую команду:

    kubectl logs --namespace aks-istio-system $(kubectl get pods --namespace aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    Эта команда создает одно из следующих выходных сообщений в зависимости от того, обнаружено ли обновление корневого сертификата:

    Root certificate update not detected.
    
    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-21 restarted
    Deployment istiod-asm-1-21 restarted.
    

Определение типа сертификата в журналах развертывания

Журналы развертывания можно просмотреть istiod , есть ли у вас самозаверяющий сертификат ЦС или сертификат подключаемого ЦС. Для просмотра журналов выполните следующую команду:

kubectl logs deploy/istiod-asm-1-21 --container discovery --namespace aks-istio-system | grep -v validationController

Непосредственно перед каждой записью журнала сертификатов является еще одна запись журнала, описывающая этот тип сертификата. Для самозаверяющего сертификата ЦС запись указывает"Без подключаемого сертификата по адресу etc/cacerts/ca-key.pem; используется самозаверяющий сертификат". Для сертификата подключаемого модуля запись указывает "Использовать подключаемый сертификат по адресу etc/cacerts/ca-key.pem". Примеры записей журнала, относящихся к сертификатам, показаны в следующих таблицах.

  • Записи журнала для самозаверяющего сертификата ЦС

    Метка времени Уровень ведения журнала Сообщение
    2023-11-20T23:27:36.649019Z info Использование формата файлов istiod для подписывания файлов ca
    2023-11-20T23:27:36.649032Z info Нет подключаемых сертификатов по адресу etc/cacerts/ca-key.pem; Используется самозаверяющий сертификат
    2023-11-20T23:27:36.649536Z info Сертификат x509 — <сведения о сертификате>
    2023-11-20T23:27:36.649552Z info Сертификаты Istiod перезагружаются
    2023-11-20T23:27:36.649613Z info spiffe Added 1 certs to trust domain cluster.local in peer cert verifier
  • Записи журнала для сертификата ЦС подключаемого модуля

    Метка времени Уровень ведения журнала Сообщение
    2023-11-21T00:20:25.808396Z info Использование формата файлов istiod для подписывания файлов ca
    2023-11-21T00:20:25.808412Z info Использование подключаемого сертификата по адресу etc/cacerts/ca-key.pem
    2023-11-21T00:20:25.808731Z info Сертификат x509 — <сведения о сертификате>
    2023-11-21T00:20:25.808764Z info Сертификат x509 — <сведения о сертификате>
    2023-11-21T00:20:25.808799Z info Сертификат x509 — <сведения о сертификате>
    2023-11-21T00:20:25.808803Z info Сертификаты Istiod перезагружаются
    2023-11-21T00:20:25.808873Z info spiffe Added 1 certs to trust domain cluster.local in peer cert verifier

Сведения о сертификате в записи журнала отображаются в виде значений с разделителями-запятыми для издателя, субъекта, серийного номера (SN— длинной шестнадцатеричной строки), а также значения меток времени начала и окончания, определяющие, когда сертификат действителен.

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

Издатель Тема SN NotBefore NotAfter
"O=cluster.local" "" <32-разрядная шестнадцатеричное значение> "2023-11-20T23:25:36Z" "2033-11-17T23:27:36Z"

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

Издатель Тема SN NotBefore NotAfter
CN=Промежуточный ЦС - A1,O=Istio,L=cluster-A1" "" <32-разрядная шестнадцатеричное значение> "2023-11-21T00:18:25Z" "2033-11-18T00:20:25Z"
CN=Root A, O=Istio" "CN=промежуточный ЦС - A1,O=Istio,L=cluster-A1" <40-цифро-шестнадцатеричное значение> "2023-11-04T01:40:22Z" "2033-11-01T01:40:22Z"
CN=Root A, O=Istio" "CN=Root A,O=Istio" <40-цифро-шестнадцатеричное значение> "2023-11-04T01:38:27Z" "2033-11-01T01:38:27Z"

Устранение распространенных неполадок

Проблема 1. Неправильно настроен доступ к Azure Key Vault

После включения надстройки поставщика секретов Azure Key Vault необходимо предоставить доступ к управляемому удостоверению, назначенному пользователем, надстройке в Azure Key Vault. Неправильное настройка доступа к Azure Key Vault приводит к остановке установки надстройки.

kubectl get pods --namespace aks-istio-system

В списке модулей pod можно увидеть, что istiod-asm-1-21 модули pod зависают в Init:0/2 состоянии.

ИМЯ ГОТОВО СОСТОЯНИЕ ПЕРЕЗАПУСКИ ВОЗРАСТ
istiod-asm-1-21-6fcfd88478-2x95b 0/1 Завершение 0 5m55s
istiod-asm-1-21-6fcfd88478-6x5hh 0/1 Завершение 0 5m40s
istiod-asm-1-21-6fcfd88478-c48f9 0/1 Инициализация:0/2 0 54 с
istiod-asm-1-21-6fcfd88478-wl8mw 0/1 Инициализация:0/2 0 39 c

Чтобы проверить проблему доступа к Azure Key Vault, выполните kubectl get pods команду, чтобы найти модули pod с secrets-store-provider-azure меткой в kube-system пространстве имен:

kubectl get pods --selector app=secrets-store-provider-azure --namespace kube-system --output name | xargs -I {} kubectl logs --namespace kube-system {}

В следующем примере выходных данных показано, что произошла ошибка "403 Запрещено", так как у вас нет разрешений "получить" для секретов в Key Vault:

"Не удалось обработать запрос подключения" err="не удалось получить objectType:secret, objectName:secret-object-name>, objectVersion:<: keyvault. BaseClient#GetSecret: сбой ответа на запрос: StatusCode=403 -- Исходная ошибка: autorest/azure: служба вернула ошибку. Status=403 Code=\"Запрещено\" Message=\"Пользователь, группа или приложение "appid=appid=<appid>; oid=<oid>; iss=<iss' не имеет секретов>, имеющих разрешение на получение разрешений на хранилище ключей MyAzureKeyVault; location=eastus'. Сведения об устранении этой проблемы см. в разделе https://go.microsoft.com/fwlink/?linkid=2125287\" InnerError={\"code\":\"AccessDenied\"}"

Чтобы устранить эту проблему, настройте доступ к управляемому удостоверению, назначаемого пользователем, для надстройки поставщика секретов Azure Key Vault, получив разрешения на получение и перечисление в секретах Azure Key Vault и переустановив надстройку Istio. Сначала получите идентификатор объекта управляемого удостоверения, назначаемого пользователем, для надстройки поставщика секретов Azure Key Vault, выполнив команду az aks show :

OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId')

Чтобы задать политику доступа, выполните следующую команду az keyvault set-policy , указав полученный идентификатор объекта:

az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get list

Примечание.

Вы создали Хранилище ключей с помощью авторизации Azure RBAC для модели разрешений вместо политики доступа к хранилищу? В этом случае ознакомьтесь с разделом "Предоставление доступа к ключам, сертификатам и секретам Key Vault" с помощью управления доступом на основе ролей Azure для создания разрешений для управляемого удостоверения. Добавьте назначение ролей Azure для средства чтения Key Vault для управляемого удостоверения, назначаемого пользователем надстройки.

Проблема 2. Автоматическое обнаружение изменений секретов Key Vault не настроено

Чтобы кластер автоматически обнаруживать изменения в секретах Azure Key Vault, необходимо включить автоматическую смену для надстройки поставщика Azure Key Vault. Автоматическая смена может обнаруживать изменения в промежуточных и корневых сертификатах автоматически. Для кластера, включающего надстройку поставщика Azure Key Vault, выполните следующую az aks show команду, чтобы проверить, включена ли автоматическая смена:

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.enableSecretRotation'

Если кластер включил надстройку поставщика Azure Key Vault, выполните следующую az aks show команду, чтобы определить интервал опроса поворота:

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.rotationPollInterval'

Секреты Azure Key Vault синхронизируются с кластером, когда интервал опроса истекает после предыдущей синхронизации. Значение интервала по умолчанию — две минуты.

Проблема 3. Значения сертификатов отсутствуют или неправильно настроены

Если секретные объекты отсутствуют в Azure Key Vault или если эти объекты настроены неправильно, istiod-asm-1-21 модули pod могут зависнуть в Init:0/2 состоянии, отложив установку надстройки. Чтобы найти основную причину этой проблемы, выполните следующую kubectl describe команду в istiod развертывании и просмотрите выходные данные:

kubectl describe deploy/istiod-asm-1-21 --namespace aks-istio-system

Команда отображает события, которые могут выглядеть примерно в следующей выходной таблице. В этом примере отсутствующий секрет является причиной проблемы.

Тип Причина Возраст From Сообщение
Обычная Запланированные 3m9s планировщик по умолчанию Успешно назначен aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj в aks-userpool-24672518-vmss00000
Предупреждение Сбой 66s kubelet Не удается подключить или подключить тома: отключенные тома=[cacerts], неподключенные тома=[], не удалось обработать тома=[]: истекло время ожидания условия.
Предупреждение Сбой 61s (x9 более 3m9s) kubelet Сбой MountVolume.SetUp для тома cacerts: ошибка rpc: код = Неизвестно desc = не удалось подключить объекты хранилища секретов для объектов pod aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj, err: ошибка rpc: код = Неизвестно desc = не удалось подключить объекты, ошибка: не удалось получить objectType:secret, objectName:test-cert-chain, objectVersion:: keyvault. BaseClient#GetSecret: сбой ответа на запрос: StatusCode=404 -- Исходная ошибка: autorest/azure: служба вернула ошибку. Status=404 Code="SecretNotFound" Message="A secret with (name/id) test-cert-chain не найден в этом хранилище ключей. Если вы недавно удалили этот секрет, вы можете восстановить его с помощью правильной команды восстановления. Сведения об устранении этой проблемы см. в разделе https://go.microsoft.com/fwlink/?linkid=2125182"

Ресурсы

Заявление об отказе от ответственности за сведения о продуктах сторонних производителей

В этой статье упомянуты программные продукты независимых производителей. Корпорация Microsoft не дает никаких гарантий, подразумеваемых и прочих, относительно производительности и надежности этих продуктов.

Заявление об отказе от ответственности за контактные данные сторонней организации

Корпорация Майкрософт предоставляет контактные данные сторонних производителей в целях получения дополнительных сведений по данной теме. Эти данные могут быть изменены без предварительного уведомления. Корпорация Майкрософт не гарантирует точность контактных данных сторонних производителей.

Свяжитесь с нами для получения помощи

Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.