Использование поставщика Azure Key Vault для драйвера CSI хранилища секретов в кластере AKS
Поставщик Azure Key Vault для драйвера CSI хранилища секретов позволяет интегрировать хранилище ключей Azure в качестве хранилища секретов с кластером Службы Azure Kubernetes (AKS) через том CSI.
Предварительные требования
- Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.
- Прежде чем начать, убедитесь, что ваша версия Azure CLI не ниже 2.30.0. Если вы используете более раннюю версию, установите последний выпуск.
Поддерживаемые версии Kubernetes в Службе Azure Kubernetes (AKS)
Минимальная рекомендуемая версия Kubernetes определяется скользящим окном поддержки версий Kubernetes. Используйте версию N-2 или более позднюю.
Компоненты
- Подключает секреты, ключи и сертификаты к модулю pod с помощью тома CSI
- Поддерживает встроенные тома CSI
- Поддерживает установку нескольких объектов хранилища секретов как одного тома
- Поддерживает переносимость модулей pod с помощью CRD
SecretProviderClass
- Поддерживает контейнеры Windows
- Синхронизируется с секретами Kubernetes
- Поддерживает автоматическую смену подключенного содержимого и синхронизированных секретов Kubernetes
Создание кластера AKS с поддержкой поставщика Azure Key Vault для драйвера CSI хранилища секретов
Сначала создайте группу ресурсов Azure:
az group create -n myResourceGroup -l eastus2
Для создания кластера AKS с функцией поставщика Azure Key Vault для драйвера CSI хранилища секретов используйте команду az aks create с надстройкой azure-keyvault-secrets-provider
.
az aks create -n myAKSCluster -g myResourceGroup --enable-addons azure-keyvault-secrets-provider --enable-managed-identity
Надстройка создает назначаемое пользователем управляемое удостоверение azurekeyvaultsecretsprovider-*
для доступа к ресурсам Azure. В следующем примере это удостоверение используется для подключения к хранилищу ключей Azure, в котором хранятся секреты, но вы также можете использовать другие механизмы доступа к удостоверениям. Запишите clientId
удостоверения из выходных данных:
...,
"addonProfiles": {
"azureKeyvaultSecretsProvider": {
...,
"identity": {
"clientId": "<client-id>",
...
}
}
Обновление существующего кластера AKS с поддержкой поставщика Azure Key Vault для драйвера CSI хранилища секретов
Чтобы обновить существующий кластер AKS с функцией поставщика Azure Key Vault для драйвера CSI хранилища секретов, воспользуйтесь командой az aks enable-addons с надстройкой azure-keyvault-secrets-provider
:
az aks enable-addons --addons azure-keyvault-secrets-provider --name myAKSCluster --resource-group myResourceGroup
Как упоминалось выше, надстройка создает назначаемое пользователем управляемое удостоверение, которое можно использовать для проверки подлинности в хранилище ключей Azure.
Проверка установки поставщика Azure Key Vault для драйвера CSI хранилища секретов
Команда выше устанавливает драйвер CSI хранилища секретов и поставщик Azure Key Vault на ваших узлах. Чтобы проверить, завершена ли установка, получите список всех модулей pod с метками secrets-store-csi-driver
и secrets-store-provider-azure
в пространстве имен kube-system и убедитесь, что выходные данные выглядят примерно так, как показано ниже:
kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver, secrets-store-provider-azure)'
NAME READY STATUS RESTARTS AGE
aks-secrets-store-csi-driver-4vpkj 3/3 Running 2 4m25s
aks-secrets-store-csi-driver-ctjq6 3/3 Running 2 4m21s
aks-secrets-store-csi-driver-tlvlq 3/3 Running 2 4m24s
aks-secrets-store-provider-azure-5p4nb 1/1 Running 0 4m21s
aks-secrets-store-provider-azure-6pqmv 1/1 Running 0 4m24s
aks-secrets-store-provider-azure-f5qlm 1/1 Running 0 4m25s
Убедитесь, что на каждом узле в пулах узлов кластера выполняются модуль драйвера CSI Driver Store и модуль поставщика Azure Key Vault.
Создание или использование существующего хранилища ключей Azure
В дополнение к кластеру AKS вам понадобится ресурс Azure Key Vault, где хранится секретное содержимое. Помните, что имя хранилища ключей должно быть глобально уникальным.
az keyvault create -n <keyvault-name> -g myResourceGroup -l eastus2
В хранилище ключей Azure могут храниться ключи, секреты и сертификаты. В этом примере мы установим секрет в виде обычного текста под именем ExampleSecret
:
az keyvault secret set --vault-name <keyvault-name> -n ExampleSecret --value MyAKSExampleSecret
Обратите внимание на нижеперечисленные свойства для использования в следующем разделе:
- Имя объекта секрета в хранилище ключей
- Тип объекта (секрет, ключ или сертификат)
- Имя вашего ресурса хранилища ключей Azure
- Идентификатор арендатора Azure, которому принадлежит подписка
Предоставление удостоверения для доступа к хранилищу ключей Azure
Драйвер CSI хранилища секретов позволяет использовать следующие механизмы доступа к хранилищу ключей Azure:
- Удостоверение модуля pod Azure Active Directory
- Управляемое удостоверение, назначаемое пользователем или системой
Следуйте инструкциям в разделе Предоставление удостоверения для доступа к поставщику Azure Key Vault для драйвера CSI хранилища секретов для выбранного вами метода.
Проверка секретов
После запуска модуля pod подключенное содержимое будет доступно по пути к тому, указанному в YAML-модуле развертывания.
## show secrets held in secrets-store
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
## print a test secret 'ExampleSecret' held in secrets-store
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/ExampleSecret
Получение сертификатов и ключей
В структуре Azure Key Vault существуют четкие различия между ключами, секретами и сертификатами. Функции сертификатов службы Key Vault открывают доступ к соответствующие возможностям ключей и секретов. Когда создается сертификат Key Vault, под тем же именем также создаются адресуемые ключ и секрет. Ключ Key Vault разрешает операции с ключами, а секрет Key Vault позволяет извлечь значение сертификата в виде секрета.
Сертификат хранилища ключей также содержит метаданные открытого сертификата x509. В хранилище ключей в секрете хранятся как общедоступные, так и закрытые компоненты сертификата. Для получения каждого отдельного компонента указывайте параметр objectType
в классе SecretProviderClass
. В таблице ниже показано, какие объекты сопоставляются с различными ресурсами, связанными с сертификатом.
Объект | Возвращаемое значение | Возвращает всю цепочку сертификатов |
---|---|---|
key |
Открытый ключ в формате Privacy Enhanced Mail (PEM) | Н/Д |
cert |
Сертификат в формате PEM | Нет |
secret |
Закрытый ключ и сертификат в формате PEM | Да |
Отключение поставщика Azure Key Vault для драйвера CSI хранилища секретов в существующем кластере AKS
Примечание
Перед отключением надстройки убедитесь, что не используется ни один объект SecretProviderClass
. Попытка отключить надстройку, пока существует SecretProviderClass
, приведет к ошибке.
Чтобы отключить поставщик Azure Key Vault для драйвера CSI хранилища секретов в существующем кластере, используйте команду az aks disable-addons с флагом azure-keyvault-secrets-provider
:
az aks disable-addons --addons azure-keyvault-secrets-provider -g myResourceGroup -n myAKSCluster
Примечание
При отключении надстройки существующие рабочие нагрузки продолжат выполняться без ошибок и не увидят никаких изменений в подключенных секретах. При перезапуске модуля pod или создании нового модуля в рамках события масштабирования модуль pod не запустится, так как драйвер больше не работает.
Дополнительные параметры конфигурации.
Включение и отключение автоматической смены
Примечание
При включении поставщика Azure Key Vault для драйвера CSI хранилища секретов обновляются подключение модуля pod и секрет Kubernetes, определенный в поле secretObjects
объекта SecretProviderClass
. Для этого осуществляется периодический опрос наличия изменений с заданным вами интервалом. Значение интервала смены по умолчанию составляет 2 минуты.
Примечание
При обновлении секрета или ключа во внешнем хранилище секретов после первоначального развертывания pod обновленный секрет будет периодически обновляться в подключении pod и секрете Kubernetes.
В зависимости от того, как приложение использует секретные данные:
- Подключите секрет Kubernetes в виде тома: используйте функцию автоматической ротации и функцию синхронизации секретов K8s в драйвере CSI хранилища секретов. Приложению потребуется отслеживать изменения из подключенного тома секрета Kubernetes. При обновлении секрета Kubernetes драйвером CSI соответствующее содержимое тома обновляется автоматически.
- Приложение считывает данные из файловой системы контейнера: используйте функцию ротации в драйвере CSI хранилища секретов. Приложению потребуется отслеживать изменение файла из тома, подключенного драйвером CSI.
- Использование секрета Kubernetes для переменной среды: модуль pod необходимо перезапустить, чтобы получить последний секрет в качестве переменной среды. Используйте что-то вроде https://github.com/stakater/Reloader, чтобы отслеживать изменения в синхронизированном секрете Kubernetes, и выполняйте последовательное обновление модулей pod.
Чтобы включить автоматическую смену секретов, используйте флаг enable-secret-rotation
при создании кластера:
az aks create -n myAKSCluster2 -g myResourceGroup --enable-addons azure-keyvault-secrets-provider --enable-secret-rotation
Вы также можете обновить существующий кластер для включения надстройки:
az aks update -g myResourceGroup -n myAKSCluster2 --enable-secret-rotation
Чтобы задать пользовательский интервал смены, используйте флаг rotation-poll-interval
:
az aks update -g myResourceGroup -n myAKSCluster2 --enable-secret-rotation --rotation-poll-interval 5m
Чтобы отключить автоматическую смену, используйте флаг disable-secret-rotation
:
az aks update -g myResourceGroup -n myAKSCluster2 --disable-secret-rotation
Синхронизация подключенного содержимого с секретом Kubernetes
Иногда может потребоваться создать секрет Kubernetes для зеркалирования подключенного содержимого.
При создании SecretProviderClass
с помощью поля secretObjects
определите требуемое состояние секрета Kubernetes, как показано в следующем примере.
Примечание
Этот пример неполон. Его необходимо изменить для реализации выбранного механизма доступа к удостоверению хранилища ключей.
Секреты будут синхронизироваться только после запуска модуля pod для их подключения. Обойтись исключительно синхронизацией с функцией секретов Kubernetes не удастся. При удалении всех модулей pod, использующих секрет, этот секрет Kubernetes также удаляется.
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-sync
spec:
provider: azure
secretObjects: # [OPTIONAL] SecretObjects defines the desired state of synced Kubernetes secret objects
- data:
- key: username # data field to populate
objectName: foo1 # name of the mounted content to sync; this could be the object name or the object alias
secretName: foosecret # name of the Kubernetes secret object
type: Opaque # type of Kubernetes secret object (for example, Opaque, kubernetes.io/tls)
Примечание
Убедитесь, что значение objectName
в поле secretObjects
совпадает с именем файла подключенного содержимого. Если вместо этого вы используете objectAlias
, это значение должно соответствовать псевдониму объекта.
Установка переменной среды для ссылки на секреты Kubernetes
После создания секрета Kubernetes вы можете сослаться на него, задав переменную среды в модуле pod, как показано в следующем примере кода:
Примечание
Этот пример неполон. Его необходимо изменить для реализации выбранного вами механизма доступа к удостоверению хранилища ключей Azure.
kind: Pod
apiVersion: v1
metadata:
name: busybox-secrets-store-inline
spec:
containers:
- name: busybox
image: k8s.gcr.io/e2e-test-images/busybox:1.29-1
command:
- "/bin/sleep"
- "10000"
volumeMounts:
- name: secrets-store01-inline
mountPath: "/mnt/secrets-store"
readOnly: true
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: foosecret
key: username
volumes:
- name: secrets-store01-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-sync"
Метрики
Поставщика Azure Key Vault
Метрики обслуживаются через Prometheus через порт 8898, но по умолчанию этот порт недоступен за пределами модуля pod. Получить доступ к метрикам через localhost можно с помощью kubectl port-forward
:
kubectl port-forward -n kube-system ds/aks-secrets-store-provider-azure 8898:8898 &
curl localhost:8898/metrics
В таблице ниже перечислены метрики, предоставляемые поставщиком Azure Key Vault для драйвера CSI хранилища секретов.
Метрика | Описание | Теги |
---|---|---|
keyvault_request | Распределение времени, затрачиваемого на получение данных из хранилища ключей | os_type=<runtime os> , provider=azure , object_name=<keyvault object name> , object_type=<keyvault object type> , error=<error if failed> |
grpc_request | Распределение времени, затрачиваемого на запросы gRPC | os_type=<runtime os> , provider=azure , grpc_method=<rpc full method> , grpc_code=<grpc status code> , grpc_message=<grpc status message> |
Драйвер CSI хранилища секретов
Метрики обслуживаются через порт 8095, но по умолчанию этот порт недоступен за пределами модуля pod. Получить доступ к метрикам через localhost можно с помощью kubectl port-forward
:
kubectl port-forward -n kube-system ds/aks-secrets-store-csi-driver 8095:8095 &
curl localhost:8095/metrics
В таблице ниже перечислены метрики, предоставляемые драйвером CSI хранилища секретов.
Метрика | Описание | Теги |
---|---|---|
total_node_publish | Общее число успешных запросов на подключение тома | os_type=<runtime os> , provider=<provider name> |
total_node_unpublish | Общее число успешных запросов на отключение тома | os_type=<runtime os> |
total_node_publish_error | Общее число ошибок в запросах на подключение тома | os_type=<runtime os> , provider=<provider name> , error_type=<error code> |
total_node_unpublish_error | Общее число ошибок в запросах на отключение тома | os_type=<runtime os> |
total_sync_k8s_secret | Общее число синхронизированных секретов Kubernetes | os_type=<runtime os , provider=<provider name> |
sync_k8s_secret_duration_sec | Распределение времени, затрачиваемого на синхронизацию секрета Kubernetes | os_type=<runtime os> |
total_rotation_reconcile | Общее число согласований смены | os_type=<runtime os> , rotated=<true or false> |
total_rotation_reconcile_error | Общее число согласований смены с ошибками | os_type=<runtime os> , rotated=<true or false> , error_type=<error code> |
total_rotation_reconcile_error | Распределение времени, затрачиваемого на смену содержимого хранилища секретов для модулей pod | os_type=<runtime os> |
Дальнейшие действия
Теперь, когда вы узнали, как использовать поставщик Azure Key Vault для драйвера CSI хранилища секретов с кластером AKS, ознакомьтесь со статьей Включение драйверов CSI для Дисков Azure и Файлов Azure в AKS.