다음을 통해 공유


Microsoft Entra 워크로드 ID 인증을 사용하여 Azure Monitor에 Prometheus 데이터 보내기

이 문서에서는 Microsoft Entra 워크로드 ID 인증을 사용하여 Azure Monitor 관리형 Prometheus 클러스터에서 데이터를 보내도록 원격 쓰기를 설정하는 방법을 설명합니다.

필수 조건

  • Microsoft Entra ID 애플리케이션 인증을 위해서는 v2.48 이상의 Prometheus 버전이 필요합니다.
  • 클러스터에서 실행되는 Prometheus입니다. 이 문서에서는 kube-prometheus 스택을 사용하여 Prometheus 클러스터를 설정한다고 가정하지만 다른 메서드를 사용하여 Prometheus를 설정할 수도 있습니다.

Microsoft Entra 워크로드 ID 사용하여 원격 쓰기 설정

Microsoft Entra 워크로드 ID 인증을 사용하여 Prometheus 원격 쓰기를 설정하는 프로세스에는 다음 작업이 완료됩니다.

  1. OpenID Connect를 사용하도록 설정하고 발급자 URL을 확인합니다.
  2. 변경 허용 웹후크를 설정합니다.
  3. 워크로드 ID를 설정합니다.
  4. Microsoft Entra 애플리케이션 또는 사용자 할당 관리 ID를 만들고 권한을 부여합니다.
  5. 작업 영역 데이터 수집 규칙에 대한 모니터링 메트릭 게시자 역할을 애플리케이션에 할당합니다.
  6. Kubernetes 서비스 계정 Prometheus Pod를 만들거나 업데이트합니다.
  7. ID와 서비스 계정 발급자 및 주체 간에 페더레이션 ID 자격 증명을 설정합니다.
  8. 사이드카 컨테이너를 배포하여 원격 쓰기를 설정합니다.

해당 작업은 다음 섹션에서 설명합니다.

OpenID Connect를 사용하도록 설정하고 발급자를 쿼리합니다.

AKS 클러스터에서 OIDC(OpenID Connect)를 사용하도록 설정하려면 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를 참조하세요.

변경 허용 웹후크 설정

페더레이션된 자격 증명을 최신 상태로 유지하도록 변경 허용 웹후크를 설정합니다. 설정하려면 허용 웹후크 변경 - 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 Pod와 연결되어 있는지 확인합니다. Prometheus Pod의 spec에서 serviceaccountName 또는 serviceAccount(사용되지 않음) 값을 찾습니다. 이 값이 있는 경우 사용합니다. Prometheus Pod와 연결된 서비스 계정을 찾으려면 아래 kubectl 명령을 실행합니다.

kubectl get pods/<Promethuespodname> -o yaml

serviceaccountNameserviceAccount가 없는 경우 Prometheus Pod와 연결할 서비스 계정의 이름을 입력합니다.

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 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 애플리케이션 또는 사용자 할당 관리 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

사이드카 컨테이너를 배포하여 원격 쓰기 설정

Important

Prometheus Pod에는 azure.workload.identity/use: "true" 레이블이 있어야 합니다.

원격 쓰기 사이드카 컨테이너에는 다음 환경 값이 필요합니다.

  • INGESTION_URL: Azure Monitor 작업 영역에 대한 개요 페이지에 표시되는 메트릭 수집 엔드포인트
  • LISTENING_PORT: 8081(모든 포트가 지원됨)
  • 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에서 다음 값을 바꿉니다.

    설명
    <CLUSTER-NAME> AKS 클러스터의 이름.
    <CONTAINER-IMAGE-VERSION> mcr.microsoft.com/azuremonitor/containerinsights/ciprod/prometheus-remote-write/images:prom-remotewrite-20240617.1
    원격 쓰기 컨테이너 이미지 버전
    <INGESTION-URL> Azure Monitor 작업 영역에 대한 개요 페이지의 메트릭 수집 엔드포인트 값.
  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> 
    

확인 및 문제 해결

확인 및 문제 해결 정보는 원격 쓰기 문제 해결Azure Monitor Prometheus용 관리 서비스 원격 쓰기를 참조하세요.

다음 단계