Mulai cepat: Menyebarkan kluster Azure Kubernetes Service (AKS) menggunakan Terraform

Azure Kubernetes Service (AKS) merupakan layanan Kube terkelola yang memungkinkan Anda menyebarkan dan mengelola kluster dengan cepat. Dalam mulai cepat ini, Anda akan:

  • Menyebarkan kluster AKS menggunakan Terraform.
  • Jalankan contoh aplikasi multi-kontainer dengan sekelompok layanan mikro dan ujung depan web yang mensimulasikan skenario ritel.

Catatan

Untuk memulai provisi kluster AKS dengan cepat, artikel ini menyertakan langkah-langkah untuk menyebarkan kluster dengan pengaturan default hanya untuk tujuan evaluasi. Sebelum menyebarkan kluster siap produksi, kami sarankan Anda membiasakan diri dengan arsitektur referensi dasar kami untuk mempertimbangkan bagaimana kluster tersebut selaras dengan kebutuhan bisnis Anda.

Sebelum Anda mulai

Catatan

Kumpulan simpul Azure Linux sekarang secara umum tersedia (GA). Untuk mempelajari tentang manfaat dan langkah-langkah penyebaran, lihat Pengantar Host Kontainer Azure Linux untuk AKS.

Masuk ke akun Azure Anda

Pertama, masuk ke akun Azure Anda dan autentikasi menggunakan salah satu metode yang dijelaskan di bagian berikut.

Skenario autentikasi Terraform dan Azure

Terraform hanya mendukung autentikasi ke Azure melalui Azure CLI. Autentikasi menggunakan Azure PowerShell tidak didukung. Oleh karena itu, meskipun Anda dapat menggunakan modul Azure PowerShell saat melakukan pekerjaan Terraform Anda, Anda harus terlebih dahulu mengautentikasi ke Azure menggunakan Azure CLI.

Artikel ini menjelaskan cara mengautentikasi Terraform ke Azure untuk skenario berikut. Untuk informasi selengkapnya tentang opsi untuk mengautentikasi Terraform ke Azure, lihat Mengautentikasi menggunakan Azure CLI.

Autentikasi ke Azure melalui akun Microsoft

Akun Microsoft adalah nama pengguna (terkait dengan email dan info masuknya) yang digunakan untuk masuk ke layanan Microsoft - seperti Azure. Akun Microsoft dapat dikaitkan dengan satu atau beberapa langganan Azure, dan salah satu langganan tersebut dijadikan sebagai default.

Langkah-langkah berikut menunjukkan caranya:

  • Masuk ke Azure secara interaktif menggunakan akun Microsoft
  • Mencantumkan langganan Azure terkait akun (termasuk default)
  • Atur langganan saat ini.
  1. Buka baris perintah yang memiliki akses ke Azure CLI.

  2. Jalankan az login tanpa parameter apa pun dan ikuti instruksi untuk masuk ke Azure.

    az login
    

    Poin utama:

    • Setelah berhasil masuk, az login menampilkan daftar langganan Azure yang terkait dengan akun Microsoft yang masuk, termasuk langganan default.
  3. Untuk mengonfirmasi langganan Azure saat ini, jalankan az account show.

    az account show
    
  4. Untuk melihat semua nama dan ID langganan Azure untuk akun Microsoft tertentu, jalankan az account list.

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    Poin utama:

    • Ganti tempat penampung <microsoft_account_email> dengan alamat email akun Microsoft yang langganan Azure-nya ingin Anda cantumkan.
    • Dengan akun Live - seperti Hotmail atau Outlook - Anda mungkin perlu menentukan alamat email yang sepenuhnya memenuhi syarat. Misalnya, jika alamat email Anda admin@hotmail.com, Anda mungkin perlu mengganti tempat penampung dengan live.com#admin@hotmail.com.
  5. Untuk menggunakan langganan Azure tertentu, jalankan az account set.

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    Poin utama:

    • Ganti tempat penampung <subscription_id_or_subscription_name> dengan ID atau nama langganan yang ingin Anda gunakan.
    • Memanggil az account set tidak menampilkan hasil dari beralih ke langganan Azure yang ditentukan. Namun, Anda dapat menggunakan az account show untuk mengonfirmasi bahwa langganan Azure saat ini telah berubah.
    • Jika Anda menjalankan perintah az account list dari langkah sebelumnya, Anda melihat bahwa langganan Azure default telah berubah menjadi langganan yang Anda tentukan menggunakan az account set.

Membuat perwakilan layanan

Alat otomatis yang menyebarkan atau menggunakan layanan Azure - seperti Terraform - harus selalu memiliki izin terbatas. Selain masuk aplikasi sebagai pengguna yang memiliki hak istimewa, Azure menawarkan prinsipal layanan.

Pola yang paling umum ialah masuk secara interaktif ke Azure, membuat perwakilan layanan, menguji perwakilan layanan, kemudian menggunakan perwakilan layanan tersebut untuk autentikasi di masa mendatang (baik secara interaktif atau dari skrip Anda).

  1. Untuk membuat perwakilan layanan, masuk ke Azure. Setelah mengautentikasi ke Azure melalui akun Microsoft, kembali ke sini.

  2. Jika Anda membuat perwakilan layanan dari Git Bash, atur variabel lingkungan MSYS_NO_PATHCONV. (Langkah ini tidak diperlukan jika Anda menggunakan Cloud Shell.)

    export MSYS_NO_PATHCONV=1    
    

    Poin utama:

    • Anda dapat mengatur variabel lingkungan MSYS_NO_PATHCONV secara global (untuk semua sesi terminal) atau secara lokal (hanya untuk sesi saat ini). Karena membuat perwakilan layanan bukanlah sesuatu yang sering Anda lakukan, sampel menetapkan nilai untuk sesi saat ini. Untuk mengatur variabel lingkungan ini secara global, tambahkan pengaturan ke file ~/.bashrc.
  3. Untuk membuat perwakilan layanan, jalankan az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    Poin utama:

    • Anda dapat mengganti <service-principal-name> dengan nama khusus untuk lingkungan Anda atau menghilangkan parameter sepenuhnya. Jika Anda menghilangkan parameter, nama prinsipal layanan dibuat berdasarkan tanggal dan waktu saat ini.
    • Setelah berhasil diselesaikan, az ad sp create-for-rbac menampilkan beberapa nilai. Nilai appId, password, dan tenant digunakan di langkah berikutnya.
    • Kata sandi tidak dapat diambil kembali jika hilang. Maka dari itu, Anda harus menyimpan kata sandi Anda di tempat yang aman. Jika Anda lupa kata sandi, Anda bisa mereset info masuk perwakilan layanan.
    • Untuk artikel ini, perwakilan layanan dengan peran Kontributor sedang digunakan. Untuk informasi selengkapnya tentang peran Role-Based Access Control (RBAC), lihat RBAC: Peran bawaan.
    • Output dari pembuatan perwakilan layanan ini mencakup info masuk sensitif. Pastikan Anda tidak menyertakan info masuk ini dalam kode atau memasukkan info masuk ke dalam kontrol sumber Anda.
    • Untuk informasi selengkapnya tentang opsi saat membuat perwakilan layanan dengan Azure CLI, lihat artikel Buat perwakilan layanan Azure menggunakan Azure CLI.

Tentukan info masuk perwakilan layanan dalam variabel lingkungan

Setelah membuat perwakilan layanan, Anda dapat menentukan info masuknya ke Terraform melalui variabel lingkungan.

  1. Edit file ~/.bashrc dengan menambahkan variabel lingkungan berikut.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. Untuk menjalankan skrip ~/.bashrc, jalankan source ~/.bashrc (atau singkatannya yang setara. ~/.bashrc). Anda juga dapat keluar dan membuka kembali Cloud Shell agar skrip dapat berjalan secara otomatis.

    . ~/.bashrc
    
  3. Setelah variabel lingkungan ditetapkan, Anda dapat memverifikasi nilainya sebagai berikut:

    printenv | grep ^ARM*
    

Poin utama:

  • Seperti halnya variabel lingkungan apa pun, untuk mengakses nilai langganan Azure dari dalam skrip Terraform, gunakan sintaksis berikut: ${env.<environment_variable>}. Misalnya, untuk mengakses nilai ARM_SUBSCRIPTION_ID, tentukan ${env.ARM_SUBSCRIPTION_ID}.
  • Membuat dan menerapkan paket eksekusi Terraform menimbulkan perubahan pada langganan Azure yang terkait dengan perwakilan layanan. Fakta ini terkadang membingungkan jika Anda masuk ke satu langganan Azure dan variabel lingkungan mengarah ke langganan Azure kedua. Mari kita lihat contoh berikut untuk penjelasannya. Katakanlah Anda memiliki dua langganan Azure: SubA dan SubB. Jika langganan Azure saat ini adalah SubA (ditentukan melalui az account show) sementara variabel lingkungan mengarah ke SubB, setiap perubahan yang dibuat oleh Terraform ada di SubB. Oleh karena itu, Anda harus masuk ke langganan SubB Anda untuk menjalankan perintah Azure CLI atau perintah Azure PowerShell guna melihat perubahan Anda.

Tentukan info masuk perwakilan layanan dalam blok penyedia Terraform

Blok penyedia Azure mendefinisikan sintaksis yang memungkinkan Anda menentukan informasi autentikasi langganan Azure.

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

Perhatian

Kemampuan untuk menentukan info masuk langganan Azure Anda dalam file konfigurasi Terraform bisa sangat mudah - terutama saat pengujian. Namun, tidak disarankan untuk menyimpan info masuk dalam file teks yang jelas yang dapat dilihat oleh individu yang tidak tepercaya.

Menerapkan kode Terraform

Catatan

Kode sampel untuk artikel ini terletak di repositori GitHub Azure Terraform. Anda dapat melihat file log yang berisi hasil pengujian dari terraform versi saat ini dan sebelumnya.

Lihat artikel dan kode sampel lainnya yang menunjukkan cara menggunakan Terraform untuk mengelola sumber daya Azure

  1. Buat direktori yang dapat Anda gunakan untuk menguji sampel kode Terraform dan menjadikannya direktori Anda saat ini.

  2. Buat file bernama providers.tf dan masukkan kode berikut:

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azapi = {
          source  = "azure/azapi"
          version = "~>1.5"
        }
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
        time = {
          source  = "hashicorp/time"
          version = "0.9.1"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Buat file bernama ssh.tf dan masukkan kode berikut:

    resource "random_pet" "ssh_key_name" {
      prefix    = "ssh"
      separator = ""
    }
    
    resource "azapi_resource_action" "ssh_public_key_gen" {
      type        = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      resource_id = azapi_resource.ssh_public_key.id
      action      = "generateKeyPair"
      method      = "POST"
    
      response_export_values = ["publicKey", "privateKey"]
    }
    
    resource "azapi_resource" "ssh_public_key" {
      type      = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      name      = random_pet.ssh_key_name.id
      location  = azurerm_resource_group.rg.location
      parent_id = azurerm_resource_group.rg.id
    }
    
    output "key_data" {
      value = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
    }
    
  4. Buat file bernama main.tf dan masukkan kode berikut:

    # Generate random resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "random_pet" "azurerm_kubernetes_cluster_name" {
      prefix = "cluster"
    }
    
    resource "random_pet" "azurerm_kubernetes_cluster_dns_prefix" {
      prefix = "dns"
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
      location            = azurerm_resource_group.rg.location
      name                = random_pet.azurerm_kubernetes_cluster_name.id
      resource_group_name = azurerm_resource_group.rg.name
      dns_prefix          = random_pet.azurerm_kubernetes_cluster_dns_prefix.id
    
      identity {
        type = "SystemAssigned"
      }
    
      default_node_pool {
        name       = "agentpool"
        vm_size    = "Standard_D2_v2"
        node_count = var.node_count
      }
      linux_profile {
        admin_username = var.username
    
        ssh_key {
          key_data = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
        }
      }
      network_profile {
        network_plugin    = "kubenet"
        load_balancer_sku = "standard"
      }
    }
    
  5. Buat file bernama variables.tf dan masukkan kode berikut:

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "node_count" {
      type        = number
      description = "The initial quantity of nodes for the node pool."
      default     = 3
    }
    
    variable "msi_id" {
      type        = string
      description = "The Managed Service Identity ID. Set this value if you're running this example using Managed Identity as the authentication method."
      default     = null
    }
    
    variable "username" {
      type        = string
      description = "The admin username for the new cluster."
      default     = "azureadmin"
    }
    
  6. Buat file bernama outputs.tf dan masukkan kode berikut:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "kubernetes_cluster_name" {
      value = azurerm_kubernetes_cluster.k8s.name
    }
    
    output "client_certificate" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_certificate
      sensitive = true
    }
    
    output "client_key" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_key
      sensitive = true
    }
    
    output "cluster_ca_certificate" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].cluster_ca_certificate
      sensitive = true
    }
    
    output "cluster_password" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].password
      sensitive = true
    }
    
    output "cluster_username" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].username
      sensitive = true
    }
    
    output "host" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].host
      sensitive = true
    }
    
    output "kube_config" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config_raw
      sensitive = true
    }
    

Inisialisasi Terraform

Jalankan terraform init untuk menginisialisasi penyebaran Terraform. Perintah ini mengunduh penyedia Azure yang diperlukan untuk mengelola sumber daya Azure Anda.

terraform init -upgrade

Poin utama:

  • Parameter -upgrade meningkatkan plugin penyedia yang diperlukan ke versi terbaru yang sesuai dengan batasan versi konfigurasi.

Buat rencana eksekusi Terraform

Jalankan terraform plan untuk membuat rencana eksekusi.

terraform plan -out main.tfplan

Poin utama:

  • Perintah terraform plan membuat rencana eksekusi, tetapi tidak menjalankannya. Perintah ini justru menentukan tindakan yang diperlukan untuk membuat konfigurasi yang ditentukan dalam file konfigurasi Anda. Pola ini memungkinkan Anda memastikan apakah rencana eksekusi telah sesuai dengan ekspektasi Anda sebelum membuat perubahan pada sumber daya aktual.
  • Parameter -out opsional memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter -out memastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.

Terapkan rencana eksekusi Terraform

Jalankan terraform apply untuk menerapkan rencana eksekusi ke infrastruktur cloud Anda.

terraform apply main.tfplan

Poin utama:

  • Contoh terraform apply perintah mengasumsikan Anda sebelumnya menjalankan terraform plan -out main.tfplan.
  • Jika Anda menentukan nama file yang berbeda untuk parameter -out, gunakan nama file yang sama dalam panggilan ke terraform apply.
  • Jika Anda tidak menggunakan parameter -out, panggil terraform apply tanpa parameter apa pun.

Memverifikasi hasil

  1. Dapatkan nama grup sumber daya Azure menggunakan perintah berikut.

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. Tampilkan nama kluster Kubernetes baru Anda menggunakan perintah az aks list .

    az aks list \
      --resource-group $resource_group_name \
      --query "[].{\"K8s cluster name\":name}" \
      --output table
    
  3. Dapatkan konfigurasi Kubernetes dari status Terraform dan simpan dalam file yang kubectl dapat dibaca menggunakan perintah berikut.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  4. Verifikasi bahwa perintah sebelumnya tidak menambahkan karakter EOT ASCII menggunakan perintah berikut.

    cat ./azurek8s
    

    Poin utama:

    • Jika Anda melihat << EOT di awal dan EOT di akhir, hapus karakter ini dari file. Jika tidak, Anda mungkin menerima pesan kesalahan berikut: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  5. Atur variabel lingkungan sehingga kubectl dapat mengambil konfigurasi yang benar menggunakan perintah berikut.

    export KUBECONFIG=./azurek8s
    
  6. Verifikasi kesehatan kluster menggunakan kubectl get nodes perintah .

    kubectl get nodes
    

Poin utama:

  • Saat Anda membuat kluster AKS, pemantauan diaktifkan untuk menangkap metrik kesehatan untuk node kluster dan pod. Metrik kesehatan tersebut tersedia di portal Azure. Untuk informasi lebih lanjut tentang pemantauan kesehatan kontainer, lihat Memantau kesehatan Azure Kubernetes Service.
  • Beberapa nilai kunci diklasifikasikan sebagai output saat Anda menerapkan rencana eksekusi Terraform. Misalnya, alamat host, nama pengguna kluster AKS, dan kata sandi kluster AKS adalah output.

Menyebarkan aplikasi

Untuk menyebarkan aplikasi, Anda menggunakan file manifes untuk membuat semua objek yang diperlukan untuk menjalankan aplikasi AKS Store. File manifes Kube menentukan status kluster yang diinginkan, seperti gambar kontainer mana yang akan dijalankan. Manifes mencakup penyebaran dan layanan Kubernetes berikut:

Cuplikan layar arsitektur sampel Azure Store.

  • Simpan depan: Aplikasi web bagi pelanggan untuk melihat produk dan melakukan pemesanan.
  • Layanan produk: Menampilkan informasi produk.
  • Layanan pesanan: Menempatkan pesanan.
  • Rabbit MQ: Antrean pesan untuk antrean pesanan.

Catatan

Kami tidak menyarankan untuk menjalankan kontainer stateful, seperti Rabbit MQ, tanpa penyimpanan persisten untuk produksi. Ini digunakan di sini untuk kesederhanaan, tetapi sebaiknya gunakan layanan terkelola, seperti Azure CosmosDB atau Azure Bus Layanan.

  1. Buat file bernama aks-store-quickstart.yaml dan salin dalam manifes berikut:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rabbitmq
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins            
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "password"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env: 
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    Untuk perincian file manifes YAML, lihat Manifes Penyebaran dan YAML.

    Jika Anda membuat dan menyimpan file YAML secara lokal, maka Anda dapat mengunggah file manifes ke direktori default Anda di CloudShell dengan memilih tombol Unggah/Unduh file dan memilih file dari sistem file lokal Anda.

  2. Sebarkan aplikasi menggunakan kubectl apply perintah dan tentukan nama manifes YAML Anda.

    kubectl apply -f aks-store-quickstart.yaml
    

    Contoh output berikut menunjukkan penyebaran dan layanan:

    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    

Uji aplikasi

Ketika aplikasi berjalan, layanan Kubernetes mengekspos front end aplikasi ke internet. Diperlukan beberapa menit untuk menyelesaikan proses ini.

  1. Periksa status pod yang disebarkan menggunakan kubectl get pods perintah . Buat semua pod sebelum Running melanjutkan.

    kubectl get pods
    
  2. Periksa alamat IP publik untuk aplikasi store-front. Pantau kemajuan menggunakan perintah kubectl get service dengan argumen --watch.

    kubectl get service store-front --watch
    

    Output EXTERNAL-IP untuk layanan awalnya store-front ditampilkan sebagai tertunda:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  3. Saat alamat IP EKSTERNAL berubah dari tertunda menjadi alamat IP publik yang sebenarnya, gunakan CTRL-C untuk menghentikan proses pemantauan kubectl.

    Output contoh berikut menunjukkan alamat IP publik yang valid yang ditetapkan ke layanan:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  4. Buka browser web ke alamat IP eksternal layanan Anda untuk melihat aplikasi Azure Store beraksi.

    Cuplikan layar aplikasi sampel AKS Store.

Membersihkan sumber daya

Menghapus sumber daya AKS

Ketika Anda tidak lagi membutuhkan sumber daya yang dibuat melalui Terraform, lakukan langkah-langkah berikut:

  1. Jalankan terraform plan dan tentukan bendera destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Poin utama:

    • Perintah terraform plan membuat rencana eksekusi, tetapi tidak menjalankannya. Perintah ini justru menentukan tindakan yang diperlukan untuk membuat konfigurasi yang ditentukan dalam file konfigurasi Anda. Pola ini memungkinkan Anda memastikan apakah rencana eksekusi telah sesuai dengan ekspektasi Anda sebelum membuat perubahan pada sumber daya aktual.
    • Parameter -out opsional memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter -out memastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.
  2. Jalankan terraform apply untuk menerapkan rencana eksekusi.

    terraform apply main.destroy.tfplan
    

Menghapus perwakilan layanan

  1. Dapatkan ID perwakilan layanan menggunakan perintah berikut.

    sp=$(terraform output -raw sp)
    
  2. Hapus perwakilan layanan menggunakan perintah az ad sp delete .

    az ad sp delete --id $sp
    

Mengkloning templat Azure Developer CLI

Azure Developer CLI memungkinkan Anda mengunduh sampel dengan cepat dari repositori Azure-Samples . Dalam mulai cepat kami, Anda mengunduh aks-store-demo aplikasi. Untuk informasi selengkapnya tentang kasus penggunaan umum, lihat azd gambaran umum.

  1. Kloning templat demo penyimpanan AKS dari repositori Azure-Samples menggunakan azd init perintah dengan --template parameter .

    azd init --template Azure-Samples/aks-store-demo
    
  2. Masukkan nama lingkungan untuk proyek Anda yang hanya menggunakan karakter alfanumerik dan tanda hubung, seperti aks-terraform-1.

    Enter a new environment name: aks-terraform-1
    

Masuk ke akun Azure Cloud Anda

azd Templat berisi semua kode yang diperlukan untuk membuat layanan, tetapi Anda perlu masuk ke akun Azure Anda untuk menghosting aplikasi di AKS.

  1. Masuk ke akun Anda menggunakan azd auth login perintah .

    azd auth login
    
  2. Salin kode perangkat yang muncul di output dan tekan enter untuk masuk.

    Start by copying the next code: XXXXXXXXX
    Then press enter and continue to log in from your browser...
    

    Penting

    Jika Anda menggunakan komputer virtual di luar jaringan atau GitHub Codespace, kebijakan keamanan Azure tertentu menyebabkan konflik saat digunakan untuk masuk dengan azd auth login. Jika Anda mengalami masalah di sini, Anda dapat mengikuti solusi azd auth yang disediakan, yang melibatkan penggunaan curl permintaan ke URL localhost tempat Anda dialihkan setelah menjalankan azd auth login.

  3. Autentikasi dengan kredensial Anda di halaman masuk organisasi Anda.

  4. Konfirmasikan bahwa Anda mencoba menyambungkan dari Azure CLI.

  5. Verifikasi pesan "Autentikasi kode perangkat selesai. Masuk ke Azure." muncul di terminal asli Anda.

    Waiting for you to complete authentication in the browser...
    Device code authentication completed.
    Logged in to Azure.
    

solusi azd auth

Solusi ini mengharuskan Anda menginstal Azure CLI .

  1. Buka jendela terminal dan masuk dengan Azure CLI menggunakan az login perintah dengan parameter yang --scope diatur ke https://graph.microsoft.com/.default.

    az login --scope https://graph.microsoft.com/.default
    

    Anda harus diarahkan ke halaman autentikasi di tab baru untuk membuat token akses browser, seperti yang ditunjukkan dalam contoh berikut:

    https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?clientid=<your_client_id>.
    
  2. Salin URL localhost halaman web yang Anda terima setelah mencoba masuk dengan azd auth login.

  3. Di jendela terminal baru, gunakan permintaan berikut curl untuk masuk. Pastikan Anda mengganti <localhost> tempat penampung dengan URL localhost yang Anda salin di langkah sebelumnya.

    curl <localhost>
    

    Login yang berhasil menghasilkan halaman web HTML, seperti yang ditunjukkan dalam contoh berikut:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="refresh" content="60;url=https://docs.microsoft.com/cli/azure/">
        <title>Login successfully</title>
        <style>
            body {
                font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            }
    
            code {
                font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
                display: inline-block;
                background-color: rgb(242, 242, 242);
                padding: 12px 16px;
                margin: 8px 0px;
            }
        </style>
    </head>
    <body>
        <h3>You have logged into Microsoft Azure!</h3>
        <p>You can close this window, or we will redirect you to the <a href="https://docs.microsoft.com/cli/azure/">Azure CLI documentation</a> in 1 minute.</p>
        <h3>Announcements</h3>
        <p>[Windows only] Azure CLI is collecting feedback on using the <a href="https://learn.microsoft.com/windows/uwp/security/web-account-manager">Web Account Manager</a> (WAM) broker for the login experience.</p>
        <p>You may opt-in to use WAM by running the following commands:</p>
        <code>
            az config set core.allow_broker=true<br>
            az account clear<br>
            az login
        </code>
    </body>
    </html>
    
  4. Tutup terminal saat ini dan buka terminal asli. Anda akan melihat daftar JSON langganan Anda.

  5. id Salin bidang langganan yang ingin Anda gunakan.

  6. Atur az account set langganan Anda menggunakan perintah .

    az account set --subscription <subscription_id>
    

Membuat dan menyebarkan sumber daya untuk kluster Anda

Untuk menyebarkan aplikasi, Anda menggunakan azd up perintah untuk membuat semua objek yang diperlukan untuk menjalankan aplikasi AKS Store.

  • File azure.yaml mendefinisikan status kluster yang diinginkan, seperti gambar kontainer mana yang akan diambil dan menyertakan penyebaran dan layanan Kubernetes berikut:

Diagram yang memperlihatkan arsitektur sampel Azure Store.

  • Simpan depan: Aplikasi web bagi pelanggan untuk melihat produk dan melakukan pemesanan.
  • Layanan produk: Menampilkan informasi produk.
  • Layanan pesanan: Menempatkan pesanan.
  • Rabbit MQ: Antrean pesan untuk antrean pesanan.

Catatan

Kami tidak menyarankan untuk menjalankan kontainer stateful, seperti Rabbit MQ, tanpa penyimpanan persisten untuk produksi. Ini digunakan di sini untuk kesederhanaan, tetapi sebaiknya gunakan layanan terkelola, seperti Azure Cosmos DB atau Azure Bus Layanan.

Menyebarkan sumber daya aplikasi

azd Templat untuk mulai cepat ini membuat grup sumber daya baru dengan kluster AKS dan Azure Key Vault. Brankas kunci menyimpan rahasia klien dan menjalankan layanan di pets namespace layanan.

  1. Buat semua sumber daya aplikasi menggunakan azd up perintah .

    azd up
    

    azd up menjalankan semua kait di dalam azd-hooks folder untuk melakukan pra-pendaftaran, provisi, dan menyebarkan layanan aplikasi.

    Kustomisasi kait untuk menambahkan kode kustom ke azd dalam tahap alur kerja. Untuk informasi selengkapnya, lihat azd referensi hook .

  2. Pilih langganan Azure untuk penggunaan tagihan Anda.

    ? Select an Azure Subscription to use:  [Use arrows to move, type to filter]
    > 1. My Azure Subscription (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    
  3. Pilih wilayah untuk menyebarkan aplikasi Anda.

    Select an Azure location to use:  [Use arrows to move, type to filter]
      1.  (South America) Brazil Southeast (brazilsoutheast)
      2.  (US) Central US (centralus)
      3.  (US) East US (eastus)
    > 43. (US) East US 2 (eastus2)
      4.  (US) East US STG (eastusstg)
      5.  (US) North Central US (northcentralus)
      6.  (US) South Central US (southcentralus)
    

    azd secara otomatis menjalankan kait praprovisi dan pascaprovisi untuk membuat sumber daya untuk aplikasi Anda. Diperlukan beberapa menit untuk menyelesaikan proses ini. Setelah selesai, Anda akan melihat output yang mirip dengan contoh berikut:

    SUCCESS: Your workflow to provision and deploy to Azure completed in 9 minutes 40 seconds.
    

Hasilkan paket Terraform

Dalam templat Pengembang Azure Anda, /infra/terraform folder berisi semua kode yang digunakan untuk menghasilkan paket Terraform.

Terraform menyebarkan dan menjalankan perintah menggunakan terraform apply sebagai bagian azddari langkah provisi. Setelah selesai, Anda akan melihat output yang mirip dengan contoh berikut:

Plan: 5 to add, 0 to change, 0 to destroy.
...
Saved the plan to: /workspaces/aks-store-demo/.azure/aks-terraform-azd/infra/terraform/main.tfplan

Uji aplikasi

Ketika aplikasi berjalan, layanan Kubernetes mengekspos front end aplikasi ke internet. Diperlukan beberapa menit untuk menyelesaikan proses ini.

  1. Atur namespace Anda sebagai namespace pets demo menggunakan kubectl set-context perintah .

    kubectl config set-context --current --namespace=pets
    
  2. Periksa status pod yang disebarkan menggunakan kubectl get pods perintah . Pastikan semua pod sebelum Running melanjutkan.

    kubectl get pods
    
  3. Periksa alamat IP publik untuk aplikasi store-front dan pantau kemajuan menggunakan kubectl get service perintah dengan --watch argumen .

    kubectl get service store-front --watch
    

    Output EXTERNAL-IP untuk layanan awalnya store-front ditampilkan sebagai tertunda:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  4. Saat alamat IP EKSTERNAL berubah dari tertunda menjadi alamat IP publik yang sebenarnya, gunakan CTRL-C untuk menghentikan proses pemantauan kubectl.

    Contoh output berikut menunjukkan alamat IP publik yang valid yang ditetapkan ke layanan:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  5. Buka browser web ke alamat IP eksternal layanan Anda untuk melihat aplikasi Azure Store beraksi.

    Cuplikan layar aplikasi sampel AKS Store.

Menghapus kluster

Setelah selesai dengan mulai cepat, bersihkan sumber daya yang tidak perlu untuk menghindari biaya Azure.

  1. Hapus semua sumber daya yang dibuat dalam mulai cepat menggunakan azd down perintah .

    azd down
    
  2. Konfirmasikan keputusan Anda untuk menghapus semua sumber daya yang digunakan dari langganan Anda dengan mengetik y dan menekan Enter.

    ? Total resources to delete: 14, are you sure you want to continue? (y/N)
    
  3. Izinkan pembersihan untuk menggunakan kembali variabel mulai cepat jika berlaku dengan mengetik y dan menekan Enter.

    [Warning]: These resources have soft delete enabled allowing them to be recovered for a period or time after deletion. During this period, their names can't be reused. In the future, you can use the argument --purge to skip this confirmation.
    

Memecahkan masalah Terraform pada Azure

Memecahkan masalah umum saat menggunakan Terraform di Azure.

Langkah berikutnya

Dalam panduan mulai cepat ini, Anda menerapkan kluster Kubernetes dan kemudian menerapkan aplikasi multi-kontainer sederhana ke dalamnya. Aplikasi sampel ini hanya untuk tujuan demo dan tidak mewakili semua praktik terbaik untuk aplikasi Kubernetes. Untuk panduan tentang membuat solusi lengkap dengan AKS untuk produksi, lihat panduan solusi AKS.

Untuk mempelajari lebih lanjut tentang AKS dan menelusuri contoh kode-ke-penyebaran lengkap, lanjutkan ke tutorial kluster Kubernetes.