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.