菜单
开源

Azure Blob 存储权限和管理

Tempo 需要以下配置才能验证并访问 Azure Blob 存储

  • 配置文件中指定的 Storage Account 名称,作为 storage_account_name,或在环境变量 AZURE_STORAGE_ACCOUNT 中指定
  • 访问 Storage Account 的凭据,可以是以下之一
    • 配置文件中指定的 Storage Account 访问密钥,作为 storage_account_key,或在环境变量 AZURE_STORAGE_KEY 中指定
    • 系统分配或用户分配的 Azure 托管身份。要使用 Azure 托管身份,您需要在配置文件中将 use_managed_identity 设置为 true,或将 user_assigned_id 设置为您希望使用的托管身份的客户端 ID。
      • 对于系统分配的托管身份,无需额外配置。
      • 对于用户分配的托管身份,您需要在配置文件中将 user_assigned_id 设置为该托管身份的客户端 ID。
    • 通过 Azure Workload Identity。要使用 Azure Workload Identity,您需要在集群上启用 Azure Workload Identity,向服务帐户和所需的 Pod 标签添加所需的标签和注解。此外,您还需要将 use_federated_token 设置为 true 以利用 Azure Workload Identity。

示例配置 (适用于 Tempo 单体模式)

访问密钥

此示例配置展示了如何使用 Helm Chart 和 Kubernetes Secret 中的访问密钥设置 Azure Blob 存储。

yaml
tempo:
  storage:
    trace:
      backend: azure
      azure:
        container_name: container-name
        storage_account_name: storage-account-name
        storage_account_key: ${STORAGE_ACCOUNT_ACCESS_KEY}

  extraArgs:
    config.expand-env: true
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: secret-name
          key: STORAGE_ACCOUNT_ACCESS_KEY

Azure Workload Identity

这是一个使用 Azure Workload Identity 的示例配置。

yaml
tempo:
  storage:
    trace:
      backend: azure
      azure:
        container_name: container-name
        storage_account_name: storage-account-name
        use_federated_token: true

示例配置 (适用于 Tempo 分布式模式)

在分布式模式下,trace 配置需要应用于 storage 对象,该对象位于 Values 对象的根部。此外,extraArgsextraEnv 配置需要应用于以下每个服务

  • distributor
  • compactor
  • ingester
  • querier
  • queryFrontend
storage:
  trace:
    backend: azure
    azure:
      container_name: tempo-traces
      storage_account_name: stgappgeneraluks
      storage_account_key: ${STORAGE_ACCOUNT_ACCESS_KEY}


distributor:
  extraArgs:
  - "-config.expand-env=true"
  extraEnv:
  - name: STORAGE_ACCOUNT_ACCESS_KEY
    valueFrom:
      secretKeyRef:
        name: tempo-traces-stg-key
        key: tempo-traces-key

compactor:
  extraArgs:
  - "-config.expand-env=true"
  extraEnv:
  - name: STORAGE_ACCOUNT_ACCESS_KEY
    valueFrom:
      secretKeyRef:
        name: tempo-traces-stg-key
        key: tempo-traces-key

ingester:
  extraArgs:
  - "-config.expand-env=true"
  extraEnv:
  - name: STORAGE_ACCOUNT_ACCESS_KEY
    valueFrom:
      secretKeyRef:
        name: tempo-traces-stg-key
        key: tempo-traces-key

querier:
  extraArgs:
  - "-config.expand-env=true"
  extraEnv:
  - name: STORAGE_ACCOUNT_ACCESS_KEY
    valueFrom:
      secretKeyRef:
        name: tempo-traces-stg-key
        key: tempo-traces-key

queryFrontend:
  extraArgs:
  - "-config.expand-env=true"
  extraEnv:
  - name: STORAGE_ACCOUNT_ACCESS_KEY
    valueFrom:
      secretKeyRef:
        name: tempo-traces-stg-key
        key: tempo-traces-key

Azure blocklist 轮询

如果您在 Azure 上托管 Tempo,可能需要更新两个值以确保 blocklist 轮询持续成功。如果您遇到此问题,请尝试将 blocklist_poll_tenant_index_builders 设置为 1。

此外,如果您看到如下所示的 DNS 故障,请尝试增加 blocklist_poll_jitter_ms。相关讨论请参见此处

reading storage container: Head "https://tempoe**************.blob.core.windows.net/tempo/single-tenant/d8aafc48-5796-4221-ac0b-58e001d18515/meta.compacted.json?timeout=61": dial tcp: lookup tempoe**************.blob.core.windows.net on 10.0.0.10:53: dial udp 10.0.0.10:53: operation was canceled

您的最终配置可能看起来像这样

  storage:
    trace:
      blocklist_poll_tenant_index_builders: 1
      blocklist_poll_jitter_ms: 500

(可选) 用于清理存储容器的 Storage Account 管理策略

以下 Storage Account 管理策略展示了如何在文件被删除一段时间后清理容器中的文件。

json
{
  "id": "/subscriptions/00000000-0000-0000000000000000000000/resourceGroups/resourceGroupName/providers/Microsoft.Storage/storageAccounts/accountName/managementPolicies/default",
  "lastModifiedTime": "2021-11-30T19:19:54.855455+00:00",
  "name": "DefaultManagementPolicy",
  "policy": {
    "rules": [
      {
        "definition": {
          "actions": {
            "baseBlob": {
              "delete": {
                "daysAfterLastAccessTimeGreaterThan": null,
                "daysAfterModificationGreaterThan": 60.0
              },
              "enableAutoTierToHotFromCool": null,
              "tierToArchive": null,
              "tierToCool": null
            },
            "snapshot": null,
            "version": null
          },
          "filters": {
            "blobIndexMatch": null,
            "blobTypes": [
              "blockBlob"
            ],
            "prefixMatch": [
              "tempo-data"
            ]
          }
        },
        "enabled": true,
        "name": "TempoBlobRetention",
        "type": "Lifecycle"
      },
      {
        "definition": {
          "actions": {
            "baseBlob": null,
            "snapshot": null,
            "version": {
              "delete": {
                "daysAfterCreationGreaterThan": 7.0
              },
              "tierToArchive": null,
              "tierToCool": null
            }
          },
          "filters": {
            "blobIndexMatch": null,
            "blobTypes": [
              "blockBlob"
            ],
            "prefixMatch": []
          }
        },
        "enabled": true,
        "name": "VersionRetention",
        "type": "Lifecycle"
      }
    ]
  },
  "resourceGroup": "resource-group-name",
  "type": "Microsoft.Storage/storageAccounts/managementPolicies"
}