Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 27

"Configuring Fleet Deployments with fleet.yaml"

Recommended resources

Merhaba! Önceki dersimizde, Fleet'e projemizin Kubernetes manifestlerini nerede bulacağını söyleyen bir GitRepo kaynağı oluşturarak GitOps yolculuğumuzda önemli bir adım attık. GitRepo kaynağı, Fleet için bir "harita" görevi görerek onu doğru Git deposuna, dala ve manifest dosyalarının bulunduğu yola yönlendirir.

Bugün, bu haritayı kullanarak bulunan "hazineyi" nasıl işleyeceğimize dair Fleet'e talimatlar vereceğiz. Geliştirme (dev) ve üretim (prod) gibi farklı ortamlar için farklı yapılandırmalar (örneğin, farklı kaynak limitleri veya imaj etiketleri) uygulamak, veri mühendisliği süreçlerinin vazgeçilmez bir parçasıdır. İşte bu noktada fleet.yaml dosyası devreye giriyor.

Bugünkü Öğrenme Hedefimiz: Dağıtım davranışını ve hedef kümeleri kontrol etmek için bir fleet.yaml yapılandırması tanımlamak.

Bu dersin sonunda, PySpark ETL işimizin geliştirme ve üretim ortamları için farklı parametrelerle dağıtılmasını sağlayacak bir fleet.yaml dosyası oluşturmuş olacaksınız.

fleet.yaml: Dağıtımın Beyni

Önceki derste GitRepo kaynağının spec.paths alanında belirttiğimiz dizinleri (k8s gibi) hatırlayın. Fleet, bu dizinlerden birinin içinde fleet.yaml adında bir dosya bulduğunda, o dizini artık basit bir manifest koleksiyonu olarak değil, Bundle olarak adlandırılan tek bir dağıtılabilir birim olarak ele alır.

Kısacası, fleet.yaml dosyası:

  1. Bir dizini resmi bir Fleet Bundle'ına dönüştürür.
  2. Bu Bundle'ın farklı hedef kümelere nasıl dağıtılacağına dair kuralları ve özelleştirmeleri içerir.

Bu dosyanın ne işe yaradığına dair genel bir bakış için resmi dokümantasyona göz atalım.

fleet.yaml - Rancher Fleet

Rancher Fleet'in resmi dokümantasyonundaki "fleet.yaml" sayfası, bu dosyanın amacını ve temel yapısını tanıtmaktadır.

Sayfanın başlangıcındaki ilk paragrafı okuyun. Bu paragraf, fleet.yaml dosyasının bir dizini nasıl otomatik olarak bir "bundle" haline getirdiğini açıklamaktadır.


Kümeleri Etiketlerle Hedefleme

fleet.yaml dosyasının en güçlü özelliği, dağıtımları farklı kümelere göre özelleştirebilmesidir. Peki Fleet, bir kümenin dev mi yoksa prod mu olduğunu nasıl anlar? Cevap, Kubernetes'in temel yapı taşlarından biri olan etiketlerde (labels) yatıyor.

Kubernetes deneyiminizden bildiğiniz gibi, kümelere veya diğer kaynaklara env: dev veya region: us-east gibi keyfi etiketler atayabiliriz. Fleet, bu etiketleri kullanarak hangi özelleştirmenin hangi kümeye uygulanacağını belirler.

Aşağıdaki video, kümelere bu tür etiketlerin nasıl atandığını ve bu etiketlere dayalı olarak küme gruplarının nasıl oluşturulduğunu pratik olarak göstermektedir. Bu, fleet.yaml'daki hedefleme mantığının temelini oluşturur.

Rancher Fleet: GitOps Across A Large Number Of Kubernetes Clusters

"Rancher Fleet: GitOps Across A Large Number of Kubernetes Clusters" başlıklı bu video, Fleet'in çoklu küme yönetimini derinlemesine inceliyor. İzleyeceğimiz bölüm, kümeleri etiketlemenin ve gruplamanın ne kadar basit olduğunu gösteriyor.

Videonun 09:57 - 13:00 aralığını izleyin. İzlerken şu noktalara odaklanın: helm upgrade --install komutunda --set labels parametresi ile bir kümeye environment=dev etiketinin nasıl eklendiği (10:33). Diğer kümelere environment=production etiketinin nasıl atandığı (11:33). Bu etiketleri kullanarak production adında bir ClusterGroup'un nasıl oluşturulduğu (12:27). Bu, birden çok kümeyi tek bir hedef olarak yönetmeyi sağlar.


targetCustomizations ile Ortama Özel Yapılandırma

Kümelerimizi etiketledikten sonra, fleet.yaml içindeki targetCustomizations bloğunu kullanarak her bir hedef için özel kurallar tanımlayabiliriz. Bu blok, bir dizi kural içerir. Fleet, her küme için bu kuralları sırayla değerlendirir ve kümenin etiketleriyle eşleşen ilk kuralı uygular.

Şimdi aynı videonun en can alıcı kısmını izleyerek fleet.yaml dosyasının bu konsepti nasıl hayata geçirdiğini görelim.

Rancher Fleet: GitOps Across A Large Number Of Kubernetes Clusters

Videonun bu bölümü, fleet.yaml dosyasının dev ve prod ortamları için farklı imaj etiketleri uygulamak üzere nasıl kullanıldığını adım adım gösteriyor. Bu, bugünkü öğrenme hedefimizin tam karşılığıdır.

Videonun 30:46 - 33:23 aralığını dikkatlice izleyin. Odaklanmanız gerekenler: fleet.yaml dosyasının yapısı (31:05): targetCustomizations altında dev ve production için ayrı bloklar olduğunu görün. clusterSelector (31:45): Her bloğun, bir önceki adımda gördüğümüz env: dev ve env: production etiketlerini kullanarak doğru kümeleri nasıl hedeflediğine dikkat edin. Değerleri Geçersiz Kılma (Helm Values Override) (31:38): Her blok içinde helm.values kullanılarak image.tag değerinin nasıl özelleştirildiği gösteriliyor. Değişikliğin Uygulanması (32:42): Git'e yapılan bir değişikliğin (prod için imaj etiketinin 4.0.0 olarak güncellenmesi) Fleet tarafından nasıl otomatik olarak algılandığını ve ilgili kümedeki dağıtıma yansıtıldığını gözlemleyin.

Bu konsepti pekiştirmek için, farklı ortamlarda veritabanı replikasyonu gibi özellikleri kontrol eden bir başka pratik fleet.yaml örneğini inceleyelim.

Mapping to Downstream Clusters - Rancher Fleet

"Mapping to Downstream Clusters" dokümanı, targetCustomizations kullanarak farklı kümelere özel Helm değerlerinin nasıl uygulanacağını net bir örnekle açıklıyor.

Sayfadaki "Customization per Cluster" başlığı altındaki bölümü okuyun. Özellikle targetCustomizations YAML bloğunu inceleyin. dev, test ve prod ortamları için helm.values alanının nasıl farklılaştığına odaklanın: dev için replication: false, test ve prod için ise replicas: 3 gibi farklı değerler ayarlanıyor.


Uygulama: Projemiz için fleet.yaml Oluşturma

Artık teoriyi ve pratik örnekleri gördüğümüze göre, kendi PySpark ETL projemiz için bir fleet.yaml dosyası oluşturma zamanı geldi.

Gelecekte SparkApplication manifestimizi bir Helm chart'ı içine paketleyeceğiz. Bu, yapılandırmayı yönetmenin standart ve en esnek yoludur. Şimdiden bu yapıya hazırlık yapmak için fleet.yaml dosyamızı Helm değerlerini (values) geçersiz kılacak şekilde tasarlayacağız.

Senaryomuz:

  • dev ortamı: Geliştirme yaparken hızlı denemeler için daha az kaynak kullanan ve en son geliştirme imajını (-dev etiketli) çeken bir yapılandırma.
  • prod ortamı: Kararlı, versiyonlanmış bir imajı kullanan ve daha fazla kaynak (örneğin daha fazla executor) ile çalışan bir yapılandırma.

Projenizin k8s dizini içine fleet.yaml adında yeni bir dosya oluşturun ve içeriğini aşağıdaki gibi doldurun. Bu dosya, SparkApplication manifestinizin yanında yer alacaktır.

k8s/fleet.yaml:




# Bu bundle için varsayılan Helm chart ayarları.
# Henüz bir Helm chart'ımız olmasa da, gelecekteki yapı için iskeleti kuruyoruz.
helm:



  # SparkApplication manifestlerimizi içeren Helm chart'ının
  # release adını belirtir.
  releaseName: pyspark-etl-job




# Ortama özel yapılandırmalar.
targetCustomizations:



  # Geliştirme (dev) ortamı için kural.
  - name: dev-environment



    # Helm chart'ına özel değerler gönderiyoruz.
    helm:
      values:



        # Geliştirme için kullanılacak Docker imajı.
        image: "YOUR_DOCKER_HUB_USERNAME/pyspark-etl:latest-dev"



        # Geliştirme ortamında daha az executor kullan.
        sparkConfig:
          executors: 1
          executorCores: 1
          executorMemory: "1g"



    # Bu kuralın hangi kümelere uygulanacağını belirleyen seçici.
    clusterSelector:
      matchLabels:



        # 'environment' etiketi 'dev' olan kümelerle eşleşir.
        environment: dev




  # Üretim (prod) ortamı için kural.
  - name: prod-environment
    helm:
      values:



        # Üretim için kullanılacak Docker imajı.
        # Bu değer CI pipeline tarafından güncellenecek! (örn: git SHA)
        image: "YOUR_DOCKER_HUB_USERNAME/pyspark-etl:1.0.0"



        # Üretim ortamında daha fazla kaynak ayır.
        sparkConfig:
          executors: 4
          executorCores: 2
          executorMemory: "4g"
    clusterSelector:
      matchLabels:



        # 'environment' etiketi 'prod' olan kümelerle eşleşir.
        environment: prod

Bu dosyayı oluşturup Git deponuza gönderdiğinizde, Fleet artık k8s dizinini bir Bundle olarak tanıyacak. Kümenize environment: dev etiketini eklerseniz, Fleet bu bundle'ı dev-environment kurallarına göre (1 executor ile) dağıtacaktır. environment: prod etiketli bir kümeye ise prod-environment kurallarını (4 executor ile) uygulayacaktır.

Bu yapı, CI/CD otomasyonumuzun temelini oluşturur. CI sürecimiz (GitHub Actions) kodu test edip yeni bir Docker imajı oluşturduğunda, CD süreci (Fleet) bu imajı doğru ortama doğru yapılandırmayla otomatik olarak dağıtabilecektir.


Özet ve Sonuç

Bu derste, Fleet'in dağıtım davranışını ortamlara göre nasıl özelleştireceğimizi öğrendik.

Temel Çıkarımlar:

  • Bir dizine eklenen fleet.yaml dosyası, o dizini Fleet için dağıtılabilir bir Bundle'a dönüştürür.
  • Fleet'in gücü, targetCustomizations bloğu aracılığıyla farklı kümelere farklı yapılandırmalar uygulama yeteneğinden gelir.
  • Hedefleme, kümelerdeki etiketlere (labels) ve clusterSelector'a dayanır. Bu, Kubernetes'teki temel seçici mantığıyla aynıdır.
  • helm.values alanını kullanarak, hedef ortama özel Helm değerlerini (imaj etiketi, kaynak limitleri, replika sayısı vb.) geçersiz kılabiliriz. Bu, PySpark işlerimiz gibi uygulamalar için dinamik ve esnek bir dağıtım stratejisi sağlar.

Gelecek Dersin Önizlemesi:
fleet.yaml ile farklı ortamlar için özelleştirmeler tanımlayabiliyoruz. Peki ya manifest dosyalarımızın kendisi de ortama göre değişiyorsa? Örneğin, prod ortamında ek bir ConfigMap veya Secret gerekebilir. Bir sonraki dersimizde, fleet.yaml'ın yeteneklerini Kustomize benzeri bir yapı olan overlay'ler ile birleştirerek Git depomuzu farklı ortamlar için nasıl daha modüler ve temiz bir şekilde organize edeceğimizi öğreneceğiz.