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). Tworzysz zasoby Azure i wdrażasz aplikację w usłudze AKS, używając poleceń Azure CLI i skryptów 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.
  • Skonfiguruj klaster AKS i wdrażaj kontenery w klastrze.
  • Przetestuj wdrożenie.
  • Utwórz zasady dostępu do usługi, aby umożliwić GitHub Actions wdrażanie do AKS i Azure Container Registry.

Ważny

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

Sforkuj repozytorium https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops na własne konto GitHub. Następnie na Twoim nowym forku:

  1. Wybierz 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, rozgałęź repozytorium https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops na swoje konto na GitHub i sklonuj je lokalnie. Wtedy:

  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 Ctrl+Shift+P, aby otworzyć paletę poleceń.
  5. Wyszukiwanie: >Dev Containers: przebudowa i ponowne otwarcie w kontenerze
  6. Visual Studio Code tworzy kontener programistyczny lokalnie.

Budowanie kontenerów

  1. W okienku terminalu uruchom następujące polecenie dotnet CLI:

    dotnet publish /p:PublishProfile=DefaultContainer 
    

Tworzenie zasobów platformy Azure

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

    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ć odpowiednią subskrypcję.

  3. Uruchom następujące polecenie Azure CLI, aby uzyskać listę regionów Azure i skojarzoną z nimi nazwą:

    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ć LOCATION na region platformy Azure blisko Ciebie; 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 portalu Azure, przypisz sobie rolę App Compliance Automation Administrator w Kontroli dostępu (IAM) rejestru kontenerów.

  5. Uruchom następujące polecenia Azure CLI:

    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 az acr login --name $ACR_Name zostanie wyświetlony błąd uwierzytelniania, musisz włączyć administratora 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ć. Konieczne może być również ponowne uwierzytelnienie przy użyciu az login --use-device-code.

    Te polecenia tworzą grupę zasobów, aby zawierała zasoby platformy Azure, usługę ACR dla obrazów, a następnie logowanie 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
    

    Możesz sprawdzić, czy wypychanie obrazów zakończyło się pomyślnie, używając 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
    

    Powinieneś zobaczyć podobne wyniki 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 na nowym klastrze AKS. Skopiuj pełny adres URL usługi ACR z wyników; na przykład powyżej znajduje się adres URL acseshop1251599299.

  9. Sprawdź stan klastra usługi AKS:

    kubectl get nodes -A
    

    Powinny zostać wyświetlone podobne wyniki jak w poniższych komunikatach.

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

Konfigurowanie manifestu wdrożenia platformy Kubernetes

Teraz, gdy obrazy eShop znajdują się w ACR, możesz zaktualizować manifest wdrożenia 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ę ACR z poprzedniego kroku — wiersz powinien przypominać następujący kod 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ą CTRL+S.

  4. W terminalu wdróż kontroler Ingress NGINX za pomocą następującego polecenia w Kubernetes:

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

    Powyższe polecenie kubectl dodaje składniki i usługi, aby umożliwić wejście do klastra usługi AKS. Sprawdź, czy Ingress 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ę Blazor frontend i usługę produktu interfejsu API REST zaplecza oraz regułę wejściową do kierowania ruchu do odpowiednich usług w klastrze AKS. Uruchom ponownie to polecenie, jeśli wystąpi błąd we wdrożeniach.

    Powinny zostać wyświetlone komunikaty podobne do następujących:

    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 być widoczne podobne wyniki, jak następujące komunikaty:

    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 ctrl i kliknij link, aby otworzyć aplikację na nowej karcie.

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

Utwórz pryncypał usługi do wdrażania z 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.

Utwórz tajemnice GitHub

Moduł GitHub Actions używa poświadczeń do komunikacji z Container Registry i AKS. Główna usługa i poświadczenia rejestru kontenerów są poufnymi informacjami. 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ć sekretami, do których runner GitHub Actions może uzyskiwać dostęp.

  1. W swoim skopiowanym repozytorium GitHub przejdź do Settings>Secrets and variables>Actions.

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

  3. Na stronie New secret w obszarze 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 pokazujący nową tajną stronę do ustawiania tajnych zmiennych środowiskowych w usłudze GitHub.

  4. Wybierz pozycję Add secret.

W następnej sekcji użyjesz tego sekretu GitHub, aby utworzyć akcję GitHub do zbudowania obrazu kontenera.