İçeriğe geç
NetDevOps
11 dk okuma DevOps

Argo Workflows: Kubernetes Native Workflow Engine

Kubernetes, container orkestrasyonunun standartı haline geldi ve modern uygulama geliştirme süreçlerinin temel taşıyıcısı konumunda. Ancak container orkestrasyonunun ötesinde, karmaşık iş akışlarını (workflows) yönetmek için daha spesifik araçlara ihtiyaç duyuluyor. İşte bu noktada Argo Workflows devreye giriyor. Argo Workflows, CNCF graduated bir proje olarak Kubernetes native bir workflow engine olarak tasarlanmış ve DAG (Directed Acyclic Graph) ile adım adım (step-based) workflow'ları destekliyor. Bu makalede Argo Workflows'un ne olduğunu, nasıl kurulduğunu, temel kavramlarını ve production ortamında nasıl kullanılacağını detaylı olarak inceleyeceğiz.

Argo Workflows Nedir?

Argo Workflows, Kubernetes için geliştirilmiş açık kaynaklı, container-native bir workflow engine'dir. Kubernetes CRD (Custom Resource Definition) olarak implement edilmiş olan bu araç, her bir iş akışı adımının bir container olarak çalışmasına olanak tanır. Bu yaklaşım, geleneksel VM veya sunucu tabanlı ortamların overhead'ını ortadan kaldırarak daha hafif, ölçeklenebilir ve kullanımı kolay bir deneyim sunar.

Argo Workflows'un temel özellikleri şunlardır:

  • Container-Native Tasarım: Her workflow adımı bağımsız bir container olarak çalışır, bu da izolasyon ve tekrar kullanılabilirlik sağlar.
  • DAG ve Step Desteği: İş akışlarını hem graf tabanlı (DAG) hem de sıralı adımlar olarak tanımlayabilirsiniz.
  • Paralel İşlem: Birden fazla görevi eşzamanlı olarak çalıştırabilir, bu da compute-intensive işlerin çok daha hızlı tamamlanmasını sağlar.
  • Cloud Agnostic: Herhangi bir Kubernetes cluster'ında çalışır, bulut bağımsızdır.
  • Artifact Desteği: S3, Artifactory, GCS, Azure Blob ve diğer birçok artifact repository ile entegre çalışır.

Use Case'ler

Argo Workflows, geniş bir kullanım alanına sahiptir. Machine Learning pipeline'ları, veri ve batch processing, infrastructure automation, CI/CD pipeline'ları ve daha birçok senaryo Argo Workflows ile implement edilebilir. Özellikle ML workflow'larında model eğitimi, hyperparameter tuning ve model deployment süreçlerini otomatize etmek için yaygın olarak kullanılır.

Kurulum

Argo Workflows'u Kubernetes cluster'ınıza kurmanın birkaç yolu vardır. En yaygın ve önerilen yöntem Helm chart kullanmaktır. Aşağıda adım adım kurulum sürecini inceleyeceğiz.

Helm ile Kurulum

Öncelikle Argo Helm repository'sini ekleyin ve güncelleyin:

helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

Argo Workflows'u kurmak için aşağıdaki komutu kullanabilirsiniz:

kubectl create namespace argo
helm install argo-workflows argo/argo-workflows -n argo

Bu komut, varsayılan değerlerle Argo Workflows'u kuracaktır. Ancak production ortamları için genellikle özelleştirilmiş bir values.yaml dosyası kullanmanız önerilir.

Production Kurulumu

Production ortamında daha güvenli ve ölçeklenebilir bir kurulum için aşağıdaki yapılandırmayı kullanabilirsiniz:

helm install argo-workflows argo/argo-workflows \
  --namespace argo \
  --set server.replicas=2 \
  --set controller.replicas=2 \
  --set executor.resources.requests.cpu=500m \
  --set executor.resources.requests.memory=1Gi \
  --set minio.install=true

Bu yapılandırma, server ve controller replica sayısını artırarak yüksek kullanılabilirlik sağlar. Ayrıca executor için kaynak limitleri belirler.

Argo CLI Kurulumu

Argo Workflows ile etkileşim için CLI aracını kurmanız işinizi kolaylaştıracaktır. Linux için aşağıdaki komutu kullanabilirsiniz:

curl -sLO https://github.com/argoproj/argo-workflows/releases/download/v3.5.0/argo-linux-amd64.gz
gunzip argo-linux-amd64.gz
chmod +x argo-linux-amd64
sudo mv argo-linux-amd64 /usr/local/bin/argo

Kurulumun başarılı olup olmadığını kontrol etmek için:

argo version

Temel Kavramlar

Argo Workflows'u etkili kullanmak için temel kavramları anlamak kritik öneme sahiptir. Bu bölümde Workflow, Template, DAG ve Steps yapılarını detaylı olarak inceleyeceğiz.

Workflow

Workflow, Argo Workflows'un temel kaynağıdır. Kubernetes CRD olarak tanımlanır ve çalıştırılacak iş akışını temsil eder. Her Workflow, bir veya birden fazla template içerir.

Template

Template, bir iş adımını tanımlayan yapıdır. Üç temel template tipi vardır:

  • Container Template: Standart Kubernetes container çalıştırır.
  • Script Template: Inline script veya script dosyası çalıştırır.
  • Resource Template: Kubernetes kaynaklarını oluşturur veya yönetir.

DAG (Directed Acyclic Graph)

DAG template, görevler arasındaki bağımlılıkları tanımlamanıza olanak tanır. Bir görev, başka bir görev tamamlanmadan başlayamaz. Bu yapı, karmaşık iş akışlarını modüler hale getirir ve hata ayıklamayı kolaylaştırır.

Steps

Steps template, sıralı veya paralel adımlar tanımlamanıza imkan verir. Adımlar sırayla çalışabildiği gibi paralel olarak da çalıştırılabilir.

Örnek Workflow'lar

Argo Workflows'un gücünü anlamak için bazı pratik örneklere bakalım.

Basit Hello World Workflow

En basit örnek, "Hello World" yazdıran bir workflow'dur:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: hello-world-
spec:
  entrypoint: hello
  templates:
  - name: hello
    container:
      image: alpine:latest
      command: [echo, "Hello Argo Workflows!"]

Bu workflow'u çalıştırmak için:

argo submit hello-world.yaml -n argo --watch

--watch flag'i, workflow çalışırken durumu takip etmenizi sağlar.

DAG Workflow Örneği

DAG yapısını kullanan daha karmaşık bir örnek:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: dag-example-
spec:
  entrypoint: root
  templates:
  - name: root
    dag:
      tasks:
      - name: task-a
        template: print-message
      - name: task-b
        template: process-data
        dependencies: [task-a]
      - name: task-c
        template: save-result
        dependencies: [task-b]

  - name: print-message
    container:
      image: alpine:latest
      command: [sh, -c]
      args: ["echo 'Task A: Veri çekme tamamlandı'"]

  - name: process-data
    container:
      image: alpine:latest
      command: [sh, -c]
      args: ["echo 'Task B: Veri işleme tamamlandı'"]

  - name: save-result
    container:
      image: alpine:latest
      command: [sh, -c]
      args: ["echo 'Task C: Sonuç kaydedildi'"]

Bu örnekte, task-b task-a'ya bağımlıdır ve task-c hem task-a hem de task-b'ye bağımlıdır. Bu sayede görevler arasındaki ilişkiler açıkça tanımlanmış olur.

Parametreli Workflow

Workflow'larınıza parametre geçmek, esneklik sağlar:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: parameters-
spec:
  entrypoint: hello-param
  arguments:
    parameters:
    - name: name
      value: "Dünya"
    - name: greeting
      value: "Merhaba"
  templates:
  - name: hello-param
    inputs:
      parameters:
      - name: name
      - name: greeting
    container:
      image: alpine:latest
      command: [sh, -c]
      args: ["echo '{{inputs.parameters.greeting}} {{inputs.parameters.name}}!'"]

Bu workflow'u parametre ile çalıştırmak için:

argo submit parameters.yaml -p name="Kullanıcı" -p greeting="Hoş geldin" -n argo

Parallel Loop Örneği

Birden fazla öğeyi paralel olarak işlemek için:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: parallel-
spec:
  entrypoint: parallel-example
  templates:
  - name: parallel-example
    steps:
    - - name: process-item
        template: process
        arguments:
          parameters:
          - name: item
            value: "{{item}}"
        withItems:
        - sunucu1
        - sunucu2
        - sunucu3

  - name: process
    inputs:
      parameters:
      - name: item
    container:
      image: alpine:latest
      command: [sh, -c]
      args: ["echo 'İşleniyor: {{inputs.parameters.item}}'"]

WorkflowTemplate Kullanımı

WorkflowTemplate'ler, sık kullanılan workflow'ları cluster'da saklamanıza ve yeniden kullanmanıza olanak tanır. Bu, özellikle büyük organizasyonlarda tekrarlanabilirlik sağlar.

WorkflowTemplate Oluşturma

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: my-workflow-template
spec:
  entrypoint: main
  arguments:
    parameters:
    - name: image
      value: "alpine:latest"
  templates:
  - name: main
    container:
      image: "{{inputs.parameters.image}}"
      command: [echo, "WorkflowTemplate çalıştı!"]

WorkflowTemplate'i oluşturmak için:

argo template create workflowtemplate.yaml -n argo

WorkflowTemplate'den Workflow Çalıştırma

Oluşturulan template'den yeni bir workflow başlatmak için:

argo submit --from workflowtemplate/my-workflow-template -p image=nginx:latest -n argo

Bu yaklaşım, aynı workflow yapısını farklı parametrelerle tekrar tekrar kullanmanıza imkan verir.

Artifact Yönetimi

Argo Workflows, workflow'lar arasında veri paylaşımı için artifact desteği sunar. S3, GCS, Azure Blob, Artifactory ve daha birçok storage backend desteklenir.

MinIO Kurulumu

Test ve geliştirme ortamları için MinIO kullanabilirsiniz:

helm install argo-workflows argo/argo-workflows \
  --namespace argo \
  --set minio.install=true

MinIO credential'ları otomatik olarak bir Kubernetes secret'inde saklanır:

kubectl get secret argo-minio -n argo -o yaml

Artifact Üretme ve Tüketme

Bir adımda artifact üretmek için:

- name: produce-artifact
  container:
    image: alpine:latest
    command: [sh, -c]
    args: ["echo 'test data' > /tmp/output.txt"]
  outputs:
    artifacts:
    - name: output
      path: /tmp/output.txt

Üretilen artifact'i başka bir adımda kullanmak için:

- name: consume-artifact
  inputs:
    artifacts:
    - name: output
      path: /tmp/input.txt
  container:
    image: alpine:latest
    command: [sh, -c]
    args: ["cat /tmp/input.txt"]

Retry ve Hata Yönetimi

Production ortamlarında workflow'ların güvenilirliği kritik öneme sahiptir. Argo Workflows, yerleşik retry mekanizmaları sunar.

Retry Policy

spec:
  templates:
  - name: unreliable-task
    retryStrategy:
      limit: 3
      retryPolicy: "OnError"
      backoff:
        duration: "1s"
        factor: 2
        maxDuration: "5m"
    container:
      image: alpine:latest
      command: [sh, -c]
      args: ["echo 'Hata oluştu!' && exit 1"]

Bu yapılandırma, hata durumunda 3 kez yeniden deneme yapar. Her deneme arasındaki süre üstel olarak artar.

Exit Handler

Workflow tamamlandığında veya hata oluştuğunda çalışacak handler tanımlayabilirsiniz:

spec:
  entrypoint: main
  onExit: cleanup
  templates:
  - name: main
    container:
      image: alpine:latest
      command: [echo, "Ana işlem"]

  - name: cleanup
    container:
      image: alpine:latest
      command: [echo, "Temizlik işlemleri çalıştı"]

Production En İyi Uygulamalar

Argo Workflows'u production ortamında kullanırken dikkat edilmesi gereken kritik noktalar bulunmaktadır.

Güvenlik

Workflow'larınızın güvenliğini sağlamak için RBAC yapılandırması kritik öneme sahiptir. Argo Workflows, Kubernetes RBAC ile entegre çalışır ve namespace-level veya cluster-level yetkilendirme destekler.

ServiceAccount kullanarak workflow'ların kimlik doğrulamasını yönetebilirsiniz:

spec:
  serviceAccountName: workflow-runner

Workflow'larınızda hassas bilgiler (API key'ler, şifreler) kullanmanız gerekiyorsa, Kubernetes Secret'larını kullanın ve bunları artifact olarak değil, environment variable olarak enjekte edin.

Kaynak Yönetimi

Her template için uygun kaynak limitleri belirlemek, cluster stabilitesi için önemlidir:

- name: resource-intensive-task
  container:
    image: python:latest
    command: [python, script.py]
    resources:
      requests:
        memory: "1Gi"
        cpu: "500m"
      limits:
        memory: "2Gi"
        cpu: "1000m"

Workflow Garbage Collection

Uzun süreli çalışan cluster'larda, tamamlanmış workflow'ların otomatik olarak temizlenmesi önerilir:

spec:
  ttlStrategy:
    secondsAfterCompletion: 86400
    secondsAfterSuccess: 86400
    secondsAfterFailure: 604800

Bu yapılandırma, başarılı workflow'ları 24 saat sonra, başarısız workflow'ları ise 7 gün sonra otomatik olarak siler.

Schedule ve Cron Workflows

Düzenli olarak çalışması gereken workflow'lar için CronWorkflow kullanabilirsiniz:

apiVersion: argoproj.io/v1alpha1
kind: CronWorkflow
metadata:
  name: scheduled-workflow
spec:
  schedule: "0 * * * *"
  timezone: "Europe/Istanbul"
  concurrencyPolicy: "Replace"
  workflowSpec:
    entrypoint: daily-task
    templates:
    - name: daily-task
      container:
        image: alpine:latest
        command: [echo, "Günlük görev çalıştı"]

Monitoring ve Logging

Argo Workflows, Prometheus metrikleri sunar. Bu metrikleri toplayarak dashboard'lar oluşturabilirsiniz:

helm install argo-workflows argo/argo-workflows \
  --namespace argo \
  --set server.metrics.enabled=true

Workflow log'larına erişmek için:

argo logs @latest -n argo

Sonuç

Argo Workflows, Kubernetes üzerinde karmaşık iş akışlarını yönetmek için güçlü ve esnek bir araçtır. Container-native yaklaşımı, DAG ve step tabanlı workflow tanımlama, artifact yönetimi ve güçlü retry mekanizmaları ile modern DevOps pipeline'larının vazgeçilmez bir parçası haline gelmiştir.

Bu makalede Argo Workflows'un temel kavramlarını, kurulum sürecini, örnek workflow'ları ve production en iyi uygulamalarını inceledik. Machine Learning pipeline'larından CI/CD süreçlerine, veri işleme workflow'larından scheduled batch job'lara kadar geniş bir kullanım alanı sunan Argo Workflows, Kubernetes ecosystem'inin en önemli araçlarından biridir.

Başlangıçta küçük ve basit workflow'larla denemeler yaparak Argo Workflows'un gücünü keşfedebilir ve zamanla daha karmaşık pipeline'lar oluşturabilirsiniz. Unutmayın ki başarılı bir workflow tasarımı, doğru bağımlılık yönetimi, uygun kaynak tahsisi ve kapsamlı error handling gerektirir.

ctCertWatch

SSL sertifika yayınlarını gerçek zamanlı takip eden bir izleme servisi. Regex filtreleme, DNS çözümleme ve webhook uyarıları ile phishing domainlerini, marka taklidini ve yetkisiz sertifikaları anında…

Rust

ipReconary

IP aralıkları, alt ağlar ve ASN bilgilerine dayalı olarak host, domain ve servis keşfi yapan bir ağ keşif (recon) aracı. Güvenlik uzmanları ve OSINT araştırmacıları için ağ altyapısını hızlı ve güveni…

Rust

Wireguard-Server-Panel

Web arayüzüne sahip, kendi sunucunuzda barındırılan bir WireGuard VPN servisi. İstemci yönetimi, mobil bağlantı için QR kod desteği, gerçek zamanlı trafik istatistikleri ve bağlantı kayıtları sunar. T…

LoadAlertTracker

Sistem yükünü neredeyse hiç kaynak tüketmeden izleyen, hafif bir servis. Belirlenen eşikler aşıldığında Telegram, Discord ve Mattermost gibi platformlara gerçek zamanlı uyarı gönderir.

Rust

Trustsslroot

Tek komutla eksiksiz bir özel PKI yapısı (Kök CA → Ara CA → sunucu ve istemci sertifikaları) oluşturan araç. Farklı formatlarda (p12/bks/jks) paketler üretir ve kullanıma hazır çıktı klasörleri sunar.

Go

DDNS-FW

Değişken IP adresini DDNS üzerinden gerçek zamanlı takip eden, hafif ve güvenilir bir araç. İzin verilen IP listelerini otomatik güncelleyerek kesintisiz erişim ve güvenlik sağlar. Tek dosyadan çalışı…

Rust

Cloudfiltred

Sunucu üzerinde 80/443 portlarına erişimi yalnızca Cloudflare IP aralıklarıyla sınırlandıran, tek dosyadan çalışan bir Linux servisi. Kendini kurar, sistem servisi olarak çalışır ve IP listelerini düz…

Rust

node_exporter

Linux için geliştirilmiş, hafif ve tek dosyadan çalışan, güvenli erişim kontrollü bir sistem metrikleri servisi.

Rust