Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Поставщик Azure Key Vault для CSI Driver позволяет интегрировать Azure Key Vault в качестве хранилища секретов с кластером Kubernetes через том CSI. Для кластеров Kubernetes с поддержкой Azure Arc можно установить расширение поставщика секретов Azure Key Vault, которое позволяет получить секреты.
К возможностям расширения поставщика секретов Azure Key Vault относятся:
- Подключает секреты, ключи и сертификаты к pod с помощью встроенного тома CSI
- Поддерживает портируемость pod'ов с помощью CRD SecretProviderClass
- Поддерживает контейнеры Linux и Windows
- Поддерживает синхронизацию с секретами Kubernetes
- Поддерживает автоматическую смену секретов
- Компоненты расширения развертываются в зонах доступности, обеспечивая их резервирование по зонам
Подсказка
Если требуется автономный доступ или если вам нужны секреты, синхронизированные с хранилищем секретов Kubernetes, используйте расширение Secret Store для управления секретами в кластерах Kubernetes с поддержкой Arc.
Предпосылки
- Кластер с поддерживаемым дистрибутивом Kubernetes, подключенным к Azure Arc. В настоящее время для этого сценария поддерживаются следующие дистрибутивы Kubernetes:
- API кластера Azure
- Кластеры Службы Azure Kubernetes (AKS) в локальной среде Azure
- AKS, поддерживаемый Azure Arc
- Google Kubernetes Engine
- Распределение OpenShift Kubernetes
- Распределение Kubernetes от Canonical
- Служба Elastic Kubernetes
- Сетка Tanzu Kubernetes
- Azure Red Hat OpenShift
- Исходящее подключение к следующим конечным точкам:
linuxgeneva-microsoft.azurecr.io
upstreamarc.azurecr.io
*.blob.core.windows.net
- Убедитесь, что выполнены общие предварительные требования для расширений кластера. Необходимо использовать версию 0.4.0 или более новую версию
k8s-extension
расширения Azure CLI.
Установка расширения поставщика секретов Azure Key Vault в кластере Kubernetes с поддержкой Arc
Расширение поставщика секретов Azure Key Vault можно установить на подключенном кластере на портале Azure с помощью Azure CLI или путем развертывания шаблона ARM.
В каждом кластере Kubernetes с поддержкой Azure Arc можно развернуть только один экземпляр расширения.
Подсказка
Если кластер находится за исходящим прокси-сервером, убедитесь, что он подключен к Azure Arc с помощью параметра конфигурации прокси-сервера перед установкой расширения.
Портал Azure
На портале Azure перейдите к разделу Kubernetes — Azure Arc и выберите свой кластер.
В меню службы в разделе "Параметры" выберите "Расширения". Затем нажмите кнопку +Добавить.
В списке доступных расширений выберите поставщика секретов Azure Key Vault , чтобы развернуть последнюю версию расширения.
Следуйте подсказкам для развертывания расширения. При необходимости настройте установку, изменив параметры по умолчанию на вкладке "Конфигурация ".
Azure CLI (Интерфейс командной строки для Azure)
Задайте переменные среды:
export CLUSTER_NAME=<arc-cluster-name> export RESOURCE_GROUP=<resource-group-name>
Установите драйвер CSI хранилища секретов и расширение поставщика секретов Azure Key Vault, выполнив следующую команду:
az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider
Вы должны увидеть выходные данные, аналогичные этому примеру. До развертывания диаграммы Helm поставщика секретов в кластере может потребоваться несколько минут.
{
"aksAssignedIdentity": null,
"autoUpgradeMinorVersion": true,
"configurationProtectedSettings": {},
"configurationSettings": {},
"customLocationSettings": null,
"errorInfo": null,
"extensionType": "microsoft.azurekeyvaultsecretsprovider",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/akvsecretsprovider",
"identity": {
"principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantId": null,
"type": "SystemAssigned"
},
"location": null,
"name": "akvsecretsprovider",
"packageUri": null,
"provisioningState": "Succeeded",
"releaseTrain": "Stable",
"resourceGroup": "$RESOURCE_GROUP",
"scope": {
"cluster": {
"releaseNamespace": "kube-system"
},
"namespace": null
},
"statuses": [],
"systemData": {
"createdAt": "2022-05-12T18:35:56.552889+00:00",
"createdBy": null,
"createdByType": null,
"lastModifiedAt": "2022-05-12T18:35:56.552889+00:00",
"lastModifiedBy": null,
"lastModifiedByType": null
},
"type": "Microsoft.KubernetesConfiguration/extensions",
"version": "1.1.3"
}
Шаблон ARM
Создайте файл .json с помощью следующего формата. Обязательно обновите
<cluster-name>
значение для ссылки на кластер.{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "ConnectedClusterName": { "defaultValue": "<cluster-name>", "type": "String", "metadata": { "description": "The Connected Cluster name." } }, "ExtensionInstanceName": { "defaultValue": "akvsecretsprovider", "type": "String", "metadata": { "description": "The extension instance name." } }, "ExtensionVersion": { "defaultValue": "", "type": "String", "metadata": { "description": "The version of the extension type." } }, "ExtensionType": { "defaultValue": "Microsoft.AzureKeyVaultSecretsProvider", "type": "String", "metadata": { "description": "The extension type." } }, "ReleaseTrain": { "defaultValue": "stable", "type": "String", "metadata": { "description": "The release train." } } }, "functions": [], "resources": [ { "type": "Microsoft.KubernetesConfiguration/extensions", "apiVersion": "2021-09-01", "name": "[parameters('ExtensionInstanceName')]", "identity": { "type": "SystemAssigned" }, "properties": { "extensionType": "[parameters('ExtensionType')]", "releaseTrain": "[parameters('ReleaseTrain')]", "version": "[parameters('ExtensionVersion')]" }, "scope": "[concat('Microsoft.Kubernetes/connectedClusters/', parameters('ConnectedClusterName'))]" } ] }
Теперь задайте переменные среды с помощью следующей команды Azure CLI:
export TEMPLATE_FILE_NAME=<template-file-path> export DEPLOYMENT_NAME=<desired-deployment-name>
Наконец, выполните следующую команду Azure CLI, чтобы установить расширение поставщика секретов Azure Key Vault:
az deployment group create --name $DEPLOYMENT_NAME --resource-group $RESOURCE_GROUP --template-file $TEMPLATE_FILE_NAME
Теперь вы сможете просматривать ресурсы поставщика секретов и использовать расширение в кластере.
Проверка установки расширения
Чтобы подтвердить успешную установку расширения поставщика секретов Azure Key Vault, выполните следующую команду.
az k8s-extension show --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider
Вы должны увидеть выходные данные, аналогичные этому примеру.
{
"aksAssignedIdentity": null,
"autoUpgradeMinorVersion": true,
"configurationProtectedSettings": {},
"configurationSettings": {},
"customLocationSettings": null,
"errorInfo": null,
"extensionType": "microsoft.azurekeyvaultsecretsprovider",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/akvsecretsprovider",
"identity": {
"principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantId": null,
"type": "SystemAssigned"
},
"location": null,
"name": "akvsecretsprovider",
"packageUri": null,
"provisioningState": "Succeeded",
"releaseTrain": "Stable",
"resourceGroup": "$RESOURCE_GROUP",
"scope": {
"cluster": {
"releaseNamespace": "kube-system"
},
"namespace": null
},
"statuses": [],
"systemData": {
"createdAt": "2022-05-12T18:35:56.552889+00:00",
"createdBy": null,
"createdByType": null,
"lastModifiedAt": "2022-05-12T18:35:56.552889+00:00",
"lastModifiedBy": null,
"lastModifiedByType": null
},
"type": "Microsoft.KubernetesConfiguration/extensions",
"version": "1.1.3"
}
Создать или выбрать Azure Key Vault
Затем укажите Azure Key Vault для использования с подключенным кластером. Если у вас еще нет, создайте новое хранилище ключей с помощью следующих команд. Помните, что имя хранилища ключей должно быть глобально уникальным.
Задайте следующие переменные среды:
export AKV_RESOURCE_GROUP=<resource-group-name>
export AZUREKEYVAULT_NAME=<AKV-name>
export AZUREKEYVAULT_LOCATION=<AKV-location>
Затем выполните следующую команду:
az keyvault create -n $AZUREKEYVAULT_NAME -g $AKV_RESOURCE_GROUP -l $AZUREKEYVAULT_LOCATION
В Azure Key Vault могут храниться ключи, секреты и сертификаты. В этом примере вы можете задать секрет в виде обычного текста с названием DemoSecret
с помощью следующей команды:
az keyvault secret set --vault-name $AZUREKEYVAULT_NAME -n DemoSecret --value MyExampleSecret
Прежде чем перейти к следующему разделу, обратите внимание на следующие свойства:
- Имя объекта секрета в Key Vault
- Тип объекта (секрет, ключ или сертификат)
- Имя ресурса Хранилище ключей
- Идентификатор клиента Azure для подписки, к которой принадлежит Key Vault
Предоставление удостоверения для доступа к Azure Key Vault
Драйвер CSI для хранилища секретов на кластерах с поддержкой Arc в настоящее время можно получить через удостоверение службы. Выполните следующие действия, чтобы предоставить удостоверение, которое имеет доступ к хранилищу ключей.
Выполните действия , чтобы создать основной объект службы в Azure. Запишите идентификатор клиента и секрет клиента, созданные на этом шаге.
Затем убедитесь, что Azure Key Vault имеет разрешение GET для созданного субъекта-службы.
Используйте идентификатор клиента и секрет клиента из первого шага, чтобы создать секрет Kubernetes в подключенном кластере:
kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
Пометьте созданный секрет:
kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
Создайте
SecretProviderClass
, используя следующий YAML, и заполните значения для имени хранилища ключей, идентификатора клиента и объектов, которые нужно получить из вашего экземпляра AKV.# This is a SecretProviderClass example using service principal to access Keyvault apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: akvprovider-demo spec: provider: azure parameters: usePodIdentity: "false" keyvaultName: <key-vault-name> cloudName: # Defaults to AzurePublicCloud objects: | array: - | objectName: DemoSecret objectType: secret # object types: secret, key or cert objectVersion: "" # [OPTIONAL] object versions, default to latest if empty tenantId: <tenant-Id> # The tenant ID of the Azure Key Vault instance
Для использования с национальными облаками, замените
cloudName
наAzureUSGovernmentCloud
для Azure Government или наAzureChinaCloud
для Microsoft Azure под управлением 21Vianet.Примените SecretProviderClass к кластеру:
kubectl apply -f secretproviderclass.yaml
Создайте pod со следующим YAML, указав имя вашей идентичности:
# This is a sample pod definition for using SecretProviderClass and service principal to access Keyvault kind: Pod apiVersion: v1 metadata: name: busybox-secrets-store-inline spec: containers: - name: busybox image: k8s.gcr.io/e2e-test-images/busybox:1.29 command: - "/bin/sleep" - "10000" volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "akvprovider-demo" nodePublishSecretRef: name: secrets-store-creds
Примените pod к вашему кластеру:
kubectl apply -f pod.yaml
Проверьте секреты
После запуска пода присоединённое содержимое по пути тома, указанному в YAML развертывания, доступно.
## show secrets held in secrets-store
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
## print a test secret 'DemoSecret' held in secrets-store
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/DemoSecret
Дополнительные параметры конфигурации
Расширение поставщика секретов Azure Key Vault поддерживает конфигурации чарта Helm.
Следующие параметры конфигурации часто используются с расширением поставщика секретов Azure Key Vault:
Параметр конфигурации | По умолчанию | Описание |
---|---|---|
enableSecretRotation | неправда | Логический тип. Если true , периодически обновляет точку монтирования pod и секрет Kubernetes с актуальным содержимым из внешнего хранилища секретов. |
интервалОпросаРотации | 2 м | Если enableSecretRotation это true так, этот параметр задает длительность интервала опроса поворота секретов. Эту длительность можно настроить в зависимости от того, как часто необходимо обновлять содержимое всех подключенных pod и секреты Kubernetes до последней версии. |
syncSecret.enabled | неправда | Булевый ввод. В некоторых случаях может потребоваться создать секрет Kubernetes для зеркального отображения подключенного содержимого. Если true , SecretProviderClass позволяет secretObjects определить желаемое состояние синхронизированных объектов секрета Kubernetes. |
Эти параметры можно указать при установке расширения с помощью az k8s-extension create
команды:
az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider --configuration-settings secrets-store-csi-driver.enableSecretRotation=true secrets-store-csi-driver.rotationPollInterval=3m secrets-store-csi-driver.syncSecret.enabled=true
Эти параметры также можно изменить после установки с помощью az k8s-extension update
команды:
az k8s-extension update --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --name akvsecretsprovider --configuration-settings secrets-store-csi-driver.enableSecretRotation=true secrets-store-csi-driver.rotationPollInterval=3m secrets-store-csi-driver.syncSecret.enabled=true
Можно использовать другие параметры конфигурации при необходимости. Например, чтобы изменить корневой каталог kubelet при создании кластера, измените az k8s-extension create
команду:
az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider --configuration-settings linux.kubeletRootDir=/path/to/kubelet secrets-store-csi-driver.linux.kubeletRootDir=/path/to/kubelet
Удалите расширение поставщика секретов Azure Key Vault
Чтобы удалить расширение, выполните следующую команду:
az k8s-extension delete --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider
Замечание
При удалении расширения не удаляются пользовательские определения ресурсов (CRD), созданные при установке расширения.
Чтобы убедиться, что экземпляр расширения был удален, выполните следующую команду:
az k8s-extension list --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Если расширение было успешно удалено, расширение поставщика секретов Azure Key Vault не указано в выходных данных. Если в кластере нет других расширений, возвращается пустой массив.
Если он больше не нужен, обязательно удалите секрет Kubernetes, связанный с учетной записью службы, выполнив следующую команду:
kubectl delete secret secrets-store-creds
Выверка и устранение неполадок
Расширение поставщика секретов Azure Key Vault является самовосстанавливающимся. Если кто-то пытается изменить или удалить компонент расширения, развернутый при установке расширения, этот компонент примирится с исходным состоянием. Единственными исключениями являются пользовательские определения ресурсов (CRD). Удаленные CRD не обрабатываются. Чтобы восстановить удаленные CRDs, используйте az k8s-extension create
команду еще раз с существующим именем экземпляра расширения.
Дополнительные сведения об устранении распространенных проблем см. в руководствах по устранению неполадок с открытым исходным кодом для поставщика Azure Key Vault для драйвера CSI хранилища секретов и драйвера CSI хранилища секретов.
Дальнейшие шаги
- Хотите что-то попробовать? Быстро начните с сценария Azure Arc Jumpstart используя Cluster API.
- Дополнительные сведения об Azure Key Vault.
- Помогите защитить кластер другими способами, следуя инструкциям в книге безопасности для Kubernetes с поддержкой Azure Arc.