Hızlı Başlangıç: Terraform kullanarak Azure Kubernetes Service (AKS) kümesi dağıtma

Azure Kubernetes Service (AKS), kümeleri hızla dağıtmanızı ve yönetmenizi sağlayan yönetilen bir Kubernetes hizmetidir. Bu hızlı başlangıçta:

  • Terraform kullanarak AKS kümesi dağıtma.
  • Bir grup mikro hizmet ve web ön ucuyla perakende senaryosu simülasyonu yaparak örnek bir çok kapsayıcılı uygulama çalıştırın.

Not

Aks kümesini hızlı bir şekilde sağlamaya başlamak için, bu makale yalnızca değerlendirme amacıyla varsayılan ayarlarla küme dağıtma adımlarını içerir. Üretime hazır bir kümeyi dağıtmadan önce, iş gereksinimlerinizle nasıl uyumlu olduğunu göz önünde bulundurmak için temel başvuru mimarimizi tanımanızı öneririz.

Başlamadan önce

  • Bu hızlı başlangıç, Kubernetes kavramlarının temel olarak bilindiğini varsayar. Daha fazla bilgi için bkz . Azure Kubernetes Service (AKS) için Kubernetes temel kavramları.
  • Etkin aboneliği olan bir Azure hesabına ihtiyacınız vardır. Hesabınız yoksa ücretsiz bir hesap oluşturun.
  • Komut satırı arabiriminize göre yönergeleri izleyin.

Not

Azure Linux düğüm havuzu artık genel kullanılabilirlik (GA) aşamasındadır. Avantajlar ve dağıtım adımları hakkında bilgi edinmek için bkz . AKS için Azure Linux Container Host'a giriş.

  • Terraform’u yükleyin ve yapılandırın.
  • kubectl dosyasını indirin.
  • random_pet kullanarak Azure kaynak grubu adı için rastgele bir değer oluşturun.
  • azurerm_resource_group kullanarak bir Azure kaynak grubu oluşturun.
  • azurerm_client_config kullanarak Azure Nesne Kimliğini almak için AzureRM sağlayıcısının yapılandırmasına erişin.
  • azurerm_kubernetes_cluster kullanarak bir Kubernetes kümesi oluşturun.
  • AzAPI kaynak azapi_resource oluşturun.
  • azapi_resource_action kullanarak SSH anahtar çifti oluşturmak için bir AzAPI kaynağı oluşturun.

Azure hesabınızda oturum açın

İlk olarak, Azure hesabınızda oturum açın ve aşağıdaki bölümde açıklanan yöntemlerden birini kullanarak kimlik doğrulaması yapın.

Terraform ve Azure kimlik doğrulama senaryoları

Terraform yalnızca Azure CLI aracılığıyla Azure'da kimlik doğrulamayı destekler. Azure PowerShell kullanarak kimlik doğrulaması desteklenmez. Bu nedenle Terraform çalışmanızı yaparken Azure PowerShell modülünü kullanabilirsiniz ancak önce Azure CLI kullanarak Azure'da kimlik doğrulaması yapmanız gerekir.

Bu makalede, aşağıdaki senaryolar için Terraform'un Azure'da kimlik doğrulaması nasıl yapılır açıklanmaktadır. Terraform'un Azure'da kimliğini doğrulama seçenekleri hakkında daha fazla bilgi için bkz . Azure CLI kullanarak kimlik doğrulama.

Microsoft hesabı aracılığıyla Azure'da kimlik doğrulaması

Microsoft hesabı, Azure gibi Microsoft hizmetleri oturum açmak için kullanılan bir kullanıcı adıdır (e-posta ve kimlik bilgileriyle ilişkilendirilmiş). Bir Microsoft hesabı, bir veya daha fazla Azure aboneliğiyle ilişkilendirilebilir ve bu aboneliklerden biri varsayılandır.

Aşağıdaki adımlarda aşağıdaki adımların nasıl yapıldığını gösterir:

  • Microsoft hesabı kullanarak Azure'da etkileşimli olarak oturum açma
  • Hesabın ilişkili Azure aboneliklerini listeleme (varsayılan abonelik dahil)
  • Geçerli aboneliği ayarlayın.
  1. Azure CLI'ya erişimi olan bir komut satırı açın.

  2. Az login komutunu herhangi bir parametre olmadan çalıştırın ve Azure'da oturum açmak için yönergeleri izleyin.

    az login
    

    Önemli noktalar:

    • Oturum başarıyla açıldıktan sonra, az login varsayılan abonelik de dahil olmak üzere oturum açmış Microsoft hesabıyla ilişkili Azure aboneliklerinin listesini görüntüler.
  3. Geçerli Azure aboneliğini onaylamak için az account show komutunu çalıştırın.

    az account show
    
  4. Belirli bir Microsoft hesabının tüm Azure abonelik adlarını ve kimliklerini görüntülemek için az account list komutunu çalıştırın.

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

    Önemli noktalar:

    • Yer tutucuyu <microsoft_account_email> , Azure aboneliklerini listelemek istediğiniz Microsoft hesabı e-posta adresiyle değiştirin.
    • Hotmail veya Outlook gibi bir Live hesabıyla, tam e-posta adresini belirtmeniz gerekebilir. Örneğin, e-posta adresiniz ise admin@hotmail.comyer tutucuyu ile live.com#admin@hotmail.comdeğiştirmeniz gerekebilir.
  5. Belirli bir Azure aboneliğini kullanmak için az account set komutunu çalıştırın.

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    Önemli noktalar:

    • Yer tutucuyu <subscription_id_or_subscription_name> , kullanmak istediğiniz aboneliğin kimliği veya adıyla değiştirin.
    • Arama az account set , belirtilen Azure aboneliğine geçmenin sonuçlarını görüntülemez. Ancak, geçerli Azure aboneliğinin değiştiğini onaylamak için kullanabilirsiniz az account show .
    • Önceki adımda komutunu az account list çalıştırırsanız, varsayılan Azure aboneliğinin ile az account setbelirttiğiniz aboneliğe değiştiğini görürsünüz.

Hizmet sorumlusu oluşturma

Terraform gibi Azure hizmetlerini dağıtan veya kullanan otomatik araçlar her zaman kısıtlı izinlere sahip olmalıdır. Azure, uygulamalarda tamamen ayrıcalıklı bir kullanıcı olarak oturum açma olması yerine hizmet sorumluları sağlar.

En yaygın desen, Azure'da etkileşimli olarak oturum açmak, bir hizmet sorumlusu oluşturmak, hizmet sorumlusunu test etmek ve sonra bu hizmet sorumlusunu gelecekteki kimlik doğrulaması için (etkileşimli olarak veya betiklerinizden) kullanmaktır.

  1. Hizmet sorumlusu oluşturmak için Azure'da oturum açın. Bir Microsoft hesabı aracılığıyla Azure'da kimlik doğrulaması yaptıktan sonra buraya dönün.

  2. Git Bash'ten bir hizmet sorumlusu oluşturuyorsanız ortam değişkenini MSYS_NO_PATHCONV ayarlayın. (Cloud Shell kullanıyorsanız bu adım gerekli değildir.)

    export MSYS_NO_PATHCONV=1    
    

    Önemli noktalar:

    • Ortam değişkenini MSYS_NO_PATHCONV genel olarak (tüm terminal oturumları için) veya yerel olarak (yalnızca geçerli oturum için) ayarlayabilirsiniz. Hizmet sorumlusu oluşturmak sık yaptığınız bir şey olmadığından, örnek geçerli oturum için değeri ayarlar. Bu ortam değişkenini genel olarak ayarlamak için, ayarı dosyaya ~/.bashrc ekleyin.
  3. Hizmet sorumlusu oluşturmak için az ad sp create-for-rbac komutunu çalıştırın.

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

    Önemli noktalar:

    • öğesini ortamınız için özel bir adla değiştirebilir <service-principal-name> veya parametresini tamamen atlayabilirsiniz. parametresini atlarsanız, hizmet asıl adı geçerli tarih ve saat temelinde oluşturulur.
    • Başarıyla tamamlandıktan sonra birkaç az ad sp create-for-rbac değer görüntüler. appId, passwordve tenant değerleri sonraki adımda kullanılır.
    • Parola kaybolursa alınamaz. Bu nedenle, parolanızı güvenli bir yerde depolamanız gerekir. Parolanızı unutursanız hizmet sorumlusu kimlik bilgilerini sıfırlayabilirsiniz.
    • Bu makale için Katkıda Bulunan rolüne sahip bir hizmet sorumlusu kullanılıyor. Rol Tabanlı Erişim Denetimi (RBAC) rolleri hakkında daha fazla bilgi için bkz . RBAC: Yerleşik roller.
    • Hizmet sorumlusu oluşturma çıktısı hassas kimlik bilgilerini içerir. Bu kimlik bilgilerini kodunuza eklemediğinizden veya kaynak denetiminizde kimlik bilgilerini denetlemediğinizden emin olun.
    • Azure CLI ile hizmet sorumlusu oluşturma seçenekleri hakkında daha fazla bilgi için Azure CLI ile Azure hizmet sorumlusu oluşturma makalesine bakın.

Ortam değişkenlerinde hizmet sorumlusu kimlik bilgilerini belirtme

Hizmet sorumlusu oluşturduktan sonra ortam değişkenleri aracılığıyla Terraform'a kimlik bilgilerini belirtebilirsiniz.

  1. ~/.bashrc Aşağıdaki ortam değişkenlerini ekleyerek dosyayı düzenleyin.

    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. Betiği yürütmek ~/.bashrc için komutunu (veya kısaltılmış eşdeğerini. ~/.bashrc) çalıştırın source ~/.bashrc . Ayrıca betiğin otomatik olarak çalışması için Cloud Shell'de çıkıp yeniden açabilirsiniz.

    . ~/.bashrc
    
  3. Ortam değişkenleri ayarlandıktan sonra, değerlerini aşağıdaki gibi doğrulayabilirsiniz:

    printenv | grep ^ARM*
    

Önemli noktalar:

  • Herhangi bir ortam değişkeninde olduğu gibi, Terraform betiğinin içinden bir Azure abonelik değerine erişmek için aşağıdaki söz dizimini kullanın: ${env.<environment_variable>}. Örneğin, değerine erişmek ARM_SUBSCRIPTION_ID için değerini belirtin ${env.ARM_SUBSCRIPTION_ID}.
  • Terraform yürütme planlarının oluşturulması ve uygulanması, hizmet sorumlusuyla ilişkili Azure aboneliğinde değişiklikler yapar. Bir Azure aboneliğinde oturum açtıysanız ve ortam değişkenleri ikinci bir Azure aboneliğine işaret ederse bu durum bazen kafa karıştırıcı olabilir. Şimdi açıklamak için aşağıdaki örneğe bakalım. İki Azure aboneliğiniz olduğunu varsayalım: SubA ve SubB. Ortam değişkenleri SubB'yi işaret ederken geçerli Azure aboneliği SubA (aracılığıyla az account showbelirlenir) ise Terraform tarafından yapılan tüm değişiklikler SubB'de olur. Bu nedenle, değişikliklerinizi görüntülemek için Azure CLI komutlarını veya Azure PowerShell komutlarını çalıştırmak için SubB aboneliğinizde oturum açmanız gerekir.

Terraform sağlayıcı bloğunda hizmet sorumlusu kimlik bilgilerini belirtme

Azure sağlayıcı bloğu, Azure aboneliğinizin kimlik doğrulama bilgilerini belirtmenize olanak tanıyan söz dizimini tanımlar.

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

Dikkat

Azure aboneliği kimlik bilgilerinizi bir Terraform yapılandırma dosyasında belirtme özelliği, özellikle test ederken kullanışlı olabilir. Ancak, kimlik bilgilerinin güvenilir olmayan kişiler tarafından görüntülenebilen bir düz metin dosyasında depolanması önerilmez.

Terraform kodunu uygulama

Not

Bu makalenin örnek kodu Azure Terraform GitHub deposunda bulunur. Terraform'un geçerli ve önceki sürümlerinden test sonuçlarını içeren günlük dosyasını görüntüleyebilirsiniz.

Azure kaynaklarını yönetmek için Terraform'un nasıl kullanılacağını gösteren diğer makalelere ve örnek koda bakın

  1. Örnek Terraform kodunu test etmek ve geçerli dizininiz yapmak için kullanabileceğiniz bir dizin oluşturun.

  2. adlı providers.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    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. adlı ssh.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    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. adlı main.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    # 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. adlı variables.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    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. adlı outputs.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    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
    }
    

Terraform'u başlatma

Terraform dağıtımını başlatmak için terraform init komutunu çalıştırın. Bu komut, Azure kaynaklarınızı yönetmek için gereken Azure sağlayıcısını indirir.

terraform init -upgrade

Önemli noktalar:

  • -upgrade parametresi, gerekli sağlayıcı eklentilerini yapılandırmanın sürüm kısıtlamalarına uygun en yeni sürüme yükseltir.

Terraform yürütme planı oluşturma

Terraform planını çalıştırarak yürütme planı oluşturun.

terraform plan -out main.tfplan

Önemli noktalar:

  • komutu terraform plan bir yürütme planı oluşturur ancak yürütmez. Bunun yerine, yapılandırma dosyalarınızda belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu düzen, gerçek kaynaklarda değişiklik yapmadan önce yürütme planının beklentilerinizle eşleşip eşleşmediğini doğrulamanızı sağlar.
  • İsteğe bağlı -out parametresi, plan için bir çıkış dosyası belirtmenize olanak tanır. parametresinin -out kullanılması, gözden geçirdiğiniz planın tam olarak uygulanan plan olmasını sağlar.

Terraform yürütme planı uygulama

Yürütme planını bulut altyapınıza uygulamak için terraform apply komutunu çalıştırın.

terraform apply main.tfplan

Önemli noktalar:

  • Örnek terraform apply komut, daha önce komutunu çalıştırdığınızı terraform plan -out main.tfplanvarsayar.
  • parametresi için -out farklı bir dosya adı belirttiyseniz, çağrısında terraform applyaynı dosya adını kullanın.
  • parametresini -out kullanmadıysanız, parametresiz olarak çağırın terraform apply .

Sonuçları doğrulama

  1. Aşağıdaki komutu kullanarak Azure kaynak grubu adını alın.

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. az aks list komutunu kullanarak yeni Kubernetes kümenizin adını görüntüleyin.

    az aks list \
      --resource-group $resource_group_name \
      --query "[].{\"K8s cluster name\":name}" \
      --output table
    
  3. Terraform durumundan Kubernetes yapılandırmasını alın ve aşağıdaki komutu kullanarak okuyabilen kubectl bir dosyada depolayın.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  4. Aşağıdaki komutu kullanarak önceki komutun ASCII EOT karakteri eklemediğini doğrulayın.

    cat ./azurek8s
    

    Önemli noktalar:

    • Başında ve EOT sonunda görüyorsanız<< EOT, bu karakterleri dosyadan kaldırın. Aksi takdirde aşağıdaki hata iletisini alabilirsiniz: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  5. Aşağıdaki komutu kullanarak doğru yapılandırmayı alabilmesi için bir ortam değişkeni kubectl ayarlayın.

    export KUBECONFIG=./azurek8s
    
  6. komutunu kullanarak kubectl get nodes kümenin durumunu doğrulayın.

    kubectl get nodes
    

Önemli noktalar:

  • AKS kümesini oluşturduğunuzda, hem küme düğümleri hem de podlar için sistem durumu ölçümlerini yakalamak için izleme etkinleştirildi. Bu sistem durumu ölçümleri Azure portaldan kullanılabilir. Küme durumu izleme hakkında daha fazla bilgi için bkz. Azure Kubernetes Hizmeti durumunu izleme.
  • Terraform yürütme planını uyguladığınızda çıkış olarak sınıflandırılan birkaç anahtar değeri. Örneğin, ana bilgisayar adresi, AKS kümesi kullanıcı adı ve AKS kümesi parolası çıkıştır.

Uygulamayı dağıtma

Uygulamayı dağıtmak için, AKS Store uygulamasını çalıştırmak için gereken tüm nesneleri oluşturmak için bir bildirim dosyası kullanırsınız. Kubernetes bildirim dosyası, hangi kapsayıcı görüntülerinin çalıştırıldığı gibi kümenin istenen durumunu tanımlar. Bildirim aşağıdaki Kubernetes dağıtımlarını ve hizmetlerini içerir:

Azure Store örnek mimarisinin ekran görüntüsü.

  • Mağaza ön: Müşterilerin ürünleri görüntülemesi ve sipariş vermesi için web uygulaması.
  • Ürün hizmeti: Ürün bilgilerini gösterir.
  • Sipariş hizmeti: Sipariş verir.
  • Rabbit MQ: Sipariş kuyruğu için ileti kuyruğu.

Not

Üretim için kalıcı depolama olmadan Rabbit MQ gibi durum bilgisi olan kapsayıcıları çalıştırmanızı önermiyoruz. Bunlar burada kolaylık sağlamak için kullanılır, ancak Azure CosmosDB veya Azure Service Bus gibi yönetilen hizmetleri kullanmanızı öneririz.

  1. Adlı aks-store-quickstart.yaml bir dosya oluşturun ve aşağıdaki bildirimde kopyalayın:

    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
    

    YAML bildirim dosyalarının dökümü için bkz . Dağıtımlar ve YAML bildirimleri.

    YAML dosyasını yerel olarak oluşturur ve kaydederseniz, Dosyaları Karşıya Yükle/İndir düğmesini seçip yerel dosya sisteminizden dosyayı seçerek bildirim dosyasını CloudShell'deki varsayılan dizininize yükleyebilirsiniz.

  2. komutunu kullanarak uygulamayı dağıtın kubectl apply ve YAML bildiriminizin adını belirtin.

    kubectl apply -f aks-store-quickstart.yaml
    

    Aşağıdaki örnek çıktı dağıtımları ve hizmetleri gösterir:

    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
    

Uygulamayı test etme

Uygulama çalıştırıldığında Kubernetes hizmeti, uygulamanın ön ucunu İnternet'te kullanıma sunar. Bu işlemin tamamlanması birkaç dakika sürebilir.

  1. komutunu kullanarak kubectl get pods dağıtılan podların durumunu denetleyin. Devam etmeden önce tüm podların olmasını Running sağlayın.

    kubectl get pods
    
  2. Mağaza ön uygulaması için genel IP adresi olup olmadığını denetleyin. bağımsız değişkeniyle komutunu kubectl get service kullanarak ilerleme durumunu --watch izleyin.

    kubectl get service store-front --watch
    

    Hizmetin EXTERNAL-IP çıkışı store-front başlangıçta beklemede olarak gösterilir:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  3. EXTERNAL-IP adresi bekleme durumundangerçek bir genel IP adresine geçtikten kubectl sonra izleme işlemini durdurmak için kullanınCTRL-C.

    Aşağıdaki örnek çıktıda hizmete atanmış geçerli bir genel IP adresi gösterilmektedir:

    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. Azure Store uygulamasının çalıştığını görmek için hizmetinizin dış IP adresine bir web tarayıcısı açın.

    AKS Store örnek uygulamasının ekran görüntüsü.

Kaynakları temizleme

AKS kaynaklarını silme

Terraform aracılığıyla oluşturulan kaynaklara artık ihtiyacınız kalmadığında aşağıdaki adımları uygulayın:

  1. terraform planını çalıştırın ve bayrağını destroy belirtin.

    terraform plan -destroy -out main.destroy.tfplan
    

    Önemli noktalar:

    • komutu terraform plan bir yürütme planı oluşturur ancak yürütmez. Bunun yerine, yapılandırma dosyalarınızda belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu düzen, gerçek kaynaklarda değişiklik yapmadan önce yürütme planının beklentilerinizle eşleşip eşleşmediğini doğrulamanızı sağlar.
    • İsteğe bağlı -out parametresi, plan için bir çıkış dosyası belirtmenize olanak tanır. parametresinin -out kullanılması, gözden geçirdiğiniz planın tam olarak uygulanan plan olmasını sağlar.
  2. Yürütme planını uygulamak için terraform apply komutunu çalıştırın.

    terraform apply main.destroy.tfplan
    

Hizmet sorumlusunu silme

  1. Aşağıdaki komutu kullanarak hizmet sorumlusu kimliğini alın.

    sp=$(terraform output -raw sp)
    
  2. az ad sp delete komutunu kullanarak hizmet sorumlusunu silin .

    az ad sp delete --id $sp
    

Azure Geliştirici CLI şablonunu kopyalama

Azure Geliştirici CLI'sı, Azure-Samples deposundan örnekleri hızlı bir şekilde indirmenize olanak tanır. Hızlı başlangıcımızda uygulamayı indireceksiniz aks-store-demo . Genel kullanım örnekleri hakkında daha fazla bilgi için genel bakışa azd bakın.

  1. parametresiyle --template komutunu kullanarak Azure-Samples deposundan azd init AKS deposu tanıtım şablonunu kopyalayın.

    azd init --template Azure-Samples/aks-store-demo
    
  2. Projeniz için yalnızca alfasayısal karakterleri ve aks-terraform-1 gibi kısa çizgileri kullanan bir ortam adı girin.

    Enter a new environment name: aks-terraform-1
    

Azure Bulut hesabınızda oturum açın

Şablon, azd hizmetleri oluşturmak için gereken tüm kodu içerir, ancak uygulamayı AKS'de barındırmak için Azure hesabınızda oturum açmanız gerekir.

  1. komutunu kullanarak azd auth login hesabınızda oturum açın.

    azd auth login
    
  2. Çıkışta görünen cihaz kodunu kopyalayın ve oturum açmak için Enter tuşuna basın.

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

    Önemli

    Ağ dışı bir sanal makine veya GitHub Codespace kullanıyorsanız, bazı Azure güvenlik ilkeleri ile azd auth loginoturum açmak için kullanıldığında çakışmalara neden olur. Burada bir sorunla karşılaşırsanız, sağlanan azd kimlik doğrulaması geçici çözümünü izleyebilirsiniz. Bu, çalıştırdıktan azd auth loginsonra yeniden yönlendirildiğiniz localhost URL'sine yönelik bir curl istek kullanmayı içerir.

  3. Kuruluşunuzun oturum açma sayfasında kimlik bilgilerinizle kimlik doğrulaması.

  4. Azure CLI'dan bağlanmaya çalıştığınızı onaylayın.

  5. "Cihaz kodu kimlik doğrulaması tamamlandı. Azure'da oturum açıldı." ifadesi özgün terminalinizde görünür.

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

azd auth geçici çözümü

Bu geçici çözüm, Azure CLI'nin yüklü olmasını gerektirir.

  1. Bir terminal penceresi açın ve parametresi olarak ayarlanmış https://graph.microsoft.com/.defaultkomutunu kullanarak az login Azure CLI ile --scope oturum açın.

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

    Aşağıdaki örnekte gösterildiği gibi tarayıcı erişim belirteci oluşturmak için yeni bir sekmedeki kimlik doğrulama sayfasına yönlendirilmelisiniz:

    https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?clientid=<your_client_id>.
    
  2. ile azd auth loginoturum açmayı denedikten sonra aldığınız web sayfasının localhost URL'sini kopyalayın.

  3. Yeni bir terminal penceresinde oturum açmak için aşağıdaki curl isteği kullanın. Yer tutucuyu <localhost> önceki adımda kopyaladığınız localhost URL'si ile değiştirdiğinizden emin olun.

    curl <localhost>
    

    Başarılı bir oturum açma işlemi, aşağıdaki örnekte gösterildiği gibi bir HTML web sayfasının çıkışını verir:

    <!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. Geçerli terminali kapatın ve özgün terminali açın. Aboneliklerinizin JSON listesini görmeniz gerekir.

  5. id Kullanmak istediğiniz aboneliğin alanını kopyalayın.

  6. komutunu kullanarak az account set aboneliğinizi ayarlayın.

    az account set --subscription <subscription_id>
    

Kümeniz için kaynak oluşturma ve dağıtma

Uygulamayı dağıtmak için komutunu kullanarak azd up AKS Mağazası uygulamasını çalıştırmak için gereken tüm nesneleri oluşturursunuz.

  • Dosya azure.yaml , aşağıdaki Kubernetes dağıtımlarını ve hizmetlerini içeren kapsayıcı görüntülerinin getirildiği gibi kümenin istenen durumunu tanımlar:

Azure Store örnek mimarisini gösteren diyagram.

  • Mağaza ön: Müşterilerin ürünleri görüntülemesi ve sipariş vermesi için web uygulaması.
  • Ürün hizmeti: Ürün bilgilerini gösterir.
  • Sipariş hizmeti: Sipariş verir.
  • Rabbit MQ: Sipariş kuyruğu için ileti kuyruğu.

Not

Üretim için kalıcı depolama olmadan Rabbit MQ gibi durum bilgisi olan kapsayıcıları çalıştırmanızı önermiyoruz. Bunlar burada kolaylık sağlamak için kullanılır, ancak Azure Cosmos DB veya Azure Service Bus gibi yönetilen hizmetleri kullanmanızı öneririz.

Uygulama kaynaklarını dağıtma

Bu hızlı başlangıcın azd şablonu AKS kümesi ve Azure Key Vault ile yeni bir kaynak grubu oluşturur. Anahtar kasası istemci gizli dizilerini depolar ve hizmetleri ad alanında pets çalıştırır.

  1. komutunu kullanarak azd up tüm uygulama kaynaklarını oluşturun.

    azd up
    

    azd up, uygulama hizmetlerini önceden kaydetmek, sağlamak ve dağıtmak için klasörün içindeki azd-hooks tüm kancaları çalıştırır.

    İş akışı aşamalarına özel kod eklemek için kancaları özelleştirin azd . Daha fazla bilgi için kanca başvurusuna azd bakın.

  2. Faturalama kullanımınız için bir Azure aboneliği seçin.

    ? Select an Azure Subscription to use:  [Use arrows to move, type to filter]
    > 1. My Azure Subscription (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    
  3. Uygulamanızın dağıtılacağı bölgeyi seçin.

    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 uygulamanızın kaynaklarını oluşturmak için ön sağlama ve sağlama sonrası kancalarını otomatik olarak çalıştırır. Bu işlemin tamamlanması birkaç dakika sürebilir. İşlem tamamlandıktan sonra aşağıdaki örneğe benzer bir çıkış görmeniz gerekir:

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

Terraform planları oluşturma

Azure Geliştirici şablonunuzun içinde, /infra/terraform klasör Terraform planını oluşturmak için kullanılan tüm kodu içerir.

Terraform, 'nin sağlama adımının azdbir parçası olarak kullanarak terraform apply komutları dağıtır ve çalıştırır. İşlem tamamlandıktan sonra aşağıdaki örneğe benzer bir çıkış görmeniz gerekir:

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

Uygulamayı test etme

Uygulama çalıştırıldığında Kubernetes hizmeti, uygulamanın ön ucunu İnternet'te kullanıma sunar. Bu işlemin tamamlanması birkaç dakika sürebilir.

  1. komutunu kullanarak kubectl set-context ad alanınızı demo ad alanı pets olarak ayarlayın.

    kubectl config set-context --current --namespace=pets
    
  2. komutunu kullanarak kubectl get pods dağıtılan podların durumunu denetleyin. Devam etmeden önce tüm podların olduğundan Running emin olun.

    kubectl get pods
    
  3. Depo ön uygulaması için genel IP adresi olup olmadığını denetleyin ve bağımsız değişkeniyle komutunu kullanarak ilerleme durumunu kubectl get service--watch izleyin.

    kubectl get service store-front --watch
    

    Hizmetin EXTERNAL-IP çıkışı store-front başlangıçta beklemede olarak gösterilir:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  4. EXTERNAL-IP adresi bekleme durumundangerçek bir genel IP adresine geçtikten kubectl sonra izleme işlemini durdurmak için kullanınCTRL-C.

    Aşağıdaki örnek çıktı hizmete atanmış geçerli bir genel IP adresini gösterir:

    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. Azure Store uygulamasının çalıştığını görmek için hizmetinizin dış IP adresine bir web tarayıcısı açın.

    AKS Store örnek uygulamasının ekran görüntüsü.

Küme silme

Hızlı başlangıcı tamamladıktan sonra, Azure ücretlerinden kaçınmak için gereksiz kaynakları temizleyin.

  1. komutunu kullanarak azd down hızlı başlangıçta oluşturulan tüm kaynakları silin.

    azd down
    
  2. yazarak y ve tuşuna basarak Entertüm kullanılan kaynakları aboneliğinizden kaldırma kararınızı onaylayın.

    ? Total resources to delete: 14, are you sure you want to continue? (y/N)
    
  3. yazarak y ve tuşuna basarak Entertemizleme işleminin varsa hızlı başlangıç değişkenlerini yeniden kullanmasına izin verin.

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

Azure'da Terraform sorunlarını giderme

Azure'da Terraform kullanırken karşılaşılan yaygın sorunları giderme.

Sonraki adımlar

Bu hızlı başlangıçta bir Kubernetes kümesi dağıttınız ve ardından basit bir çok kapsayıcılı uygulama dağıttınız. Bu örnek uygulama yalnızca tanıtım amaçlıdır ve Kubernetes uygulamaları için en iyi yöntemlerin tümünü temsil etmez. Üretim için AKS ile tam çözüm oluşturma yönergeleri için bkz . AKS çözümü kılavuzu.

AKS hakkında daha fazla bilgi edinmek ve eksiksiz bir koddan dağıtım örneğine gitmek için Kubernetes kümesi öğreticisine geçin.