Terrayform kullanarak Azure Kubernetes hizmeti ile bir Kubernetes kümesi oluşturma

Azure Kubernetes hizmeti (AKS) , barındırılan Kubernetes ortamınızı yönetir. AKS, kapsayıcı düzenleme uzmanlığı olmadan Kapsayıcılı uygulamaları dağıtmanıza ve yönetmenize olanak tanır. AKS Ayrıca, uygulamanızı çevrimdışı duruma getirmeden birçok yaygın bakım işlemi yapmanızı sağlar. Bu işlemler, kaynakları isteğe bağlı olarak sağlamayı, yükseltmeyi ve ölçeklendirmeyi içerir.

Bu makalede şunları öğreneceksiniz:

  • HCL (HashiCorp Language) ile Kubernetes kümesi tanımlama
  • Terraform ve AKS ile Kubernetes kümesi oluşturma
  • kubectl aracıyla bir Kubernetes kümesinin kullanılabilirlik durumunu test etme

1. ortamınızı yapılandırın

  • Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
  • Azure hizmet sorumlusu: hizmet sorumlusu yoksa hizmet sorumlusu oluşturun. ,, Ve değerlerini unutmayın appIddisplayNamepasswordtenant .

2. SSH anahtar çifti oluşturma

Bu makaledeki örnek, kullanıcıyı VM 'ye doğrulamak için bir SSH anahtar çifti kullanır.

Ortamınıza bağlı olarak aşağıdaki makalelerden birini kullanarak bir SSH anahtar çifti oluşturun:

3. dizin yapısını oluşturma

İlk adım, bu alıştırmadaki Terraform yapılandırma dosyalarınızı barındıracak olan dizini oluşturmaktır.

  1. Terrayform komutlarını çalıştırabileceğiniz bir komut satırı istemi açın.

  2. terraform-aks-k8s adlı bir dizin oluşturun.

  3. Dizinleri yeni dizinle değiştirin:

4. Azure sağlayıcısını bildirme

Bir Terrayform yapılandırma dosyası, sağlayıcının belirtimine göre başlatılır. Azure 'u kullanırken, bloğunda Azure sağlayıcısını (azurerd) belirtirsiniz .

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}
provider "azurerm" {
  features {}
}
resource "azurerm_resource_group" "rg" {
  name = "<resource_group_name>"
  location = "<location>"
}

# Your Terraform code goes here...

Anahtar noktaları:

  • versionÖzniteliği isteğe bağlı olsa da HashiCorp, sağlayıcının belirli bir sürümüne sabitlenmesini öneriyor.
  • Azure sağlayıcısı 1. x kullanıyorsanız, features bloğa izin verilmez.
  • Azure sağlayıcısı 2. x kullanıyorsanız, features blok gereklidir.
  • Azurerm_resource_group kaynak bildiriminin iki bağımsız değişkeni vardır: ve . Yer tutucuları ortamınız için uygun değerlere ayarlayın.
  • Kaynak grubu için Yerel adlandırılmış değeri , kaynak grubuna başvururken nasıl yapılır ve makale makaleleri boyunca kullanılır. Bu değer, kaynak grubu adından bağımsızdır ve yalnızca kodunuzdaki değişken adına başvurur. Bu değeri kaynak grubu tanımında değiştirirseniz, ona başvuran kodda de değiştirin.

5. bir Kubernetes kümesi tanımlayın

Kubernetes kümesinin kaynaklarını tanımlayan Terraform yapılandırma dosyasını oluşturun.

  1. k8s.tf adlı bir dosya oluşturun.

  2. Aşağıdaki kodu yeni dosyaya ekleyin:

    resource "azurerm_resource_group" "k8s" {
        name     = var.resource_group_name
        location = var.location
    }
    
    resource "random_id" "log_analytics_workspace_name_suffix" {
        byte_length = 8
    }
    
    resource "azurerm_log_analytics_workspace" "test" {
        # The WorkSpace name has to be unique across the whole of azure, not just the current subscription/tenant.
        name                = "${var.log_analytics_workspace_name}-${random_id.log_analytics_workspace_name_suffix.dec}"
        location            = var.log_analytics_workspace_location
        resource_group_name = azurerm_resource_group.k8s.name
        sku                 = var.log_analytics_workspace_sku
    }
    
    resource "azurerm_log_analytics_solution" "test" {
        solution_name         = "ContainerInsights"
        location              = azurerm_log_analytics_workspace.test.location
        resource_group_name   = azurerm_resource_group.k8s.name
        workspace_resource_id = azurerm_log_analytics_workspace.test.id
        workspace_name        = azurerm_log_analytics_workspace.test.name
    
        plan {
            publisher = "Microsoft"
            product   = "OMSGallery/ContainerInsights"
        }
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
        name                = var.cluster_name
        location            = azurerm_resource_group.k8s.location
        resource_group_name = azurerm_resource_group.k8s.name
        dns_prefix          = var.dns_prefix
    
        linux_profile {
            admin_username = "ubuntu"
    
            ssh_key {
                key_data = file(var.ssh_public_key)
            }
        }
    
        default_node_pool {
            name            = "agentpool"
            node_count      = var.agent_count
            vm_size         = "Standard_D2_v2"
        }
    
        service_principal {
            client_id     = var.client_id
            client_secret = var.client_secret
        }
    
        addon_profile {
            oms_agent {
            enabled                    = true
            log_analytics_workspace_id = azurerm_log_analytics_workspace.test.id
            }
        }
    
        network_profile {
            load_balancer_sku = "Standard"
            network_plugin = "kubenet"
        }
    
        tags = {
            Environment = "Development"
        }
    }
    

    Yukarıdaki kod, kümenin, konumun ve kaynak grubu adının adını ayarlar. Tam etki alanı adı (FQDN) için önek de ayarlanır. FQDN, kümeye erişmek için kullanılır.

    linux_profileKayıt, SSH kullanarak çalışan düğümlerinde oturum açmayı etkinleştiren ayarları yapılandırmanıza olanak tanır.

    AKS ile yalnızca çalışan düğümleri için ödeme yaparsınız. default_node_poolKayıt, bu çalışan düğümlerinin ayrıntılarını yapılandırır. , default_node_pool record Oluşturulacak çalışan düğümlerinin sayısını ve çalışan düğümlerinin türünü içerir. Daha sonra kümede ölçeği büyütme veya küçültme yapmanız gerekiyorsa, count bu kayıttaki değeri değiştirirsiniz.

6. değişkenleri bildirin

  1. variables.tfProje değişkenlerini içerecek şekilde adlı bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    variable "client_id" {}
    variable "client_secret" {}
    
    variable "agent_count" {
        default = 3
    }
    
    variable "ssh_public_key" {
        default = "~/.ssh/id_rsa.pub"
    }
    
    variable "dns_prefix" {
        default = "k8stest"
    }
    
    variable cluster_name {
        default = "k8stest"
    }
    
    variable resource_group_name {
        default = "azure-k8stest"
    }
    
    variable location {
        default = "Central US"
    }
    
    variable log_analytics_workspace_name {
        default = "testLogAnalyticsWorkspaceName"
    }
    
    # refer https://azure.microsoft.com/global-infrastructure/services/?products=monitor for log analytics available regions
    variable log_analytics_workspace_location {
        default = "eastus"
    }
    
    # refer https://azure.microsoft.com/pricing/details/monitor/ for log analytics pricing 
    variable log_analytics_workspace_sku {
        default = "PerGB2018"
    }
    

7. bir Terrayform çıkış dosyası oluşturma

Terraform çıkışları, Terraform bir plan uyguladığında kullanıcı için vurgulanabilecek değerleri tanımlamanızı sağlar. Bu değerler komutuyla sorgulanabilir. Bu bölümde kubectl ile kümeye erişmenizi sağlayan bir çıkış dosyası oluşturacaksınız.

  1. output.tf adlı bir dosya oluşturun.

  2. Aşağıdaki kodu yeni dosyaya ekleyin:

    output "client_key" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_key
    }
    
    output "client_certificate" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_certificate
    }
    
    output "cluster_ca_certificate" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.cluster_ca_certificate
    }
    
    output "cluster_username" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.username
    }
    
    output "cluster_password" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.password
    }
    
    output "kube_config" {
        value = azurerm_kubernetes_cluster.k8s.kube_config_raw
        sensitive = true
    }
    
    output "host" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.host
    }
    

8. Terrayform durumunu depolamak için Azure Storage 'ı ayarlama

Terraform, durumu terraform.tfstate dosyasıyla yerel olarak izler. Bu model tek kişilik bir ortamda iyi çalışır. Çok kişili bir ortamda, durumu izlemek için Azure depolama kullanılır.

Bu bölümde, aşağıdaki görevlerin nasıl yapılacağını göreceksiniz:

  • Depolama hesabı bilgilerini alma (hesap adı ve hesap anahtarı)
  • Terrayform durum bilgilerinin depolanacağı bir depolama kapsayıcısı oluşturun.
  1. Azure portalda sol taraftaki menüden Tüm hizmetler'i seçin.

  2. Depolama hesapları'nı seçin.

  3. Depolama hesapları sekmesinde Terraform durum bilgilerinin depolanacağı depolama hesabının adını seçin. Örneğin Cloud Shell'i ilk açtığınızda oluşturulmuş olan depolama hesabını kullanabilirsiniz. Cloud Shell tarafından oluşturulan depolama hesabı genellikle cs ile başlar ve sonrasında rastgele sayı ve harf dizesi bulunur. Seçtiğiniz depolama hesabını bir yere göz atın. Bu değer daha sonra gereklidir.

  4. Depolama hesabı sekmesinde Erişim anahtarları'nı seçin.

    Depolama hesabı adı

  5. key1anahtar değerini not edin. (Anahtarın sağ tarafındaki simgeyi seçtiğinizde değer panoya kopyalanır.)

    Depolama hesabı erişim anahtarları

  6. Azure depolama hesabınızda bir kapsayıcı oluşturun. Yer tutucuları ortamınız için uygun değerlerle değiştirin.

    az storage container create -n tfstate --account-name <YourAzureStorageAccountName> --account-key <YourAzureStorageAccountKey>
    

9. Kubernetes kümesi oluşturma

Bu bölümde, terraform init önceki bölümlerde oluşturduğunuz yapılandırma dosyalarında tanımlanan kaynakları oluşturmak için komutunu nasıl kullanacağınızı görürsünüz.

  1. Cloud Shell ' de Terrayform ' u başlatın. Yer tutucuları ortamınız için uygun değerlerle değiştirin.

    terraform init -backend-config="storage_account_name=<YourAzureStorageAccountName>" -backend-config="container_name=tfstate" -backend-config="access_key=<YourStorageAccountAccessKey>" -backend-config="key=codelab.microsoft.tfstate" 
    

    terraform initKomut, arka uç ve sağlayıcı eklentisinin başlatılma başarısını görüntüler:

  2. Hizmet sorumlusu kimlik bilgilerini dışarı aktarma Yer tutucuları hizmet sorumlınızdan uygun değerlerle değiştirin.

    export TF_VAR_client_id=<service-principal-appid>
    export TF_VAR_client_secret=<service-principal-password>
    
  3. terraform plan komutunu çalıştırarak altyapı öğelerini tanımlayan Terraform planını oluşturun.

    terraform plan -out out.plan
    

    terraform plan komutu, terraform apply komutunu çalıştırdığınızda oluşturularak kaynakları gösterir:

  4. Kubernetes kümesini oluşturma planını uygulamak için terraform apply komutunu çalıştırın. Bir Kubernetes kümesi oluşturma işlemi birkaç dakika sürebilir ve Cloud Shell oturum zaman aşımına uğramaz. Cloud Shell oturum zaman aşımına uğrarsa, işlemi tamamlamanıza olanak tanımak için "Cloud Shell zaman aşımından kurtarma" bölümündeki adımları izleyebilirsiniz.

    terraform apply out.plan
    

    terraform apply komutu, yapılandırma dosyalarınızda tanımlı kaynakların oluşturulmasının sonuçlarını gösterir:

  5. Azure portal yeni Kubernetes kümeniz için oluşturulan kaynakları görmek için, sol taraftaki menüden tüm kaynaklar ' ı seçin.

    Azure portal tüm kaynaklar

10. Cloud Shell zaman aşımından kurtarma

Cloud Shell oturumu zaman aşımına uğrarsa, kurtarmak için aşağıdaki adımları gerçekleştirebilirsiniz:

  1. Cloud Shell oturumu başlatın.

  2. Terraform yapılandırma dosyalarınızı içeren dizine geçin.

    cd /clouddrive/terraform-aks-k8s
    
  3. Şu komutu çalıştırın:

    export KUBECONFIG=./azurek8s
    

11. Kubernetes kümesini test etme

Yeni oluşturulan kümeyi doğrulamak için Kubernetes araçlarını kullanabilirsiniz.

  1. Terraform durumundaki Kubernetes yapılandırmasını alın ve kubectl tarafından okunabilecek bir dosyaya kaydedin.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  2. Önceki komutun bir EOT ASCII karakteri eklememediğinden emin olun

    cat ./azurek8s
    

    << EOTBaşında ve EOT sonunda görüyorsanız, bu dosyaları kaldırmak için dosyanın içeriğini düzenleyin. Bu gereklidir, aksi takdirde şu iletiyi alabilirsiniz: error: error loading config file "./azurek8s": yaml: line 2: mapping values ​​are not allowed in this context

  3. kubectl aracının doğru yapılandırmayı alabilmesi için bir ortam değişkeni ayarlayın.

    export KUBECONFIG=./azurek8s
    
  4. Kümenin durumunu doğrulayın.

    kubectl get nodes
    

    Çalışan düğümlerinin ayrıntılarını görmeniz ve bu düğümlerin durumunun aşağıdaki görüntüde olduğu gibi Ready (Hazır) olması gerekir:

    kubectl aracı, Kubernetes kümenizin durumunu doğrulamanızı sağlar

12. sistem durumunu ve günlükleri izleme

AKS kümesi oluşturulduğunda hem küme düğümleri hem de pod'lar için sistem durumu ölçümlerini yakalamak için izleme özellikleri etkinleştirilmiştir. 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.

Azure 'da Terrampaform sorunlarını giderme

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

Sonraki adımlar