Microsoft Entra 認証を使用して Prometheus データを Azure Monitor に送信する

この記事では、Microsoft Entra 認証を使用して Azure Kubernetes Service (AKS) クラスターまたは Azure Arc 対応 Kubernetes クラスターで実行されているセルフマネージド Prometheus サーバーからデータを送信するためにリモート書き込みを設定する方法について説明します。

クラスター構成

この記事は、次のクラスター構成に適用されます。

  • Azure Kubernetes Service クラスター
  • Azure Arc 対応 Kubernetes クラスター
  • 別のクラウドまたはオンプレミスで実行されている Kubernetes クラスター

Note

AKS クラスターまたは Azure Arc 対応 Kubernetes クラスターの場合は、マネージド ID 認証を使用することをお勧めします。 詳細については、マネージド ID の Azure Monitor の Prometheus 用マネージド サービスのリモート書き込みに関するページを参照してください。

前提条件

サポートされているバージョン

  • Microsoft Entra ID アプリケーション認証には、v2.48 より大きい Prometheus バージョンが必要です。

Azure Monitor ワークスペース

この記事では、Prometheus メトリックを Azure Monitor ワークスペースに送信する方法について説明します。 Azure Monitor ワークスペースを作成するには、Azure Monitor ワークスペースの管理に関するページを参照してください。

アクセス許可

この記事の手順を完了するには、クラスターまたはリソースの管理者アクセス許可が必要です。

Microsoft Entra ID 用にアプリケーションを設定する

Microsoft Entra 認証を使用してアプリケーションの Prometheus リモート書き込みを設定するプロセスには、次のタスクを完了することが含まれます。

  1. Microsoft Entra ID でアプリケーションを登録します。
  2. Microsoft Entra アプリケーションのクライアント ID を取得します。
  3. ワークスペース データ収集ルールに対する監視メトリック発行者ロールをアプリケーションに割り当てる。
  4. Azure キー コンテナーを作成して証明書を生成する。
  5. Microsoft Entra アプリケーションに証明書を追加する。
  6. クラスター用の CSI ドライバーとストレージを追加する。
  7. サイドカー コンテナーをデプロイしてリモート書き込みを設定する。

これらのタスクについては、以降のセクションで説明します。

演Microsoft Entra ID でアプリケーションを登録する

Microsoft Entra ID にアプリケーションを登録し、サービス プリンシパルを作成する手順を完了します。

Microsoft Entra アプリケーションのクライアント ID を取得する

  1. Azure portal で、[Microsoft Entra ID] メニューに移動し、[アプリの登録] を選びます。
  2. アプリケーションのリストで、登録済みアプリケーションのアプリケーション (クライアント) ID の値をコピーします。

Microsoft Entra アプリケーションのアプリケーションまたはクライアント ID を示すスクリーンショット。

ワークスペース データ収集ルールに対する監視メトリック発行者ロールをアプリケーションに割り当てる

アプリケーションには、Azure Monitor ワークスペースに関連付けられているデータ収集ルールに対する監視メトリック発行者ロールが割り当てられている必要があります。

  1. Azure Monitor ワークスペースのリソース メニューで、[概要] を選びます。 [データ収集ルール] で、リンクを選びます。

    Azure Monitor ワークスペースで使用されるデータ収集ルールを示すスクリーンショット。

  2. データ収集ルールのリソース メニューで、[アクセス制御 (IAM)] を選びます。

  3. 追加を選択し、ロール割り当ての追加を選択します。

    アクセス制御ページでのロールの割り当ての追加を示すスクリーンショット。

  4. [監視メトリック発行者] ロールを選択して、[次へ] を選択します。

    ロールの割り当ての一覧を示すスクリーンショット。

  5. [ユーザー、グループ、またはサービス プリンシパル] を選んでから、[メンバーの選択] を選びます。 作成したアプリケーションを選び、[選択] を選びます。

    アプリケーションの選択を示すスクリーンショット。

  6. ロールの割り当てを完了するには、[レビューと割り当て] を選びます。

Azure キー コンテナーを作成して証明書を生成する

  1. Azure キー コンテナーがまだない場合は、コンテナーを作成します
  2. 証明書を Key Vault に追加する」のガイダンスを使用して証明書を作成します。
  3. Key Vault から証明書をエクスポートする」のガイダンスを使用して、証明書を CER 形式でダウンロードします。

Microsoft Entra アプリケーションに証明書を追加する

  1. Microsoft Entra アプリケーションのリソース メニューで、[証明書とシークレット] を選びます。

  2. [証明書] タブで、[証明書のアップロード] を選び、ダウンロードした証明書を選びます。

    Microsoft Entra アプリケーションの証明書のアップロードを示すスクリーンショット。

警告

証明書には有効期限があります。 証明書を有効に保つのはユーザーの責任です。

クラスター用の CSI ドライバーとストレージを追加する

Note

Azure Key Vault の CSI ドライバーの構成は、ポッドにマウントされた証明書を取得する方法の 1 つにすぎません。 リモート書き込みコンテナーには、「サイドカー コンテナーをデプロイしてリモート書き込みを設定する」の手順の <AZURE_CLIENT_CERTIFICATE_PATH> 値に対してのみ、ポッド内の証明書へのローカル パスが必要です。

この手順は、クラスターの作成時にシークレット ストア CSI ドライバーの Azure Key Vault プロバイダーを有効にしなかった場合にのみ必要です。

  1. クラスターのシークレット ストア CSI ドライバーの Azure Key Vault プロバイダーを有効にするには、次の Azure CLI コマンドを実行します。

    az aks enable-addons --addons azure-keyvault-secrets-provider --name <aks-cluster-name> --resource-group <resource-group-name>
    
  2. ID にキー コンテナーへのアクセス権を付与するには、次のコマンドを実行します。

    # show client id of the managed identity of the cluster
    az aks show -g <resource-group> -n <cluster-name> --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId -o tsv
    
    # set policy to access keys in your key vault
    az keyvault set-policy -n <keyvault-name> --key-permissions get --spn <identity-client-id>
    
    # set policy to access secrets in your key vault
    az keyvault set-policy -n <keyvault-name> --secret-permissions get --spn <identity-client-id>
    
    # set policy to access certs in your key vault
    az keyvault set-policy -n <keyvault-name> --certificate-permissions get --spn <identity-client-id>
    
  3. 次の YAML を secretproviderclass.yml という名前のファイルに保存して、SecretProviderClass を作成します。 キー コンテナーから取得する userAssignedIdentityIDkeyvaultNametenantId、オブジェクトの値を置き換えます。 使用する値の詳細については、Azure Key Vault プロバイダーにアクセスするための ID をシークレット ストア CSI ドライバーに提供するに関するページを参照してください。

    # This is a SecretProviderClass example using user-assigned identity to access your key vault
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: azure-kvname-user-msi
    spec:
      provider: azure
      parameters:
        usePodIdentity: "false"
        useVMManagedIdentity: "true"          # Set to true for using managed identity
        userAssignedIdentityID: <client-id>   # Set the client ID of the user-assigned managed identity to use
        keyvaultName: <key-vault-name>        # Set to the name of your key vault
        cloudName: ""                         # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud
        objects:  |
          array:
            - |
              objectName: <name-of-cert>
              objectType: secret              # object types: secret, key, or cert
              objectFormat: pfx
              objectEncoding: base64
              objectVersion: ""
        tenantId: <tenant-id>                 # The tenant ID of the key vault
    
  4. お使いのクラスターで次のコマンドを実行して、SecretProviderClass を適用します。

    kubectl apply -f secretproviderclass.yml
    

サイドカー コンテナーをデプロイしてリモート書き込みを設定する

  1. 次の YAML をコピーし、ファイルに保存します。 この YAML では、リッスン ポートとしてポート 8081 が使用されます。 別のポートを使用する場合は、YAML でその値を変更してください。

    prometheus:
      prometheusSpec:
        externalLabels:
          cluster: <CLUSTER-NAME>  
    
        ##	Azure Managed Prometheus currently exports some default mixins in Grafana.  
        ##  These mixins are compatible with data scraped by Azure Monitor agent on your 
        ##  Azure Kubernetes Service cluster. These mixins aren't compatible with Prometheus 
        ##  metrics scraped by the Kube Prometheus stack. 
        ##  To make these mixins compatible, uncomment the remote write relabel configuration below:
        ##	writeRelabelConfigs:
        ##	  - sourceLabels: [metrics_path]
        ##	    regex: /metrics/cadvisor
        ##	    targetLabel: job
        ##	    replacement: cadvisor
        ##	    action: replace
        ##	  - sourceLabels: [job]
        ##	    regex: 'node-exporter'
        ##	    targetLabel: job
        ##	    replacement: node
        ##	    action: replace  
        ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
        remoteWrite:
          - url: 'http://localhost:8081/api/v1/write'
        
        # Additional volumes on the output StatefulSet definition.
        # Required only for Microsoft Entra ID based auth
        volumes:
          - name: secrets-store-inline
            csi:
              driver: secrets-store.csi.k8s.io
              readOnly: true
              volumeAttributes:
                secretProviderClass: azure-kvname-user-msi
        containers:
          - name: prom-remotewrite
            image: <CONTAINER-IMAGE-VERSION>
            imagePullPolicy: Always
            # Required only for Microsoft Entra ID based auth
            volumeMounts:
              - name: secrets-store-inline
                mountPath: /mnt/secrets-store
                readOnly: true
            ports:
              - name: rw-port
                containerPort: 8081
            livenessProbe:
              httpGet:
                path: /health
                port: rw-port
                initialDelaySeconds: 10
                timeoutSeconds: 10
            readinessProbe:
              httpGet:
                path: /ready
                port: rw-port
                initialDelaySeconds: 10
                timeoutSeconds: 10
            env:
              - name: INGESTION_URL
                value: '<INGESTION_URL>'
              - name: LISTENING_PORT
                value: '8081'
              - name: IDENTITY_TYPE
                value: aadApplication
              - name: AZURE_CLIENT_ID
                value: '<APP-REGISTRATION-CLIENT-ID>'
              - name: AZURE_TENANT_ID
                value: '<TENANT-ID>'
              - name: AZURE_CLIENT_CERTIFICATE_PATH
                value: /mnt/secrets-store/<CERT-NAME>
              - name: CLUSTER
                value: '<CLUSTER-NAME>'
    
  2. YAML ファイル内の次の値を置き換えます。

    Value 説明
    <CLUSTER-NAME> AKS クラスターの名前。
    <CONTAINER-IMAGE-VERSION> mcr.microsoft.com/azuremonitor/prometheus/promdev/prom-remotewrite:prom-remotewrite-20230906.1
    リモート書き込みコンテナー イメージのバージョン。
    <INGESTION-URL> Azure Monitor ワークスペースの [概要] ページの [メトリック インジェスト エンドポイント] の値。
    <APP-REGISTRATION -CLIENT-ID> お使いのアプリケーションのクライアント ID。
    <TENANT-ID> Microsoft Entra アプリケーションのテナント ID。
    <CERT-NAME> 証明書の名前です。
    <CLUSTER-NAME> Prometheus が実行されているクラスターの名前。
  3. Azure Cloud Shell を開き、YAML ファイルをアップロードします。

  4. Helm を使って YAML ファイルを適用し、Prometheus 構成を更新します。

    # set the context to your cluster 
    az aks get-credentials -g <aks-rg-name> -n <aks-cluster-name> 
    
    # use Helm to update your remote write config 
    helm upgrade -f <YAML-FILENAME>.yml prometheus prometheus-community/kube-prometheus-stack -namespace <namespace where Prometheus pod resides> 
    

確認とトラブルシューティング

検証とトラブルシューティングの情報については、「リモート書き込みのトラブルシューティング」と「Azure Monitor の Prometheus 用マネージド サービスのリモート書き込み」を参照してください。

次のステップ