Samouczek: włączanie usługi Azure Container Apps na platformie Kubernetes z obsługą usługi Azure Arc

Ten tutorial przygotowuje wspierany klaster Kubernetes do uruchamiania Azure Container Apps. Tworzy klaster Kubernetes z obsługą Azure Arc, instaluje rozszerzenie Container Apps, tworzy niestandardową lokalizację oraz tworzy połączone środowisko Container Apps.

Ukończenie tego samouczka zmienia zarówno subskrypcję Azure, jak i klaster Kubernetes. Potrzebujesz uprawnień Azure, aby tworzyć wymienione zasoby oraz mieć dostęp administratora klastra do klastra Kubernetes.

Ten samouczek pokazuje, jak włączyć Azure Container Apps na klastrze Kubernetes z włączonym Azure Arc. W tym samouczku nauczysz się następujących rzeczy:

  • Połącz klaster Kubernetes z Azure Arc, jeśli nie jest on jeszcze połączony.
  • Opcjonalnie można utworzyć przestrzeń roboczą Log Analytics.
  • Zainstaluj i zweryfikuj rozszerzenie Container Apps.
  • Stwórz i zweryfikowaj niestandardową lokalizację.
  • Stwórz i zweryfikowaj połączone środowisko Container Apps.

Zanim zaczniesz, zapoznaj się z Azure Container Apps w Azure Arc. Jeśli zasób lub komponent w klastrze nie jest gotowy, zobacz Troubleshoot Azure Container Apps on Azure Arc-enabled Kubernetes.

Wymagania wstępne

Zanim zaczniesz, sprawdź następujące wymagania:

  • Konto platformy Azure z aktywną subskrypcją. Jeśli go nie masz, utwórz go bezpłatnie.
  • Uprawnienia do rejestracji dostawców zasobów i tworzenia grup zasobów, zasób Kubernetes z Azure Arc, rozszerzenie klastra, niestandardowa lokalizacja, środowisko połączone z Container Apps oraz opcjonalnie przestrzeń robocza Log Analytics.
  • Azure CLI i jego wymagania wstępne.
  • Wersja kubectl, kompatybilna z Twoim klastrem Kubernetes i z dostępem sieciowym z Twojej stacji roboczej do serwera API Kubernetes.
  • Obsługiwany klaster Kubernetes z węzłami roboczymi z systemem Linux amd64 oraz dostępem typu cluster-admin za pośrednictwem aktywnego kontekstu kubectl.
  • Działająca implementacja usługi Kubernetes LoadBalancer .
  • Łączność wychodząca do punktów końcowych wymagana przez Azure Arc i Container Apps.
  • Wystarczające zasoby procesora i pamięci możliwe do przydzielenia dla obciążeń rozszerzenia i aplikacji.

Przed zmianą klastra produkcyjnego zapoznaj się z wdrożeniem aplikacji kontenerowych Plan a Container na Kubernetes z włączonym Azure Arc.

Ustawienia

Zainstaluj następujące rozszerzenia interfejsu wiersza polecenia platformy Azure.

az extension add --name connectedk8s --upgrade --yes
az extension add --name k8s-extension --upgrade --yes
az extension add --name customlocation --upgrade --yes
az extension add --name containerapp --upgrade --yes

Zarejestruj wymagane przestrzenie nazw.

az provider register --namespace Microsoft.ExtendedLocation --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait
az provider register --namespace Microsoft.App --wait
az provider register --namespace Microsoft.Web --wait
az provider register --namespace Microsoft.OperationalInsights --wait

Ustaw zmienne środowiskowe na podstawie wdrożenia klastra Kubernetes.

GROUP_NAME="my-arc-cluster-group"
AKS_CLUSTER_GROUP_NAME="my-aks-cluster-group"
AKS_NAME="my-aks-cluster"
LOCATION="eastus"

Tworzenie połączonego klastra

Jeśli masz już wspierany klaster Kubernetes z obsługą Azure Arc w $GROUP_NAME, nie twórz kolejnego klastra. Ustaw CLUSTER_NAME na nazwę istniejącego zasobu połączonego klastra, zweryfikuj dostęp za pomocą kubectl get nodes i przejdź do Tworzenie obszaru roboczego usługi Log Analytics.

Poniższe kroki umożliwiają utworzenie klastra AKS i połączenie go z usługą Azure Arc. To podejście jest przeznaczone wyłącznie jako hostowane na platformie Azure środowisko do celów ewaluacyjnych na potrzeby tego samouczka. Aby uzyskać istniejący klaster lokalny lub wielochmurowy, skorzystaj z Quickstart: Połącz istniejący klaster Kubernetes z Azure Arc, a następnie wróć do tego tutorialu.

  1. Utwórz klaster w usłudze Azure Kubernetes Service.

    az group create --name $AKS_CLUSTER_GROUP_NAME --location $LOCATION
    az aks create \
       --resource-group $AKS_CLUSTER_GROUP_NAME \
       --name $AKS_NAME \
       --enable-aad \
       --generate-ssh-keys
    
  2. Pobierz plik kubeconfig i przetestuj połączenie z klastrem. Domyślnie plik kubeconfig jest zapisywany w pliku ~/.kube/config.

    az aks get-credentials --resource-group $AKS_CLUSTER_GROUP_NAME --name $AKS_NAME --admin
    
    kubectl get ns
    
  3. Utwórz grupę zasobów zawierającą zasoby usługi Azure Arc.

    az group create --name $GROUP_NAME --location $LOCATION
    
  4. Połącz utworzony klaster z usługą Azure Arc.

    CLUSTER_NAME="${GROUP_NAME}-cluster" # Name of the connected cluster resource
    
    az connectedk8s connect --resource-group $GROUP_NAME --name $CLUSTER_NAME
    
  5. Poczekaj, aż połączony klaster zakończy aprowizację.

    CONNECTED_CLUSTER_ID=$(az connectedk8s show \
        --resource-group $GROUP_NAME \
        --name $CLUSTER_NAME \
        --query id \
        --output tsv)
    
    az resource wait --ids $CONNECTED_CLUSTER_ID --created --timeout 600
    
    az connectedk8s show \
        --resource-group $GROUP_NAME \
        --name $CLUSTER_NAME \
        --query "{State:provisioningState,Connectivity:connectivityStatus}" \
        --output table
    

    Kontynuuj tylko wtedy, gdy State jest Succeeded, a Connectivity jest Connected. Jeśli polecenie przekroczy limit czasu, zobacz temat Połączony klaster nie jest gotowy.

Tworzenie obszaru roboczego usługi Log Analytics

Przestrzeń robocza Log Analytics zapewnia dostęp do logów aplikacji dla aplikacji kontenerowych działających w klastrze Kubernetes z obsługą Azure Arc. Przestrzeń robocza Log Analytics jest opcjonalna, ale zalecana do diagnostyki aplikacji.

Ważne

Zdecyduj, czy użyć Log Analytics przed instalacją rozszerzenia Container Apps. Dostarcz konfigurację Log Analytics podczas instalacji rozszerzenia. Nie możesz później dodać konfiguracji Log Analytics do tej instancji rozszerzenia.

  1. Utworzenie obszaru roboczego usługi Log Analytics.

    WORKSPACE_NAME="$GROUP_NAME-workspace" # Name of the Log Analytics workspace
    
    az monitor log-analytics workspace create \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME
    
  2. Uruchom następujące polecenia, aby uzyskać zakodowany identyfikator obszaru roboczego i klucz udostępniony dla istniejącego obszaru roboczego usługi Log Analytics. Będą one potrzebne w następnym kroku.

    Caution

    Klucz współdzielony w przestrzeni roboczej to poświadczenie uwierzytelniające. Nie drukuj go, nie zapisuj do kontroli wersji wersyjnej, nie zapisuj w historii powłoki ani nie włączaj go do pakietów wsparcia. Poniższe polecenia przechowują ją w zmiennej powłoki i przekazują do platformy Azure jako chronione ustawienie rozszerzenia.

    LOG_ANALYTICS_WORKSPACE_ID=$(az monitor log-analytics workspace show \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME \
        --query customerId \
        --output tsv)
    LOG_ANALYTICS_WORKSPACE_ID_ENC=$(printf %s $LOG_ANALYTICS_WORKSPACE_ID | base64 -w0) # Needed for the next step
    LOG_ANALYTICS_KEY=$(az monitor log-analytics workspace get-shared-keys \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME \
        --query primarySharedKey \
        --output tsv)
    LOG_ANALYTICS_KEY_ENC=$(printf %s $LOG_ANALYTICS_KEY | base64 -w0) # Needed for the next step
    

Sprawdź istniejącą instalację KEDA

Rozszerzenie Container Apps instaluje KEDA. Przed instalacją rozszerzenia sprawdź klaster pod kątem istniejących komponentów KEDA:

kubectl get deployments -A -o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name"
kubectl get crd scaledobjects.keda.sh

Sprawdź, czy na liście wdrożeń znajdują się komponenty KEDA. Jeśli któreś z poleceń identyfikuje istniejącą instalację KEDA, zatrzymaj się i potwierdź obsługiwaną konfigurację współistnienia przed kontynuacją. Nie usuwaj istniejącej instalacji KEDA ani nie stosuj ustawień nieudokumentowanych rozszerzeń, bo inne obciążenia mogą od tego zależeć.

Instalowanie rozszerzenia Container Apps

Ważne

Jeśli wdrażasz na AKS w Azure lokalnie, upewnij się, że skonfigurowałeś HAProxy lub niestandardowy load balancer przed próbą instalacji rozszerzenia. Możesz też użyć az containerapp arc setup-core-dns --distro AksAzureLocal, aby skonfigurować CoreDNS w kontekstach lokalnych.

  1. Ustaw nazwy dla rozszerzenia Container Apps, jego przestrzeni nazw Kubernetes oraz środowiska połączonego.

    • EXTENSION_NAMEidentyfikuje zasób rozszerzenia klastra Azure.
    • NAMESPACE jest tworzony w klastrze Kubernetes i zawiera komponenty rozszerzenia oraz zasoby zarządzane przez Container Apps. Ustawienie appsNamespace musi dokładnie pasować do przestrzeni nazw wersji rozszerzenia.
    • CONNECTED_ENVIRONMENT_NAME staje się częścią domyślnej domeny aplikacji. Użyj nazwy kompatybilnej z DNS, która jest unikalna w obrębie grupy zasobów.

    Nie instaluj niezwiązanych z nimi obciążeń w przestrzeni nazw rozszerzenia.

    EXTENSION_NAME="appenv-ext"
    NAMESPACE="appplat-ns"
    CONNECTED_ENVIRONMENT_NAME="<connected-environment-name>"
    
  2. Zainstaluj rozszerzenie Container Apps do klastra połączonego z usługą Azure Arc z włączoną usługą Log Analytics. Nie można później dodać usługi Log Analytics do rozszerzenia.

    az k8s-extension create \
        --resource-group $GROUP_NAME \
        --name $EXTENSION_NAME \
        --cluster-type connectedClusters \
        --cluster-name $CLUSTER_NAME \
        --extension-type 'Microsoft.App.Environment' \
        --release-train stable \
        --auto-upgrade-minor-version true \
        --scope cluster \
        --release-namespace $NAMESPACE \
        --configuration-settings "Microsoft.CustomLocation.ServiceAccount=default" \
        --configuration-settings "appsNamespace=${NAMESPACE}" \
        --configuration-settings "clusterName=${CONNECTED_ENVIRONMENT_NAME}" \
        --configuration-settings "logProcessor.appLogs.destination=log-analytics" \
        --config-protected-settings "logProcessor.appLogs.logAnalyticsConfig.customerId=${LOG_ANALYTICS_WORKSPACE_ID_ENC}" \
        --config-protected-settings "logProcessor.appLogs.logAnalyticsConfig.sharedKey=${LOG_ANALYTICS_KEY_ENC}"
    

    Uwaga

    Aby zainstalować rozszerzenie bez integracji z Log Analytics, usuń trzy parametry związane z logowaniem z polecenia.

    Dla klastra używającego niestandardowego modułu równoważenia obciążenia ustaw loadBalancerIp na adres zarezerwowany dla ruchu przychodzącego usługi Container Apps:

    --configuration-settings "loadBalancerIp=<LOAD_BALANCER_INGRESS_IP>"
    

    Adres musi być dostępny dla klientów aplikacji i nie może być przypisany do innej usługi. Po instalacji użyj kubectl get service -n $NAMESPACE -o wide, aby sprawdzić, czy usługa ingress rozszerzenia zgłasza ten adres. Konfiguruj DNS z dziką kartą dopiero po przypisaniu adresu. Zobacz wymagania DNS.

    W poniższej tabeli opisano różne --configuration-settings parametry podczas uruchamiania polecenia:

    Parametr Opis
    Microsoft.CustomLocation.ServiceAccount Konto usługi utworzone dla lokalizacji niestandardowej. Ustaw wartość na default.
    appsNamespace Przestrzeń nazw używana do tworzenia definicji i poprawek aplikacji. Musi być taka sama jak przestrzeń nazw wydania rozszerzenia.
    clusterName Nazwa środowiska Kubernetes rozszerzenia Container Apps utworzonego na potrzeby tego rozszerzenia.
    logProcessor.appLogs.destination Opcjonalny. Miejsce docelowe dzienników aplikacji. Obsługuje log-analytics lub none, wybranie „Brak” wyłącza dzienniki platformy.
    logProcessor.appLogs.logAnalyticsConfig.customerId Wymagane tylko wtedy, gdy logProcessor.appLogs.destination jest ustawione na log-analytics. Identyfikator przestrzeni roboczej Log Analytics kodowany w base64. Ten parametr należy skonfigurować jako ustawienie chronione.
    logProcessor.appLogs.logAnalyticsConfig.sharedKey Wymagane tylko wtedy, gdy logProcessor.appLogs.destination ma wartość log-analytics. Klucz współdzielony w przestrzeni roboczej Log Analytics kodowany w base64. Ten parametr należy skonfigurować jako ustawienie chronione.
    loadBalancerIp Adres IP wejściowy load balancera.
  3. id Zapisz właściwość rozszerzenia Container Apps do późniejszego użycia.

    EXTENSION_ID=$(az k8s-extension show \
        --cluster-type connectedClusters \
        --cluster-name $CLUSTER_NAME \
        --resource-group $GROUP_NAME \
        --name $EXTENSION_NAME \
        --query id \
        --output tsv)
    
  4. Przed kontynuowaniem poczekaj na pełne zainstalowanie rozszerzenia.

    az resource wait --ids $EXTENSION_ID --created --timeout 1200
    
    az k8s-extension show \
        --cluster-type connectedClusters \
        --cluster-name $CLUSTER_NAME \
        --resource-group $GROUP_NAME \
        --name $EXTENSION_NAME \
        --query "{State:provisioningState,Version:currentVersion}" \
        --output table
    

    Kontynuuj tylko wtedy, gdy State jest Succeeded. Jeśli wykonanie polecenia przekracza limit czasu lub zgłasza błąd, zobacz Instalacja rozszerzenia kończy się niepowodzeniem lub przekracza limit czasu.

  5. Sprawdź obciążenia rozszerzenia, usługi i ostatnie zdarzenia:

    kubectl get pods -n $NAMESPACE
    kubectl get services -n $NAMESPACE -o wide
    kubectl get events -n $NAMESPACE --sort-by=.lastTimestamp
    

    Nie twórz niestandardowej lokalizacji, gdy kapsuła rozszerzenia jest w trakcie oczekiwania, wielokrotnie się restartuje lub niespodziewanie nie jest gotowa. Aby dowiedzieć się więcej na temat tych zasobników i ich roli w systemie, zobacz Omówienie usługi Azure Arc.

  6. Jeśli skonfigurowałeś Log Analytics, usuń lokalne zmienne zawierające klucz workspace.

    unset LOG_ANALYTICS_KEY LOG_ANALYTICS_KEY_ENC
    

Tworzenie lokalizacji niestandardowej

lokalizacja niestandardowa jest lokalizacją platformy Azure, którą przypisujesz do połączonego środowiska usługi Azure Container Apps.

  1. Ustaw następujące zmienne środowiskowe, podając wybraną nazwę lokalizacji niestandardowej oraz identyfikator klastra połączonego z usługą Azure Arc.

    CUSTOM_LOCATION_NAME="my-custom-location" # Name of the custom location
    CONNECTED_CLUSTER_ID=$(az connectedk8s show --resource-group $GROUP_NAME --name $CLUSTER_NAME --query id --output tsv)
    
  2. Utwórz niestandardową lokalizację:

    az customlocation create \
        --resource-group $GROUP_NAME \
        --name $CUSTOM_LOCATION_NAME \
        --host-resource-id $CONNECTED_CLUSTER_ID \
        --namespace $NAMESPACE \
        --cluster-extension-ids $EXTENSION_ID
    

    Uwaga

    Jeśli masz problem z utworzeniem niestandardowej lokalizacji na swoim klastrze, może być konieczne włączenie funkcji niestandardowej lokalizacji na klastrze. Włącz tę funkcję podczas logowania do interfejsu wiersza polecenia (CLI) przy użyciu jednostki usługi lub użytkownika Microsoft Entra z ograniczonymi uprawnieniami do zasobu klastra.

  3. Poczekaj, aż wdrażanie niestandardowej lokalizacji zostanie zakończone, a następnie zapisz jej identyfikator zasobu.

    CUSTOM_LOCATION_ID=$(az customlocation show \
        --resource-group $GROUP_NAME \
        --name $CUSTOM_LOCATION_NAME \
        --query id \
        --output tsv)
    
    az resource wait --ids $CUSTOM_LOCATION_ID --created --timeout 600
    
    az customlocation show \
        --resource-group $GROUP_NAME \
        --name $CUSTOM_LOCATION_NAME \
        --query "{State:provisioningState,Host:hostResourceId,Namespace:namespace}" \
        --output table
    

    Sprawdź, czy State ma wartość Succeeded, Host wskazuje połączony klaster, którego potrzebujesz, a Namespace jest zgodne z $NAMESPACE. Jeśli proces aprowizacji zakończy się niepowodzeniem, zobacz Tworzenie lokalizacji niestandardowej kończy się niepowodzeniem.

Tworzenie połączonego środowiska usługi Azure Container Apps

Przed rozpoczęciem tworzenia aplikacji w lokalizacji niestandardowej potrzebne jest połączone środowisko usługi Azure Container Apps.

  1. Utwórz połączone środowisko usługi Container Apps:

    az containerapp connected-env create \
        --resource-group $GROUP_NAME \
        --name $CONNECTED_ENVIRONMENT_NAME \
        --custom-location $CUSTOM_LOCATION_ID \
        --location $LOCATION
    
  2. Poczekaj, aż połączone środowisko zakończy inicjowanie.

    CONNECTED_ENVIRONMENT_ID=$(az containerapp connected-env show \
        --resource-group $GROUP_NAME \
        --name $CONNECTED_ENVIRONMENT_NAME \
        --query id \
        --output tsv)
    
    az resource wait --ids $CONNECTED_ENVIRONMENT_ID --created --timeout 900
    
    az containerapp connected-env show \
        --resource-group $GROUP_NAME \
        --name $CONNECTED_ENVIRONMENT_NAME \
        --query "{State:properties.provisioningState,Location:location,CustomLocation:extendedLocation.name,Domain:properties.defaultDomain}" \
        --output yaml
    

    Kontynuuj tylko wtedy, gdy State ma wartość Succeeded i gdy CustomLocation odpowiada niestandardowej lokalizacji utworzonej w tym samouczku. Zachowaj wyświetlone Domain na potrzeby konfiguracji DNS aplikacji. Jeśli aprowizowanie nie powiedzie się, zobacz Tworzenie połączonego środowiska nie powiodło się.

Następne kroki