Terraform ile Azure Kubernetes Service (AKS) Kurulumu

ahmets.eth
5 min readMar 9, 2023

--

Cloud Provider’ lar (Azure, Amazon, Google vb.) kubernetes hizmeti sağlarken müşterilerine sadece worker node üzerinde işlem yapmasına olanak sağlıyor. Master node tarafının yönetimiyse onlara ait. Kuruluma geçmeden önce neden kubernetes kurulumunu panelden yapmak yerine neden Terraform kullandığıma değinmek istiyorum. Terraform open-source bir Infrastructure as Code (IaC) aracıdır. Yeni bir altyapı veya mevcut altyapı da değişiklik yapmak istediğinizde bunu kod satırlarıyla yapıp olası sorunlarda fiziki müdahale yerine kod aracılığıyla yapmak, yaptığınız değişiklikleri görmek, düzenlemek ve geri alma gibi işlemleri hızlıca yapmanıza olanak sağlamaktadır. Planladığınız altyapının on-prem de veya farklı cloud provider’ larında olmasının hiçbir önemi olmadan basit değişikliklerle yapınızı kısa süre içinde hazır hale getirebilirsiniz.

Infrastructure as Code Uygulamalarının Karşılaştırılması

Terraform alternatifleriyle kıyaslandığında multi-vendor (AWS, Azure, OpenStack, GCP vb.) desteğinin olması, aynı altyapıyı farklı ortamlarda (dev, staging, prod, private, test vb.) oluşturmaya olanak sağlaması, altayapının grafiğini çıkarması ve open source olmasıyla öne çıkmaktadır. Daha detaylı bilgi almak için aşağıdaki sayfayı inceleyebilirsiniz.

Bu aşamaya kadar neyi neden kullandığımızı hallettik. İşin pratik kısmına geçelim. Terraform dosyalarını hazırlarken kullanacağımız blokları ayrı dosyalarda tutmamız geriye dönük okunabilirlik açısından önemlidir. Buna dikkat edecek şekilde toplamda 4 adet dosya kullanacağız.

  • main.tf
  • variables.tf
  • providers.tf
  • output.tf

Ana şablonun -hangi kaynaklar, hangi bölgede, hangi özellikte, hangi isimle- bulunduğu main.tf dosyası oluşturuyoruz.

resource "azurerm_resource_group" "aks-dev" {
name = "rg-azno-dev-mordor"
location = "North Europe"
}

resource "azurerm_kubernetes_cluster" "mordor" {
name = "aks-azno-dev-mordor"
location = azurerm_resource_group.aks-dev.location
resource_group_name = azurerm_resource_group.aks-dev.name
dns_prefix = "aks-dev"

default_node_pool {
name = "vmpool"
node_count = 1
vm_size = "Standard_B2s"
enable_auto_scaling = "true"
min_count = var.min_count
max_count = var.max_count
}

identity {
type = "SystemAssigned"
}

network_profile {
network_plugin = var.network_plugin
}

tags = {
CreatedDepartent = "Security"
CreatedBy = "Terraform"
Environment = "Development"
}
}

Tasarım şeklini genelden özele şeklinde düşünebilirsiniz.

  • North Europe bölgesinde bir Resource Group oluşturması ve adının “rg-azno-dev-mordor” olmasını belirtiyoruz.
  • Resource Group’ un içerisinde Kubernetes Cluster’ ı oluşturmasını ve adının “aks-azno-dev-mordor” olmasını belirtiyoruz.
  • Kubernetes’ ın kurulu olacağı vm türünün “Standart_B2s” en az ve en çok çalışacak node sayısını yapıyı kurarken istemesi için değişken ataması yaptık.
  • Son olarakta uygulamanın kim tarafından hangi ortam için hazırlandığının anlaşılması için etiketleme adımlarını yazdık.

PS: Büyük yapılarda oluşturacağınız kaynakların belirli bir standarda uygun olarak adlandırılması sürdürebilirlik ve bilgi kaybı oluşmaması için önemlidir.

main.tf dosyasında oluşturduğumuz değişkenleri tanımlamamız için variables.tf dosyasını oluşturuyoruz.

variable "max_count" {

}
variable "min_count" {

default = 1
type = number

}
variable "network_plugin" {
}
  • default_node_pool’ da belirttiğimiz max.count değerini deploy başlamadan önce bize sormasını min.count değerinin de “number” formatında ve 1 olmasını belirtiyoruz.
  • network_plugin’ inin de deploy başlamadan önce bize sormasını istiyoruz. Bu değer default olarak “kubenet” seçilidir.

Providers.tf dosyasında da deploy işlemini hangi platformda hangi terraform sürümünü kullanarak yapacağımız belirttiğimiz dosyadır.

terraform {
required_version = ">=1.0"

required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
random = {
source = "hashicorp/random"
version = "~>3.0"
}
}
}

provider "azurerm" {
features {}
}

Provider dosyalarının en güncel hali için Terraform’ un registry sayfalarını kontrol etmeyi unutmayın.

Deploy tamamlandıktan sonra çıktı olarak istediğimiz değerleri output.tf dosyasına yazıyoruz.

output "client_certificate" {
value = azurerm_kubernetes_cluster.mordor.kube_config[0].client_certificate
sensitive = true
}

output "kube_config" {
value = azurerm_kubernetes_cluster.mordor.kube_config_raw
sensitive = true
}

output "default_node_pool" {
value = azurerm_kubernetes_cluster.mordor.default_node_pool
}

output "identity_type" {
value = azurerm_kubernetes_cluster.mordor.identity.0.type

}

Çıktı olarak istediğimiz sertifika ve kube config bilgileri gizli bilgiler içerdiği için sadece çıktı olarak true dönmesini belirtiyoruz.

Terminalden Azure’ a Bağlanma

Geliştirme adımını tamamladıktan sonra Azure platformuna deploy yapabilmek için öncelikle terminalden Azure hesabımıza “az login” komutuyla bağlanıyoruz.

Terraform Deployment Süreci

Ve son adımdayız. Görevimiz Deploy.

terraform plan Komut Çıktısı

Yukarıdaki akışa uygun bir şekilde ilerlemek için öncelikle “terraform plan” komutuyla Terraform’ un AKS’ i kurarken nerelerde hangi değişiklikleri yapacağını içeren ön çıktı alırız. Bu sayede yaptığımız değişiklikleri ve gözden kaçan yerleri kontrol ederiz.

terraform apply Komut Çıktısı

Plan aşamasında değişiklikleri gözden geçirip onayladıktan sonra “terraform apply” komutuyla deployment sürecini başlatıyoruz.

Terraform deploy işlemine başlamadan önce değişiklikleri son kez göstererek bizden onay istemektedir.

Bu süreci bypass etmek için “--auto-approve” komutunu kullanabilirsiniz.

terraform apply Komut Çıktısı 2

Deploy successful.

Şimdi portalden Resource Group ve Kubernetes Cluster’ ı kontrol edelim.

aks-azno-dev-mordor Sayfası

main.tf dosyasında belirttiğimiz şekilde rg-azno-dev-mordor Resource Group’ unun altında aks-azno-dev-mordor adıyla Kubernetes Service’ imiz 1.24.9 versiyonuyla ayağa kalkmıştır.

Bu yazımızda Terraform’ da deployment sürecinin nasıl yapıldığını uygulamalı bir şekilde inceledik. Süreci uygulamaları olarak denemek isterseniz aşağıdaki Github reposundan dosyaları çekebilirsiniz. Bir sonraki yazı da görüşmek dileğiyle.

--

--