다음을 통해 공유


KEDA를 Azure Kubernetes Service 클러스터와 통합

KEDA는 Kubernetes 기반 이벤트 기반 자동 크기 조정기입니다. KEDA를 사용하면 Prometheus와 같은 시스템에서 메트릭을 쿼리하여 처리할 부하를 기준으로 Kubernetes의 컨테이너 크기를 조정할 수 있습니다. KEDA를 AKS(Azure Kubernetes Service) 클러스터와 통합하여 Azure Monitor 작업 영역의 Prometheus 메트릭을 기준으로 워크로드 크기를 조정합니다.

KEDA를 Azure Kubernetes Service에 통합하려면 클러스터에서 워크로드 ID 또는 Pod ID를 배포하고 구성해야 합니다. 이 ID를 사용하면 KEDA가 Azure로 인증하고 Monitor 작업 영역에서 크기 조정 메트릭을 검색할 수 있습니다.

이 문서에서는 워크로드 ID를 사용하여 KEDA를 AKS 클러스터에 통합하는 단계를 설명합니다.

참고 항목

Microsoft Entra 워크로드 ID를 사용하는 것이 좋습니다. 이 인증 방법은 Kubernetes 네이티브 기능과 통합되어 애플리케이션을 대신하여 외부 ID 공급자와 페더레이션하는 Pod 관리 ID(미리 보기)를 대체합니다.

Azure Kubernetes Service의 오픈 소스 Microsoft Entra Pod 관리 ID(미리 보기)는 2022년 10월 24일부터 사용되지 않으며 프로젝트는 2023년 9월에 보관됩니다. 자세한 내용은 사용 중단 알림을 참조하세요. AKS 관리 추가 기능은 2023년 9월에 더 이상 사용되지 않습니다.

Azure Managed Prometheus는 KEDA v2.10부터 지원됩니다. 이전 버전의 KEDA가 설치된 경우 Azure Managed Prometheus를 사용하려면 업그레이드해야 합니다.

필수 조건

워크로드 ID 설정

  1. 먼저 일부 환경 변수를 설정합니다. AKS 클러스터에 맞게 값을 변경합니다.

    export RESOURCE_GROUP="rg-keda-integration"
    export LOCATION="eastus"
    export SUBSCRIPTION="$(az account show --query id --output tsv)"
    export USER_ASSIGNED_IDENTITY_NAME="keda-int-identity"
    export FEDERATED_IDENTITY_CREDENTIAL_NAME="kedaFedIdentity" 
    export SERVICE_ACCOUNT_NAMESPACE="keda"
    export SERVICE_ACCOUNT_NAME="keda-operator"
    export AKS_CLUSTER_NAME="aks-cluster-name"
    
    • SERVICE_ACCOUNT_NAME - KEDA는 페더레이션된 자격 증명을 만드는 데 사용된 서비스 계정을 사용해야 합니다. 서비스 계정은 사용자 정의 이름일 수 있습니다.
    • AKS_CLUSTER_NAME - KEDA를 배포하려는 AKS 클러스터의 이름입니다.
    • SERVICE_ACCOUNT_NAMESPACE KEDA와 서비스 계정은 모두 동일한 네임스페이스에 있어야 합니다.
    • USER_ASSIGNED_IDENTITY_NAME은 KEDA를 위해 생성된 Microsoft Entra ID의 이름입니다.
    • FEDERATED_IDENTITY_CREDENTIAL_NAME은 KEDA에서 Azure로 인증하는 데 사용하기 위해 만든 자격 증명의 이름입니다.
  2. 워크로드 ID 또는 oidc-issuer를 사용하도록 설정하여 AKS 클러스터를 만들지 않은 경우 사용하도록 설정해야 합니다. 확실하지 않은 경우 다음 명령을 실행하여 사용하도록 설정되었는지 확인할 수 있습니다.

    az aks show --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query oidcIssuerProfile
    az aks show --resource-group $RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query securityProfile.workloadIdentity
    

    워크로드 ID 및 oidc-issuer를 사용하도록 설정하려면 다음 명령을 실행합니다.

    az aks update -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME --enable-workload-identity --enable-oidc-issuer
    
  3. 나중에 사용할 환경 변수에 OIDC 발급자 URL을 저장합니다.

    export AKS_OIDC_ISSUER="$(az aks show -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv)"
    
  4. KEDA에 대한 사용자 할당 ID를 만듭니다. 이 ID는 KEDA에서 Azure Monitor로 인증하는 데 사용됩니다.

     az identity create --name $USER_ASSIGNED_IDENTITY_NAME --resource-group $RESOURCE_GROUP --location $LOCATION --subscription $SUBSCRIPTION
    

    다음과 유사하게 출력됩니다.

    {
      "clientId": "abcd1234-abcd-abcd-abcd-9876543210ab",
      "id": "/subscriptions/abcdef01-2345-6789-0abc-def012345678/resourcegroups/rg-keda-integration/providers/Microsoft.    ManagedIdentity/userAssignedIdentities/keda-int-identity",
      "location": "eastus",
      "name": "keda-int-identity",
      "principalId": "12345678-abcd-abcd-abcd-1234567890ab",
      "resourceGroup": "rg-keda-integration",
      "systemData": null,
      "tags": {},
      "tenantId": "1234abcd-9876-9876-9876-abcdef012345",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  5. 나중에 사용할 환경 변수에 clientIdtenantId를 저장합니다.

    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group $RESOURCE_GROUP --name $USER_ASSIGNED_IDENTITY_NAME --query 'clientId' -otsv)"
    export TENANT_ID="$(az identity show --resource-group $RESOURCE_GROUP --name $USER_ASSIGNED_IDENTITY_NAME --query 'tenantId' -otsv)"
    
  6. 모니터링 데이터 판독기 역할을 Azure Monitor 작업 영역의 ID에 할당합니다. 이 역할을 사용하면 ID가 작업 영역에서 메트릭을 읽을 수 있습니다. Azure Monitor 작업 영역 리소스 그룹Azure Monitor 작업 영역 이름을 AKS 클러스터에서 메트릭을 수집하도록 구성된 Azure Monitor 작업 영역의 리소스 그룹 및 이름으로 바꿉니다.

    az role assignment create \
    --assignee $USER_ASSIGNED_CLIENT_ID \
    --role "Monitoring Data Reader" \
    --scope /subscriptions/$SUBSCRIPTION/resourceGroups/<Azure Monitor Workspace resource group>/providers/microsoft.monitor/accounts/<Azure monitor workspace name>
    
  7. KEDA 네임스페이스를 만든 다음, Kubernetes 서비스 계정을 만듭니다. 이 서비스 계정은 KEDA에서 Azure로 인증하는 데 사용됩니다.

    
    az aks get-credentials -n $AKS_CLUSTER_NAME -g $RESOURCE_GROUP
    
    kubectl create namespace keda
    
    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: $USER_ASSIGNED_CLIENT_ID
      name: $SERVICE_ACCOUNT_NAME
      namespace: $SERVICE_ACCOUNT_NAMESPACE
    EOF
    
  8. 실행하여 서비스 계정 확인

    kubectl describe serviceaccount $SERVICE_ACCOUNT_NAME -n keda
    
  9. 서비스 계정과 사용자가 할당한 ID 간에 페더레이션 자격 증명을 설정합니다. 페더레이션 자격 증명을 사용하면 서비스 계정에서 사용자가 할당한 ID를 사용하여 Azure로 인증할 수 있습니다.

    az identity federated-credential create --name $FEDERATED_IDENTITY_CREDENTIAL_NAME --identity-name $USER_ASSIGNED_IDENTITY_NAME --resource-group $RESOURCE_GROUP --issuer $AKS_OIDC_ISSUER --subject     system:serviceaccount:$SERVICE_ACCOUNT_NAMESPACE:$SERVICE_ACCOUNT_NAME --audience api://AzureADTokenExchange
    

    참고 항목

    페더레이션 ID 자격 증명이 처음 추가된 후 전파되는 데 몇 초 정도 걸립니다. 페더레이션 ID 자격 증명을 추가한 직후에 토큰 요청이 이루어진 경우 캐시가 이전 데이터와 디렉터리에 채워지기 때문에 몇 분 동안 실패할 수 있습니다. 이 문제를 방지하려면 페더레이션 ID 자격 증명을 추가한 후 약간의 지연을 추가하면 됩니다.

KEDA 배포

KEDA는 YAML 매니페스트, Helm 차트 또는 운영자 허브를 통해 배포될 수 있습니다. 이 문서에서는 Helm 차트를 사용합니다. KEDA 배포에 대한 자세한 내용은 KEDA 배포를 참조하세요.

helm 리포지토리 추가:

helm repo add kedacore https://kedacore.github.io/charts
helm repo update

다음 명령을 사용하여 KEDA를 배포합니다.

helm install keda kedacore/keda --namespace keda \
--set serviceAccount.create=false \
--set serviceAccount.name=keda-operator \
--set podIdentity.azureWorkload.enabled=true \
--set podIdentity.azureWorkload.clientId=$USER_ASSIGNED_CLIENT_ID \
--set podIdentity.azureWorkload.tenantId=$TENANT_ID

다음 명령을 실행하여 배포를 확인합니다.

kubectl get pods -n keda

다음과 유사하게 출력됩니다.

NAME                                               READY   STATUS    RESTARTS       AGE
keda-admission-webhooks-ffcb8f688-kqlxp            1/1     Running   0              4m
keda-operator-5d9f7d975-mgv7r                      1/1     Running   1 (4m ago)     4m
keda-operator-metrics-apiserver-7dc6f59678-745nz   1/1     Running   0              4m

스케일러

스케일러는 KEDA가 배포 크기를 조정하는 방법과 시기를 정의합니다. KEDA는 다양한 스케일러를 지원합니다. 스케일러에 대한 자세한 내용은 스케일러를 참조하세요. Azure Managed Prometheus는 기존 Prometheus 스케일러를 활용하여 Azure Monitor 작업 영역에서 Prometheus 메트릭을 검색합니다. 다음 yaml 파일은 Azure Managed Prometheus를 사용하는 예제입니다.

apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: azure-managed-prometheus-trigger-auth
spec:
  podIdentity:
      provider: azure-workload | azure # use "azure" for pod identity and "azure-workload" for workload identity
      identityId: <identity-id> # Optional. Default: Identity linked with the label set when installing KEDA.
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: azure-managed-prometheus-scaler
spec:
  scaleTargetRef:
    name: deployment-name-to-be-scaled
  minReplicaCount: 1
  maxReplicaCount: 20
  triggers:
  - type: prometheus
    metadata:
      serverAddress: https://test-azure-monitor-workspace-name-1234.eastus.prometheus.monitor.azure.com
      metricName: http_requests_total
      query: sum(rate(http_requests_total{deployment="my-deployment"}[2m])) # Note: query must return a vector/scalar single element response
      threshold: '100.50'
      activationThreshold: '5.5'
    authenticationRef:
      name: azure-managed-prometheus-trigger-auth
  • serverAddress는 Azure Monitor 작업 영역의 쿼리 엔드포인트입니다. 자세한 내용은 API 및 PromQL을 사용하여 Prometheus 메트릭 쿼리를 참조하세요.
  • metricName은 크기를 조정하려는 메트릭의 이름입니다.
  • query는 메트릭을 검색하는 데 사용되는 쿼리입니다.
  • threshold는 배포 크기가 조정되는 값입니다.
  • 사용 중인 ID 형식에 따라 podIdentity.provider를 설정합니다.

문제 해결

다음 섹션에서는 일반적인 이슈에 대한 문제 해결 팁을 제공합니다.

페더레이션 자격 증명

페더레이션 자격 증명이 전파되는 데 최대 10분이 걸릴 수 있습니다. KEDA에서 Azure로 인증하는 데 이슈가 발생하면 다음 단계를 수행해 봅니다.

다음 로그 발췌에서는 페더레이션 자격 증명의 오류를 보여줍니다.

kubectl logs -n keda keda-operator-5d9f7d975-mgv7r

{
 \"error\": \"unauthorized_client\",\n  \"error_description\": \"AADSTS70021: No matching federated identity record found for presented assertion. 
Assertion Issuer: 'https://eastus.oic.prod-aks.azure.com/abcdef01-2345-6789-0abc-def012345678/12345678-abcd-abcd-abcd-1234567890ab/'.
Assertion Subject: 'system:serviceaccount:keda:keda-operator'. 
Assertion Audience: 'api://AzureADTokenExchange'. https://docs.microsoft.com/azure/active-directory/develop/workload-identity-federation
Trace ID: 12dd9ea0-3a65-408f-a41f-5d0403a25100\\r\\nCorrelation ID: 8a2dce68-17f1-4f11-bed2-4bcf9577f2af\\r\\nTimestamp: 2023-05-30 11:11:53Z\",
\"error_codes\": [\n    70021\n  ],\n  \"timestamp\": \"2023-05-30 11:11:53Z\",
\"trace_id\": \"12345678-3a65-408f-a41f-5d0403a25100\",
\"correlation_id\": \"12345678-17f1-4f11-bed2-4bcf9577f2af\",
\"error_uri\": \"https://login.microsoftonline.com/error?code=70021\"\n}
\n--------------------------------------------------------------------------------\n"}

ServiceAccount를 만드는 데 사용되는 값과 az identity federated-credential create를 사용하여 만든 자격 증명을 확인하고 subject 값이 system:serviceaccount 값과 일치하는지 확인합니다.

Azure Monitor 작업 영역 권한

KEDA에서 Azure로 인증하는 데 이슈가 발생하면 Azure Monitor 작업 영역에 대한 권한을 확인합니다. 다음 로그 발췌에서는 ID에 Azure Monitor 작업 영역에 대한 읽기 권한이 없다는 것을 보여줍니다.

kubectl logs -n keda keda-operator-5d9f7d975-mgv7r

2023-05-30T11:15:45Z    ERROR   scale_handler   error getting metric for scaler 
{"scaledObject.Namespace": "default", "scaledObject.Name": "azure-managed-prometheus-scaler", "scaler": "prometheusScaler", 
"error": "prometheus query api returned error. status: 403 response: {\"status\":\"error\",
\"errorType\":\"Forbidden\",\"error\":\"User \\u0027abc123ab-1234-1234-abcd-abcdef123456
\\u0027 does not have access to perform any of the following actions 
\\u0027microsoft.monitor/accounts/data/metrics/read, microsoft.monitor/accounts/data/metrics/read
\\u0027 on resource \\u0027/subscriptions/abcdef01-2345-6789-0abc-def012345678/resourcegroups/rg-azmon-ws-01/providers/microsoft.monitor/accounts/azmon-ws-01\\u0027. RequestId: 123456c427f348258f3e5aeeefef834a\"}"}

ID에 Azure Monitor 작업 영역에 대한 Monitoring Data Reader 역할이 있는지 확인합니다.