Bulutta yerel uygulamanızı Azure Kubernetes Service'e el ile dağıtma

Tamamlandı

Web sitesi dağıtımlarınızı otomatikleştirmeden önce mevcut eShop uygulamasını Azure Kubernetes Service'e (AKS) el ile dağıtmanız gerekir. Azure kaynaklarını oluşturur ve Azure CLI komutlarını ve bash betiklerini kullanarak uygulamayı AKS'ye dağıtırsınız. Son olarak GitHub Actions'ın AKS ve Azure Container Registry'ye dağıtılmasına izin vermek için bir Azure Active Directory (Azure AD) hizmet sorumlusu oluşturursunuz.

Komutlar, eShop uygulamasının güncelleştirilmiş bir sürümünü dağıtmak için aşağıdaki kaynakları oluşturur.

  • Bir Azure Container Registry (ACR) sağlayın ve ardından görüntüleri kayıt defterine gönderin.
  • BIR AKS kümesi sağlayın ve kapsayıcıları kümeye dağıtın.
  • Dağıtımı test edin.
  • GitHub Actions'ın AKS ve Azure Container Registry'ye dağıtılmasına izin vermek için hizmet sorumluları oluşturun.

Önemli

Başlamadan önce önkoşulları tamamladığınızdan emin olun.

Geliştirme ortamını açma

Alıştırmayı barındıran bir GitHub kod alanı kullanmayı seçebilir veya alıştırmayı Visual Studio Code'da yerel olarak tamamlayabilirsiniz.

GitHub Codespaces Kurulumu

Deponun çatalını https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops kendi GitHub hesabınıza oluşturun. Ardından yeni çatalınıza:

  1. Kod’u seçin.
  2. Codespaces sekmesini seçin.
  3. + Kod alanınızı oluşturmak için simgeyi seçin.

GitHub'ın kod alanının oluşturulması ve yapılandırılması birkaç dakika sürer. İşlem tamamlandığında alıştırmanın kod dosyalarını görürsünüz.

İsteğe bağlı: Visual Studio Code Kurulumu

Visual Studio Code'ı kullanmak için depoyu https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops kendi GitHub hesabınıza çatallayın ve yerel olarak kopyalayın. Ardından:

  1. Visual Studio Code'da Dev Container'ı çalıştırmak için tüm sistem isteklerini yükleyin.
  2. Docker'ın çalıştığından emin olun.
  3. Yeni bir Visual Studio Code penceresinde kopyalanan deponun klasörünü açın
  4. Komut paletini açmak için Ctrl+Shift+P tuşlarına basın.
  5. Arama: >Geliştirme Kapsayıcıları: Kapsayıcıda Yeniden Oluşturma ve Yeniden Açma
  6. Visual Studio Code, geliştirme kapsayıcınızı yerel olarak oluşturur.

Kapsayıcı oluşturma

  1. Terminal bölmesinde şu dotnet CLI komutunu çalıştırın:

    dotnet publish /p:PublishProfile=DefaultContainer 
    

Azure kaynaklarını oluşturma

  1. Terminal bölmesinde şu Azure CLI komutuyla Azure'da oturum açın:

    az login --use-device-code
    
  2. Seçili Azure aboneliğini görüntüleyin.

    az account show -o table
    

    Yanlış abonelik seçiliyse, doğru aboneliği seçmek için az account set komutunu kullanın.

  3. Azure bölgelerinin listesini ve onunla ilişkili Adı almak için aşağıdaki Azure CLI komutunu çalıştırın:

    az account list-locations -o table
    

    Size en yakın bölgeyi bulun ve sonraki adımda [Closest Azure region]

  4. Şu bash deyimlerini çalıştırın:

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

    Önceki komutlar, sonraki Azure CLI komutlarında kullanacağınız ortam değişkenlerini oluşturur. LOCATION değerini size yakın bir Azure bölgesiyle (örneğin eastus) değiştirmeniz gerekir. Kaynak grubunuz, AKS kümeniz veya ACR'niz için farklı bir ad istiyorsanız bu değerleri değiştirin. Azure portalında yeni depolarınızı görüntülemek için kapsayıcı kayıt defterinin Erişim denetiminde (IAM) kendinizi Uygulama Uyumluluk Otomasyonu Yönetici istrator olarak atayın.

  5. Şu Azure CLI komutlarını çalıştırın:

    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
    

    Çalıştırıldığında az acr login --name $ACR_Name bir kimlik doğrulama hatası alırsanız Azure'da yeni oluşturulan kapsayıcı kaydında Ayarlar - Erişim Anahtarları altında Yönetici kullanıcıyı açmanız gerekir. Azure, devam etmek için bu kimlik bilgilerini girmenizi ister. ayrıca ile az login --use-device-codeyeniden kimlik doğrulaması yapmanız da gerekebilir.

    Bu komutlar Azure kaynaklarını, görüntüleriniz için bir ACR'yi içeren bir kaynak grubu oluşturur ve ardından ACR'de oturum açar. Bu çıkışı görmeniz birkaç dakika sürebilir:

      ...
      },
      "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. Görüntülerinizi etiketlemek ve oluşturduğunuz ACR'ye göndermek için şu komutları çalıştırın:

    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
    

    Şu komutla görüntüleri gönderme işleminin başarıyla tamamlanmasını de kontrol edebilirsiniz:

    az acr repository list --name $ACR_NAME --output table
    
  7. AKS'nizi oluşturun ve şu komutlarla ACR'ye bağlayın:

    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
    

    Yukarıdaki komutlar tek düğüm aks kümesi oluşturur, ACR'ye bağlar ve ardından yerel makinenizi AKS kümesine bağlar. Yukarıdaki komutların tamamlanması birkaç dakika sürebilir.

  8. Yeni AKS'nin şu komutla ACR'den görüntü çekebildiğini denetleyin:

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

    Aşağıdaki iletilere benzer bir çıkış görmeniz gerekir:

    [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: 71588cd0-9229-4914-9c8e-1dc229d775c8
    [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!
    

    Artık yeni AKS kümenizde kubectl komutlarını çalıştırabilirsiniz. Çıktıdan tam ACR URL'sini kopyalayın; örneğin, yukarıdaki URL acseshop1251599299 şeklindedir.

  9. AKS kümenizin durumunu denetleyin:

    kubectl get nodes -A
    

    Aşağıdaki iletilere benzer bir çıkış görmeniz gerekir:

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

Kubernetes dağıtım bildirimini yapılandırma

Artık eShop görüntüleri ACR'dedir. Aks dağıtım bildirimini bu yeni görüntüleri kullanacak şekilde güncelleştirebilirsiniz.

  1. Visual Studio Code'da, EXPLORER panelinden projenin kökündeki deployment.yml dosyasını seçin.

  2. 17. satırdaki değiştir:

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

    Kopyalanan ACR adını önceki adımdan yapıştırın; satır aşağıdaki yaml'ye benzer görünmelidir:

    - image: acseshop1251599299.azurecr.io/storeimage:v1
    
  3. 65. satır için şu adımları yineleyin:

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

    Dosyayı CTRL+S ile kaydedin.

  4. Terminal bölmesinde, aşağıdaki kubernetes komutuyla bir NGINX giriş denetleyicisi dağıtın:

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

    Yukarıdaki kubectl komut AKS kümenize girişe izin vermek için hizmetler ve bileşenler ekler. Aşağıdaki kubernetes komutunu kullanarak girişin çalışmaya hazır olup olmadığını denetleyin:

    kubectl get services --namespace ingress-nginx 
    

    Aşağıdaki iletilere benzer bir çıkış görmeniz gerekir:

    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. eShop uygulamasını şu komutla dağıtın:

    kubectl apply -f deployment.yml
    

    kubectl Uygula komutu eShop uygulamasını, ön uç Blazor web uygulamasını ve arka uç REST API ürün hizmetini ve trafiği AKS kümenize doğru hizmetlere yönlendirmek için bir giriş kuralı dağıtır. Dağıtımlarda hata alırsanız bu komutu yeniden çalıştırın.

    Aşağıdaki iletilere benzer bir çıkış görmeniz gerekir:

    deployment.apps/storeimage created
    service/eshop-website created
    deployment.apps/productservice created
    service/eshop-backend created
    ingress.networking.k8s.io/eshop-ingress created
    
  6. İki mikro hizmetin şu komutla dağıtıldığından denetleyin:

    kubectl get pods -A
    

    Aşağıdaki iletilere benzer bir çıkış görmeniz gerekir:

    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. Dağıtılan eShop'a şu komutla bakın:

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

    Yukarıdaki komut, web uygulamasının dış IP adresini döndürür. Uygulamayı yeni bir sekmede açmak için CTRL tuşunu basılı tutun ve bağlantıya tıklayın.

    eShop web uygulaması giriş sayfasının ekran görüntüsü.

GitHub'dan dağıtmak için hizmet sorumlusu oluşturma

GitHub Actions, kapsayıcı görüntülerini bir Azure Container Registry'de yayımlayabilir. Bu nedenle GitHub çalıştırıcısının Azure'a bağlanma izinleri olmalıdır. Aşağıdaki adımlar, Azure içinde GitHub Actions kimliği olarak görev yapmak için bir Azure AD hizmet sorumlusu oluşturur.

  1. Abonelik Kimliğinizi bir ortam değişkenine kaydetmek için terminalde aşağıdaki komutu çalıştırın:

    export SUBS=$(az account show --query 'id' --output tsv)
    
  2. GitHub'dan erişime izin verecek bir Azure AD hizmet sorumlusu oluşturmak için aşağıdaki komutu çalıştırın:

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

    Aşağıdaki çıkışın bir varyasyonu görüntülenir:

    Creating 'Contributor' role assignment under scope '/subscriptions/00000000-0000-0000-0000-000000000000'
    
    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": "00000000-0000-0000-0000-000000000000",
      "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. Sonraki adımda kullanmak üzere JSON çıkışını ve köşeli ayraçları kopyalayın.

GitHub gizli dizilerini oluşturma

GitHub Actions çalıştırıcısı, Container Registry ve AKS ile etkileşime geçmek için kimlik bilgilerini kullanır. Kapsayıcı kayıt defterine ait hizmet sorumlusu ve kimlik bilgileri, hassas bilgilerdir. Hassas bilgileri güvenli bir konumda şifrelenmiş gizli diziler olarak depolamak en iyisidir. GitHub, gizli dizileri ve diğer değişkenleri depolamak için yerleşik bir konum sağlar.

Hassas bilgileri deponuzda ortam değişkenleri olarak güvenli bir şekilde depolamak için aşağıdaki adımları tamamlayın. Depo yöneticileri, GitHub Actions çalıştırıcısının erişebileceği gizli dizileri yönetmelidir.

  1. Çatallanmış GitHub deponuzda adresine Settings>>Secrets and variablesActionsgidin.

  2. Actions secrets and variables Sayfasında öğesini seçinNew repository secret.

  3. New secret Sayfasında, alanına NameAZURE_CREDENTIALS girin ve altına Secretterminalden kopyaladığınız JSON çıkışını girin.

    Ayarlar aşağıdaki ekran görüntüsüne benzer görünmelidir:

    GitHub'da ortam değişkeni gizli dizilerini ayarlamak için Yeni gizli dizi sayfasının ekran görüntüsü.

  4. Add secret öğesini seçin.

Sonraki bölümde bu GitHub gizli dizisini kullanarak kapsayıcı görüntüsünü oluşturmak için bir GitHub eylemi oluşturacaksınız.