次の方法で共有


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

この記事では、Microsoft Entra ワークロード ID 認証を使用してリモート書き込みを設定し、Azure Monitor マネージド Prometheus クラスターからデータを送信する方法について説明します。

前提条件

  • Microsoft Entra ID アプリケーション認証には、v2.48 より大きい Prometheus バージョンが必要です。
  • クラスターで実行されている Prometheus。 この記事では、kube-prometheus スタック を使用して Prometheus クラスターが設定されていることを前提としていますが、他の方法を使用して Prometheus を設定することもできます。

Microsoft Entra ワークロード ID を使用してリモート書き込みを設定する

Microsoft Entra ワークロード ID 認証を使って Prometheus リモート書き込みを設定するプロセスでは、次のタスクの実行が含まれます。

  1. OpenID Connect を有効にして、発行者の URL を記録します。
  2. Mutating Admission Webhook を設定します。
  3. ワークロード ID を設定する。
  4. Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID を作成して、アクセス許可を付与する。
  5. ワークスペース データ収集規則に対する監視メトリック発行者ロールをアプリケーションに割り当てる。
  6. Kubernetes サービス アカウントの Prometheus ポッドを作成または更新する。
  7. ID とサービス アカウント発行者およびサブジェクトの間でフェデレーション ID 資格情報を確立する。
  8. サイドカー コンテナーをデプロイしてリモート書き込みを設定する。

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

OpenID Connect を有効にして、発行者のクエリを実行する

AKS クラスターで OpenID Connect (OIDC) を有効にするには、「Azure Kubernetes Service (AKS) で OpenID Connect プロバイダーを作成する」の手順に従って行います。

有効にしたら、基本的に OIDC 発行者の URL である SERVICE_ACCOUNT_ISSUER を記録しておきます。 OIDC 発行者 URL を取得するには、az aks show コマンドを実行します。 クラスター名とリソース グループ名の既定値を置き換えてください。

az aks show --name myAKScluster --resource-group myResourceGroup --query "oidcIssuerProfile.issuerUrl" -o tsv

既定では、発行者はベース URL https://{region}.oic.prod-aks.azure.com を使用するように設定されています。ここで {region} の値は、AKS クラスターがデプロイされている場所と一致します。

他のマネージド クラスター (Amazon Elastic Kubernetes Service、Google Kubernetes Engine) については、マネージド クラスター - Microsoft Entra ワークロード ID に関する記事をご覧ください。 自己管理型クラスターについては、「自己管理型クラスター - Microsoft Entra ワークロード ID」を参照してください。

Mutating Admission Webhook を設定する

フェデレーション資格情報を最新の状態に保つように、Mutating Admission Webhook を設定します。 設定については、Mutating Admission Webhook - Microsoft Entra ワークロード ID に関する記事をご覧ください。

ワークロード ID を設定する

ワークロード ID を設定するには、以下の環境変数をエクスポートします。

# [OPTIONAL] Set this if you're using a Microsoft Entra application
export APPLICATION_NAME="<your application name>"
    
# [OPTIONAL] Set this only if you're using a user-assigned managed identity
export USER_ASSIGNED_IDENTITY_NAME="<your user-assigned managed identity name>"
    
# Environment variables for the Kubernetes service account and federated identity credential
export SERVICE_ACCOUNT_NAMESPACE="<namespace where Prometheus pod is running>"
export SERVICE_ACCOUNT_NAME="<name of service account associated with Prometheus pod. See below for more details>"
export SERVICE_ACCOUNT_ISSUER="<your service account (or OIDC) issuer URL>"

SERVICE_ACCOUNT_NAME の場合は、("既定の" サービス アカウントとは別の) サービス アカウントが Prometheus ポッドに既に関連付けられているかどうかを確認します。 Prometheus ポッドの spec で、serviceaccountName または serviceAccount (非推奨) の値を探します。 この値が存在する場合は、それを使用します。 Prometheus ポッドに関連付けられているサービス アカウントを確認するには、次の kubectl コマンドを実行します。

kubectl get pods/<Promethuespodname> -o yaml

serviceaccountNameserviceAccount が存在しない場合は、Prometheus ポッドに関連付けたいサービス アカウントの名前を入力します。

Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID を作成して、アクセス許可を付与する

Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID を作成し、Azure Monitor ワークスペースにメトリックを発行するためのアクセス許可を付与します。

# create a Microsoft Entra application
az ad sp create-for-rbac --name "${APPLICATION_NAME}"

# create a user-assigned managed identity if you use a user-assigned managed identity for this article
az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}"

ワークスペース データ収集規則に対する監視メトリック発行者ロールをアプリケーションまたはマネージド ID に割り当てる

ロールの割り当てについては、「ワークスペース データ収集規則に対する監視メトリック発行者ロールをマネージド ID に割り当てる」を参照してください。

Kubernetes サービス アカウントの Prometheus ポッドを作成または更新する

多くの場合、Kubernetes サービス アカウントが作成されており、Prometheus コンテナーを実行するポッドに関連付けられています。 kube-prometheus スタックを使用している場合は、コードによって prometheus-kube-prometheus-prometheus サービス アカウントが自動的に作成されます。

既定のサービス アカウント以外に、Prometheus に関連付けられている Kubernetes サービス アカウントがない場合は、Prometheus を実行しているポッド専用の新しいサービス アカウントを作成します。

サービス アカウントを作成するには、次の kubectl コマンドを実行します。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: service account
metadata:
  annotations:
    azure.workload.identity/client-id: ${APPLICATION_CLIENT_ID:-$USER_ASSIGNED_IDENTITY_CLIENT_ID}
  name: ${SERVICE_ACCOUNT_NAME}
  namespace: ${SERVICE_ACCOUNT_NAMESPACE}
EOF

既定のサービス アカウント以外の Kubernetes サービス アカウントがポッドに関連付けられている場合は、サービス アカウントに次の注釈を追加します。

kubectl annotate sa ${SERVICE_ACCOUNT_NAME} -n ${SERVICE_ACCOUNT_NAMESPACE} azure.workload.identity/client-id="${APPLICATION_OR_USER_ASSIGNED_IDENTITY_CLIENT_ID}" –overwrite

Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID がクラスターと同じテナントにない場合、サービス アカウントに次の注釈を追加します。

kubectl annotate sa ${SERVICE_ACCOUNT_NAME} -n ${SERVICE_ACCOUNT_NAMESPACE} azure.workload.identity/tenant-id="${APPLICATION_OR_USER_ASSIGNED_IDENTITY_TENANT_ID}" –overwrite

ID とサービス アカウント発行者およびサブジェクトの間でフェデレーション ID 資格情報を確立します

Azure CLI を使用して、フェデレーション資格情報を作成します。

ユーザー割り当てマネージド ID

az identity federated-credential create \
   --name "kubernetes-federated-credential" \
   --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
   --resource-group "${RESOURCE_GROUP}" \
   --issuer "${SERVICE_ACCOUNT_ISSUER}" \
   --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"

Microsoft Entra アプリケーション

# Get the ObjectID of the Microsoft Entra app.

export APPLICATION_OBJECT_ID="$(az ad app show --id ${APPLICATION_CLIENT_ID} --query id -otsv)"

# Add a federated identity credential.

cat <<EOF > params.json
{
  "name": "kubernetes-federated-credential",
  "issuer": "${SERVICE_ACCOUNT_ISSUER}",
  "subject": "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}",
  "description": "Kubernetes service account federated credential",
  "audiences": [
    "api://AzureADTokenExchange"
  ]
}
EOF

az ad app federated-credential create --id ${APPLICATION_OBJECT_ID} --parameters @params.json

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

重要

Prometheus ポッドには、次のラベルが必要です。azure.workload.identity/use: "true"

リモート書き込みサイドカー コンテナーには、次の環境値が必要です。

  • INGESTION_URL: Azure Monitor ワークスペースの [概要] ページに表示されるメトリック取り込みエンドポイント
  • LISTENING_PORT: 8081 (すべてのノードがサポートされています)
  • IDENTITY_TYPE: workloadIdentity
  1. 次の YAML をコピーし、ファイルに保存します。 この YAML では、リッスン ポートとしてポート 8081 が使用されます。 別のポートを使用する場合は、YAML でその値を変更してください。

    prometheus:
      prometheusSpec:
        externalLabels:
              cluster: <AKS-CLUSTER-NAME>
        podMetadata:
            labels:
                azure.workload.identity/use: "true"
        ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write    
        remoteWrite:
        - url: 'http://localhost:8081/api/v1/write'
    
        containers:
        - name: prom-remotewrite
          image: <CONTAINER-IMAGE-VERSION>
          imagePullPolicy: Always
          ports:
            - name: rw-port
              containerPort: 8081
          env:
          - name: INGESTION_URL
            value: <INGESTION_URL>
          - name: LISTENING_PORT
            value: '8081'
          - name: IDENTITY_TYPE
            value: workloadIdentity
    
  2. YAML 内の次の値を置き換えます。

    Value 説明
    <CLUSTER-NAME> AKS クラスターの名前。
    <CONTAINER-IMAGE-VERSION> mcr.microsoft.com/azuremonitor/containerinsights/ciprod/prometheus-remote-write/images:prom-remotewrite-20240617.1
    リモート書き込みコンテナー イメージのバージョン。
    <INGESTION-URL> Azure Monitor ワークスペースの [概要] ページの [メトリック インジェスト エンドポイント] の値。
  3. Helm を使って YAML ファイルを適用し、Prometheus 構成を更新します。

    # set a 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 用マネージド サービスのリモート書き込み」を参照してください。

次のステップ