다음을 통해 공유


Microsoft Entra 인증을 사용하여 Prometheus 데이터를 Azure Monitor로 보내기

이 문서에서는 Microsoft Entra 인증 및 Azure Monitor가 제공하는 사이드카 컨테이너를 사용하여 AKS(Azure Kubernetes Service) 클러스터 또는 Azure Arc 지원 Kubernetes 클러스터에서 실행되는 자체 관리되는 Prometheus 서버에서 데이터를 전송하도록 원격 쓰기를 설정하는 방법을 설명합니다. Prometheus 구성에서 원격 쓰기를 직접 구성할 수도 있습니다.

참고 항목

Azure Monitor 작업 영역에 원격으로 쓰기 위해 Kubernetes 클러스터에서 실행되는 Prometheus를 직접 구성하는 것이 좋습니다. 자세한 내용은 Microsoft Entra ID 인증을 사용하여 Azure Monitor에 Prometheus 데이터 보내기를 참조하세요. 아래 단계에서는 Azure Monitor 측면 사이드카 컨테이너를 사용합니다.

클러스터 구성

이 문서는 다음 클러스터 구성에 적용됩니다.

  • Azure Kubernetes Service 클러스터
  • Azure Arc 지원 Kubernetes 클러스터
  • 다른 클라우드나 온-프레미스에서 실행되는 Kubernetes 클러스터

참고 항목

AKS 클러스터나 Azure Arc 지원 Kubernetes 클러스터의 경우 관리 ID 인증을 사용하는 것이 좋습니다. 자세한 내용은 관리 ID에 대한 Prometheus 원격 쓰기용 Azure Monitor 관리 서비스를 참조하세요.

필수 조건

지원되는 버전

  • Microsoft Entra ID 애플리케이션 인증을 위해서는 v2.48 이상의 Prometheus 버전이 필요합니다.

Azure Monitor 작업 영역

이 문서에서는 Prometheus 메트릭을 Azure Monitor 작업 영역으로 보내는 방법을 다룹니다. Azure Monitor 작업 영역을 만들려면 Azure Monitor 작업 영역 관리를 참조하세요.

사용 권한

이 문서의 단계를 완료하려면 클러스터 또는 리소스에 대한 관리자 권한이 필요합니다.

Microsoft Entra ID 애플리케이션 설정

Microsoft Entra 인증을 사용하여 애플리케이션에 Prometheus 원격 쓰기를 설정하는 프로세스에서는 다음 작업을 완료해야 합니다.

  1. Microsoft Entra ID로 애플리케이션을 등록합니다.
  2. Microsoft Entra 애플리케이션의 클라이언트 ID를 가져옵니다.
  3. 작업 영역 데이터 수집 규칙에 대한 모니터링 메트릭 게시자 역할을 애플리케이션에 할당합니다.
  4. Azure Key Vault를 만들고 인증서를 생성합니다.
  5. 인증서를 Microsoft Entra 애플리케이션에 추가합니다.
  6. 클러스터용 CSI 드라이버와 스토리지를 추가합니다.
  7. 사이드카 컨테이너를 배포하여 원격 쓰기를 설정합니다.

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

Microsoft Entra ID를 사용하여 애플리케이션 등록

Microsoft Entra ID로 애플리케이션을 등록하고 서비스 주체 만들기 단계를 완료합니다.

Microsoft Entra 애플리케이션의 클라이언트 ID 가져오기

  1. Azure Portal에서 Microsoft Entra ID 메뉴로 이동하고 앱 등록을 선택합니다.
  2. 애플리케이션 목록에서 등록된 애플리케이션의 애플리케이션(클라이언트) ID 값을 복사합니다.

Microsoft Entra 애플리케이션의 애플리케이션 또는 클라이언트 ID를 보여 주는 스크린샷.

작업 영역 데이터 수집 규칙에 대한 모니터링 메트릭 게시자 역할을 애플리케이션에 할당

Azure Monitor 작업 영역과 연결된 데이터 수집 규칙에 대한 모니터링 메트릭 게시자 역할을 애플리케이션에 할당해야 합니다.

  1. Azure Monitor 작업 영역에 대한 리소스 메뉴에서 개요를 선택합니다. 데이터 수집 규칙의 경우 링크를 선택합니다.

    Azure Monitor 작업 영역에서 사용하는 데이터 수집 규칙을 보여 주는 스크린샷.

  2. 데이터 수집 규칙의 리소스 메뉴에서 액세스 제어(IAM)를 선택합니다.

  3. 추가를 선택한 다음 역할 할당 추가를 선택합니다.

    액세스 제어 페이지에 역할 할당을 추가하는 것을 보여 주는 스크린샷.

  4. 모니터링 메트릭 게시자 역할을 선택하고 다음을 선택합니다.

    역할 할당 목록을 보여 주는 스크린샷.

  5. 사용자, 그룹 또는 서비스 주체를 선택한 다음, 구성원 선택을 선택합니다. 만든 애플리케이션을 선택한 다음, 선택을 선택합니다.

    애플리케이션 선택을 보여 주는 스크린샷.

  6. 역할 할당을 완료하려면 검토 + 할당을 선택합니다.

Azure Key Vault 및 인증서 생성

  1. Azure Key Vault가 아직 없으면 자격 증명 모음을 만듭니다.
  2. Key Vault에 인증서 추가의 지침을 수행하여 인증서를 만듭니다.
  3. Key Vault에서 인증서 내보내기의 지침을 수행하여 인증서를 CER 형식으로 다운로드합니다.

Microsoft Entra 애플리케이션에 인증서 추가

  1. Microsoft Entra 애플리케이션의 리소스 메뉴에서 인증서 및 비밀을 선택합니다.

  2. 인증서 탭을 클릭하고 인증서 업로드를 선택하고 다운로드한 인증서를 선택합니다.

    Microsoft Entra 애플리케이션에 대한 인증서 업로드를 보여 주는 스크린샷.

Warning

인증서에 만료 날짜가 있습니다. 사용자가 인증서를 유효한 상태로 유지해야 합니다.

클러스터용 CSI 드라이버 및 스토리지 추가

참고 항목

Azure Key Vault CSI 드라이버 구성은 Pod에 탑재된 인증서를 가져오는 유일한 방법입니다. 원격 쓰기 컨테이너에는 사이드카 컨테이너를 배포하여 원격 쓰기 설정 단계의 <AZURE_CLIENT_CERTIFICATE_PATH> 값 전용 Pod의 인증서에 대한 로컬 경로가 필요합니다.

이 단계는 클러스터를 만들 때 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자를 사용하도록 설정하지 않은 경우에만 필요합니다.

  1. 클러스터에 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자를 사용하도록 설정하려면 다음 Azure CLI 명령을 실행합니다.

    az aks enable-addons --addons azure-keyvault-secrets-provider --name <aks-cluster-name> --resource-group <resource-group-name>
    
  2. ID에 키 자격 증명 모음에 대한 액세스 권한을 부여하려면 다음 명령을 실행합니다.

    # 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>
    
  3. secretproviderclass.yml 파일에 다음 YAML을 저장하여 SecretProviderClass를 만듭니다. 키 자격 증명 모음에서 검색할 userAssignedIdentityID, keyvaultName, tenantId 및 개체의 값을 바꿉니다. 사용할 값에 대한 자세한 내용은 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자에 액세스하기 위한 ID 제공을 참조하세요.

    # 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
    
  4. 클러스터에서 다음 명령을 실행하여 SecretProviderClass를 적용합니다.

    kubectl apply -f secretproviderclass.yml
    

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

  1. 다음 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>'
    
  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 작업 영역에 대한 개요 페이지의 메트릭 수집 엔드포인트 값.
    <APP-REGISTRATION -CLIENT-ID> 애플리케이션의 클라이언트 ID
    <TENANT-ID> Microsoft Entra 애플리케이션의 테넌트 ID
    <CERT-NAME> 인증서의 이름입니다.
    <CLUSTER-NAME> Prometheus가 실행 중인 클러스터의 이름
  3. Azure Cloud Shell을 열고 YAML 파일을 업로드합니다.

  4. 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> 
    

확인 및 문제 해결

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

다음 단계