Bezpieczne skalowanie aplikacji przy użyciu tożsamości dodatku KEDA i obciążenia w usłudze Azure Kubernetes Service (AKS)
W tym artykule pokazano, jak bezpiecznie skalować aplikacje za pomocą dodatku Kubernetes Event-driven Autoscaling (KEDA) i tożsamości obciążenia w usłudze Azure Kubernetes Service (AKS).
Ważne
Wersja klastra Kubernetes określa, jaka wersja KEDA zostanie zainstalowana w klastrze usługi AKS. Aby zobaczyć, która wersja KEDA jest mapowana na każdą wersję usługi AKS, zobacz kolumnę AKS managed add-ons ( Dodatki zarządzane przez usługę AKS) tabeli wersji składnika Kubernetes.
W przypadku wersji ogólnodostępnych platformy Kubernetes usługa AKS oferuje pełną obsługę odpowiedniej wersji pomocniczej KEDA w tabeli. Wersje wersji zapoznawczej platformy Kubernetes i najnowsza poprawka KEDA są częściowo objęte pomocą techniczną dla klientów. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:
Zanim rozpoczniesz
- Wymagana jest subskrypcja platformy Azure. Jeśli nie masz subskrypcji Azure, możesz utworzyć bezpłatne konto Azure.
- Potrzebny jest zainstalowany interfejs wiersza polecenia platformy Azure.
- Upewnij się, że masz skonfigurowane reguły zapory umożliwiające dostęp do serwera interfejsu API Kubernetes. Aby uzyskać więcej informacji, zobacz Reguły sieci wychodzącej i nazwy FQDN dla klastrów usługi Azure Kubernetes Service (AKS).
Tworzenie grupy zasobów
Utwórz grupę zasobów przy użyciu
az group create
polecenia . Pamiętaj, aby zastąpić wartości symboli zastępczych własnymi wartościami.LOCATION=<azure-region> RG_NAME=<resource-group-name> az group create --name $RG_NAME --location $LOCATION
Tworzenie klastra AKS
Utwórz klaster usługi AKS z włączonym dodatkiem KEDA, tożsamością obciążenia i wystawcą OIDC przy użyciu
az aks create
polecenia z flagami--enable-workload-identity
,--enable-keda
i--enable-oidc-issuer
. Upewnij się, że zastąpisz wartość symbolu zastępczego własną wartością.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
Sprawdź, czy wdrożenie zakończyło się pomyślnie i upewnij się, że klaster ma włączoną usługę KEDA, tożsamość obciążenia i wystawcę OIDC przy użyciu
az aks show
polecenia z flagą ustawioną--query
na"[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]"
.az aks show \ --name $AKS_NAME \ --resource-group $RG_NAME \ --query "[workloadAutoScalerProfile, securityProfile, oidcIssuerProfile]"
Połącz się z klastrem
az aks get-credentials
przy użyciu polecenia .az aks get-credentials \ --name $AKS_NAME \ --resource-group $RG_NAME \ --overwrite-existing
Tworzenie usługi Azure Service Bus
Utwórz przestrzeń nazw usługi Azure Service Bus przy użyciu
az servicebus namespace create
polecenia . Pamiętaj, aby zastąpić wartość symbolu zastępczego własną wartością.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
Utwórz kolejkę usługi Azure Service Bus przy użyciu
az servicebus queue create
polecenia . Pamiętaj, aby zastąpić wartość symbolu zastępczego własną wartością.SB_QUEUE_NAME=<service-bus-queue-name> az servicebus queue create \ --name $SB_QUEUE_NAME \ --namespace $SB_NAME \ --resource-group $RG_NAME
Tworzenie tożsamości zarządzanej
Utwórz tożsamość zarządzaną przy użyciu
az identity create
polecenia . Pamiętaj, aby zastąpić wartość symbolu zastępczego własną wartością.MI_NAME=<managed-identity-name> MI_CLIENT_ID=$(az identity create \ --name $MI_NAME \ --resource-group $RG_NAME \ --query "clientId" \ --output tsv)
Pobierz adres URL wystawcy OIDC przy użyciu
az aks show
polecenia z flagą ustawioną na--query
oidcIssuerProfile.issuerUrl
.AKS_OIDC_ISSUER=$(az aks show \ --name $AKS_NAME \ --resource-group $RG_NAME \ --query oidcIssuerProfile.issuerUrl \ --output tsv)
Utwórz poświadczenia federacyjne między tożsamością zarządzaną a przestrzenią nazw i kontem usługi używanym przez obciążenie przy użyciu
az identity federated-credential create
polecenia . Pamiętaj, aby zastąpić wartość symbolu zastępczego własną wartością.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
Utwórz drugie poświadczenie federacyjne między tożsamością zarządzaną a przestrzenią nazw i kontem usługi używanym
az identity federated-credential create
przez operator keda za pomocą polecenia . Pamiętaj, aby zastąpić wartość symbolu zastępczego własną wartością.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
Tworzenie przypisań roli
Pobierz identyfikator obiektu tożsamości zarządzanej przy użyciu
az identity show
polecenia z flagą ustawioną--query
na"principalId"
.MI_OBJECT_ID=$(az identity show \ --name $MI_NAME \ --resource-group $RG_NAME \ --query "principalId" \ --output tsv)
Pobierz identyfikator zasobu przestrzeni nazw usługi Service Bus przy użyciu
az servicebus namespace show
polecenia z flagą ustawioną na--query
"id"
.SB_ID=$(az servicebus namespace show \ --name $SB_NAME \ --resource-group $RG_NAME \ --query "id" \ --output tsv)
Przypisz rolę Właściciela danych usługi Azure Service Bus do tożsamości zarządzanej
az role assignment create
przy użyciu polecenia .az role assignment create \ --role "Azure Service Bus Data Owner" \ --assignee-object-id $MI_OBJECT_ID \ --assignee-principal-type ServicePrincipal \ --scope $SB_ID
Włączanie tożsamości obciążenia dla operatora KEDA
Po utworzeniu poświadczeń federacyjnych dla
keda-operator
konta usługi należy ręcznie uruchomić ponowniekeda-operator
zasobniki, aby upewnić się, że zmienne środowiskowe tożsamości obciążenia są wstrzykiwane do zasobnika.kubectl rollout restart deploy keda-operator -n kube-system
Potwierdzanie ponownego uruchomienia zasobników keda-operator
kubectl get pod -n kube-system -lapp=keda-operator -w
Po potwierdzeniu, że zasobniki keda-operator zakończyły działanie w
Ctrl+c
celu przerwania poprzedniego polecenia zegarka, upewnij się, że zmienne środowiskowe tożsamości obciążenia zostały wprowadzone.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
Powinny zostać wyświetlone dane wyjściowe podobne do poniższych w obszarze Środowisko.
--- 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/ ---
Wdróż zasób KEDA TriggerAuthentication zawierający identyfikator klienta tożsamości zarządzanej przypisanej przez użytkownika.
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
Uwaga
Po uruchomieniu uwierzytelniania TriggerAuthentication usługa KEDA będzie mogła uwierzytelniać się za pośrednictwem tożsamości obciążenia. Zasobniki
keda-operator
używają poleceniaidentityId
do uwierzytelniania względem zasobów platformy Azure podczas oceniania wyzwalaczy skalowania.
Publikowanie komunikatów w usłudze Azure Service Bus
W tym momencie wszystko jest skonfigurowane do skalowania przy użyciu architektury KEDA i tożsamości obciążeń firmy Microsoft Entra. Przetestujemy to przez wdrożenie obciążeń producentów i konsumentów.
Utwórz nowy konto usługi dla obciążeń.
kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $MI_CLIENT_ID name: $MI_NAME EOF
Wdróż zadanie, aby opublikować 100 komunikatów.
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
Korzystanie z komunikatów z usługi Azure Service Bus
Po opublikowaniu komunikatów w kolejce usługi Azure Service Bus wdrożymy obiekt ScaledJob w celu korzystania z komunikatów. To zadanie ScaledJob będzie używać zasobu KEDA TriggerAuthentication do uwierzytelniania w kolejce usługi Azure Service Bus przy użyciu tożsamości obciążenia i skalowania w poziomie co 10 komunikatów.
Wdróż zasób ScaledJob, aby korzystać z komunikatów. Wyzwalacz skalowania zostanie skonfigurowany do skalowania w poziomie co 10 komunikatów. Program skalowania KEDA utworzy 10 zadań do korzystania z 100 komunikatów.
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
Uwaga
Zadanie ScaledJob tworzy zasób zadania Kubernetes za każdym razem, gdy wystąpi zdarzenie skalowania, w związku z czym szablon zadania musi zostać przekazany podczas tworzenia zasobu. Po utworzeniu nowych zadań zasobniki będą wdrażane z bitami tożsamości obciążenia w celu korzystania z komunikatów.
Sprawdź, czy skalowanie KEDA działało zgodnie z oczekiwaniami.
kubectl describe scaledjob myconsumer-scaledjob
Powinny zostać wyświetlone zdarzenia podobne do poniższych.
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
Czyszczenie zasobów
Po sprawdzeniu, czy wdrożenie zakończy się pomyślnie, możesz wyczyścić zasoby, aby uniknąć ponoszenia kosztów platformy Azure.
Usuń grupę zasobów platformy Azure i wszystkie zasoby w niej przy użyciu polecenia [
az group delete
][az-group-delete].az group delete --name $RG_NAME --yes --no-wait
Następne kroki
W tym artykule pokazano, jak bezpiecznie skalować aplikacje przy użyciu tożsamości dodatku KEDA i obciążenia w usłudze AKS.
Aby uzyskać informacje na temat rozwiązywania problemów z usługą KEDA, zobacz Rozwiązywanie problemów z dodatkiem Kubernetes Event-driven Autoscaling (KEDA).
Aby dowiedzieć się więcej na temat usługi KEDA, zobacz nadrzędną dokumentację KEDA.
Azure Kubernetes Service