共用方式為


使用 Microsoft Entra 工作負載 ID 驗證將 Prometheus 數據傳送至 Azure 監視器

本文說明如何使用 Microsoft Entra 工作負載識別碼驗證,設定遠端寫入以從 Azure 監視器受控 Prometheus 叢集傳送資料。

必要條件

  • Microsoft Entra ID 應用程式驗證需要大於 v2.48 的 Prometheus 版本。
  • 在叢集中執行的 Prometheus。 本文假設使用 kube-prometheus 堆疊來設定 Prometheus 叢集,但您也可以使用其他方法來設定 Prometheus。

使用 Microsoft Entra 工作負載 ID 設定遠端寫入

使用 Microsoft Entra 工作負載 ID 驗證設定 Prometheus 遠端寫入的程式包括完成下列工作:

  1. 啟用 OpenID Connect 並記下簽發者 URL。
  2. 設定變動許可 Webhook。
  3. 設定工作負載身分識別。
  4. 建立 Microsoft Entra 應用程式或使用者指派的受控識別,並授與權限。
  5. 依據工作區資料收集規則,將監視計量發行者角色指派給應用程式。
  6. 建立或更新 Kubernetes 服務帳戶 Prometheus Pod。
  7. 建立身分識別與服務帳戶簽發者和主體之間的同盟身分識別認證。
  8. 部署 Sidecar 容器以設定遠端寫入。

這些工作將於下列各節中說明。

啟用OpenID Connect並查詢簽發者

若要在 AKS 叢集上啟用 OpenID Connect (OIDC),請遵循在 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 工作負載識別碼

設定變動許可 Webhook

設定變動許可 Webhook,讓同盟認證保持在最新狀態。 請參閱變動許可 Webhook - Microsoft Entra 工作負載 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 Pod 相關聯。 在 Prometheus Pod 的 spec 中尋找 serviceaccountNameserviceAccount 值 (已淘汰)。 使用此值 (如果存在)。 若要尋找與 Prometheus Pod 相關聯的服務帳戶,請執行下列 kubectl 命令:

kubectl get pods/<Promethuespodname> -o yaml

如果 serviceaccountNameserviceAccount 不存在,請輸入您想要與 Prometheus Pod 建立關聯的服務帳戶名稱。

建立 Microsoft Entra 應用程式或使用者指派的受控識別,並授與權限

建立 Microsoft Entra 應用程式或使用者指派的受控識別,並授與將計量發佈至 Azure 監視器工作區的權限:

# 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}"

依據工作區資料收集規則,將監視計量發行者角色指派給應用程式或受控識別

如需指派角色的相關資訊,請參閱依據工作區資料收集規則,將監視計量發行者角色指派給受控識別

建立或更新 Kubernetes 服務帳戶 Prometheus Pod

Kubernetes 服務帳戶通常會建立,並將其與執行 Prometheus 容器的 Pod 相關聯。 如果您使用 kube-prometheus 堆疊,程式碼會自動建立 prometheus-kube-prometheus-prometheus 服務帳戶。

如果預設服務帳戶之外沒有任何 Kubernetes 服務帳戶與 Prometheus 相關聯,請特別為執行 Prometheus 的 Pod 建立新的服務帳戶。

若要建立服務帳戶,請執行下列 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 服務帳戶與您的 Pod 相關聯,請將下列註釋新增至服務帳戶:

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 應用程式或使用者指派的受控識別不在與叢集相同的租用戶中,請將下列註釋新增至服務帳戶:

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

建立身分識別與服務帳戶簽發者和主體之間的同盟身分識別認證

使用 Azure CLI 建立同盟認證。

使用者指派的受控識別

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

部署 Sidecar 容器以設定遠端寫入

重要

Prometheus Pod 必須具有下列標籤:azure.workload.identity/use: "true"

遠端寫入 Sidecar 容器需要下列環境值:

  • INGESTION_URL:Azure 監視器工作區的 [概觀] 頁面上顯示的計量擷取端點
  • LISTENING_PORT8081 (支援任何連接埠)
  • 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 中的下列值:

    Description
    <CLUSTER-NAME> AKS 叢集的名稱。
    <CONTAINER-IMAGE-VERSION> mcr.microsoft.com/azuremonitor/containerinsights/ciprod/prometheus-remote-write/images:prom-remotewrite-20240617.1
    這是遠端寫入容器映像版本。
    <INGESTION-URL> Azure 監視器工作區的 [概觀] 頁面中的 [計量擷取端點] 的值。
  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> 
    

驗證與疑難排解

如需驗證和疑難排解資訊,請參閱遠端寫入疑難排解Prometheus 遠端寫入的 Azure 監視器受管理服務

下一步