Deckhouse Kubernetes Platform (DKP) поддерживает нативную интеграцию с несколькими облачными сервисами Yandex Cloud. Это позволяет подключать внешний мониторинг, безопасно работать с секретами и автоматизировать синхронизацию данных между инфраструктурой и кластером.

В данном разделе описаны шаги по настройке следующих интеграций:

  • с Yandex Lockbox через External Secrets Operator;
  • с Yandex Managed Service for Prometheus.

Интеграция с Yandex Lockbox

DKP поддерживает интеграцию с Yandex Lockbox с помощью оператора External Secrets Operator (ESO). Это позволяет автоматически синхронизировать секреты из Lockbox с секретами Kubernetes в кластере.

Для интеграции выполните следующие шаги:

  1. Создайте сервисный аккаунт, необходимый для работы External Secrets Operator:

    yc iam service-account create --name eso-service-account
    
  2. Создайте авторизованный ключ для сервисного аккаунта и сохраните его в файл:

    yc iam key create --service-account-name eso-service-account --output authorized-key.json
    
  3. Назначьте сервисному аккаунту роли lockbox.editor, lockbox.payloadViewer и kms.keys.encrypterDecrypter для доступа ко всем секретам каталога:

    folder_id=<идентификатор каталога>
    yc resource-manager folder add-access-binding --id=${folder_id} --service-account-name eso-service-account --role lockbox.editor
    yc resource-manager folder add-access-binding --id=${folder_id} --service-account-name eso-service-account --role lockbox.payloadViewer
    yc resource-manager folder add-access-binding --id=${folder_id} --service-account-name eso-service-account --role kms.keys.encrypterDecrypter
    

    Для более тонкой настройки ознакомьтесь с управлением доступом в Yandex Lockbox.

  4. Установите External Secrets Operator с помощью Helm-чарта согласно инструкции.

    Обратите внимание, что вам может понадобиться задать nodeSelector, tolerations и другие параметры. Для этого используйте файл ./external-secrets/values.yaml после распаковки Helm-чарта.

    Скачайте и распакуйте чарт:

    helm pull oci://cr.yandex/yc-marketplace/yandex-cloud/external-secrets/chart/external-secrets \
      --version 0.5.5 \
      --untar
    

    Установите Helm-чарт:

    helm install -n external-secrets --create-namespace \
      --set-file auth.json=authorized-key.json \
      external-secrets ./external-secrets/
    

    Где:

    • authorized-key.json — название файла с авторизованным ключом из шага 2.
  5. Создайте хранилище секретов SecretStore, содержащее секрет sa-creds:

    d8 k -n external-secrets apply -f - <<< '
    apiVersion: external-secrets.io/v1alpha1
    kind: SecretStore
    metadata:
      name: secret-store
    spec:
      provider:
        yandexlockbox:
          auth:
            authorizedKeySecretRef:
              name: sa-creds
              key: key'
    

    Где:

    • sa-creds — название Secret, содержащего авторизованный ключ. Этот секрет должен появиться после установки Helm-чарта.
    • key — название ключа в поле .data секрета выше.
  6. Проверьте статус External Secrets Operator:

    d8 k -n external-secrets get po
    

    Пример вывода:

    NAME                                                READY   STATUS    RESTARTS   AGE
    external-secrets-55f78c44cf-dbf6q                   1/1     Running   0          77m
    external-secrets-cert-controller-78cbc7d9c8-rszhx   1/1     Running   0          77m
    external-secrets-webhook-6d7b66758-s7v9c            1/1     Running   0          77m
    

    Проверьте статус созданного хранилища секретов:

    d8 k -n external-secrets get secretstores.external-secrets.io 
    

    Пример вывода:

    NAME           AGE   STATUS
    secret-store   69m   Valid
    
  7. Создайте секрет Yandex Lockbox со следующими параметрами:

    • Имя — lockbox-secret.
    • Ключ — введите неконфиденциальный идентификатор password.
    • Значение — введите конфиденциальные данные для хранения p@$$w0rd.
  8. Создайте объект ExternalSecret, указывающий на секрет lockbox-secret в хранилище secret-store:

    d8 k -n external-secrets apply -f - <<< '
    apiVersion: external-secrets.io/v1alpha1
    kind: ExternalSecret
    metadata:
      name: external-secret
    spec:
      refreshInterval: 1h
      secretStoreRef:
        name: secret-store
        kind: SecretStore
      target:
        name: k8s-secret
      data:
      - secretKey: password
        remoteRef:
          key: <ИДЕНТИФИКАТОР_СЕКРЕТА>
          property: password'
    

    Где:

    • spec.target.name — имя нового секрета. External Secret Operator создаст этот секрет в кластере Deckhouse Kubernetes Platform и поместит в него параметры секрета Yandex Lockbox lockbox-secret.
    • spec.data[].secretKey — название ключа в поле .data секрета, который создаст External Secret Operator.
    • spec.data[].remoteRef.key — идентификатор созданного ранее секрета Yandex Lockbox lockbox-secret. Например, e6q28nvfmhu539******.
    • spec.data[].remoteRef.property — ключ, указанный ранее, для секрета Yandex Lockbox lockbox-secret.
  9. Убедитесь, что новый ключ k8s-secret содержит значение секрета lockbox-secret:

    d8 k -n external-secrets get secret k8s-secret -ojson | jq -r '.data.password' | base64 -d
    

    В выводе команды будет содержаться значение ключа password секрета lockbox-secret, созданного ранее:

    p@$$w0rd
    

Интеграция с Yandex Managed Service for Prometheus

С помощью данной интеграции вы можете использовать Yandex Managed Service for Prometheus в качестве внешнего хранилища метрик, например, для долгосрочного хранения.

Для записи метрик (PrometheusRemoteWrite) выполните следующие шаги:

  1. Создайте сервисный аккаунт с ролью monitoring.editor.
  2. Создайте API-ключ для сервисного аккаунта.
  3. Создайте ресурс PrometheusRemoteWrite:

    d8 k apply -f - <<EOF
       
    apiVersion: deckhouse.io/v1
    kind: PrometheusRemoteWrite
    metadata:
      name: yc-remote-write
    spec:
      url: <URL_ЗАПИСИ_МЕТРИК>
      bearerToken: <API_КЛЮЧ>
    EOF
    

    Где:

    • <URL_ЗАПИСИ_МЕТРИК> — URL со страницы Yandex Monitoring/Prometheus/Запись метрик.
    • <API_КЛЮЧ> — API-ключ, созданный на предыдущем шаге. Например, AQVN1HHJReSrfo9jU3aopsXrJyfq_UHs********.

    Также вы можете указать дополнительные параметры в соответствии с документацией.

Подробнее с данной функциональностью можно ознакомиться в документации Yandex Cloud.

Для чтения метрик через Grafana:

  1. Создайте сервисный аккаунт с ролью monitoring.viewer.
  2. Создайте API-ключ для сервисного аккаунта.
  3. Создайте ресурс GrafanaAdditionalDatasource:

    apiVersion: deckhouse.io/v1
    kind: GrafanaAdditionalDatasource
    metadata:
      name: managed-prometheus
    spec:
      type: prometheus
      access: Proxy
      url: <URL_ЧТЕНИЕ_МЕТРИК_ЧЕРЕЗ_GRAFANA>
      basicAuth: false
      jsonData:
        timeInterval: 30s
        httpMethod: POST
        httpHeaderName1: Authorization
      secureJsonData:
        httpHeaderValue1: Bearer <API_КЛЮЧ>
    

    Где:

    • <URL_ЧТЕНИЕ_МЕТРИК_ЧЕРЕЗ_GRAFANA> — URL со страницы Yandex Monitoring/Prometheus/Чтение метрик через Grafana.
    • <API_КЛЮЧ> — API-ключ, созданный на предыдущем шаге. Например, AQVN1HHJReSrfo9jU3aopsXrJyfq_UHs********.

    Также вы можете указать дополнительные параметры в соответствии с документацией.

Подробнее с данной функциональностью можно ознакомиться в документации Yandex Cloud.