Azure Kubernetes Service (AKS) で KEDA アドオンとワークロード ID を使用してアプリケーションを安全にスケーリングする

この記事では、Azure Kubernetes Service (AKS) で Kubernetes Event-driven Autoscaling (KEDA) アドオンとワークロード ID を使用して、アプリケーションを安全にスケーリングする方法について説明します。

重要

クラスター Kubernetes バージョンによって、AKS クラスターにインストールされる KEDA のバージョンが決まります。 各 AKS バージョンに対応する KEDA バージョンを確認するには、Kubernetes コンポーネント バージョン テーブルAKS マネージド アドオン列を参照してください。

GA Kubernetes バージョンの場合は、AKS はテーブル内の対応する KEDA マイナー バージョンを完全にサポートします。 Kubernetes プレビュー バージョンと最新の KEDA パッチは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

開始する前に

リソース グループを作成する

  • az group create コマンドを使用して、リソース グループを作成します。 プレースホルダーの値は、実際の値に置き換えてください。

    LOCATION=<azure-region>
    RG_NAME=<resource-group-name>
    
    az group create --name $RG_NAME --location $LOCATION
    

AKS クラスターを作成する

  1. --enable-workload-identity--enable-keda--enable-oidc-issuer フラグを指定した az aks create コマンドを使用して、KEDA アドオン、ワークロード ID、OIDC 発行者が有効な AKS クラスターを作成します。 プレースホルダーの値は、実際の値に置き換えてください。

    AKS_NAME=<cluster-name>
    
    az aks create \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --enable-workload-identity \
        --enable-oidc-issuer \
        --enable-keda \
        --generate-ssh-keys 
    
  2. デプロイが成功したことを検証し、--query フラグを "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]" に設定した az aks show コマンドを使用して、クラスターで KEDA、ワークロード ID、OIDC 発行者が有効になっていることを確認します。

    az aks show \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --query "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]"
    
  3. az aks get-credentials コマンドを使用してクラスターに接続します。

    az aks get-credentials \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --overwrite-existing
    

Azure Service Bus を作成する

  1. az servicebus namespace create コマンドを使用して Azure Service Bus 名前空間を作成します。 プレースホルダーの値は、実際の値に置き換えてください。

    SB_NAME=<service-bus-name>
    SB_HOSTNAME="${SB_NAME}.servicebus.windows.net"
    
    az servicebus namespace create \
        --name $SB_NAME \
        --resource-group $RG_NAME \
        --disable-local-auth
    
  2. az servicebus queue create コマンドを使用して Azure Service Bus キューを作成します。 プレースホルダーの値は、実際の値に置き換えてください。

    SB_QUEUE_NAME=<service-bus-queue-name>
    
    az servicebus queue create \
        --name $SB_QUEUE_NAME \
        --namespace $SB_NAME \
        --resource-group $RG_NAME
    

マネージド ID の作成

  1. az identity create コマンドを使用して、マネージド ID を作成します。 プレースホルダーの値は、実際の値に置き換えてください。

    MI_NAME=<managed-identity-name>
    
    MI_CLIENT_ID=$(az identity create \
        --name $MI_NAME \
        --resource-group $RG_NAME \
        --query "clientId" \
        --output tsv)
    
  2. --query フラグを oidcIssuerProfile.issuerUrl に設定した az aks showコマンドを使用して OIDC 発行者 URL を取得します。

    AKS_OIDC_ISSUER=$(az aks show \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --query oidcIssuerProfile.issuerUrl \
        --output tsv)
    
  3. az identity federated-credential create コマンドを使用して、マネージド ID と、ワークロードで使用される名前空間とサービス アカウントの間にフェデレーション資格情報を作成します。 プレースホルダーの値は、実際の値に置き換えてください。

    FED_WORKLOAD=<federated-credential-workload-name>
    
    az identity federated-credential create \
        --name $FED_WORKLOAD \
        --identity-name $MI_NAME \
        --resource-group $RG_NAME \
        --issuer $AKS_OIDC_ISSUER \
        --subject system:serviceaccount:default:$MI_NAME \
        --audience api://AzureADTokenExchange
    
  4. az identity federated-credential create コマンドを使用して、マネージド ID と、keda-operator が使用する名前空間とサービス アカウントの間に 2 つ目のフェデレーション資格情報を作成します。 プレースホルダーの値は、実際の値に置き換えてください。

    FED_KEDA=<federated-credential-keda-name>
    
    az identity federated-credential create \
        --name $FED_KEDA \
        --identity-name $MI_NAME \
        --resource-group $RG_NAME \
        --issuer $AKS_OIDC_ISSUER \
        --subject system:serviceaccount:kube-system:keda-operator \
        --audience api://AzureADTokenExchange
    

ロールの割り当ての作成

  1. --query フラグを "principalId" に設定した az identity show コマンドを使用して、マネージド ID のオブジェクト ID を取得します。

    MI_OBJECT_ID=$(az identity show \
        --name $MI_NAME \
        --resource-group $RG_NAME \
        --query "principalId" \
        --output tsv)
    
  2. --query フラグを "id" に設定した az servicebus namespace show コマンドを使用して Service Bus 名前空間リソース ID を取得します。

    SB_ID=$(az servicebus namespace show \
        --name $SB_NAME \
        --resource-group $RG_NAME \
        --query "id" \
        --output tsv)
    
  3. az role assignment create コマンドを使用して、マネージド ID に Azure Service Bus のデータ所有者ロールを割り当てます。

    az role assignment create \
        --role "Azure Service Bus Data Owner" \
        --assignee-object-id $MI_OBJECT_ID \
        --assignee-principal-type ServicePrincipal \
        --scope $SB_ID
    

KEDA オペレーターでワークロード ID を有効にする

  1. keda-operator ServiceAccount のフェデレーション資格情報を作成した後、ワークロード ID 環境変数がポッドに挿入されるように、keda-operator ポッドを手動で再起動する必要があります。

    kubectl rollout restart deploy keda-operator -n kube-system
    
  2. keda-operator ポッドの再起動を確認する

    kubectl get pod -n kube-system -lapp=keda-operator -w
    
  3. keda-operator ポッドがローリングを完了したことを確認したら、Ctrl+c を押して前回のウォッチ コマンドを中断し、ワークロード ID 環境変数が挿入されていることを確認します。

    KEDA_POD_ID=$(kubectl get po -n kube-system -l app.kubernetes.io/name=keda-operator -ojsonpath='{.items[0].metadata.name}')
    kubectl describe po $KEDA_POD_ID -n kube-system
    
  4. Environment の下に次のような出力が表示されます。

    ---
    AZURE_CLIENT_ID:
    AZURE_TENANT_ID:               xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
    AZURE_FEDERATED_TOKEN_FILE:    /var/run/secrets/azure/tokens/azure-identity-token
    AZURE_AUTHORITY_HOST:          https://login.microsoftonline.com/
    ---
    
  5. ユーザー割り当てマネージド ID のクライアント ID を含む KEDA TriggerAuthentication リソースをデプロイします。

    kubectl apply -f - <<EOF
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: azure-servicebus-auth
      namespace: default  # this must be same namespace as the ScaledObject/ScaledJob that will use it
    spec:
      podIdentity:
        provider:  azure-workload
        identityId: $MI_CLIENT_ID
    EOF
    

    Note

    TriggerAuthentication を設定すると、KEDA はワークロード ID を介して認証できるようになります。 keda-operator ポッドは、スケーリング トリガーを評価するときに、identityId を使用して Azure リソースに対する認証を行います。

Azure Service Bus にメッセージを発行する

この時点で、KEDA と Microsoft Entra ワークロード ID を使用したスケーリング用にすべてが構成されます。 これを、プロデューサーとコンシューマーのワークロードをデプロイしてテストします。

  1. ワークロードの新しい ServiceAccount を作成します。

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: $MI_CLIENT_ID
      name: $MI_NAME
    EOF
    
  2. 100 件のメッセージを発行するジョブをデプロイします。

    kubectl apply -f - <<EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: myproducer
    spec:
      template:
        metadata:
          labels:
            azure.workload.identity/use: "true"
        spec:
          serviceAccountName: $MI_NAME
          containers:
          - image: ghcr.io/azure-samples/aks-app-samples/servicebusdemo:latest
            name: myproducer
            resources: {}
            env:
            - name: OPERATION_MODE
              value: "producer"
            - name: MESSAGE_COUNT
              value: "100"
            - name: AZURE_SERVICEBUS_QUEUE_NAME
              value: $SB_QUEUE_NAME
            - name: AZURE_SERVICEBUS_HOSTNAME
              value: $SB_HOSTNAME
          restartPolicy: Never
    EOF
    

Azure Service Bus からのメッセージを使用する

Azure Service Bus キューにメッセージを発行したので、メッセージを使用する ScaledJob を展開します。 この ScaledJob は、KEDA TriggerAuthentication リソースを使用し、ワークロード ID を使用して Azure Service Bus キューに対して認証し、10 メッセージごとにスケールアウトします。

  1. メッセージを使用する ScaledJob リソースをデプロイします。 スケール トリガーは、10 メッセージごとにスケールアウトするように構成されます。 KEDA スケーラーは、100 件のメッセージを使用する 10 個のジョブを作成します。

    kubectl apply -f - <<EOF
    apiVersion: keda.sh/v1alpha1
    kind: ScaledJob
    metadata:
      name: myconsumer-scaledjob
    spec:
      jobTargetRef:
        template:
          metadata:
            labels:
              azure.workload.identity/use: "true"
          spec:
            serviceAccountName: $MI_NAME
            containers:
            - image: ghcr.io/azure-samples/aks-app-samples/servicebusdemo:latest
              name: myconsumer
              env:
              - name: OPERATION_MODE
                value: "consumer"
              - name: MESSAGE_COUNT
                value: "10"
              - name: AZURE_SERVICEBUS_QUEUE_NAME
                value: $SB_QUEUE_NAME
              - name: AZURE_SERVICEBUS_HOSTNAME
                value: $SB_HOSTNAME
            restartPolicy: Never
      triggers:
      - type: azure-servicebus
        metadata:
          queueName: $SB_QUEUE_NAME
          namespace: $SB_NAME
          messageCount: "10"
        authenticationRef:
          name: azure-servicebus-auth
    EOF
    

    Note

    ScaledJob では、スケーリング イベントが発生するたびに Kubernetes Job リソースが作成されるため、リソースの作成時にジョブ テンプレートを渡す必要があります。 新しいジョブが作成されると、メッセージを使用するために、ワークロード ID ビットを使用してポッドがデプロイされます。

  2. KEDA スケーラーが意図したとおりに動作したことを確認します。

    kubectl describe scaledjob myconsumer-scaledjob
    
  3. 次のようなイベントが表示されるはずです。

    Events:
    Type     Reason              Age   From           Message
    ----     ------              ----  ----           -------
    Normal   KEDAScalersStarted  10m   scale-handler  Started scalers watch
    Normal   ScaledJobReady      10m   keda-operator  ScaledJob is ready for scaling
    Warning  KEDAScalerFailed    10m   scale-handler  context canceled
    Normal   KEDAJobsCreated     10m   scale-handler  Created 10 jobs
    

リソースをクリーンアップする

デプロイが成功したことを確認したら、Azure のコストが発生しないようにリソースをクリーンアップできます。

  1. [az group delete][az-group-delete] コマンドを使用して、Azure リソース グループとその中のすべてのリソースを削除します。

    az group delete --name $RG_NAME --yes --no-wait
    

次のステップ

この記事では、AKS の KEDA アドオンとワークロード ID を使用して、アプリケーションを安全にスケーリングする方法について説明しました。

KEDA のトラブルシューティングについては、Kubernetes Event-driven Autoscaling (KEDA) アドオンのトラブルシューティングに関する記事を参照してください。

KEDA の詳細については、アップストリーム KEDA のドキュメントを参照してください。