Ręczne wdrażanie aplikacji natywnej dla chmury w usłudze Azure Kubernetes Service

Ukończone

Przed zautomatyzowanie wdrożeń witryny internetowej należy ręcznie wdrożyć istniejącą aplikację eShop w usłudze Azure Kubernetes Service (AKS). Zasoby platformy Azure można utworzyć i wdrożyć aplikację w usłudze AKS przy użyciu poleceń interfejsu wiersza polecenia platformy Azure i skryptów powłoki Bash. Na koniec utworzysz jednostkę usługi Azure Active Directory (Azure AD), aby umożliwić usłudze GitHub Actions wdrażanie w usługach AKS i Azure Container Registry.

Polecenia tworzą następujące zasoby, aby wdrożyć zaktualizowaną wersję aplikacji eShop.

  • Aprowizuj usługę Azure Container Registry (ACR), a następnie wypchnij obrazy do rejestru.
  • Aprowizuj klaster usługi AKS, a następnie wdróż kontenery w klastrze.
  • Przetestuj wdrożenie.
  • Utwórz jednostki usługi, aby umożliwić usłudze GitHub Actions wdrażanie w usługach AKS i Azure Container Registry.

Ważne

Przed rozpoczęciem upewnij się, że zostały spełnione wymagania wstępne .

Otwieranie środowiska projektowego

Możesz użyć przestrzeni kodu usługi GitHub, która hostuje ćwiczenie, lub wykonać ćwiczenie lokalnie w programie Visual Studio Code.

Konfiguracja usługi GitHub Codespaces

Rozwidlenie https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops repozytorium na własnym koncie usługi GitHub. Następnie na nowym rozwidlu:

  1. Wybierz pozycję Kod.
  2. Wybierz kartę Codespaces .
  3. Wybierz ikonę, + aby utworzyć przestrzeń kodu.

Utworzenie i skonfigurowanie przestrzeni kodu w usłudze GitHub trwa kilka minut. Po zakończeniu procesu zobaczysz pliki kodu dla ćwiczenia.

Opcjonalnie: Konfiguracja programu Visual Studio Code

Aby użyć programu Visual Studio Code, rozwidlenie https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops repozytorium do własnego konta usługi GitHub i sklonuj je lokalnie. Następnie:

  1. Zainstaluj wszystkie wymagania systemowe, aby uruchomić kontener deweloperski w programie Visual Studio Code.
  2. Upewnij się, że platforma Docker jest uruchomiona.
  3. W nowym oknie programu Visual Studio Code otwórz folder sklonowanego repozytorium
  4. Naciśnij klawisze Ctrl+Shift+P, aby otworzyć paletę poleceń.
  5. Wyszukiwanie: Tworzenie kontenerów: >ponowne kompilowanie i ponowne otwieranie w kontenerze
  6. Program Visual Studio Code tworzy kontener dewelopera lokalnie.

Kompilowanie kontenerów

  1. W okienku terminalu uruchom następujące polecenie interfejsu wiersza polecenia dotnet:

    dotnet publish /p:PublishProfile=DefaultContainer 
    

Tworzenie zasobów platformy Azure

  1. W okienku terminalu zaloguj się do platformy Azure za pomocą tego polecenia interfejsu wiersza polecenia platformy Azure:

    az login --use-device-code
    
  2. Wyświetl wybraną subskrypcję platformy Azure.

    az account show -o table
    

    Jeśli wybrano niewłaściwą subskrypcję, użyj polecenia az account set , aby wybrać poprawną subskrypcję.

  3. Uruchom następujące polecenie interfejsu wiersza polecenia platformy Azure, aby uzyskać listę regionów platformy Azure i skojarzona z nią nazwa:

    az account list-locations -o table
    

    Znajdź region najbliżej Ciebie i użyj go w następnym kroku, zastępując [Closest Azure region]

  4. Uruchom następujące instrukcje powłoki bash:

    export LOCATION=[Closest Azure region]
    export RESOURCE_GROUP=rg-eshop
    export CLUSTER_NAME=aks-eshop
    export ACR_NAME=acseshop$SRANDOM
    

    Poprzednie polecenia tworzą zmienne środowiskowe, które będą używane w następnych poleceniach interfejsu wiersza polecenia platformy Azure. Musisz zmienić lokalizację na region platformy Azure blisko Siebie, na przykład eastus. Jeśli chcesz zmienić nazwę grupy zasobów, klastra usługi AKS lub usługi ACR, zmień te wartości. Aby wyświetlić nowe repozytoria w witrynie Azure Portal, przypisz sobie rolę App Compliance Automation Administracja istrator w kontroli dostępu (IAM) rejestru kontenerów.

  5. Uruchom następujące polecenia interfejsu wiersza polecenia platformy Azure:

    az group create --name $RESOURCE_GROUP --location $LOCATION
    az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic
    az acr login --name $ACR_NAME
    

    Jeśli podczas uruchamiania wystąpi błąd az acr login --name $ACR_Name uwierzytelniania, musisz włączyć użytkownika Administracja w nowo utworzonym rejestrze kontenerów na platformie Azure w obszarze Ustawienia — Klucze dostępu. Platforma Azure monituje o wprowadzenie tych poświadczeń, aby kontynuować. Może być również konieczne ponowne uwierzytelnienie za pomocą polecenia az login --use-device-code.

    Te polecenia tworzą grupę zasobów zawierającą zasoby platformy Azure, usługę ACR dla obrazów, a następnie loguje się do usługi ACR. Może upłynąć kilka minut, zanim zobaczysz następujące dane wyjściowe:

      ...
      },
      "status": null,
      "systemData": {
        "createdAt": "2023-10-19T09:11:51.389157+00:00",
        "createdBy": "",
        "createdByType": "User",
        "lastModifiedAt": "2023-10-19T09:11:51.389157+00:00",
        "lastModifiedBy": "",
        "lastModifiedByType": "User"
      },
      "tags": {},
      "type": "Microsoft.ContainerRegistry/registries",
      "zoneRedundancy": "Disabled"
    }
    Login Succeeded
    
  6. Aby oznaczyć obrazy i wypchnąć je do utworzonego rekordu ACR, uruchom następujące polecenia:

    docker tag store $ACR_NAME.azurecr.io/storeimage:v1
    docker tag products $ACR_NAME.azurecr.io/productservice:v1
    
    docker push $ACR_NAME.azurecr.io/storeimage:v1
    docker push $ACR_NAME.azurecr.io/productservice:v1
    

    Wypychanie obrazów kończy się pomyślnie za pomocą tego polecenia:

    az acr repository list --name $ACR_NAME --output table
    
  7. Utwórz usługę AKS i połącz ją z usługą ACR przy użyciu następujących poleceń:

    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --node-count 1 --generate-ssh-keys --node-vm-size Standard_B2s --network-plugin azure --attach-acr $ACR_NAME
    
    az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
    

    Powyższe polecenia tworzą klaster usługi AKS z jednym węzłem, łączą go z usługą ACR, a następnie łączą maszynę lokalną z klastrem usługi AKS. Wykonanie powyższych poleceń może potrwać kilka minut.

  8. Sprawdź, czy nowa usługa AKS może ściągać obrazy z usługi ACR za pomocą tego polecenia:

    az aks check-acr --acr $ACR_NAME.azurecr.io --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
    

    Powinny zostać wyświetlone podobne dane wyjściowe do następujących komunikatów:

    [2023-10-19T13:33:09Z] Loading azure.json file from /etc/kubernetes/azure.json
    [2023-10-19T13:33:09Z] Checking managed identity...
    [2023-10-19T13:33:09Z] Cluster cloud name: AzurePublicCloud
    [2023-10-19T13:33:09Z] Kubelet managed identity client ID: 00001111-aaaa-2222-bbbb-3333cccc4444
    [2023-10-19T13:33:09Z] Validating managed identity existance: SUCCEEDED
    [2023-10-19T13:33:09Z] Validating image pull permission: SUCCEEDED
    [2023-10-19T13:33:09Z] 
    Your cluster can pull images from acseshop1251599299.azurecr.io!
    

    Teraz można uruchamiać polecenia kubectl względem nowego klastra usługi AKS. Skopiuj pełny adres URL usługi ACR z danych wyjściowych; na przykład powyżej adresu URL jest acseshop1251599299.

  9. Sprawdź stan klastra usługi AKS:

    kubectl get nodes -A
    

    Powinny zostać wyświetlone podobne dane wyjściowe do następujących komunikatów:

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-37200563-vmss000000   Ready    agent   3h44m   v1.26.6
    

Konfigurowanie manifestu wdrożenia platformy Kubernetes

Teraz obrazy eShop znajdują się w usłudze ACR, aby można było zaktualizować manifest wdrożenia usługi AKS, aby używać tych nowych obrazów.

  1. W programie Visual Studio Code z panelu EKSPLORATOR wybierz plik deployment.yml w katalogu głównym projektu.

  2. Zastąp element w wierszu 17:

    - image: [replace with your ACR name].azurecr.io/storeimage:v1
    

    Wklej skopiowaną nazwę usługi ACR z poprzedniego kroku — wiersz powinien wyglądać podobnie do następującego kodu yaml:

    - image: acseshop1251599299.azurecr.io/storeimage:v1
    
  3. Powtórz następujące kroki dla wiersza 65:

    - image: [replace with your ACR name].azurecr.io/productservice:v1
    

    Zapisz plik za pomocą klawiszy CTRL+S.

  4. W okienku terminalu wdróż kontroler ruchu przychodzącego NGINX za pomocą następującego polecenia kubernetes:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.3/deploy/static/provider/cloud/deploy.yaml
    

    Powyższe kubectl polecenie dodaje usługi i składniki, aby umożliwić ruch przychodzący do klastra usługi AKS. Sprawdź, czy ruch przychodzący jest gotowy do uruchomienia przy użyciu następującego polecenia kubernetes:

    kubectl get services --namespace ingress-nginx 
    

    Powinny zostać wyświetlone podobne dane wyjściowe do następujących komunikatów:

    NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE
    ingress-nginx-controller             LoadBalancer   10.0.135.51    20.26.154.64   80:32115/TCP,443:32254/TCP   58s
    ingress-nginx-controller-admission   ClusterIP      10.0.137.137   <none>         443/TCP                      58s
    
  5. Wdróż aplikację eShop za pomocą tego polecenia:

    kubectl apply -f deployment.yml
    

    Polecenie kubectl apply wdraża aplikację eShop, aplikację internetową frontonu Blazor i usługę produktu interfejsu API REST zaplecza oraz regułę ruchu przychodzącego w celu kierowania ruchu do odpowiednich usług do klastra usługi AKS. Uruchom ponownie to polecenie, jeśli wystąpi błąd we wdrożeniach.

    Powinny zostać wyświetlone podobne dane wyjściowe do następujących komunikatów:

    deployment.apps/storeimage created
    service/eshop-website created
    deployment.apps/productservice created
    service/eshop-backend created
    ingress.networking.k8s.io/eshop-ingress created
    
  6. Sprawdź, czy dwie mikrousługi są wdrażane za pomocą tego polecenia:

    kubectl get pods -A
    

    Powinny zostać wyświetlone podobne dane wyjściowe do następujących komunikatów:

    NAMESPACE       NAME                                        READY   STATUS      RESTARTS   AGE
    default         productservice-7569b8c64-vfbfz              1/1     Running     0          3m56s
    default         storeimage-6c7c999d7c-zsnxd                 1/1     Running     0          3m56s
    ingress-nginx   ingress-nginx-admission-create-szb8l        0/1     Completed   0          4m4s
    ingress-nginx   ingress-nginx-admission-patch-czdbv         0/1     Completed   0          4m4s
    ingress-nginx   ingress-nginx-controller-58bf5bf7dc-nwtsr   1/1     Running     0          4m4s
    
  7. Wyświetl wdrożony sklep eShop za pomocą tego polecenia:

    echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    

    Powyższe polecenie zwraca zewnętrzny adres IP aplikacji internetowej. Przytrzymaj klawisze CTRL i kliknij link, aby otworzyć aplikację na nowej karcie.

    Zrzut ekranu przedstawiający stronę główną aplikacji internetowej eShop.

Tworzenie jednostki usługi na potrzeby wdrażania z usługi GitHub

Funkcja GitHub Actions może publikować obrazy kontenerów w usłudze Azure Container Registry. Dlatego moduł uruchamiający usługę GitHub musi mieć uprawnienia do nawiązywania połączenia z platformą Azure. Poniższe kroki umożliwiają utworzenie jednostki usługi Azure AD, która będzie działać jako tożsamość funkcji GitHub Actions na platformie Azure.

  1. Aby zapisać identyfikator subskrypcji w zmiennej środowiskowej, uruchom następujące polecenie w terminalu:

    export SUBS=$(az account show --query 'id' --output tsv)
    
  2. Aby utworzyć jednostkę usługi Azure AD w celu zezwolenia na dostęp z usługi GitHub, uruchom następujące polecenie:

    az ad sp create-for-rbac --name "eShop" --role contributor --scopes /subscriptions/$SUBS/resourceGroups/$RESOURCE_GROUP --json-auth
    

    Zostanie wyświetlona odmiana następujących danych wyjściowych:

    Creating 'Contributor' role assignment under scope '/subscriptions/ffffffff-aaaa-bbbb-6666-777777777777'
    
    The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli
     {
      "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "clientSecret": "abc1A~abc123ABC123abc123ABC123abc123ABC1",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "tenantId": "00000000-0000-0000-0000-000000000000",
      "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
      "resourceManagerEndpointUrl": "https://management.azure.com/",
      "activeDirectoryGraphResourceId": "https://graph.windows.net/",
      "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
      "galleryEndpointUrl": "https://gallery.azure.com/",
      "managementEndpointUrl": "https://management.core.windows.net/"
    }
    
  3. Skopiuj dane wyjściowe i nawiasy JSON do użycia w następnym kroku.

Tworzenie wpisów tajnych usługi GitHub

Moduł uruchamiający akcje GitHub Actions używa poświadczeń do interakcji z usługą Container Registry i usługą AKS. Jednostka usługi i poświadczenia dla rejestru kontenerów to informacje poufne. Najlepiej przechowywać poufne informacje jako zaszyfrowane wpisy tajne w bezpiecznej lokalizacji. Usługa GitHub udostępnia wbudowaną lokalizację do przechowywania wpisów tajnych i innych zmiennych.

Wykonaj poniższe kroki, aby bezpiecznie przechowywać poufne informacje jako zmienne środowiskowe w repozytorium. Administratorzy repozytorium powinni zarządzać wpisami tajnymi, do których moduł uruchamiający funkcję GitHub Actions może uzyskiwać dostęp.

  1. W rozwidlonym repozytorium GitHub przejdź do Settings>>Secrets and variablesActionswitryny .

  2. Actions secrets and variables Na stronie wybierz pozycję New repository secret.

  3. Na stronie w obszarze New secret Namewprowadź AZURE_CREDENTIALS, a w obszarze Secretwprowadź dane wyjściowe JSON skopiowane z terminalu.

    Ustawienia powinny wyglądać podobnie jak na poniższym zrzucie ekranu:

    Zrzut ekranu przedstawiający stronę Nowy wpis tajny w celu ustawienia wpisów tajnych zmiennych środowiskowych w usłudze GitHub.

  4. Wybierz opcję Add secret.

Ten wpis tajny usługi GitHub zostanie użyty w następnej sekcji, aby utworzyć akcję usługi GitHub w celu skompilowania obrazu kontenera.