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 リモート書き込みを設定するプロセスでは、次のタスクの実行が含まれます。
- OpenID Connect を有効にして、発行者の URL を記録します。
- Mutating Admission Webhook を設定します。
- ワークロード ID を設定する。
- Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID を作成して、アクセス許可を付与する。
- ワークスペース データ収集規則に対する監視メトリック発行者ロールをアプリケーションに割り当てる。
- Kubernetes サービス アカウントの Prometheus ポッドを作成または更新する。
- ID とサービス アカウント発行者およびサブジェクトの間でフェデレーション ID 資格情報を確立する。
- サイドカー コンテナーをデプロイしてリモート書き込みを設定する。
これらのタスクについては、以降のセクションで説明します。
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
serviceaccountName
と serviceAccount
が存在しない場合は、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
次の 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
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 ワークスペースの [概要] ページの [メトリック インジェスト エンドポイント] の値。 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 用マネージド サービスのリモート書き込み」を参照してください。
次のステップ
- AKS クラスターから Prometheus メトリックを収集する
- Prometheus 用の Azure Monitor マネージド サービスの詳細
- Azure Monitor の Prometheus 用マネージド サービスでのリモート書き込み
- Microsoft Entra 認証を使用して Prometheus データを Azure Monitor に送信する
- マネージド ID 認証を使用して Prometheus データを Azure Monitor に送信する
- Microsoft Entra ポッドマネージド ID (プレビュー) 認証を使用して Prometheus データを Azure Monitor に送信する