Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Поставщик Azure Key Vault для драйвера контейнерного интерфейса хранения секретов (CSI) позволяет интегрировать Azure Key Vault как хранилище секретов с кластером Azure Kubernetes Service (AKS) через том CSI.
Функции
- Подключает секреты, ключи и сертификаты к pod с помощью тома CSI.
- Поддерживает встроенные тома CSI.
- Поддерживает монтирование нескольких объектов хранилища секретов в виде одного тома.
- Поддерживает переносимость pod с помощью пользовательского
SecretProviderClassопределения ресурсов (CRD). - Поддерживает контейнеры Windows.
- Синхронизируется с секретами Kubernetes.
- Поддерживает авторотацию подключенного содержимого и синхронизированных секретов Kubernetes.
Ограничения
- Контейнер, использующий
ConfigMapилиSecretв качестве точки монтирования томаsubPath, не получает автоматических обновлений при ротации секрета, что связано с ограничением Kubernetes. Чтобы изменения вступили в силу, приложение должно перезагрузить измененный файл, наблюдая за изменениями в файловой системе или перезапуском модуля pod. Дополнительные сведения см. в разделе "Известные ограничения для хранилища секретов CSI Driver". - Надстройка создает управляемое удостоверение с именем
azurekeyvaultsecretsprovider-xxxxxв группе ресурсов узла (MC_) и назначает его масштабируемой группе виртуальных машин автоматически. Это управляемое удостоверение или собственное управляемое удостоверение можно использовать для доступа к хранилищу ключей. Предотвращение создания удостоверения не поддерживается.
Предварительные условия
- Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
- Убедитесь, что версия Azure CLI — 2.30.0 или более поздняя. Если вы используете более раннюю версию, установите последний выпуск.
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Terraform, версия 1.6 или более поздняя.
Azure CLI установлен и выполнен вход. Установите последнюю версию.
Разрешения на создание ресурсов AKS и Key Vault.
Задайте подписку Azure в Azure CLI с помощью следующей команды. Замените
<subscriptionId>идентификатором своей подписки.az account set --subscription <subscriptionId>
Сеть
- Если вы используете изолированные сети кластеры, рекомендуется настроить частную конечную точку для доступа к Azure Key Vault.
- Если кластер имеет тип исходящего трафика
userDefinedRoutingи использует брандмауэрное устройство, которое может управлять исходящим трафиком на основе доменных имен, таких как Брандмауэр Azure, убедитесь, что разрешены необходимые правила для исходящего трафика и Полные доменные имена (FQDNs). - Если вы ограничиваете входящий трафик в кластер, убедитесь, что открыты порты 9808 и 8095 .
Роли
- В этой статье используется роль Key Vault Secrets Officer, чтобы предоставить вашей учетной записи разрешение на создание секретного ключа в хранилище ключей.
- В статье для предоставления доступа к Azure Key Vault удостоверение, используемое с
SecretProviderClass, требует роли Key Vault Certificate User для доступа кkeycertificateтипам объектов и роли Key Vault Secrets User для доступа кsecretтипу объекта.
Создание кластера AKS
Создайте кластер AKS с поставщиком Azure Key Vault для поддержки драйвера CSI для хранилища секретов.
Создайте переменные, которые используются в командах для создания кластера AKS и Key Vault.
export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM") export KEYVAULT_NAME=myKeyVault${RANDOM_STRING} export RESOURCE_GROUP=myResourceGroup export CLUSTER_NAME=myAKSCluster export LOCATION=eastus2Имена Azure Key Vault должны быть глобально уникальными, буквенно-цифровыми, включая дефисы и 3–24 символов. Имя хранилища ключей объединяет
KEYVAULT_NAMEзначение переменной сmyKeyVault10 символьной строкой переменнойRANDOM_STRING.Создайте группу ресурсов Azure с помощью
az group createкоманды.az group create --name $RESOURCE_GROUP --location $LOCATIONСоздайте кластер AKS с модулем Azure Key Vault для использования драйвера CSI для хранилища секретов с помощью команды
az aks createс параметром--enable-addons azure-keyvault-secrets-provider.Этот параметр
--enable-addonsсоздает назначаемую пользователем управляемую идентичность с именемazurekeyvaultsecretsprovider-xxxx, которую можно использовать для аутентификации в вашем хранилище ключей. Управляемое удостоверение хранится в группе ресурсов узла (MC_) и автоматически назначается масштабируемому набору виртуальных машин. Это управляемое удостоверение или собственное управляемое удостоверение можно использовать для доступа к хранилищу ключей. Предотвращение создания удостоверения не поддерживается.az aks create \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --enable-addons azure-keyvault-secrets-provider \ --generate-ssh-keysПодсказка
Если вы хотите использовать идентификатор рабочей нагрузки Microsoft Entra,
az aks createкоманда должна включать--enable-oidc-issuerи--enable-workload-identityпараметры.
Создание кластера AKS
Создайте файл main.tf со следующей конфигурацией, чтобы создать кластер AKS с провайдером Azure Key Vault для поддержки CSI драйвера для хранилища секретов.
Создайте конфигурацию Terraform.
terraform { required_version = ">= 1.6.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } } } provider "azurerm" { features {} } data "azurerm_client_config" "current" {} resource "azurerm_resource_group" "rg" { name = "aks-rg" location = "East US" }Создайте кластер AKS.
resource "azurerm_kubernetes_cluster" "aks" { name = "aks-cluster" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name dns_prefix = "akscsi" default_node_pool { name = "system" node_count = 1 vm_size = "Standard_DS2_v2" } identity { type = "SystemAssigned" } key_vault_secrets_provider { secret_rotation_enabled = false } }Разверните конфигурацию. Создайте сеанс Bash, выполните следующие команды, чтобы развернуть ресурсы:
terraform init terraform validate terraform plan terraform apply
Обновление существующего кластера AKS
Обновите существующий кластер AKS с помощью поставщика Azure Key Vault для поддержки Secrets Store CSI Driver.
Создайте переменные, используемые в командах. Замените значения по мере необходимости для обновления существующего кластера AKS или Key Vault.
Например, если вы используете существующее хранилище ключей, замените
KEYVAULT_NAMEзначение переменной без использования переменнойRANDOM_STRING.Если у вас нет хранилища ключей, имена Azure Key Vault должны быть глобально уникальными, буквенно-цифровыми, включая дефисы и 3–24 символов. Имя хранилища ключей объединяет
KEYVAULT_NAMEзначение переменной сmyKeyVault10 символьной строкой переменнойRANDOM_STRING. Далее в этой статье можно создать хранилище ключей.export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM") export KEYVAULT_NAME=myKeyVault${RANDOM_STRING} export RESOURCE_GROUP=myResourceGroup export CLUSTER_NAME=myAKSCluster export LOCATION=eastus2Обновите существующий кластер AKS с помощью провайдера Azure Key Vault для обеспечения возможности использования драйвера CSI Хранилища секретов с помощью команды
az aks enable-addonsи включите дополнениеazure-keyvault-secrets-provider. Надстройка создает управляемое удостоверение, назначаемое пользователем, которое можно использовать для аутентификации в вашем хранилище ключей.az aks enable-addons \ --addons azure-keyvault-secrets-provider \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUPПосле включения поставщика секретов Azure Key Vault AKS создает управляемое удостоверение с именем
azurekeyvaultsecretsprovider-xxxx, которое можно использовать для проверки подлинности в хранилище ключей. Управляемое удостоверение хранится в группе ресурсов узла (MC_) и автоматически назначается масштабируемому набору виртуальных машин. Это управляемое удостоверение или собственное управляемое удостоверение можно использовать для доступа к хранилищу ключей. Предотвращение создания удостоверения не поддерживается.
Обновление существующего кластера AKS
Создайте файл main.tf со следующей конфигурацией, чтобы обновить кластер AKS с поставщиком Azure Key Vault для поддержки драйвера CSI для хранилища секретов.
Обновление существующего кластера AKS.
resource "azurerm_kubernetes_cluster" "aks" { name = "<existing-cluster>" resource_group_name = "<resource-group>" key_vault_secrets_provider { secret_rotation_enabled = false } }Разверните конфигурацию. Создайте сеанс Bash, выполните следующие команды, чтобы развернуть конфигурацию:
Run the following commands to apply the updates: terraform init terraform validate terraform plan terraform apply
Проверьте установку управляемой идентификации и поставщика хранилища ключей
Если вы использовали Terraform для создания нового кластера или обновления существующего кластера, необходимо заменить переменные, как $CLUSTER_NAME в следующих командах, значениями, используемыми в конфигурации Terraform.
Проверьте управляемое удостоверение
Чтобы удостовериться, что управляемое удостоверение создано и назначено масштабируемому набору виртуальных машин кластера, выполните следующие шаги.
Убедитесь, что управляемое удостоверение было создано и назначено кластеру с помощью команды
az aks show.az aks show \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --query addonProfiles{ "azureKeyvaultSecretsProvider": { "config": { "enableSecretRotation": "false", "rotationPollInterval": "2m" }, "enabled": true, "identity": { "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444", "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "resourceId": "/subscriptions/<subscriptionID>/resourcegroups/MC_myResourceGroup_myAKSCluster_eastus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myakscluster" } } }Свойство
resourceIdпоказывает группу ресурсов и имя удостоверенияazurekeyvaultsecretsprovider-myakscluster.Убедитесь, что управляемое удостоверение личности назначено для масштабируемого набора виртуальных машин в группе ресурсов узла.
NODE_RG=$(az aks show \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --query nodeResourceGroup --output tsv) VMSS_NAME=$(az vmss list \ --resource-group $NODE_RG \ --query [].name --output tsv) az vmss show --name $VMSS_NAME --resource-group $NODE_RG --query '[id, identity]'В выходных данных показаны идентификатор ресурса наборов масштабирования виртуальных машин
Microsoft.Compute/virtualMachineScaleSetsи свойствоuserAssignedIdentitiesс идентификатором ресурса дляazurekeyvaultsecretsprovider-myakscluster, который подтверждает назначение удостоверения набору масштабирования виртуальных машин.
Проверьте драйвер CSI для хранилища секретов поставщика Azure Key Vault
Получите учетные данные кластера AKS с помощью
az aks get-credentialsкоманды.az aks get-credentials \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUPУбедитесь, что установка завершена с помощью команды
kubectl get pods, которая перечисляет все pod с меткамиsecrets-store-csi-driverв пространстве именsecrets-store-provider-azure.kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wideФлаг
-o wideвключает в выходные данные узел, на котором выполняется каждый под.Выходные данные должны выглядеть примерно так:
NAME READY STATUS RESTARTS AGE NODE aks-secrets-store-csi-driver-4vpkj 3/3 Running 2 4m25s aks-nodepool1-12345678-vmss000002 aks-secrets-store-csi-driver-ctjq6 3/3 Running 2 4m21s aks-nodepool1-12345678-vmss000001 aks-secrets-store-csi-driver-tlvlq 3/3 Running 2 4m24s aks-nodepool1-12345678-vmss000000 aks-secrets-store-provider-azure-5p4nb 1/1 Running 0 4m21s aks-nodepool1-12345678-vmss000000 aks-secrets-store-provider-azure-6pqmv 1/1 Running 0 4m24s aks-nodepool1-12345678-vmss000001 aks-secrets-store-provider-azure-f5qlm 1/1 Running 0 4m25s aks-nodepool1-12345678-vmss000002
Создайте новое хранилище ключей
Выполните команду az keyvault create, чтобы создать новое хранилище ключей с включенным Azure RBAC.
az keyvault create \
--name $KEYVAULT_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--enable-rbac-authorization
Azure RBAC включен по умолчанию при создании нового хранилища ключей, даже если параметр не включен --enable-rbac-authorization .
Для получения дополнительной информации о моделях разрешений Key Vault и Azure RBAC см. в разделе Предоставление доступа к ключам Key Vault, сертификатам и секретам с использованием управления доступом на основе ролей Azure.
Обновление существующего хранилища ключей
Выполните команду az keyvault update, чтобы обновить существующее хранилище ключей с помощью Azure управления доступом на основе ролей (Azure RBAC). Параметр --enable-rbac-authorization необходим для включения Azure RBAC при обновлении существующего хранилища ключей, в котором отключен Azure RBAC.
az keyvault update \
--name $KEYVAULT_NAME \
--resource-group $RESOURCE_GROUP \
--enable-rbac-authorization
Дополнительные сведения о моделях разрешений хранилища ключей и Azure RBAC см. в статье Предоставление доступа к ключам Key Vault, сертификатам и секретам с помощью управления доступом на основе ролей Azure
Добавление назначения роли и секрета в хранилище ключей
az keyvault showВыполните команду, чтобы проверить, включен ли хранилище ключей Azure RBAC.az keyvault show \ --name $KEYVAULT_NAME \ --resource-group $RESOURCE_GROUP \ --query properties.enableRbacAuthorizationВыходные данные должны быть
true.Добавьте назначение ролей для учетной записи пользователя в область хранилища ключей с помощью
az role assignment createкоманды, чтобы добавить секрет хранилища ключей на следующем шаге.Роль офицера по секретам Key Vault с уникальным идентификатором
b86a8fe4-44ce-4948-aee5-eccb2c155cd7добавлена, и вы можете использовать как имя, так и уникальный идентификатор. Использование уникального идентификатора роли является рекомендованной практикой для предотвращения проблем, если имя роли изменится.KEYVAULT_ID=$(az keyvault show \ --name $KEYVAULT_NAME \ --resource-group $RESOURCE_GROUP \ --query id -o tsv) MYID=$(az ad signed-in-user show --query id --output tsv) az role assignment create \ --assignee-object-id $MYID \ --role "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" \ --scope $KEYVAULT_ID \ --assignee-principal-type UserВыполнение назначения роли может занять несколько минут. Вы можете проверить, что назначение роли было создано с помощью следующей команды:
az role assignment list \ --assignee-object-id $MYID \ --scope $KEYVAULT_ID \ --query '[].{Role:roleDefinitionName, Scope:scope}' \ --output tableСоздайте секрет обычного текста с именем
ExampleSecretв хранилище ключейaz keyvault secret setс помощью команды.Хранилище ключей может хранить ключи, секреты и сертификаты. Параметр
valueиспользуетRANDOM_STRINGпеременную для создания уникального значения секрета.az keyvault secret set \ --vault-name $KEYVAULT_NAME \ --name ExampleSecret \ --value MyAKSExampleSecret${RANDOM_STRING}Убедитесь, что секрет был добавлен в хранилище ключей с помощью команды [
az keyvault secret show][az-keyvault-secret-show].az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
Создайте новое хранилище ключей
Обновите файл main.tf, чтобы создать новое хранилище ключей с включенным Azure управлением доступом на основе ролей (Azure RBAC).
Создайте новое хранилище ключей с включенным Azure RBAC.
data "azurerm_client_config" "current" {} resource "random_string" "suffix" { length = 5 special = false upper = false } resource "azurerm_key_vault" "kv" { name = "akskv${random_string.suffix.result}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" enable_rbac_authorization = true }Назначьте роль сотрудника по управлению секретами в Key Vault.
resource "azurerm_role_assignment" "kv_role" { scope = azurerm_key_vault.kv.id role_definition_name = "Key Vault Secrets Officer" principal_id = data.azurerm_client_config.current.object_id }Создайте ExampleSecret в хранилище ключей.
resource "azurerm_key_vault_secret" "example" { name = "ExampleSecret" value = "MyAKSExampleSecret" key_vault_id = azurerm_key_vault.kv.id }Разверните конфигурацию. Создайте сеанс Bash, выполните следующие команды, чтобы развернуть обновленную конфигурацию:
terraform plan terraform applyУбедитесь, что ExampleSecret был добавлен в хранилище ключей с помощью команды [
az keyvault secret show][az-keyvault-secret-show]. Замените<keyvault-name>именем хранилища ключей, созданного в конфигурации Terraform.az keyvault secret show \ --vault-name <keyvault-name> \ --name ExampleSecret
Обновление существующего хранилища ключей
Обновите файл main.tf, чтобы обновить существующее хранилище ключей с включенным Azure управлением доступом на основе ролей (Azure RBAC).
Обновите существующее хранилище ключей, чтобы включить Azure RBAC.
resource "azurerm_key_vault" "kv" { name = "<existing-kv>" resource_group_name = "<resource-group>" enable_rbac_authorization = true }Назначьте роль и добавьте секрет.
resource "azurerm_role_assignment" "kv_role" { scope = azurerm_key_vault.kv.id role_definition_name = "Key Vault Secrets Officer" principal_id = data.azurerm_client_config.current.object_id } resource "azurerm_key_vault_secret" "example" { name = "ExampleSecret" value = "MyAKSExampleSecret" key_vault_id = azurerm_key_vault.kv.id }Разверните конфигурацию. Создайте сеанс Bash, выполните следующие команды, чтобы развернуть обновленную конфигурацию:
terraform plan terraform apply
Очистите ресурсы
Если вы перейдете к следующей статье и нуждаетесь в этих ресурсах, пропустите следующие действия. В противном случае, если вы закончите работу и не планируете продолжить работу со следующей статьей, удалите ресурсы, созданные в этой статье, чтобы избежать ненужных затрат.
Удалите учетные данные кластера из локального kube/config-файла .
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXTУдалите группу ресурсов и все ресурсы в ней, включая ресурсы в группе ресурсов узла (
MC_) с помощьюaz group deleteкоманды.az group delete --name $RESOURCE_GROUP --yes --no-wait
Команда terraform destroy удаляет все ресурсы, определенные в текущей конфигурации Terraform и файле состояния. Выполните эту команду только из рабочего каталога, используемого для этой статьи.
Предупреждение
Если вы работаете с существующими или промышленными ресурсами, внимательно изучите план выполнения перед его запуском:
terraform plan -destroy
Избегайте выполнения terraform destroy на общей или импортированной инфраструктуре, если вы не уверены в её безопасности для удаления. Дополнительные сведения см. в документации Terraform для команды terraform destroy .
Удалите учетные данные кластера из локального kube/config-файла .
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXTВыполните следующую команду, чтобы удалить ресурсы, созданные в этой статье:
terraform destroy
Следующие шаги
Из этой статьи вы узнали, как использовать поставщика Azure Key Vault для CSI-драйвера для хранилища секретов в кластере AKS. Теперь необходимо предоставить удостоверение для доступа к Azure Key Vault. Чтобы узнать, как, перейдите к следующей статье.