Использование поставщика Azure Key Vault для драйвера CSI хранилища секретов в кластере AKS
Поставщик Azure Key Vault для драйвера CSI хранилища секретов позволяет интегрировать хранилище ключей Azure в качестве хранилища секретов с кластером Службы Azure Kubernetes (AKS) через том CSI.
Предварительные требования
- Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.
- Прежде чем начать, убедитесь, что ваша версия Azure CLI не ниже 2.30.0. Если вы используете более раннюю версию, установите последний выпуск.
- Если кластер ограничивает входящий трафик, убедитесь, что порты 9808 и 8095 открыты.
Поддерживаемые версии 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, секрет Kubernetes и подключение pod периодически обновляются в зависимости от того, как приложение использует данные секретов.
Подключение секрета Kubernetes в качестве тома: Используйте функции автоматического поворота и синхронизации секретов K8s драйвера CSI хранилища секретов. Приложению потребуется отслеживать изменения из подключенного тома секрета Kubernetes. При обновлении секрета Kubernetes драйвером CSI соответствующее содержимое тома обновляется автоматически.
Приложение считывает данные из файловой системы контейнера: используйте функцию автоматического поворота драйвера CSI хранилища секретов. Приложение должно следить за изменением файла тома, подключенного драйвером CSI.
Использование секрета Kubernetes для переменной среды: перезапустите pod, чтобы получить последний секрет в качестве переменной среды. Используйте инструмент, например Средство перезагрузки, чтобы отслеживать изменения в синхронизированном секрете 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.