Takip et

DevOps Sanal Bir Minecraft Dünyasından: Terraform ile DigitalOcean Kubernetes Uygulamaları Dağıtma

DevOps Sanal Bir Minecraft Dünyasından: Terraform ile DigitalOcean Kubernetes Uygulamaları Dağıtma Modern yazılım geliştirme dünyasında h

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.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.