Menyebarkan aplikasi cloud-native Anda secara manual ke Azure Kubernetes Service

Selesai

Sebelum dapat mengotomatiskan penyebaran situs web, Anda perlu menyebarkan aplikasi eShop yang ada secara manual ke Azure Kubernetes Service (AKS). Anda membuat sumber daya Azure dan menyebarkan aplikasi ke AKS menggunakan perintah Azure CLI dan skrip bash. Terakhir, Anda membuat perwakilan layanan Azure Active Directory (Azure AD) untuk memungkinkan GitHub Actions melakukan penyebaran ke AKS dan Azure Container Registry.

Perintah membuat sumber daya berikut untuk menyebarkan versi aplikasi eShop yang diperbarui.

  • Provisikan Azure Container Registry (ACR) lalu dorong gambar ke registri.
  • Provisikan kluster AKS, lalu sebarkan kontainer ke dalam kluster.
  • Uji penyebaran.
  • Buat perwakilan layanan untuk memungkinkan GitHub Actions disebarkan ke AKS dan Azure Container Registry.

Penting

Pastikan Anda telah menyelesaikan prasyarat sebelum memulai.

Buka lingkungan pengembangan

Anda dapat memilih untuk menggunakan ruang kode GitHub yang menghosting latihan, atau menyelesaikan latihan secara lokal di Visual Studio Code.

Penyiapan Codespaces GitHub

Fork repositori https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops ke akun GitHub Anda sendiri. Kemudian pada fork baru Anda:

  1. Pilih Kode.
  2. Pilih tab Codespace.
  3. Pilih ikon + untuk membuat codespace Anda.

GitHub membutuhkan waktu beberapa menit untuk membuat dan mengonfigurasi codespace. Setelah proses selesai, Anda akan melihat file kode untuk latihan.

Opsional: Pengaturan Visual Studio Code

Untuk menggunakan Visual Studio Code, fork https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops repositori ke akun GitHub Anda sendiri dan kloning secara lokal. Kemudian:

  1. Pasang persyaratan sistem apa pun untuk menjalankan Dev Container di Visual Studio Code.
  2. Pastikan Docker berjalan.
  3. Di jendela Visual Studio Code baru, buka folder repositori kloning
  4. Tekan Ctrl+Shift+P untuk membuka palet perintah.
  5. Pencarian: >Dev Containers: Rekonstruksi dan Buka Kembali di Kontainer
  6. Visual Studio Code membuat kontainer pengembangan Anda secara lokal.

Membangun kontainer

  1. Di panel terminal, jalankan perintah CLI dotnet ini:

    dotnet publish /p:PublishProfile=DefaultContainer 
    

Membuat sumber daya Azure

  1. Di panel terminal, masuk ke Azure dengan perintah Azure CLI ini:

    az login --use-device-code
    
  2. Menampilkan langganan Azure yang dipilih.

    az account show -o table
    

    Jika langganan yang salah dipilih, gunakan perintah az account set untuk memilih langganan yang benar.

  3. Jalankan perintah Azure CLI berikut untuk mendapatkan daftar wilayah Azure dan Nama yang terkait dengannya:

    az account list-locations -o table
    

    Temukan wilayah yang paling dekat dengan Anda dan gunakan di langkah berikutnya dengan mengganti [Closest Azure region]

  4. Jalankan perintah bash ini:

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

    Perintah sebelumnya membuat variabel lingkungan yang akan Anda gunakan dalam perintah Azure CLI berikutnya. Anda perlu mengubah LOKASI ke wilayah Azure yang dekat dengan Anda seperti eastus. Jika Anda menginginkan nama yang berbeda untuk grup sumber daya, kluster AKS, atau ACR, ubah nilai tersebut. Untuk melihat repositori baru Anda di portal Microsoft Azure, tetapkan diri Anda sebagai Administrator Otomatisasi Kepatuhan Aplikasi di Kontrol akses (IAM) registri kontainer.

  5. Jalankan perintah Azure CLI ini:

    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
    

    Jika Anda menerima kesalahan autentikasi saat az acr login --name $ACR_Name dijalankan, Anda perlu mengaktifkan Pengguna admin di daftar kontainer yang baru dibuat di Azure di bawah Pengaturan - Kunci Akses. Azure meminta Anda memasukkan kredensial ini untuk melanjutkan. Anda mungkin juga perlu mengautentikasi lagi dengan az login --use-device-code.

    Perintah ini membuat grup sumber daya yang akan menampung sumber daya Azure, ACR untuk gambar Anda, lalu masuk ke ACR. Dibutuhkan beberapa menit hingga Anda melihat output ini:

      ...
      },
      "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. Untuk menandai gambar Anda dan mendorongnya ke ACR yang Anda buat, jalankan perintah ini:

    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
    

    Anda dapat memeriksa apakah pengunggahan gambar telah berhasil diselesaikan dengan perintah ini:

    az acr repository list --name $ACR_NAME --output table
    
  7. Buat AKS Anda dan sambungkan ke ACR dengan perintah ini:

    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
    

    Perintah ini membuat kluster AKS dengan satu simpul, menghubungkannya ke ACR, dan kemudian menyambungkan komputer lokal Anda ke kluster AKS. Perintah dapat memakan waktu beberapa menit untuk diselesaikan.

  8. Periksa apakah AKS baru dapat menarik gambar dari ACR dengan perintah ini:

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

    Anda akan melihat output serupa dengan pesan berikut:

    [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!
    

    Anda sekarang dapat menjalankan perintah kubectl terhadap kluster AKS baru Anda. Salin URL ACR lengkap dari output; misalnya, di atas URL adalah acseshop1251599299.

  9. Periksa status kluster AKS Anda:

    kubectl get nodes -A
    

    Anda akan melihat output serupa dengan pesan berikut:

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

Mengonfigurasi manifes penyebaran Kubernetes

Sekarang gambar eShop berada di ACR, Anda dapat memperbarui manifes penyebaran AKS untuk menggunakan gambar baru ini.

  1. Di Visual Studio Code atau Codespaces, dari panel EXPLORER, pilih file deployment.yml di akar proyek.

  2. Ganti pada baris 17:

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

    Tempelkan nama ACR yang disalin dari langkah sebelumnya - baris akan terlihat mirip dengan yaml berikut:

    - image: acseshop1251599299.azurecr.io/storeimage:v1
    
  3. Ulangi langkah-langkah ini untuk baris 65:

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

    Simpan file dengan CTRL+S.

  4. Di panel terminal, sebarkan pengontrol ingress NGINX dengan perintah kubernetes berikut:

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

    Perintah kubectl menambahkan layanan dan komponen untuk memungkinkan akses ke kluster AKS Anda. Periksa apakah ingress siap dijalankan menggunakan perintah kubernetes berikut:

    kubectl get services --namespace ingress-nginx 
    

    Anda akan melihat output serupa dengan pesan berikut:

    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. Sebarkan aplikasi eShop dengan perintah ini:

    kubectl apply -f deployment.yml
    

    Perintah kubectl mengimplementasikan perintah apply untuk menerapkan aplikasi eShop: sebuah aplikasi web Blazor front-end dan layanan produk REST API back-end, serta aturan ingress untuk merutekan lalu lintas ke layanan yang benar di dalam kluster AKS Anda. Jalankan kembali perintah ini jika Anda mengalami kesalahan saat penyebaran.

    Anda akan melihat output serupa dengan pesan berikut:

    deployment.apps/storeimage created
    service/eshop-website created
    deployment.apps/productservice created
    service/eshop-backend created
    ingress.networking.k8s.io/eshop-ingress created
    
  6. Periksa apakah dua layanan mikro disebarkan dengan perintah ini:

    kubectl get pods -A
    

    Anda akan melihat output serupa dengan pesan berikut:

    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. Lihat eShop yang dipublikasikan dengan perintah ini:

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

    Perintah mengembalikan alamat IP eksternal untuk aplikasi web. Tahan CTRL dan klik tautan untuk membuka aplikasi di tab baru.

    Cuplikan layar beranda aplikasi web eShop.

Membuat entitas layanan untuk mengaktifkan dari GitHub

GitHub Actions dapat menerbitkan gambar kontainer ke Azure Container Registry. Oleh karena itu, GitHub runner harus memiliki izin untuk terhubung ke Azure. Langkah-langkah berikut membuat prinsipal layanan Azure Active Directory untuk berfungsi sebagai identitas GitHub Actions di Azure.

  1. Untuk menyimpan ID Langganan Anda dalam variabel lingkungan, jalankan perintah berikut di terminal:

    export SUBS=$(az account show --query 'id' --output tsv)
    
  2. Untuk membuat entitas layanan Azure AD untuk mengizinkan akses dari GitHub, jalankan perintah berikut:

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

    Variasi output berikut muncul:

    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. Salin output dan tanda kurung JSON untuk digunakan di langkah berikutnya.

Membuat rahasia GitHub

Runner GitHub Actions menggunakan kredensial untuk berinteraksi dengan Container Registry dan AKS. Perwakilan layanan dan kredensial untuk registri kontainer adalah informasi sensitif. Yang terbaik adalah menyimpan informasi sensitif sebagai rahasia terenkripsi di lokasi yang aman. GitHub menyediakan lokasi bawaan untuk menyimpan rahasia dan variabel lainnya.

Selesaikan langkah-langkah berikut untuk menyimpan informasi sensitif dengan aman sebagai variabel lingkungan di repositori Anda. Administrator repositori harus mengelola rahasia yang dapat diakses oleh runner GitHub Actions.

  1. Di repositori GitHub fork Anda, buka Settings>Secrets and variables>Actions.

  2. Pada halaman Actions secrets and variables, pilih New repository secret.

  3. New secret Pada halaman, di bawah Name, masukkan AZURE_CREDENTIALS, dan di bawah Secret, masukkan output JSON yang Anda salin dari terminal.

    Pengaturan akan terlihat mirip dengan cuplikan layar berikut:

    Cuplikan layar halaman Rahasia baru untuk mengatur rahasia variabel lingkungan di GitHub.

  4. Pilih Add secret.

Anda akan menggunakan rahasia GitHub ini di bagian berikutnya untuk membuat tindakan GitHub untuk membangun gambar kontainer.