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


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

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

Примечание.

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

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

  • Azure CLI.

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

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

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

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

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

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

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

Если вы хотите использовать функцию подключаемых сертификатов ЦС, необходимо указать все пять параметров. Все объекты хранилища ключей Azure должны иметь тип 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-17SecretProviderClass создается в aks-istio-system пространстве имен во время развертывания надстройки. Этот ресурс содержит параметры, относящиеся к Azure для драйвера CSI хранилища секретов:

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-17   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-17Cronjob создается в aks-istio-system пространстве имен. Этот cronjob должен выполняться каждые 10 минут, чтобы проверка обновления корневого сертификата. Если корневой сертификат, который находится в cacerts секрете Kubernetes, не соответствует istio-ca-root-cert карте конфигурации в aks-istio-system пространстве имен, он перезапускает istiod-asm-1-17 развертывание:

    kubectl get cronjob --namespace aks-istio-system
    
    NAME                                    SCHEDULE       SUSPEND   ACTIVE
    istio-cert-validator-cronjob-asm-1-17   */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-17 restarted
    Deployment istiod-asm-1-17 restarted.
    

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

Вы можете просмотреть журналы развертывания, чтобы определить, есть ли у вас самозаверяющий сертификат ЦС или сертификат ЦС BYO (подключаемый модуль). Чтобы просмотреть журналы, выполните следующую команду:

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

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

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

    Timestamp Уровень журнала Сообщение
    2023-11-20T23:27:36.649019Z info Использование формата файла istiod для подписывания файлов ЦС
    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 Добавлен 1 сертификат для доверенного домена cluster.local в одноранговой проверке сертификатов
  • Записи журнала для сертификата ЦС BYO (подключаемого модуля)

    Timestamp Уровень журнала Сообщение
    2023-11-21T00:20:25.808396Z info Использование формата файла istiod для подписывания файлов ЦС
    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 Добавлен 1 сертификат для доверенного домена cluster.local в одноранговой проверке сертификатов

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

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

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

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

Издатель Subject 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=Intermediate CA - 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 необходимо предоставить доступ к управляемому удостоверению, назначаемому пользователем, к Key Vault Azure. При неправильной настройке доступа к Azure Key Vault установка надстройки зависает.

kubectl get pods --namespace aks-istio-system

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

ИМЯ ГОТОВ СТАТУС ПЕРЕЗАГРУЖАЕТСЯ ВОЗРАСТ
istiod-asm-1-17-6fcfd88478-2x95b 0/1 Прекращения 0 5m55s
istiod-asm-1-17-6fcfd88478-6x5hhh 0/1 Прекращения 0 5m40s
istiod-asm-1-17-6fcfd88478-c48f9 0/1 Инициализация:0/2 0 54s
istiod-asm-1-17-6fcfd88478-wl8mw 0/1 Инициализация:0/2 0 39s

Чтобы проверить проблему с доступом к Key Vault Azure, выполните 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 Запрещено", и вам отказано в разрешении "получить" для секретов в хранилище ключей:

"не удалось обработать запрос на подключение" err="не удалось получить objectType:secret, objectName:<secret-name>, objectVersion:: keyvault. BaseClient#GetSecret: сбой при ответе на запрос: StatusCode=403 - Исходная ошибка: autorest/azure: служба вернула ошибку. Status=403 Code=\"Forbidden\" Message=\"Пользователь, группа или приложение '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 <my-resource-group> --name <my-managed-cluster> --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId')

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

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

Примечание.

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

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

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

az aks show --resource-group <my-resource-group> --name <my-managed-cluster> | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.enableSecretRotation'

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

az aks show --resource-group <my-resource-group> --name <my-managed-cluster> | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.rotationPollInterval'

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

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

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

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

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

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

Ресурсы

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

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

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

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

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

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