DevOps Sanal Bir Minecraft Dünyasından: Terraform ile DigitalOcean Kubernetes Uygulamaları Dağıtma
Modern yazılım geliştirme dünyasında hız, otomasyon ve güvenilirlik, rekabetçi kalmak için olmazsa olmazdır. Bu prensiplerin temelini oluşturan DevOps kültürü, geliştirme ve operasyon ekiplerini bir araya getirerek sürekli entegrasyon ve sürekli dağıtım (CI/CD) süreçlerini mümkün kılar. Peki, bu karmaşık dünyayı sanal bir Minecraft evreninde hayal etsek nasıl olurdu?
Bu rehberde, DigitalOcean Kubernetes (DOKS) üzerinde bir uygulamanın altyapısını Terraform ile nasıl otomatize edeceğimizi adım adım inceleyeceğiz. Minecraft dünyasını altyapımızın metaforu olarak kullanarak, Terraform’un “usta mimar” rolünü ve Kubernetes’in “akıllı şehir” yönetimini nasıl üstlendiğini göreceğiz.
Minecraft Metaforuyla Dijital Altyapıyı Anlamak
Hayal edin ki, sınırsız kaynaklara sahip bir Minecraft dünyasındasınız. Bu dünya, bizim dijital altyapımız. Sonsuz sanal sunucular, ağlar ve depolama alanları var. Geleneksel olarak, bu dünyada bir yapı inşa etmek (yani bir uygulama dağıtmak) için her tuğlayı (sunucu, veritabanı, ağ kuralı) tek tek elle yerleştirmeniz gerekirdi. Bu, zaman alıcı, hataya açık ve tekrarlaması zor bir süreçti.
İşte burada DevOps felsefesi ve araçları devreye giriyor:
* Terraform: Usta Mimarınız. Terraform, bu dünyada karmaşık yapıları (Kubernetes kümeleri, veritabanları, ağlar) tek bir kod parçasında tanımlamanızı sağlayan bir araçtır. Siz sadece yapının planını (Terraform kodu) verirsiniz, o da sizin için tüm tuğlaları otomatik olarak yerleştirir. Tıpkı bir Minecraft modunun devasa bir kaleyi saniyeler içinde inşa etmesi gibi.
* Kubernetes: Akıllı Şehir Yöneticisi. Kubernetes, inşa ettiğimiz bu şehrin (kümenin) içindeki yaşamı (uygulamaları) yöneten bir sistemdir. Hangi köylünün (uygulama bileşeninin) nerede yaşayacağını, nasıl besleneceğini (kaynak tahsisi), ne zaman çoğalacağını (ölçeklendirme) ve hastalandığında (hata durumunda) nasıl iyileşeceğini otomatik olarak belirler. Sizin tek yapmanız gereken, köylülerinize ne iş yapacaklarını (uygulama tanımı) söylemektir.
* DigitalOcean: Dünyanızın Sağlayıcısı. DigitalOcean, bu Minecraft dünyasının kendisidir. Bize sanal araziyi (bulut kaynakları) ve üzerinde inşaat yapabileceğimiz temel yapı taşlarını sağlar.
Bu rehberde amacımız, Terraform ile DigitalOcean üzerinde bir Kubernetes kümesi kurmak ve ardından bu küme üzerine basit bir uygulamayı dağıtmaktır. Bu süreç, manuel adımları ortadan kaldırarak hem hız hem de tutarlılık sağlayacaktır.
Terraform ile Dijital Altyapımızın Temellerini Atmak
Terraform, HashiCorp tarafından geliştirilen açık kaynaklı bir “Altyapı Kod Olarak” (Infrastructure as Code – IaC) aracıdır. Altyapınızı kod ile tanımlamanızı, sağlamanızı ve yönetmenizi sağlar. Bu, altyapının versiyon kontrolü altında olmasını, kolayca tekrarlanabilir olmasını ve otomasyon süreçlerine dahil edilmesini mümkün kılar.
Gereksinimler ve Kurulum
Başlamadan önce aşağıdaki araçlara ihtiyacınız olacak:
1. Terraform: Resmi web sitesinden işletim sisteminize uygun sürümü indirin ve PATH’inize ekleyin.
2. DigitalOcean Hesabı ve API Token: Bir DigitalOcean hesabınız olmalı ve API Token oluşturmuş olmalısınız. Bu token, Terraform’un DigitalOcean hesabınızda kaynak oluşturabilmesi için gereklidir. Token’ı güvenli bir şekilde saklayın.
3. kubectl: Kubernetes kümelerinizle etkileşim kurmak için kullanılan komut satırı aracıdır.
DigitalOcean Kubernetes Kümesi Oluşturma (Terraform Kodu)
Bir dizin oluşturun (örneğin minecraft-devops) ve içine main.tf adında bir dosya oluşturun. Aşağıdaki kodu bu dosyaya yapıştırın:
# main.tf
Terraform'un hangi sağlayıcıları kullanacağını belirtiyoruz
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0" # DigitalOcean sağlayıcısının belirli bir sürümünü kullan
}
}
}
DigitalOcean sağlayıcısını yapılandırıyoruz
provider "digitalocean" {
# API token'ı bir değişkenden alıyoruz. Güvenlik için ortam değişkeni olarak veya .tfvars ile geçmek en iyisidir.
token = var.do_token
}
DigitalOcean API Token için bir değişken tanımlıyoruz
variable "do_token" {
description = "DigitalOcean API Token"
type = string
sensitive = true # Bu değişkenin hassas olduğunu belirtir, çıktıya yazılmaz
}
DigitalOcean Kubernetes Kümesi (DOKS) kaynağını tanımlıyoruz
resource "digitalocean_kubernetes_cluster" "minecraft_cluster" {
name = "minecraft-devops-cluster" # Kümenin adı
region = "fra1" # Kümenin konuşlandırılacağı bölge (size en yakın olanı seçin)
version = "1.28.2-do.0" # Kubernetes sürümü. DigitalOcean dokümantasyonundan güncel sürümü kontrol edin.
auto_upgrade = true # Otomatik sürüm yükseltmeleri etkinleştir
# Düğüm havuzu (node pool) tanımlıyoruz
node_pool {
name = "worker-pool" # Düğüm havuzunun adı
size = "s-2vcpu-4gb" # Düğüm boyutu (örneğin, 2 vCPU, 4GB RAM)
node_count = 2 # Başlangıçta 2 adet düğüm (worker node) oluştur
}
}
Kubernetes kümesinin kubeconfig çıktısını alıyoruz
output "kube_config" {
value = digitalocean_kubernetes_cluster.minecraft_cluster.kube_config[0].raw_config
sensitive = true # Kubeconfig hassas bilgi içerdiği için çıktıya yazılmaz
description = "Kubernetes kümesi için kubeconfig içeriği"
}
Kümenin API uç noktasını (endpoint) çıktı olarak alıyoruz
output "cluster_endpoint" {
value = digitalocean_kubernetes_cluster.minecraft_cluster.endpoint
description = "Kubernetes kümesinin API uç noktası"
}
Kodu Çalıştırma Adımları:
1. terraform init: Çalışma dizininizde terminali açın ve bu komutu çalıştırın. Terraform, DigitalOcean sağlayıcısını indirir ve gerekli başlangıç ayarlarını yapar.
terraform init
2. terraform plan: Bu komut, Terraform’un mevcut altyapınızda ne gibi değişiklikler yapacağını gösterir. Gerçek bir değişiklik yapmaz, sadece bir önizleme sunar. Bu, “inşaat planını” gözden geçirmek gibidir.
# API token'ı ortam değişkeni olarak geçmek için (Linux/macOS)
export DO_TOKEN="sizin_digitalocean_api_tokeniniz"
terraform plan -var="do_token=$DO_TOKEN"
İpucu: do_token değişkenini güvenli bir şekilde geçirmek için terraform.tfvars dosyası oluşturabilir veya yukarıdaki gibi ortam değişkeni kullanabilirsiniz. terraform.tfvars dosyası Git’e commit edilmemelidir.
3. terraform apply: Planladığınız değişiklikleri uygulamak için bu komutu kullanın. Terraform, DigitalOcean’da Kubernetes kümesini oluşturmaya başlayacaktır. Bu işlem birkaç dakika sürebilir. Onay istenecektir, yes yazarak devam edin.
terraform apply -var="do_token=$DO_TOKEN"
Başarılı bir dağıtımın ardından, kube_config ve cluster_endpoint çıktılarını terminalde göreceksiniz. kube_config çıktısını güvenli bir yere kaydedin, bu kümenize erişmek için gerekecek.
kubectl ile Kümenize Bağlanma
terraform apply komutunun çıktısı olarak aldığınız kube_config içeriğini bir dosyaya kaydedin (örneğin kubeconfig.yaml). Ardından kubectl‘i bu dosyayı kullanacak şekilde yapılandırın:
# Kubeconfig çıktısını bir dosyaya kaydettiyseniz
export KUBECONFIG=./kubeconfig.yaml
Kümenin düğümlerini listeleyin
kubectl get nodes
Eğer düğümleri görebiliyorsanız, Kubernetes kümeniz başarıyla kurulmuş ve kubectl ile erişilebilir durumdadır.
Kubernetes Üzerinde Uygulamalarımızı İnşa Etmek
Kubernetes kümemiz artık hazır. Şimdi bu “akıllı şehrin” içine “köylülerimizi” yani uygulamalarımızı yerleştirelim. Kubernetes, uygulamalarınızı konteynerler (örneğin Docker) içinde çalıştırmanızı sağlar ve bu konteynerlerin yaşam döngüsünü yönetir.
Uygulama Dağıtımı (Deployment) ve Servis (Service) Tanımları
Basit bir Nginx web sunucusunu Kubernetes kümemize dağıtacağız. Bunun için iki ana Kubernetes objesi tanımlayacağız:
1. Deployment: Uygulama konteynerlerimizin nasıl çalışacağını (kaç kopya, hangi imaj, hangi portlar vb.) tanımlar.
2. Service: Uygulamamıza dışarıdan nasıl erişileceğini tanımlar. LoadBalancer tipi, DigitalOcean’da otomatik olarak bir Load Balancer oluşturarak uygulamamıza genel bir IP adresi atar.
app-manifests.yaml adında bir dosya oluşturun ve aşağıdaki içeriği yapıştırın:
# app-manifests.yaml
Nginx web sunucusu için Deployment tanımı
apiVersion: apps/v1
kind: Deployment
metadata:
name: minecraft-app-deployment # Deployment'ın adı
labels:
app: minecraft-app # Uygulama etiketimiz
spec:
replicas: 3 # Uygulamadan 3 adet kopya (pod) çalıştır
selector:
matchLabels:
app: minecraft-app # Bu Deployment'ın hangi Pod'ları yöneteceğini belirler
template:
metadata:
labels:
app: minecraft-app # Pod'ların etiketi
spec:
containers:
- name: minecraft-web-container # Konteynerin adı
image: nginx:latest # Kullanılacak Docker imajı (Nginx'in en son sürümü)
ports:
- containerPort: 80 # Konteynerin dinleyeceği port
---
Nginx uygulaması için Service tanımı
apiVersion: v1
kind: Service
metadata:
name: minecraft-app-service # Service'in adı
spec:
selector:
app: minecraft-app # Bu Service'in hangi Pod'ları hedefleyeceğini belirler
ports:
- protocol: TCP
port: 80 # Service'in dışarıya açacağı port
targetPort: 80 # Service'in yönlendireceği Pod'un portu
type: LoadBalancer # Dışarıdan erişim için bir Load Balancer oluştur
Uygulamayı Dağıtma Adımları:
1. kubectl apply: Kubernetes manifest dosyasını kullanarak uygulamayı kümenize dağıtın.
kubectl apply -f app-manifests.yaml
Bu komut, Nginx Deployment’ını ve Service’ini oluşturacaktır.
2. Dağıtım Durumunu Kontrol Etme: Pod’larınızın çalıştığından emin olun.
kubectl get pods -l app=minecraft-app
# Çıktı örnek:
# minecraft-app-deployment-5c7f8... 1/1 Running
# minecraft-app-deployment-6f8d9... 1/1 Running
# minecraft-app-deployment-7a1b2... 1/1 Running
3. Servis Durumunu Kontrol Etme: Load Balancer’ın bir dış IP adresi alıp almadığını kontrol edin. Bu işlem birkaç dakika sürebilir.
kubectl get svc minecraft-app-service
# Çıktı örnek:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# minecraft-app-service LoadBalancer 10.245.xx.yy AAA.BBB.CCC.DDD 80:3xxxx/TCP 2m
EXTERNAL-IP sütunundaki IP adresini not edin. Bu, uygulamanıza internet üzerinden erişebileceğiniz adrestir. Tarayıcınızda bu IP adresine giderek Nginx’in varsayılan karşılama sayfasını görmelisiniz.
Tebrikler! Terraform ile bir Kubernetes kümesi kurdunuz ve üzerine bir uygulama dağıttınız. Bu, Minecraft dünyanızda otomatik bir çiftlik kurmaya benzer: Siz sadece planı verdiniz, sistem sizin için her şeyi inşa etti ve yönetiyor.
DevOps Felsefesi ve Sürekli Gelişim
Bu rehberde yaptığımız adımlar, DevOps felsefesinin temel taşlarını oluşturur:
* Otomasyon: Altyapımızı (Terraform) ve uygulamalarımızı (Kubernetes) kod ile tanımlayarak manuel hataları minimize ettik ve süreçleri otomatik hale getirdik. Tıpkı bir redstone devresiyle otomatik kapılar yapmak gibi.
* Versiyon Kontrolü: Terraform ve Kubernetes manifest dosyalarını Git gibi bir versiyon kontrol sisteminde saklayarak, altyapımızın ve uygulamalarımızın geçmişini takip edebilir, değişiklikleri gözden geçirebilir ve geri alabiliriz.
* Tekrarlanabilirlik: Aynı Terraform kodu ile istediğimiz zaman, istediğimiz yerde tamamen aynı Kubernetes kümesini ve uygulamaları yeniden oluşturabiliriz. Bu, geliştirme, test ve üretim ortamlarının tutarlı olmasını sağlar.
* İşbirliği: Kod tabanlı bir yaklaşım, ekiplerin altyapı ve uygulama değişiklikleri üzerinde daha kolay işbirliği yapmasına olanak tanır.
* Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD): Bu kurulum, CI/CD boru hatlarına entegrasyon için mükemmel bir temeldir. Örneğin, bir Git deposuna yapılan her kod değişikliğinde (uygulama veya altyapı), otomatik olarak terraform plan, terraform apply veya kubectl apply komutlarını çalıştıran bir CI/CD sistemi kurabilirsiniz. Bu, yeni özelliklerin veya düzeltmelerin çok daha hızlı ve güvenilir bir şekilde canlıya alınmasını sağlar.
Bu adımlar, sanal Minecraft dünyanızda sadece bir temel atmaktı. Gerçek dünyada, bu temelin üzerine izleme (monitoring), günlükleme (logging), güvenlik duvarları, ağ politikaları, otomatik ölçeklendirme gibi birçok katman ekleyerek daha sağlam ve güvenli bir yapı inşa edersiniz. Ancak başlangıç için, bu otomatize edilmiş süreç, modern DevOps uygulamalarının gücünü anlamak için harika bir adımdır.
Kaynakları Temizleme
İşiniz bittiğinde, DigitalOcean hesabınızda gereksiz maliyet oluşmaması için oluşturduğunuz kaynakları temizlemeniz önemlidir.
1. Kubernetes Uygulamasını Silme:
kubectl delete -f app-manifests.yaml
2. Kubernetes Kümesini Silme:
terraform destroy -var="do_token=$DO_TOKEN"
Bu komut, Terraform’un oluşturduğu tüm kaynakları (Kubernetes kümesi, düğüm havuzları vb.) DigitalOcean hesabınızdan kaldıracaktır. Onay için yine yes yazmanız gerekecektir.
Sonuç ve Sıkça Sorulan Sorular (SSS)
Bu rehberde, DevOps prensiplerini Minecraft metaforuyla açıklayarak, Terraform ve Kubernetes’in gücünü birleştirdik. DigitalOcean üzerinde bir Kubernetes kümesini kod ile nasıl oluşturacağımızı ve üzerine basit bir uygulamayı nasıl dağıtacağımızı öğrendik. Bu yaklaşım, altyapı yönetimini daha verimli, güvenilir ve ölçeklenebilir hale getirerek modern yazılım geliştirme süreçleri için temel bir yapı taşı sunar.
Sıkça Sorulan Sorular (SSS)
1. Neden Terraform kullanmalıyım? Manuel olarak da Kubernetes kümesi oluşturabilirim.
Manuel kurulumlar zaman alıcı, hataya açık ve tekrarlanamazdır. Terraform ile altyapınızı kod olarak tanımlayarak, aynı küme yapılandırmasını defalarca oluşturabilir, versiyon kontrolü altında tutabilir ve otomasyon süreçlerine dahil edebilirsiniz. Bu, tutarlılık, hız ve güvenilirlik sağlar.
2. Kubernetes karmaşık değil mi? Daha basit bir çözüm yok mu?
Kubernetes, başlangıçta karmaşık görünebilir, ancak modern, mikroservis tabanlı uygulamaların ölçeklendirilmesi ve yönetimi için endüstri standardıdır. DigitalOcean Kubernetes gibi yönetilen hizmetler, altyapı karmaşıklığının bir kısmını sizin için üstlenir. Basit uygulamalar için daha küçük konteyner orkestrasyon araçları (örn. Docker Compose) veya sunucusuz (serverless) çözümler (örn. DigitalOcean Functions) düşünülebilir, ancak K8s uzun vadede esneklik ve güç sunar.
3. Bu yaklaşım sadece DigitalOcean için mi geçerli?
Hayır, Terraform birden çok bulut sağlayıcısını (AWS, Azure, Google Cloud) ve diğer altyapı hizmetlerini destekler. Sağlayıcı blokunu ve kaynak tanımlarını değiştirerek aynı mantığı farklı platformlarda da uygulayabilirsiniz. Kubernetes de bulut sağlayıcısından bağımsız olarak çalışabilir.
4. Üretim ortamında başka nelere dikkat etmeliyim?
Üretim ortamları için daha fazla güvenlik (ağ politikaları, RBAC), izleme ve günlükleme çözümleri (Prometheus, Grafana, ELK Stack), otomatik ölçeklendirme (Horizontal Pod Autoscaler, Cluster Autoscaler), yedekleme ve felaket kurtarma stratejileri gibi ek katmanlar eklemeniz gerekir. Ayrıca, daha güçlü düğüm boyutları ve daha fazla düğüm sayısı önerilir.
5. CI/CD entegrasyonunu nasıl yaparım?
Terraform ve Kubernetes manifest dosyalarınızı bir Git deposunda (GitHub, GitLab, Bitbucket) saklayın. GitHub Actions, GitLab CI/CD, Jenkins veya CircleCI gibi bir CI/CD aracı kullanarak, Git’e yapılan her push işlemi sonrası otomatik olarak terraform plan, terraform apply ve kubectl apply komutlarını çalıştıran boru hatları (pipelines) oluşturabilirsiniz. Bu genellikle GitOps olarak bilinen bir yaklaşımdır.