Partager via


Mettre à l’échelle vos applications en toute sécurité à l’aide du module complémentaire KEDA et d’une identité de charge de travail sur Azure Kubernetes Service (AKS)

Cet article vous montre comment mettre à l’échelle vos applications en toute sécurité avec le module complémentaire KEDA (Kubernetes Event-driven Autoscaling) et une identité de charge de travail sur Azure Kubernetes Service (AKS).

Important

La version Kubernetes de votre cluster détermine la version KEDA installée sur votre cluster AKS. Pour voir la version KEDA mappée à chaque version AKS, consultez la colonne Modules complémentaires gérés par AKS du tableau des versions de composant Kubernetes.

Pour les versions Kubernetes GA, AKS offre une prise en charge complète de la version mineure KEDA correspondante dans le tableau. Les préversions de Kubernetes et le dernier patch KEDA sont partiellement couverts par le service client, dans la mesure du possible. Telles quelles, ces fonctionnalités ne sont pas destinées à une utilisation en production. Pour plus d’informations, consultez les articles de support suivants :

Avant de commencer

Créer un groupe de ressources

  • Créez un groupe de ressources avec la commande az group create. Veillez à remplacer les valeurs d’espace réservé par vos propres valeurs.

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

Créer un cluster AKS

  1. Créez un cluster AKS avec le module complémentaire KEDA, une identité de charge de travail et un émetteur OIDC activés en utilisant la commande az aks create avec les indicateurs --enable-workload-identity, --enable-keda et --enable-oidc-issuer. Veillez à remplacer la valeur d’espace réservé par votre propre valeur.

    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. Vérifiez que le déploiement a réussi et que le cluster a KEDA, une identité de charge de travail et un émetteur OIDC activés en utilisant la commande az aks show avec l’indicateur --query défini sur "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]".

    az aks show \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --query "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]"
    
  3. Connectez-vous au cluster en utilisant la commande az aks get-credentials.

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

Créer une instance Azure Service Bus

  1. Créez un espace de noms Azure Service Bus à l’aide de la commande az servicebus namespace create. Veillez à remplacer la valeur d’espace réservé par votre propre valeur.

    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. Créez une file d’attente Azure Service Bus à l’aide de la commande az servicebus queue create. Veillez à remplacer la valeur d’espace réservé par votre propre valeur.

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

Créer une identité managée

  1. Créez une identité managée à l’aide de la commande az identity create. Veillez à remplacer la valeur d’espace réservé par votre propre valeur.

    MI_NAME=<managed-identity-name>
    
    MI_CLIENT_ID=$(az identity create \
        --name $MI_NAME \
        --resource-group $RG_NAME \
        --query "clientId" \
        --output tsv)
    
  2. Obtenez l’URL de l’émetteur OIDC en utilisant la commande az aks show avec l’indicateur --query défini sur oidcIssuerProfile.issuerUrl.

    AKS_OIDC_ISSUER=$(az aks show \
        --name $AKS_NAME \
        --resource-group $RG_NAME \
        --query oidcIssuerProfile.issuerUrl \
        --output tsv)
    
  3. Créez des informations d’identification fédérées entre l’identité managée et l’espace de noms et le compte de service utilisés par la charge de travail à l’aide de la commande az identity federated-credential create. Veillez à remplacer la valeur d’espace réservé par votre propre valeur.

    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. Créez d’autres informations d’identification fédérées entre l’identité managée et l’espace de noms et le compte de service utilisés par keda-operator à l’aide de la commande az identity federated-credential create. Veillez à remplacer la valeur d’espace réservé par votre propre valeur.

    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
    

Créer des attributions de rôles

  1. Obtenez l’ID d’objet de l’identité managée en utilisant la commande az identity show avec l’indicateur --query défini sur "principalId".

    MI_OBJECT_ID=$(az identity show \
        --name $MI_NAME \
        --resource-group $RG_NAME \
        --query "principalId" \
        --output tsv)
    
  2. Obtenez l’ID de ressource de l’espace de noms Service Bus en utilisant la commande az servicebus namespace show avec l’indicateur --query défini sur "id".

    SB_ID=$(az servicebus namespace show \
        --name $SB_NAME \
        --resource-group $RG_NAME \
        --query "id" \
        --output tsv)
    
  3. Attribuez le rôle Propriétaire de données Azure Service Bus à l’identité managée en utilisant la commande az role assignment create.

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

Activer l’identité de charge de travail sur l’opérateur KEDA

  1. Après avoir créé les informations d’identification fédérées pour le ServiceAccount keda-operator, vous devez redémarrer manuellement les pods keda-operator pour vous assurer que les variables d’environnement de l’identité de charge de travail sont injectées dans le pod.

    kubectl rollout restart deploy keda-operator -n kube-system
    
  2. Confirmer le redémarrage des pods keda-operator

    kubectl get pod -n kube-system -lapp=keda-operator -w
    
  3. Une fois que vous avez confirmé que les pods keda-operator ont fini de redémarrer, appuyez sur Ctrl+c pour arrêter la commande espion précédente, puis confirmez que les variables d’environnement de l’identité de charge de travail ont été injectées.

    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. Vous devriez obtenir une sortie similaire à la suivante sous Environnement.

    ---
    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. Déployez une ressource KEDA TriggerAuthentication qui inclut l’ID client de l’identité managée affectée par l’utilisateur.

    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
    

    Remarque

    Avec triggerAuthentication en place, KEDA pourra s’authentifier via l’identité de charge de travail. Les pods keda-operator utilisent identityId pour s’authentifier auprès des ressources Azure lors de l’évaluation des déclencheurs de mise à l’échelle.

Publier des messages dans Azure Service Bus

À ce stade, tout est configuré pour la mise à l’échelle avec KEDA et l’identité de charge de travail Microsoft Entra. Nous allons tester cela en déployant des charges de travail de producteur et de consommateur.

  1. Créez un ServiceAccount pour les charges de travail.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: $MI_CLIENT_ID
      name: $MI_NAME
    EOF
    
  2. Déployez un travail pour publier 100 messages.

    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
    

Consommer des messages dans Azure Service Bus

Maintenant que nous avons publié des messages dans la file d’attente Azure Service Bus, nous allons déployer un ScaledJob pour consommer les messages. Ce ScaledJob utilise la ressource KEDA TriggerAuthentication pour s’authentifier auprès de la file d’attente Azure Service Bus à l’aide de l’identité de la charge de travail et effectuer un scale-out tous les 10 messages.

  1. Déployez une ressource ScaledJob pour consommer les messages. Le déclencheur de mise à l’échelle est configuré pour effectuer un scale-out tous les 10 messages. Le scaler KEDA crée 10 travaux pour consommer les 100 messages.

    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
    

    Remarque

    ScaledJob crée une ressource de travail Kubernetes chaque fois qu’un événement de mise à l’échelle se produit, donc un modèle de travail doit être transmis lors de la création de la ressource. À mesure que de nouveaux travaux sont créés, les pods sont déployés avec les données de l’identité de charge de travail pour consommer les messages.

  2. Vérifiez que le scaler KEDA a fonctionné comme prévu.

    kubectl describe scaledjob myconsumer-scaledjob
    
  3. Vous devriez voir des événements similaires à ce qui suit.

    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
    

Nettoyer les ressources

Après avoir vérifié que le déploiement est effectué, vous pouvez nettoyer les ressources pour éviter les coûts liés à Azure.

  1. Supprimez le groupe de ressources Azure et toutes ses ressources à l’aide de la commande [az group delete][az-group-delete].

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

Étapes suivantes

Cet article vous a montré comment mettre à l’échelle vos applications en toute sécurité à l’aide du module complémentaire KEDA et d’une identité de charge de travail dans AKS.

Pour plus d’informations sur la résolution des problèmes KEDA, consultez Résoudre les problèmes du module complémentaire Kubernetes Event-driven Autoscaling (KEDA).

Pour en savoir plus sur KEDA, consultez la documentation KEDA en amont.