使用 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 遠端寫入的程式包括完成下列工作:
- 啟用 OpenID Connect 並記下簽發者 URL。
- 設定變動許可 Webhook。
- 設定工作負載身分識別。
- 建立 Microsoft Entra 應用程式或使用者指派的受控識別,並授與權限。
- 依據工作區資料收集規則,將監視計量發行者角色指派給應用程式。
- 建立或更新 Kubernetes 服務帳戶 Prometheus Pod。
- 建立身分識別與服務帳戶簽發者和主體之間的同盟身分識別認證。
- 部署 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
中尋找 serviceaccountName
或 serviceAccount
值 (已淘汰)。 使用此值 (如果存在)。 若要尋找與 Prometheus Pod 相關聯的服務帳戶,請執行下列 kubectl 命令:
kubectl get pods/<Promethuespodname> -o yaml
如果 serviceaccountName
和 serviceAccount
不存在,請輸入您想要與 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_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 中的下列值:
值 Description <CLUSTER-NAME>
AKS 叢集的名稱。 <CONTAINER-IMAGE-VERSION>
mcr.microsoft.com/azuremonitor/containerinsights/ciprod/prometheus-remote-write/images:prom-remotewrite-20240617.1
這是遠端寫入容器映像版本。<INGESTION-URL>
Azure 監視器工作區的 [概觀] 頁面中的 [計量擷取端點] 的值。 使用 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 監視器受管理服務。