Proxy de autorización de Microsoft Entra
El proxy de autorización de Microsoft Entra es un proxy inverso, que se puede usar para autenticar solicitudes mediante el identificador de Microsoft Entra. El proxy se puede usar para autenticar las solicitudes en cualquier servicio que admita la autenticación de Microsoft Entra. Use este proxy para autenticar solicitudes al servicio administrado de Azure Monitor para Prometheus.
Requisitos previos
- Un área de trabajo de Azure Monitor. Si no tiene un área de trabajo, puede crear uno mediante Azure Portal.
- Prometheus instalado en su clúster.
Nota
En el ejemplo de escritura remota de este artículo se usa la escritura remota de Prometheus para escribir datos en Azure Monitor. Al incorporar su clúster de AKS a Prometheus, este se instala automáticamente en su clúster y envía datos a su área de trabajo.
Implementación
El proxy se puede implementar con plantillas personalizadas mediante la imagen de versión o como un gráfico de Helm. Ambas implementaciones contienen los mismos parámetros personalizables. Estos parámetros se describen en la tabla Parámetros.
Para obtener más información, consulte el proyecto de proxy de autenticación de Microsoft Entra.
En los siguientes ejemplos se muestra cómo implementar el proxy para escritura remota y para consultar datos desde Azure Monitor.
Nota
En este ejemplo se muestra cómo usar el proxy para autenticar solicitudes de escritura remota en un servicio administrado de Azure Monitor para Prometheus. La escritura remota de Prometheus tiene un coche lateral dedicado para la escritura remota, que es el método recomendado para implementar la escritura remota.
Antes de implementar el proxy, busque la identidad administrada y asígnele el rol Monitoring Metrics Publisher
para la regla de recopilación de datos del área de trabajo de Azure Monitor.
Busque la
clientId
para la identidad administrada del clúster de AKS. La identidad administrada se usa para autenticarse en el área de trabajo de Azure Monitor. La identidad administrada se crea cuando se crea el clúster de AKS.# Get the identity client_id az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile"
La salida tiene el siguiente formato:
{ "kubeletidentity": { "clientId": "abcd1234-1243-abcd-9876-1234abcd5678", "objectId": "12345678-abcd-abcd-abcd-1234567890ab", "resourceId": "/subscriptions/def0123-1243-abcd-9876-1234abcd5678/resourcegroups/MC_rg-proxytest-01_proxytest-01_eastus/providers/Microsoft.ManagedIdentity/userAssignedIdentities/proxytest-01-agentpool" }
Busque el identificador de regla de recopilación de datos (DCR) de su área de trabajo de Azure Monitor.
El nombre de la regla es el mismo que el nombre del área de trabajo. El nombre del grupo de recursos de la regla de recopilación de datos sigue el formato:MA_<workspace-name>_<REGION>_managed
, por ejemplo,MA_amw-proxytest_eastus_managed
. Use el siguiente comando para encontrar el ID de la regla de recopilación de datos:az monitor data-collection rule show --name <dcr-name> --resource-group <resource-group-name> --query "id"
Como alternativa, puede encontrar su ID de DCR y el punto de conexión de ingestión de métricas mediante Azure Portal en la página de información general del área de trabajo de Azure Monitor.
Seleccione la Regla recopilación de datos en la pestaña Información general del área de trabajo y, después, seleccione vista JSON para ver el identificador de recurso.
Asigne el rol
Monitoring Metrics Publisher
a laclientId
de la identidad administrada para que pueda escribir en la regla de recopilación de datos del área de trabajo de Azure Monitor.az role assignment create / --assignee <clientid> / --role "Monitoring Metrics Publisher" / --scope <workspace-dcr-id>
Por ejemplo:
az role assignment create \ --assignee abcd1234-1243-abcd-9876-1234abcd5678 \ --role "Monitoring Metrics Publisher" \ --scope /subscriptions/ef0123-1243-abcd-9876-1234abcd5678/resourceGroups/MA_amw-proxytest_eastus_managed/providers/Microsoft.Insights/dataCollectionRules/amw-proxytest
Use el siguiente archivo YAML para implementar el proxy para escritura remota. Modifique los parámetros siguientes:
TARGET_HOST
: host de destino al que desea reenviar la solicitud. Para enviar datos a un área de trabajo de Azure Monitor, use la parte del nombre de hostMetrics ingestion endpoint
desde la página Información general de las áreas de trabajo. Por ejemplo:http://amw-proxytest-abcd.eastus-1.metrics.ingest.monitor.azure.com
AAD_CLIENT_ID
: laclientId
de la identidad administrada usada que se asignó al rolMonitoring Metrics Publisher
.AUDIENCE
: para ingerir métricas en el área de trabajo de Azure Monitor, establezcaAUDIENCE
enhttps://monitor.azure.com/.default
.- Elimine
OTEL_GRPC_ENDPOINT
yOTEL_SERVICE_NAME
si no usa OpenTelemetry.
Para obtener más información acerca de los parámetros, vea la tabla Parámetros.
proxy-ingestion.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: azuremonitor-ingestion name: azuremonitor-ingestion namespace: observability spec: replicas: 1 selector: matchLabels: app: azuremonitor-ingestion template: metadata: labels: app: azuremonitor-ingestion name: azuremonitor-ingestion spec: containers: - name: aad-auth-proxy image: mcr.microsoft.com/azuremonitor/auth-proxy/prod/aad-auth-proxy/images/aad-auth-proxy:0.1.0-main-05-24-2023-b911fe1c imagePullPolicy: Always ports: - name: auth-port containerPort: 8081 env: - name: AUDIENCE value: https://monitor.azure.com/.default - name: TARGET_HOST value: http://<workspace-endpoint-hostname> - name: LISTENING_PORT value: "8081" - name: IDENTITY_TYPE value: userAssigned - name: AAD_CLIENT_ID value: <clientId> - name: AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE value: "10" - name: OTEL_GRPC_ENDPOINT value: <YOUR-OTEL-GRPC-ENDPOINT> # "otel-collector.observability.svc.cluster.local:4317" - name: OTEL_SERVICE_NAME value: <YOUE-SERVICE-NAME> livenessProbe: httpGet: path: /health port: auth-port initialDelaySeconds: 5 timeoutSeconds: 5 readinessProbe: httpGet: path: /ready port: auth-port initialDelaySeconds: 5 timeoutSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: azuremonitor-ingestion namespace: observability spec: ports: - port: 80 targetPort: 8081 selector: app: azuremonitor-ingestion
Implemente el proxy usando los comandos:
# create the namespace if it doesn't already exist kubectl create namespace observability kubectl apply -f proxy-ingestion.yaml -n observability
Como alternativa, puede implementar el proxy mediante Helm como se indica a continuación:
helm install aad-auth-proxy oci://mcr.microsoft.com/azuremonitor/auth-proxy/prod/aad-auth-proxy/helmchart/aad-auth-proxy \ --version 0.1.0-main-05-24-2023-b911fe1c \ -n observability \ --set targetHost=https://proxy-test-abc123.eastus-1.metrics.ingest.monitor.azure.com \ --set identityType=userAssigned \ --set aadClientId= abcd1234-1243-abcd-9876-1234abcd5678 \ --set audience=https://monitor.azure.com/.default
Configuración URL de la escritura remota.
El nombre de host de la dirección URL se compone del nombre del servicio de ingesta y del espacio de nombres en el siguiente formato<ingestion service name>.<namespace>.svc.cluster.local
. En este ejemplo, el host esazuremonitor-ingestion.observability.svc.cluster.local
.
Configure la ruta de la URL mediante la ruta deMetrics ingestion endpoint
desde la página de información general del área de trabajo de Azure Monitor. Por ejemplo,dataCollectionRules/dcr-abc123d987e654f3210abc1def234567/streams/Microsoft-PrometheusMetrics/api/v1/write?api-version=2021-11-01-preview
.prometheus: prometheusSpec: externalLabels: cluster: <cluster name to be used in the workspace> ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write ## remoteWrite: - url: "http://azuremonitor-ingestion.observability.svc.cluster.local/dataCollectionRules/dcr-abc123d987e654f3210abc1def234567/streams/Microsoft-PrometheusMetrics/api/v1/write?api-version=2021-11-01-preview"
Aplique la configuración de escritura remota.
Nota
Para obtener la versión más reciente de la imagen de proxy, consulte las notas de la versión
Comprobación de que el proxy está ingiriendo datos
Compruebe que el proxy ingiere correctamente las métricas comprobando los registros del pod o consultando el área de trabajo de Azure Monitor.
Ejecute los siguientes comandos para comprobar los registros del pod:
# Get the azuremonitor-ingestion pod ID
kubectl get pods -A | grep azuremonitor-ingestion
#Using the returned pod ID, get the logs
kubectl logs --namespace observability <pod ID> --tail=10
La ingesta correcta de métricas genera un registro con StatusCode=200
con aspecto similar al siguiente:
time="2023-05-16T08:47:27Z" level=info msg="Successfully sent request, returning response back." ContentLength=0 Request="https://amw-proxytest-05-t16w.eastus-1.metrics.ingest.monitor.azure.com/dataCollectionRules/dcr-688b6ed1f2244e098a88e32dde18b4f6/streams/Microsoft-PrometheusMetrics/api/v1/write?api-version=2021-11-01-preview" StatusCode=200
Para consultar el área de trabajo de Azure Monitor, siga estos pasos:
Parámetros
Parámetro de imagen | Nombre del parámetro del gráfico de Helm | Descripción | Valores admitidos | Mandatory |
---|---|---|---|---|
TARGET_HOST |
targetHost |
Host de destino al que desea reenviar la solicitud. Para enviar datos a un área de trabajo de Azure Monitor, use Metrics ingestion endpoint desde la página Información general de las áreas de trabajo. Al leer datos de un área de trabajo de Azure Monitor, use Query endpoint desde la página de Información general de las áreas de trabajo |
Sí | |
IDENTITY_TYPE |
identityType |
Tipo de identidad que se usa para autenticar solicitudes. Este proxy admite tres tipos de identidades. | systemassigned , userassigned , aadapplication |
Sí |
AAD_CLIENT_ID |
aadClientId |
ID de cliente de la identidad utilizada. Se usa para userassigned y aadapplication los tipos de identidad . Usar az aks show -g <AKS-CLUSTER-RESOURCE-GROUP> -n <AKS-CLUSTER-NAME> --query "identityProfile" para recuperar el identificador del cliente |
Sí para userassigned y aadapplication |
|
AAD_TENANT_ID |
aadTenantId |
ID de inquilino de la identidad utilizada. El identificador de inquilino se usa para los tipos de identidad aadapplication . |
Sí para aadapplication |
|
AAD_CLIENT_CERTIFICATE_PATH |
aadClientCertificatePath |
Ruta de acceso donde el proxy puede encontrar el certificado para aadapplication. Esta ruta debe ser accesible por proxy y debe ser un certificado pfx o pem que contenga una clave privada. | Solo para tipos de identidad aadapplication |
|
AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE |
aadTokenRefreshIntervalInMinutes |
El token se actualiza en función del porcentaje de tiempo hasta que expire el token. El valor predeterminado es un 10 % de tiempo antes de la expiración. | No | |
AUDIENCE |
audience |
Audiencia para el token | No | |
LISTENING_PORT |
listeningPort |
Proxy escuchando en este puerto | Sí | |
OTEL_SERVICE_NAME |
otelServiceName |
Nombre del servicio para seguimientos y métricas de OTEL. Valor predeterminado: aad_auth_proxy | No | |
OTEL_GRPC_ENDPOINT |
otelGrpcEndpoint |
El proxy envía la telemetría de OTEL a este punto de conexión. Valor predeterminado: http://localhost:4317 | No |
Solución de problemas
El contenedor proxy no se inicia.
Ejecute el siguiente comando para mostrar los errores del contenedor de proxy.kubectl --namespace <Namespace> describe pod <Prometheus-Pod-Name>`
El proxy no se inicia: errores de configuración
El proxy comprueba si hay una identidad válida para capturar un token durante el inicio. Si no se puede recuperar un token, se produce un error en el inicio. Los errores se registran y se pueden ver ejecutando el siguiente comando:
kubectl --namespace <Namespace> logs <Proxy-Pod-Name>
Salida de ejemplo:
time="2023-05-15T11:24:06Z" level=info msg="Configuration settings loaded:" AAD_CLIENT_CERTIFICATE_PATH= AAD_CLIENT_ID=abc123de-be75-4141-a1e6-abc123987def AAD_TENANT_ID= AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE=10 AUDIENCE="https://prometheus.monitor.azure.com" IDENTITY_TYPE=userassigned LISTENING_PORT=8082 OTEL_GRPC_ENDPOINT= OTEL_SERVICE_NAME=aad_auth_proxy TARGET_HOST=proxytest-01-workspace-orkw.eastus.prometheus.monitor.azure.com 2023-05-15T11:24:06.414Z [ERROR] TokenCredential creation failed:Failed to get access token: ManagedIdentityCredential authentication failed GET http://169.254.169.254/metadata/identity/oauth2/token -------------------------------------------------------------------------------- RESPONSE 400 Bad Request -------------------------------------------------------------------------------- { "error": "invalid_request", "error_description": "Identity not found" } --------------------------------------------------------------------------------