使用 Microsoft Entra 驗證將 Prometheus 資料傳送至 Azure 監視器
本文說明如何使用 Microsoft Entra 驗證和 Azure 監視器提供的側車容器設定遠端寫入,以從在 Azure Kubernetes Service (AKS) 叢集或已啟用 Azure Arc 的 Kubernetes 叢集中執行的自我管理 Prometheus 伺服器傳送資料。 請注意,您也可以直接在 Prometheus 設定中設定相同的遠端寫入。
注意
建議您直接設定在 Kubernetes 叢集上執行的 Prometheus,以遠端寫入 Azure 監視器工作區。 請參閱使用 Microsoft Entra ID 驗證將 Prometheus 資料傳送至 Azure 監視器以深入了解。 下列步驟使用 Azure 監視器側車容器。
叢集組態
本文適用於下列叢集設定:
- Azure Kubernetes Service 叢集
- 已啟用 Azure Arc 的 Kubernetes 叢集
- 在不同的雲端或內部部署中執行的 Kubernetes 叢集
注意
對於 AKS 叢集或已啟用 Azure Arc 的 Kubernetes 叢集,建議您使用受控識別驗證。 如需詳細資訊,請參閱適用於對受控識別進行 Prometheus 遠端寫入的 Azure 監視器受控服務。
必要條件
支援的版本
- Microsoft Entra ID 應用程式驗證需要大於 v2.48 的 Prometheus 版本。
Azure 監視器工作區
本文介紹將 Prometheus 計量傳送至 Azure 監視器工作區。 若要建立 Azure 監視器工作區,請參閱管理 Azure 監視器工作區。
權限
需要叢集或資源的系統管理員權限,才能完成本文中的步驟。
設定 Microsoft Entra ID 的應用程式
使用 Microsoft Entra 驗證為應用程式設定 Prometheus 遠端寫入的程序包括完成下列工作:
- 使用 Microsoft Entra ID 註冊應用程式。
- 取得 Microsoft Entra 應用程式的用戶端識別碼。
- 依據工作區資料收集規則,將監視計量發行者角色指派給應用程式。
- 建立 Azure Key Vault 並產生憑證。
- 將憑證新增至 Microsoft Entra 應用程式。
- 新增叢集的 CSI 驅動程式和儲存體。
- 部署 Sidecar 容器以設定遠端寫入。
這些工作將於下列各節中說明。
使用 Microsoft Entra ID 註冊應用程式
完成使用 Microsoft Entra ID 註冊應用程式中的步驟,並建立服務主體。
取得 Microsoft Entra 應用程式的用戶端識別碼
- 在 Azure 入口網站中,移至 [Microsoft Entra ID] 功能表,然後選取 [應用程式註冊]。
- 在應用程式清單中,複製已註冊應用程式的 [應用程式 (用戶端) 識別碼] 值。
依據工作區資料收集規則,將監視計量發行者角色指派給應用程式
依據與 Azure 監視器工作區相關聯的資料收集規則,必須將監視計量發行者角色指派給應用程式。
在 Azure 監視器工作區的資源功能表上,選取 [概觀]。 在 [資料收集規則] 中,選取連結。
在資料收集規則的資源功能表上,選取 [存取控制 (IAM)]。
選取 [新增],然後選取 [新增角色指派]。
選取 [監視計量發行者] 角色,然後選取 [下一步]。
選取 [使用者、群組或服務主體],然後選擇 [選取成員]。 選取您建立的應用程式,然後選擇 [選取]。
若要完成角色指派,請選取 [檢閱 + 指派]。
建立 Azure Key Vault 並產生憑證
- 如果您還沒有 Azure 金鑰保存庫,請建立保存庫。
- 使用將憑證新增至金鑰保存庫的指引來建立憑證。
- 使用從 Key Vault 匯出憑證中的指引,下載 CER 格式的憑證。
將憑證新增至 Microsoft Entra 應用程式
警告
憑證有到期日。 使用者有責任讓憑證保持有效。
新增叢集的 CSI 驅動程式和儲存體
注意
Azure Key Vault CSI 驅動程式設定只是在 Pod 上掛接憑證的其中一種方式。 在部署 Sidecar 容器以設定遠端寫入步驟中,遠端寫入容器僅需要 Pod 中憑證的本機路徑作為 <AZURE_CLIENT_CERTIFICATE_PATH>
值。
只有在建立叢集時未開啟適用於祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者時,才需要此步驟。
若要針對您的叢集開啟適用於祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者,請執行下列 Azure CLI 命令:
az aks enable-addons --addons azure-keyvault-secrets-provider --name <aks-cluster-name> --resource-group <resource-group-name>
若要提供金鑰保存庫的身分識別存取權,請執行下列命令:
# 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>
將下列 YAML 儲存至名為 secretproviderclass.yml 的檔案,以建立 SecretProviderClass
SecretProviderClass
。 取代userAssignedIdentityID
、keyvaultName
、tenantId
和物件的值,以從您的金鑰保存庫擷取。 如需有關要使用哪些值的資訊,請參閱提供身分識別來存取適用於祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者。# 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
在叢集上執行下列命令,以套用
SecretProviderClass
:kubectl apply -f secretproviderclass.yml
部署 Sidecar 容器以設定遠端寫入
複製下列 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>'
取代 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 監視器工作區的 [概觀] 頁面中的 [計量擷取端點] 的值。 <APP-REGISTRATION -CLIENT-ID>
應用程式的用戶端識別碼。 <TENANT-ID>
Microsoft Entra 應用程式的用戶端識別碼。 <CERT-NAME>
憑證的名稱。 <CLUSTER-NAME>
Prometheus 執行所在的叢集名稱。 開啟 Azure Cloud Shell 並上傳 YAML 檔案。
使用 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>
驗證與疑難排解
如需驗證和疑難排解資訊,請參閱遠端寫入疑難排解和 Prometheus 遠端寫入的 Azure 監視器受管理服務。