BiSoft Logo

Hizmetler

Ürünler

Ortaklık

Blog

Turkish

Genel

Hardcoded IP'lere Son: Terraform templatefile ile Dinamik K3s Cluster Kurulumu

DevOps mühendisleri olarak otomasyonu seviyoruz. Ancak altyapı oluştururken sıklıkla bir “Tavuk ve Yumurta” problemiyle karşılaşıyoruz: Server B’yi, Server A henüz oluşturulmamışsa Server A’nın IP adresiyle nasıl yapılandırabilirim?

Bu rehberde yalnızca Multipass ve WSL kullanarak hafif bir Kubernetes (K3s) cluster’ı oluşturmayacağız. Aynı zamanda Terraform’un en güçlü özelliklerinden biri olan templatefile fonksiyonunu kullanarak bu dinamik yapılandırma problemini çözeceğiz.

Bu eğitimin sonunda çalışan bir local lab ortamınız ve dinamik verileri startup script’lerinize nasıl aktaracağınız konusunda sağlam bir anlayışınız olacak.

1. Kurulum ve Ön Gereksinimler

Koda geçmeden önce, altyapımızı güçlendiren aracı kısaca anlayalım.

Multipass Nedir?

Ubuntu’nun geliştiricisi olan Canonical tarafından geliştirilen Multipass, özellikle geliştiriciler için tasarlanmış hafif bir VM yöneticisidir. Ağır GUI tabanlı araçların aksine, cloud tarzı Ubuntu instance’larını saniyeler içinde çalıştırır.

Bu hız ve verimliliği, işletim sisteminizin native hypervisor’larını kullanarak sağlar:

  • Windows üzerinde Hyper-V

  • Linux üzerinde KVM

  • macOS üzerinde QEMU/HyperKit

Geliştirme ortamınızı zaten hazırlamış olduğunuzu varsayıyorum.

Bu eğitimi takip etmek için şunlara sahip olmalısınız:

  • Windows üzerinde Multipass kurulu olmalı (VM’leri yönetecek)

  • WSL (Ubuntu) içerisinde Terraform kurulu olmalı

  • WSL 2 aktif ve çalışıyor olmalı

WSL Kullanıcıları İçin Hızlı Bir Kontrol

Her iki araç da kurulu olsa bile Terraform’un WSL içerisinde çalışırken Windows üzerinde çalışan Multipass’ı “görememesi” mümkün. Bunun nedeni, ikisinin farklı ortamlarda çalışmasıdır.

Başlamadan önce aralarındaki bağlantının kurulduğundan emin olun.

Eğer multipass version komutu WSL terminalinizde çalışmıyorsa, Windows executable dosyasını Linux path’inize bağlamak için şu hızlı çözümü uygulayın:

sudo ln -s "/mnt/c/Program Files/Multipass/bin/multipass.exe"
sudo ln -s "/mnt/c/Program Files/Multipass/bin/multipass.exe"
sudo ln -s "/mnt/c/Program Files/Multipass/bin/multipass.exe"

Artık araçlarımız birbiriyle iletişim kurabildiğine göre koda odaklanalım.

2. Problem: Altyapıda Dinamik IP Adresleri

Bir Kubernetes cluster’ı oluşturduğunuzu düşünün.

  1. Bir Master Node başlatıyorsunuz. DHCP üzerinden rastgele bir IP alıyor.

  2. Bir Worker Node başlatıyorsunuz.

  3. Worker’ın cluster’a katılabilmesi için Master’ın IP adresini içeren bir “join command” çalıştırması gerekiyor.

Bunu manuel olarak yapıyor olsaydınız IP adresini kopyalayıp yapıştırırdınız.

Ancak Terraform’da (IaC) herhangi bir manuel müdahale istemiyoruz.

Terraform’a şunu söylemenin bir yoluna ihtiyacımız var:

“Master’ın tamamlanmasını bekle, dinamik IP adresini al, bunu Worker’ın script’ine yaz ve SONRA Worker’ı başlat.”

İşte templatefile tam olarak bunu yapıyor.

Terraform İpucu: templatefile Nedir?

Uygulamaya geçmeden önce bu fonksiyonun gerçekte ne yaptığını kısaca tanımlayalım.

Nedir?

templatefile(path, vars), bir text dosyasını okuyan ve sağladığınız değişkenler üzerinden bu dosyayı render eden yerleşik bir Terraform fonksiyonudur.

Ne için kullanılır?

Temel olarak IP adresleri, Database URL’leri veya şifreler gibi değerlerin runtime sırasında henüz bilinmediği durumlarda dinamik configuration dosyaları, shell script’leri veya cloud-init verileri oluşturmak için kullanılır.

Neden kullanmalıyız?

Kodunuzu temiz tutar.

Uzun ve karmaşık shell script’lerini main.tf içerisinde "heredoc" syntax kullanarak yazmak yerine script’lerinizi ayrı dosyalarda (.sh veya .yaml gibi) tutabilir ve Terraform çalıştığında gerekli verileri bu dosyalara aktarabilirsiniz.

Hangi Provider’ı Kullanıyoruz?

Bu orchestration işlemini local makinemizde gerçekleştirmek için Multipass Provider’ı, özellikle larstobi/multipass provider’ını kullanıyoruz.

Multipass, Canonical tarafından geliştirilen ve Windows üzerinde Hyper-V veya Linux üzerinde QEMU gibi native hypervisor’ları kullanan hafif bir VM yöneticisidir.

Bu provider’ı kullanarak Terraform, local VM’leri tıpkı cloud instance’ları gibi ele alabilir. Böylece Ubuntu node’larımızın oluşturulmasını, resource allocation işlemlerini ve cloud-init execution süreçlerini kolayca otomatikleştirebiliriz.

3. Çözüm: templatefile İş Başında

Şimdi bu mantığı Terraform dosyalarımızda nasıl uyguladığımıza bakalım.

Adım A: Template — worker_setup.tftpl

İlk olarak bir shell script oluşturuyoruz ancak bunu .tftpl uzantısıyla kaydediyoruz.

Bu bizim “blueprint”imiz.

Değerleri hardcode etmek yerine ${master_ip} gibi placeholder’lar kullanıyoruz.

#cloud-config
package_update: false
package_upgrade: false
runcmd:
  - |
    (
    # Wait until Master API Server (6443) is reachable
    until curl -k https://${master_ip}:6443; do sleep 5; done

    # Install K3s Agent and join the cluster
    curl -sfL https://get.k3s.io | K3S_URL=https://${master_ip}:6443 \
    K3S_TOKEN="${join_token}"

#cloud-config
package_update: false
package_upgrade: false
runcmd:
  - |
    (
    # Wait until Master API Server (6443) is reachable
    until curl -k https://${master_ip}:6443; do sleep 5; done

    # Install K3s Agent and join the cluster
    curl -sfL https://get.k3s.io | K3S_URL=https://${master_ip}:6443 \
    K3S_TOKEN="${join_token}"

#cloud-config
package_update: false
package_upgrade: false
runcmd:
  - |
    (
    # Wait until Master API Server (6443) is reachable
    until curl -k https://${master_ip}:6443; do sleep 5; done

    # Install K3s Agent and join the cluster
    curl -sfL https://get.k3s.io | K3S_URL=https://${master_ip}:6443 \
    K3S_TOKEN="${join_token}"

Burada 192.168.x.x gibi bir IP adresi yazmadığımıza dikkat edin.

Henüz var olmayan değişkenleri yazıyoruz!

Adım B: Rendering — main.tf

Şimdi Terraform kodumuzun içerisinde templatefile fonksiyonunu kullanarak boşlukları dinamik olarak dolduruyoruz.

# main.tf

# 1. Create the Master Node first
resource "multipass_instance" "master" {
  name = "k8s-master"
  # ... specs ...
}

# 2. Render the Template
resource "local_file" "worker_cloudinit_rendered" {
  content = templatefile("${path.module}/worker_setup.tftpl", {
    # Here is the magic: We map the Terraform resource output
    # to the template variable
    master_ip  = multipass_instance.master.ipv4
    join_token = var.k3s_token
  })

  filename = "${path.module}/worker_setup_rendered.yaml"
}
# main.tf

# 1. Create the Master Node first
resource "multipass_instance" "master" {
  name = "k8s-master"
  # ... specs ...
}

# 2. Render the Template
resource "local_file" "worker_cloudinit_rendered" {
  content = templatefile("${path.module}/worker_setup.tftpl", {
    # Here is the magic: We map the Terraform resource output
    # to the template variable
    master_ip  = multipass_instance.master.ipv4
    join_token = var.k3s_token
  })

  filename = "${path.module}/worker_setup_rendered.yaml"
}
# main.tf

# 1. Create the Master Node first
resource "multipass_instance" "master" {
  name = "k8s-master"
  # ... specs ...
}

# 2. Render the Template
resource "local_file" "worker_cloudinit_rendered" {
  content = templatefile("${path.module}/worker_setup.tftpl", {
    # Here is the magic: We map the Terraform resource output
    # to the template variable
    master_ip  = multipass_instance.master.ipv4
    join_token = var.k3s_token
  })

  filename = "${path.module}/worker_setup_rendered.yaml"
}

Burada Ne Oluyor?

1. Terraform önce master instance’ını oluşturuyor.

2. Yeni dinamik IP adresini alıyor:

multipass_instance.master.ipv4

3. worker_setup.tftpl dosyasını okuyor.

4. ${master_ip} değerini gerçek IP adresiyle değiştiriyor.

5. Sonucu worker_setup_rendered.yaml adında yeni bir dosyaya kaydediyor.

Adım C: Deployment

Son olarak Worker node başlatıldığında, artık doğru ve gerçek zamanlı connection bilgilerini içeren bu render edilmiş dosyayı kullanıyor.

4. Neden master_setup.yaml Kullanıyoruz?

Master node için setup daha basit çünkü başka bir node’un IP adresini bilmesine gerek yok.

Standart bir cloud-init YAML dosyası kullanıyoruz.

Buradaki önemli detay, install command’ini & kullanarak background’da çalıştırmamız.

# master_setup.yaml

runcmd:
  - (curl -sfL https://get.k3s.io | K3S_TOKEN="k8s-otomatik-sifre-2026"

# master_setup.yaml

runcmd:
  - (curl -sfL https://get.k3s.io | K3S_TOKEN="k8s-otomatik-sifre-2026"

# master_setup.yaml

runcmd:
  - (curl -sfL https://get.k3s.io | K3S_TOKEN="k8s-otomatik-sifre-2026"

Neden?

Çünkü K3s kurulumu bir dakika kadar sürebilir.

Eğer işlemi background’a göndermezsek Terraform provisioning script’inin “takıldığını” düşünüp timeout’a düşebilir.

5. Lab Ortamını Başlatmak

Şimdi çalıştırma zamanı.

Terminalinizi .tf dosyalarınızın bulunduğu klasörde açın.

Provider’ları Başlatın

Configuration’ı Uygulayın

terraform apply -auto-approve
terraform apply -auto-approve
terraform apply -auto-approve

Log’ları dikkatlice takip edin.

local_file resource’unun master’dan sonra ancak worker’dan önce oluşturulduğunu göreceksiniz.

İşte burada dependency graph devreye giriyor.

6. Cluster’ı Doğrulamak

Terraform işlemi tamamlandığında (genellikle 2–3 dakika sürer), lab ortamımızı doğrulayalım.

Master Node’a Bağlanın

Kubernetes Node’larını Kontrol Edin

kubectl get
kubectl get
kubectl get

Şuna benzer bir çıktı görmelisiniz:

Tebrikler! Server’ların gerçek zamanlı verilere göre kendilerini yapılandırdığı dinamik bir altyapıyı başarıyla orchestrate ettiniz.

Sonuç

Bir Kubernetes lab’ı kurmak kullanışlı olsa da asıl çıkarım Terraform templatefile özelliğini anlamaktır.

Statik configuration’lardan, dinamik bir setup’a geçtik. Bu yapıda:

1. Altyapı Esnek

IP adresleri değişebilir ve kodunuz çalışmaya devam eder.

2. Kurulum Otomatik

Token’ları veya IP adreslerini manuel olarak kopyalayıp yapıştırmaya gerek yok.

3. Kod Temiz

Logic ve configuration birbirinden ayrılmış durumda.

Aynı pattern’i Ansible inventory’leri, load balancer configuration’ları veya Server B’nin Server A hakkında bilgi sahibi olması gereken herhangi bir senaryoda kullanabilirsiniz.


Kaynak:

https://medium.com/@ysnhasturk/stop-hardcoding-ips-dynamic-k3s-cluster-setup-with-terraform-multipass-6f511995df3e

250'den fazla müşterimize katılın

İster uzman danışmanlık, ister özel yazılım, ister kapsamlı veri çözümleri arıyor olun, BiSoft yanınızda. Hedeflerinize nasıl katkı sağlayabileceğimizi konuşalım.

250'den fazla müşterimize katılın

İster uzman danışmanlık, ister özel yazılım, ister kapsamlı veri çözümleri arıyor olun, BiSoft yanınızda. Hedeflerinize nasıl katkı sağlayabileceğimizi konuşalım.

250'den fazla müşterimize katılın

İster uzman danışmanlık, ister özel yazılım, ister kapsamlı veri çözümleri arıyor olun, BiSoft yanınızda. Hedeflerinize nasıl katkı sağlayabileceğimizi konuşalım.

İş büyümesi ve verimliliği için akıllı veri çözümleri

Şirket

Hizmetler

Ürün

Vispeahen

BFM

BFM4Patroni

Daha fazla içerik