Устранение неполадок с сертификатом ЦС для надстройки в сетке службы Istio
В этой статье рассматриваются распространенные проблемы с устранением неполадок, связанных с функцией сертификатов центра сертификации (ЦС) надстройки Istio, и она предлагает решения для устранения этих проблем. В этой статье также рассматривается общий процесс настройки сертификатов подключаемых модулей ЦС для надстройки сетки служб.
Примечание.
В этой статье предполагается, что редакция asm-1-21
Istio развертывается в кластере.
Предварительные требования
Средство 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" |
Ресурсы
Устранение неполадок с надстройкой сетки сетки Istio в MeshConfig
Устранение неполадок при устранении неполадок шлюза ingress в сетке служб Istio
Устранение неполадок при обновлении дополнительных исправлений в сетке служб Istio
Заявление об отказе от ответственности за сведения о продуктах сторонних производителей
В этой статье упомянуты программные продукты независимых производителей. Корпорация Microsoft не дает никаких гарантий, подразумеваемых и прочих, относительно производительности и надежности этих продуктов.
Заявление об отказе от ответственности за контактные данные сторонней организации
Корпорация Майкрософт предоставляет контактные данные сторонних производителей в целях получения дополнительных сведений по данной теме. Эти данные могут быть изменены без предварительного уведомления. Корпорация Майкрософт не гарантирует точность контактных данных сторонних производителей.
Свяжитесь с нами для получения помощи
Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.