Использование поставщика Azure Key Vault для драйвера CSI хранилища секретов в кластере AKS

Поставщик Azure Key Vault для драйвера CSI хранилища секретов позволяет интегрировать хранилище ключей Azure в качестве хранилища секретов с кластером Службы Azure Kubernetes (AKS) через том CSI.

Предварительные требования

Поддерживаемые версии 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:

Следуйте инструкциям в разделе Предоставление удостоверения для доступа к поставщику 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.