<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ali Cheaib</title>
    <description>The latest articles on DEV Community by Ali Cheaib (@ali_cheaib_adc8e17d360636).</description>
    <link>https://dev.to/ali_cheaib_adc8e17d360636</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1626728%2F0bf0cf8c-8c5a-4a0d-8e1b-7b32315c249c.jpg</url>
      <title>DEV Community: Ali Cheaib</title>
      <link>https://dev.to/ali_cheaib_adc8e17d360636</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ali_cheaib_adc8e17d360636"/>
    <language>en</language>
    <item>
      <title>Kubernetes v1.34</title>
      <dc:creator>Ali Cheaib</dc:creator>
      <pubDate>Tue, 12 Aug 2025 17:57:39 +0000</pubDate>
      <link>https://dev.to/ali_cheaib_adc8e17d360636/kubernetes-v134-4aj1</link>
      <guid>https://dev.to/ali_cheaib_adc8e17d360636/kubernetes-v134-4aj1</guid>
      <description>&lt;h1&gt;
  
  
  The Game-Changing Release That Will Transform Enterprise Container Orchestration
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;A comprehensive analysis of the most significant Kubernetes release in years&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As we approach the end of August 2025, the Kubernetes community is preparing for what many consider the most transformative release in recent years. Kubernetes v1.34 represents a major milestone in container orchestration maturity, bringing seven groundbreaking features from experimental stages to production readiness. Unlike previous releases focused on deprecations and removals, v1.34 is entirely about enhancement and innovation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Strategic Importance of This Release
&lt;/h2&gt;

&lt;p&gt;What makes v1.34 particularly significant is its focus on solving real-world enterprise challenges that have plagued Kubernetes adoption at scale. From GPU resource management in AI/ML workloads to observability gaps that have frustrated SRE teams for years, this release addresses the pain points that matter most to production environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Dynamic Resource Allocation (DRA) Reaches Stable: The GPU Revolution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem It Solves
&lt;/h3&gt;

&lt;p&gt;For years, managing specialized hardware like GPUs, FPGAs, and custom accelerators in Kubernetes has been a complex, vendor-specific nightmare. Organizations running AI/ML workloads have struggled with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inflexible device allocation mechanisms&lt;/li&gt;
&lt;li&gt;Vendor lock-in with proprietary solutions&lt;/li&gt;
&lt;li&gt;Complex configuration requirements&lt;/li&gt;
&lt;li&gt;Limited device sharing capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What's Changing
&lt;/h3&gt;

&lt;p&gt;Dynamic Resource Allocation (DRA) graduating to stable in v1.34 represents a fundamental shift in how Kubernetes handles specialized hardware. Built on the foundation laid since v1.30, DRA introduces a flexible, vendor-agnostic framework for device management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Components:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ResourceClaim&lt;/strong&gt;: Represents a request for specific resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeviceClass&lt;/strong&gt;: Defines categories of available devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ResourceClaimTemplate&lt;/strong&gt;: Templates for common resource patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ResourceSlice&lt;/strong&gt;: Provides device inventory information&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Deep Dive
&lt;/h3&gt;

&lt;p&gt;The architecture leverages structured parameters that remain opaque to Kubernetes core, allowing device drivers to implement sophisticated allocation logic without requiring changes to the scheduler. The system uses Common Expression Language (CEL) for flexible device filtering, enabling complex allocation rules like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;resource.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ResourceClaim&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu-claim&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;devices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu&lt;/span&gt;
      &lt;span class="na"&gt;deviceClassRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia-a100&lt;/span&gt;
      &lt;span class="na"&gt;selectors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;expression&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;device.attributes["memory"]&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;40'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Business Impact
&lt;/h3&gt;

&lt;p&gt;For enterprises, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost Optimization&lt;/strong&gt;: Better device utilization through intelligent allocation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor Flexibility&lt;/strong&gt;: No longer locked into proprietary solutions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational Simplicity&lt;/strong&gt;: Centralized device management across the cluster&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI/ML Acceleration&lt;/strong&gt;: Streamlined deployment of GPU-intensive workloads&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. ServiceAccount Tokens for Image Pull Authentication: Security Modernization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Security Challenge
&lt;/h3&gt;

&lt;p&gt;Traditional image pull secrets have been a security liability for years:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-lived credentials pose breach risks&lt;/li&gt;
&lt;li&gt;Manual secret rotation creates operational overhead&lt;/li&gt;
&lt;li&gt;Cluster-wide secrets lack workload-specific scoping&lt;/li&gt;
&lt;li&gt;Compliance teams struggle with credential lifecycle management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Beta Solution
&lt;/h3&gt;

&lt;p&gt;KEP-4412 introduces a revolutionary approach using short-lived, automatically rotated ServiceAccount tokens that follow OIDC-compliant semantics. Each token is scoped to a specific Pod, fundamentally changing the security model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Architecture
&lt;/h3&gt;

&lt;p&gt;The integration works through kubelet credential providers, allowing the kubelet to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate workload-specific OIDC tokens&lt;/li&gt;
&lt;li&gt;Automatically rotate tokens before expiration&lt;/li&gt;
&lt;li&gt;Authenticate to registries using modern identity protocols&lt;/li&gt;
&lt;li&gt;Eliminate the need for long-lived secrets&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Security Improvements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token lifespan measured in minutes, not months&lt;/li&gt;
&lt;li&gt;Automatic rotation eliminates manual processes&lt;/li&gt;
&lt;li&gt;Pod-scoped tokens prevent credential sprawl&lt;/li&gt;
&lt;li&gt;OIDC compliance enables audit trails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduced secret management overhead&lt;/li&gt;
&lt;li&gt;Automated credential lifecycle&lt;/li&gt;
&lt;li&gt;Integration with existing identity systems&lt;/li&gt;
&lt;li&gt;Simplified compliance reporting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Pod Replacement Policy for Deployments: Predictable Rollout Control
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Resource Management Challenge
&lt;/h3&gt;

&lt;p&gt;During deployment updates, the default Kubernetes behavior often leads to unpredictable resource consumption. Organizations face:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource spikes during rollouts&lt;/li&gt;
&lt;li&gt;Unpredictable deployment timing&lt;/li&gt;
&lt;li&gt;Difficulty planning capacity during updates&lt;/li&gt;
&lt;li&gt;Challenges in resource-constrained environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Alpha Solution: spec.podReplacementPolicy
&lt;/h3&gt;

&lt;p&gt;KEP-3973 introduces granular control over when new pods are created during updates, offering two distinct strategies:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TerminationStarted Strategy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podReplacementPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TerminationStarted&lt;/span&gt;
  &lt;span class="c1"&gt;# Creates new pods immediately when old ones start terminating&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TerminationComplete Strategy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podReplacementPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TerminationComplete&lt;/span&gt;
  &lt;span class="c1"&gt;# Waits for complete termination before creating new pods&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Strategic Use Cases
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TerminationStarted&lt;/strong&gt; is ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-availability applications requiring zero downtime&lt;/li&gt;
&lt;li&gt;Environments with abundant resources&lt;/li&gt;
&lt;li&gt;Services with minimal graceful shutdown requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TerminationComplete&lt;/strong&gt; excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource-constrained environments&lt;/li&gt;
&lt;li&gt;Applications with long termination periods&lt;/li&gt;
&lt;li&gt;Batch processing workloads&lt;/li&gt;
&lt;li&gt;Cost-sensitive deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Feature Gate Requirements
&lt;/h3&gt;

&lt;p&gt;Enable through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DeploymentPodReplacementPolicy&lt;/code&gt; feature gate on API server&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DeploymentReplicaSetTerminatingReplicas&lt;/code&gt; feature gate on kube-controller-manager&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Production-Ready Tracing: Observability Revolution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Debugging Nightmare
&lt;/h3&gt;

&lt;p&gt;Node-level debugging has historically been one of Kubernetes' most challenging aspects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disconnected logs provide incomplete pictures&lt;/li&gt;
&lt;li&gt;Latency issues are difficult to trace&lt;/li&gt;
&lt;li&gt;Container runtime interactions remain opaque&lt;/li&gt;
&lt;li&gt;Root cause analysis requires extensive manual correlation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dual Enhancement Approach
&lt;/h3&gt;

&lt;p&gt;Two complementary KEPs provide comprehensive tracing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KEP-2831 (Kubelet Tracing):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instruments critical kubelet operations&lt;/li&gt;
&lt;li&gt;Deep visibility into Container Runtime Interface (CRI) calls&lt;/li&gt;
&lt;li&gt;OpenTelemetry-standard instrumentation&lt;/li&gt;
&lt;li&gt;Trace context propagation to container runtimes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;KEP-647 (API Server Tracing):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;End-to-end request tracing through the control plane&lt;/li&gt;
&lt;li&gt;Integration with kubelet traces for complete visibility&lt;/li&gt;
&lt;li&gt;Performance bottleneck identification&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Implementation
&lt;/h3&gt;

&lt;p&gt;The tracing system provides:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Request → API Server → etcd
     ↓
Scheduler → Kubelet → Container Runtime
     ↓
Pod Creation/Management
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Span creation with relevant metadata&lt;/li&gt;
&lt;li&gt;Latency measurement&lt;/li&gt;
&lt;li&gt;Error propagation&lt;/li&gt;
&lt;li&gt;Context correlation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operational Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;For SRE Teams:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual representation of request lifecycles&lt;/li&gt;
&lt;li&gt;Pinpoint latency bottlenecks&lt;/li&gt;
&lt;li&gt;Correlate control plane and node-level issues&lt;/li&gt;
&lt;li&gt;Proactive performance optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Development Teams:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand application startup bottlenecks&lt;/li&gt;
&lt;li&gt;Debug container runtime issues&lt;/li&gt;
&lt;li&gt;Optimize resource allocation patterns&lt;/li&gt;
&lt;li&gt;Improve deployment strategies&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Enhanced Traffic Distribution: Performance Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Network Efficiency Challenge
&lt;/h3&gt;

&lt;p&gt;Default round-robin traffic distribution ignores network topology, leading to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unnecessary cross-zone traffic costs&lt;/li&gt;
&lt;li&gt;Increased latency from distant endpoints&lt;/li&gt;
&lt;li&gt;Suboptimal resource utilization&lt;/li&gt;
&lt;li&gt;Higher cloud networking charges&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  KEP-3015: Intelligent Traffic Routing
&lt;/h3&gt;

&lt;p&gt;The enhancement introduces topology-aware traffic distribution:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PreferSameZone:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;trafficDistribution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PreferSameZone&lt;/span&gt;
  &lt;span class="c1"&gt;# Routes traffic to endpoints in the same availability zone&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PreferSameNode:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;trafficDistribution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PreferSameNode&lt;/span&gt;
  &lt;span class="c1"&gt;# Prioritizes endpoints on the same node as the client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Impact
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cost Reduction:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimized cross-zone data transfer charges&lt;/li&gt;
&lt;li&gt;Reduced bandwidth consumption&lt;/li&gt;
&lt;li&gt;Lower cloud networking costs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Latency Improvement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster response times through proximity routing&lt;/li&gt;
&lt;li&gt;Reduced network hops&lt;/li&gt;
&lt;li&gt;Better user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resource Efficiency:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimal utilization of local resources&lt;/li&gt;
&lt;li&gt;Reduced network congestion&lt;/li&gt;
&lt;li&gt;Improved overall cluster performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. KYAML Support: Configuration Safety Revolution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The YAML Problem
&lt;/h3&gt;

&lt;p&gt;YAML's flexibility has become its curse in production environments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whitespace sensitivity causes deployment failures&lt;/li&gt;
&lt;li&gt;Type coercion leads to unexpected behavior (the infamous "Norway Bug")&lt;/li&gt;
&lt;li&gt;Lack of standardization creates inconsistency&lt;/li&gt;
&lt;li&gt;No comment support in JSON alternatives&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  KEP-5295: KYAML Introduction
&lt;/h3&gt;

&lt;p&gt;KYAML (Kubernetes YAML) addresses these issues while maintaining compatibility:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safety Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always double-quoted value strings&lt;/li&gt;
&lt;li&gt;Unquoted keys unless ambiguous&lt;/li&gt;
&lt;li&gt;Consistent mapping syntax with &lt;code&gt;{}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Consistent list syntax with &lt;code&gt;[]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer Experience:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comment support for documentation&lt;/li&gt;
&lt;li&gt;Trailing comma tolerance&lt;/li&gt;
&lt;li&gt;JSON-like structure with YAML benefits&lt;/li&gt;
&lt;li&gt;100% YAML parser compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example Comparison
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Traditional YAML:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;  &lt;span class="c1"&gt;# Unquoted, potential issues&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;   &lt;span class="c1"&gt;# Number, but could be interpreted as string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;KYAML:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apps/v1"&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deployment"&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-app"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;  &lt;span class="nv"&gt;// Comments supported&lt;/span&gt;
&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;     &lt;span class="nv"&gt;// Trailing commas allowed&lt;/span&gt;
&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integration Strategy
&lt;/h3&gt;

&lt;p&gt;KYAML will be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Available as kubectl output format: &lt;code&gt;kubectl get -o kyaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Compatible with existing toolchains&lt;/li&gt;
&lt;li&gt;Optional for users (no forced migration)&lt;/li&gt;
&lt;li&gt;Supported by Helm and other tools&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Fine-Grained HPA Control: Autoscaling Precision
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Scaling Precision Problem
&lt;/h3&gt;

&lt;p&gt;Kubernetes' default 10% autoscaling tolerance creates challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large deployments leave hundreds of unnecessary pods&lt;/li&gt;
&lt;li&gt;One-size-fits-all approach ignores workload characteristics&lt;/li&gt;
&lt;li&gt;Inefficient resource utilization at scale&lt;/li&gt;
&lt;li&gt;Poor cost optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  KEP-4951: Configurable HPA Tolerance
&lt;/h3&gt;

&lt;p&gt;The enhancement enables per-HPA tolerance configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;autoscaling/v2&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HorizontalPodAutoscaler&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;behavior&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;scaleUp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tolerance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5%&lt;/span&gt;      &lt;span class="c1"&gt;# Responsive scaling for traffic surges&lt;/span&gt;
    &lt;span class="na"&gt;scaleDown&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tolerance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15%&lt;/span&gt;     &lt;span class="c1"&gt;# Conservative scaling to avoid thrashing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Strategic Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;For Large-Scale Deployments:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precise resource control&lt;/li&gt;
&lt;li&gt;Significant cost savings&lt;/li&gt;
&lt;li&gt;Improved efficiency metrics&lt;/li&gt;
&lt;li&gt;Better capacity planning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Diverse Workloads:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traffic-sensitive applications use low tolerance&lt;/li&gt;
&lt;li&gt;Batch processing uses higher tolerance&lt;/li&gt;
&lt;li&gt;Critical services get custom parameters&lt;/li&gt;
&lt;li&gt;Development environments optimize for cost&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Feature Maturity Path
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Alpha in v1.33 behind &lt;code&gt;HPAConfigurableTolerance&lt;/code&gt; feature gate&lt;/li&gt;
&lt;li&gt;Expected beta graduation in v1.34&lt;/li&gt;
&lt;li&gt;Default enablement planned for production use&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Migration and Adoption Strategy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Preparation Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Feature Gate Planning&lt;/strong&gt;: Review which features require specific feature gates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing Environment&lt;/strong&gt;: Establish v1.34 testing clusters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring Setup&lt;/strong&gt;: Implement observability for new tracing features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Review&lt;/strong&gt;: Plan ServiceAccount token migration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Planning&lt;/strong&gt;: Evaluate DRA adoption for GPU workloads&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Rollout Recommendations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Observability&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable tracing features for debugging capabilities&lt;/li&gt;
&lt;li&gt;Implement KYAML for new manifests&lt;/li&gt;
&lt;li&gt;Test HPA tolerance configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Resource Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pilot DRA with non-critical GPU workloads&lt;/li&gt;
&lt;li&gt;Implement Pod replacement policies for specific deployments&lt;/li&gt;
&lt;li&gt;Optimize traffic distribution for high-traffic services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: Security Enhancement&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrate to ServiceAccount token-based image pulls&lt;/li&gt;
&lt;li&gt;Implement workload-specific identity patterns&lt;/li&gt;
&lt;li&gt;Remove long-lived image pull secrets&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion: A New Era for Kubernetes
&lt;/h2&gt;

&lt;p&gt;Kubernetes v1.34 represents more than incremental improvement—it's a fundamental advancement in container orchestration maturity. The combination of enhanced resource management, improved security, better observability, and operational flexibility positions this release as a turning point for enterprise Kubernetes adoption.&lt;/p&gt;

&lt;p&gt;Organizations that strategically adopt these features will gain significant competitive advantages in cost optimization, operational efficiency, and deployment reliability. The focus on stability graduation for key features signals Kubernetes' evolution from a complex orchestration platform to a production-ready enterprise solution.&lt;/p&gt;

&lt;p&gt;As we approach the August 2025 release, now is the time for engineering teams to begin planning their adoption strategy. The features in v1.34 aren't just enhancements—they're the foundation for the next generation of cloud-native infrastructure.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;For the latest updates on Kubernetes v1.34 development, monitor the official Kubernetes blog and KEP repository. Feature availability and graduation status may change before the final release.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
    <item>
      <title>Kestra: The Workflow Orchestration Tool You Haven't Heard Of (But Should)</title>
      <dc:creator>Ali Cheaib</dc:creator>
      <pubDate>Sat, 12 Jul 2025 23:36:15 +0000</pubDate>
      <link>https://dev.to/ali_cheaib_adc8e17d360636/kestra-the-workflow-orchestration-tool-you-havent-heard-of-but-should-5bbb</link>
      <guid>https://dev.to/ali_cheaib_adc8e17d360636/kestra-the-workflow-orchestration-tool-you-havent-heard-of-but-should-5bbb</guid>
      <description>&lt;h2&gt;
  
  
  What is Kestra?
&lt;/h2&gt;

&lt;p&gt;Kestra is an open-source workflow orchestration platform that uses declarative YAML to define workflows. Think of it as a universal automation engine that can orchestrate anything – from simple file processing to complex multi-step business processes.&lt;/p&gt;

&lt;p&gt;Unlike traditional CI/CD tools or data pipeline orchestrators, Kestra is designed to be genuinely general-purpose. It can handle DevOps tasks, business processes, data workflows, and basically anything that involves "do X, then Y, then Z."&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Example 1: Automated Customer Onboarding
&lt;/h2&gt;

&lt;p&gt;Here's a workflow that handles our entire customer onboarding process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;customer-onboarding&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;business-processes&lt;/span&gt;

&lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;customer_email&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;STRING&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;customer_name&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;STRING&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;plan_type&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;STRING&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create-customer-account&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
    &lt;span class="na"&gt;beforeCommands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pip install requests&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;import requests&lt;/span&gt;
      &lt;span class="s"&gt;import json&lt;/span&gt;

      &lt;span class="s"&gt;# Create account in our system&lt;/span&gt;
      &lt;span class="s"&gt;response = requests.post(&lt;/span&gt;
          &lt;span class="s"&gt;"{{ secret('API_BASE_URL') }}/customers",&lt;/span&gt;
          &lt;span class="s"&gt;headers={"Authorization": "Bearer {{ secret('API_TOKEN') }}"},&lt;/span&gt;
          &lt;span class="s"&gt;json={&lt;/span&gt;
              &lt;span class="s"&gt;"email": "{{ inputs.customer_email }}",&lt;/span&gt;
              &lt;span class="s"&gt;"name": "{{ inputs.customer_name }}",&lt;/span&gt;
              &lt;span class="s"&gt;"plan": "{{ inputs.plan_type }}"&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;
      &lt;span class="s"&gt;)&lt;/span&gt;

      &lt;span class="s"&gt;if response.status_code == 201:&lt;/span&gt;
          &lt;span class="s"&gt;customer_data = response.json()&lt;/span&gt;
          &lt;span class="s"&gt;print(f"Created customer: {customer_data['id']}")&lt;/span&gt;
      &lt;span class="s"&gt;else:&lt;/span&gt;
          &lt;span class="s"&gt;raise Exception(f"Failed to create customer: {response.text}")&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup-workspace&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.shell.Commands&lt;/span&gt;
    &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;# Create customer workspace directory&lt;/span&gt;
        &lt;span class="s"&gt;mkdir -p /workspaces/{{ inputs.customer_email }}&lt;/span&gt;

        &lt;span class="s"&gt;# Copy template files&lt;/span&gt;
        &lt;span class="s"&gt;cp -r /templates/{{ inputs.plan_type }}/* /workspaces/{{ inputs.customer_email }}/&lt;/span&gt;

        &lt;span class="s"&gt;# Set permissions&lt;/span&gt;
        &lt;span class="s"&gt;chmod 755 /workspaces/{{ inputs.customer_email }}&lt;/span&gt;

        &lt;span class="s"&gt;echo "Workspace created for {{ inputs.customer_name }}"&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;send-welcome-email&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.notifications.mail.MailSend&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;welcome@ourcompany.com"&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;inputs.customer_email&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Our&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Platform!"&lt;/span&gt;
    &lt;span class="na"&gt;htmlTextContent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;&amp;lt;h2&amp;gt;Welcome {{ inputs.customer_name }}!&amp;lt;/h2&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;&amp;lt;p&amp;gt;Your {{ inputs.plan_type }} account has been created.&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;&amp;lt;p&amp;gt;You can access your workspace at: https://app.ourcompany.com/{{ inputs.customer_email }}&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;&amp;lt;p&amp;gt;If you have any questions, just reply to this email.&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create-support-ticket&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
    &lt;span class="na"&gt;beforeCommands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pip install requests&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;import requests&lt;/span&gt;

      &lt;span class="s"&gt;# Create welcome ticket in support system&lt;/span&gt;
      &lt;span class="s"&gt;response = requests.post(&lt;/span&gt;
          &lt;span class="s"&gt;"{{ secret('SUPPORT_API_URL') }}/tickets",&lt;/span&gt;
          &lt;span class="s"&gt;headers={"Authorization": "Bearer {{ secret('SUPPORT_TOKEN') }}"},&lt;/span&gt;
          &lt;span class="s"&gt;json={&lt;/span&gt;
              &lt;span class="s"&gt;"customer_email": "{{ inputs.customer_email }}",&lt;/span&gt;
              &lt;span class="s"&gt;"subject": "Welcome &amp;amp; Setup Assistance",&lt;/span&gt;
              &lt;span class="s"&gt;"priority": "low",&lt;/span&gt;
              &lt;span class="s"&gt;"type": "onboarding",&lt;/span&gt;
              &lt;span class="s"&gt;"description": "New customer onboarding completed. Follow up in 3 days."&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;
      &lt;span class="s"&gt;)&lt;/span&gt;

      &lt;span class="s"&gt;print(f"Support ticket created: {response.json()['ticket_id']}")&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;schedule-followup&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.core.flow.WorkingDirectory&lt;/span&gt;
    &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create-followup-reminder&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
        &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;import datetime&lt;/span&gt;

          &lt;span class="s"&gt;followup_date = datetime.datetime.now() + datetime.timedelta(days=3)&lt;/span&gt;

          &lt;span class="s"&gt;# This would integrate with your calendar/reminder system&lt;/span&gt;
          &lt;span class="s"&gt;print(f"Schedule follow-up for {followup_date.strftime('%Y-%m-%d')}")&lt;/span&gt;
          &lt;span class="s"&gt;print(f"Customer: {{ inputs.customer_name }} ({{ inputs.customer_email }})")&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;update-crm&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
    &lt;span class="na"&gt;beforeCommands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pip install requests&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;import requests&lt;/span&gt;

      &lt;span class="s"&gt;# Update CRM with onboarding completion&lt;/span&gt;
      &lt;span class="s"&gt;response = requests.patch(&lt;/span&gt;
          &lt;span class="s"&gt;"{{ secret('CRM_API_URL') }}/contacts/{{ inputs.customer_email }}",&lt;/span&gt;
          &lt;span class="s"&gt;headers={"Authorization": "Bearer {{ secret('CRM_TOKEN') }}"},&lt;/span&gt;
          &lt;span class="s"&gt;json={&lt;/span&gt;
              &lt;span class="s"&gt;"onboarding_status": "completed",&lt;/span&gt;
              &lt;span class="s"&gt;"onboarding_date": "{{ now() }}",&lt;/span&gt;
              &lt;span class="s"&gt;"account_type": "{{ inputs.plan_type }}"&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;
      &lt;span class="s"&gt;)&lt;/span&gt;

      &lt;span class="s"&gt;print("CRM updated successfully")&lt;/span&gt;

&lt;span class="na"&gt;triggers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webhook-trigger&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.core.models.triggers.types.Webhook&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer-signup"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This workflow gets triggered whenever someone signs up on our website. It creates their account, sets up their workspace, sends welcome emails, creates support tickets, and updates our CRM. What used to take 30 minutes of manual work now happens in under 2 minutes automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Example 2: Infrastructure Health Check
&lt;/h2&gt;

&lt;p&gt;Here's a workflow that monitors our infrastructure and automatically handles common issues:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;infrastructure-health-check&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;devops&lt;/span&gt;

&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-database-connections&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
    &lt;span class="na"&gt;beforeCommands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pip install psycopg2-binary redis&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;import psycopg2&lt;/span&gt;
      &lt;span class="s"&gt;import redis&lt;/span&gt;

      &lt;span class="s"&gt;# Check PostgreSQL&lt;/span&gt;
      &lt;span class="s"&gt;try:&lt;/span&gt;
          &lt;span class="s"&gt;conn = psycopg2.connect(&lt;/span&gt;
              &lt;span class="s"&gt;host="{{ secret('DB_HOST') }}",&lt;/span&gt;
              &lt;span class="s"&gt;database="{{ secret('DB_NAME') }}",&lt;/span&gt;
              &lt;span class="s"&gt;user="{{ secret('DB_USER') }}",&lt;/span&gt;
              &lt;span class="s"&gt;password="{{ secret('DB_PASSWORD') }}"&lt;/span&gt;
          &lt;span class="s"&gt;)&lt;/span&gt;
          &lt;span class="s"&gt;conn.close()&lt;/span&gt;
          &lt;span class="s"&gt;print(" PostgreSQL: Healthy")&lt;/span&gt;
          &lt;span class="s"&gt;postgres_healthy = True&lt;/span&gt;
      &lt;span class="s"&gt;except Exception as e:&lt;/span&gt;
          &lt;span class="s"&gt;print(f" PostgreSQL: {e}")&lt;/span&gt;
          &lt;span class="s"&gt;postgres_healthy = False&lt;/span&gt;

      &lt;span class="s"&gt;# Check Redis&lt;/span&gt;
      &lt;span class="s"&gt;try:&lt;/span&gt;
          &lt;span class="s"&gt;r = redis.Redis(host="{{ secret('REDIS_HOST') }}", port=6379, decode_responses=True)&lt;/span&gt;
          &lt;span class="s"&gt;r.ping()&lt;/span&gt;
          &lt;span class="s"&gt;print(" Redis: Healthy")&lt;/span&gt;
          &lt;span class="s"&gt;redis_healthy = True&lt;/span&gt;
      &lt;span class="s"&gt;except Exception as e:&lt;/span&gt;
          &lt;span class="s"&gt;print(f" Redis: {e}")&lt;/span&gt;
          &lt;span class="s"&gt;redis_healthy = False&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-api-endpoints&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
    &lt;span class="na"&gt;beforeCommands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pip install requests&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;import requests&lt;/span&gt;

      &lt;span class="s"&gt;endpoints = [&lt;/span&gt;
          &lt;span class="s"&gt;"{{ secret('API_BASE_URL') }}/health",&lt;/span&gt;
          &lt;span class="s"&gt;"{{ secret('API_BASE_URL') }}/api/v1/status",&lt;/span&gt;
          &lt;span class="s"&gt;"{{ secret('ADMIN_API_URL') }}/health"&lt;/span&gt;
      &lt;span class="s"&gt;]&lt;/span&gt;

      &lt;span class="s"&gt;failed_endpoints = []&lt;/span&gt;

      &lt;span class="s"&gt;for endpoint in endpoints:&lt;/span&gt;
          &lt;span class="s"&gt;try:&lt;/span&gt;
              &lt;span class="s"&gt;response = requests.get(endpoint, timeout=10)&lt;/span&gt;
              &lt;span class="s"&gt;if response.status_code == 200:&lt;/span&gt;
                  &lt;span class="s"&gt;print(f" {endpoint}: Healthy")&lt;/span&gt;
              &lt;span class="s"&gt;else:&lt;/span&gt;
                  &lt;span class="s"&gt;print(f" {endpoint}: Status {response.status_code}")&lt;/span&gt;
                  &lt;span class="s"&gt;failed_endpoints.append(endpoint)&lt;/span&gt;
          &lt;span class="s"&gt;except Exception as e:&lt;/span&gt;
              &lt;span class="s"&gt;print(f" {endpoint}: {e}")&lt;/span&gt;
              &lt;span class="s"&gt;failed_endpoints.append(endpoint)&lt;/span&gt;

      &lt;span class="s"&gt;if failed_endpoints:&lt;/span&gt;
          &lt;span class="s"&gt;raise Exception(f"Failed endpoints: {failed_endpoints}")&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-disk-space&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.shell.Commands&lt;/span&gt;
    &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;# Check disk usage on main servers&lt;/span&gt;
        &lt;span class="s"&gt;servers=("web-01" "web-02" "db-01")&lt;/span&gt;

        &lt;span class="s"&gt;for server in "${servers[@]}"; do&lt;/span&gt;
            &lt;span class="s"&gt;usage=$(ssh $server "df -h / | tail -1 | awk '{print \$5}' | sed 's/%//'")&lt;/span&gt;
            &lt;span class="s"&gt;echo "Server $server disk usage: ${usage}%"&lt;/span&gt;

            &lt;span class="s"&gt;if [ "$usage" -gt 85 ]; then&lt;/span&gt;
                &lt;span class="s"&gt;echo " WARNING: $server disk usage is ${usage}%"&lt;/span&gt;
            &lt;span class="s"&gt;fi&lt;/span&gt;
        &lt;span class="s"&gt;done&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;restart-services-if-needed&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.shell.Commands&lt;/span&gt;
    &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;# Check if any services are in failed state&lt;/span&gt;
        &lt;span class="s"&gt;failed_services=$(systemctl list-units --state=failed --no-pager | grep -v "0 loaded")&lt;/span&gt;

        &lt;span class="s"&gt;if [ ! -z "$failed_services" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "Found failed services:"&lt;/span&gt;
            &lt;span class="s"&gt;echo "$failed_services"&lt;/span&gt;

            &lt;span class="s"&gt;# Restart common services that sometimes fail&lt;/span&gt;
            &lt;span class="s"&gt;sudo systemctl restart nginx&lt;/span&gt;
            &lt;span class="s"&gt;sudo systemctl restart redis&lt;/span&gt;

            &lt;span class="s"&gt;echo "Services restarted"&lt;/span&gt;
        &lt;span class="s"&gt;else&lt;/span&gt;
            &lt;span class="s"&gt;echo "All services running normally"&lt;/span&gt;
        &lt;span class="s"&gt;fi&lt;/span&gt;

&lt;span class="na"&gt;triggers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;health-check-schedule&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.core.models.triggers.types.Schedule&lt;/span&gt;
    &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*/15&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;  &lt;span class="c1"&gt;# Every 15 minutes&lt;/span&gt;

&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alert-on-failure&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.notifications.slack.SlackIncomingWebhook&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;secret('SLACK_WEBHOOK')&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"text": " Infrastructure Health Check Failed",&lt;/span&gt;
        &lt;span class="s"&gt;"attachments": [&lt;/span&gt;
          &lt;span class="s"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"color": "danger",&lt;/span&gt;
            &lt;span class="s"&gt;"fields": [&lt;/span&gt;
              &lt;span class="s"&gt;{&lt;/span&gt;
                &lt;span class="s"&gt;"title": "Failed Task",&lt;/span&gt;
                &lt;span class="s"&gt;"value": "{{ task.id }}",&lt;/span&gt;
                &lt;span class="s"&gt;"short": true&lt;/span&gt;
              &lt;span class="s"&gt;},&lt;/span&gt;
              &lt;span class="s"&gt;{&lt;/span&gt;
                &lt;span class="s"&gt;"title": "Error",&lt;/span&gt;
                &lt;span class="s"&gt;"value": "{{ task.error }}",&lt;/span&gt;
                &lt;span class="s"&gt;"short": false&lt;/span&gt;
              &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;]&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;
        &lt;span class="s"&gt;]&lt;/span&gt;
      &lt;span class="s"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs every 15 minutes and checks our databases, APIs, disk space, and system services. If anything fails, it tries to fix common issues automatically and alerts us via Slack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Example 3: Content Publishing Pipeline
&lt;/h2&gt;

&lt;p&gt;Here's a workflow that handles our blog publishing process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;content-publishing&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;marketing&lt;/span&gt;

&lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;article_file&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;FILE&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publish_date&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DATETIME&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;author_email&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;STRING&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;validate-content&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
    &lt;span class="na"&gt;beforeCommands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pip install markdown beautifulsoup4&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;import markdown&lt;/span&gt;
      &lt;span class="s"&gt;from bs4 import BeautifulSoup&lt;/span&gt;
      &lt;span class="s"&gt;import re&lt;/span&gt;

      &lt;span class="s"&gt;# Read the uploaded file&lt;/span&gt;
      &lt;span class="s"&gt;with open("{{ inputs.article_file }}", 'r') as f:&lt;/span&gt;
          &lt;span class="s"&gt;content = f.read()&lt;/span&gt;

      &lt;span class="s"&gt;# Convert markdown to HTML&lt;/span&gt;
      &lt;span class="s"&gt;html = markdown.markdown(content)&lt;/span&gt;
      &lt;span class="s"&gt;soup = BeautifulSoup(html, 'html.parser')&lt;/span&gt;

      &lt;span class="s"&gt;# Validate content&lt;/span&gt;
      &lt;span class="s"&gt;word_count = len(content.split())&lt;/span&gt;
      &lt;span class="s"&gt;if word_count &amp;lt; 500:&lt;/span&gt;
          &lt;span class="s"&gt;raise Exception(f"Article too short: {word_count} words (minimum 500)")&lt;/span&gt;

      &lt;span class="s"&gt;# Check for required elements&lt;/span&gt;
      &lt;span class="s"&gt;if not soup.find('h1'):&lt;/span&gt;
          &lt;span class="s"&gt;raise Exception("Article must have at least one H1 heading")&lt;/span&gt;

      &lt;span class="s"&gt;# Check for images&lt;/span&gt;
      &lt;span class="s"&gt;img_count = len(soup.find_all('img'))&lt;/span&gt;
      &lt;span class="s"&gt;if img_count == 0:&lt;/span&gt;
          &lt;span class="s"&gt;print("Warning: No images found in article")&lt;/span&gt;

      &lt;span class="s"&gt;print(f"Article validated: {word_count} words, {img_count} images")&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;optimize-images&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.shell.Commands&lt;/span&gt;
    &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;# Find and optimize images in the article&lt;/span&gt;
        &lt;span class="s"&gt;mkdir -p optimized_images&lt;/span&gt;

        &lt;span class="s"&gt;# This would typically process images referenced in the markdown&lt;/span&gt;
        &lt;span class="s"&gt;find ./images -name "*.jpg" -o -name "*.png" | while read img; do&lt;/span&gt;
            &lt;span class="s"&gt;filename=$(basename "$img")&lt;/span&gt;

            &lt;span class="s"&gt;# Optimize image (example with imagemagick)&lt;/span&gt;
            &lt;span class="s"&gt;convert "$img" -resize "800x600&amp;gt;" -quality 85 "optimized_images/$filename"&lt;/span&gt;

            &lt;span class="s"&gt;echo "Optimized: $filename"&lt;/span&gt;
        &lt;span class="s"&gt;done&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;generate-social-media-posts&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;import re&lt;/span&gt;

      &lt;span class="s"&gt;# Read article content&lt;/span&gt;
      &lt;span class="s"&gt;with open("{{ inputs.article_file }}", 'r') as f:&lt;/span&gt;
          &lt;span class="s"&gt;content = f.read()&lt;/span&gt;

      &lt;span class="s"&gt;# Extract title (first H1)&lt;/span&gt;
      &lt;span class="s"&gt;title_match = re.search(r'^# (.+)$', content, re.MULTILINE)&lt;/span&gt;
      &lt;span class="s"&gt;title = title_match.group(1) if title_match else "New Article"&lt;/span&gt;

      &lt;span class="s"&gt;# Generate social media posts&lt;/span&gt;
      &lt;span class="s"&gt;twitter_post = f" New article: {title}\n\nRead more: https://blog.ourcompany.com/latest"&lt;/span&gt;
      &lt;span class="s"&gt;linkedin_post = f"I just published a new article: {title}\n\nCheck it out and let me know what you think!\n\nhttps://blog.ourcompany.com/latest"&lt;/span&gt;

      &lt;span class="s"&gt;# Save to files&lt;/span&gt;
      &lt;span class="s"&gt;with open('twitter_post.txt', 'w') as f:&lt;/span&gt;
          &lt;span class="s"&gt;f.write(twitter_post)&lt;/span&gt;

      &lt;span class="s"&gt;with open('linkedin_post.txt', 'w') as f:&lt;/span&gt;
          &lt;span class="s"&gt;f.write(linkedin_post)&lt;/span&gt;

      &lt;span class="s"&gt;print("Social media posts generated")&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;schedule-publication&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.scripts.python.Script&lt;/span&gt;
    &lt;span class="na"&gt;beforeCommands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pip install requests&lt;/span&gt;
    &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;import requests&lt;/span&gt;
      &lt;span class="s"&gt;from datetime import datetime&lt;/span&gt;

      &lt;span class="s"&gt;# Upload to CMS&lt;/span&gt;
      &lt;span class="s"&gt;with open("{{ inputs.article_file }}", 'r') as f:&lt;/span&gt;
          &lt;span class="s"&gt;content = f.read()&lt;/span&gt;

      &lt;span class="s"&gt;response = requests.post(&lt;/span&gt;
          &lt;span class="s"&gt;"{{ secret('CMS_API_URL') }}/articles",&lt;/span&gt;
          &lt;span class="s"&gt;headers={"Authorization": "Bearer {{ secret('CMS_TOKEN') }}"},&lt;/span&gt;
          &lt;span class="s"&gt;json={&lt;/span&gt;
              &lt;span class="s"&gt;"content": content,&lt;/span&gt;
              &lt;span class="s"&gt;"author": "{{ inputs.author_email }}",&lt;/span&gt;
              &lt;span class="s"&gt;"publish_date": "{{ inputs.publish_date }}",&lt;/span&gt;
              &lt;span class="s"&gt;"status": "scheduled"&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;
      &lt;span class="s"&gt;)&lt;/span&gt;

      &lt;span class="s"&gt;if response.status_code == 201:&lt;/span&gt;
          &lt;span class="s"&gt;article_id = response.json()['id']&lt;/span&gt;
          &lt;span class="s"&gt;print(f"Article scheduled for publication: {article_id}")&lt;/span&gt;
      &lt;span class="s"&gt;else:&lt;/span&gt;
          &lt;span class="s"&gt;raise Exception(f"Failed to schedule article: {response.text}")&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;notify-team&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;io.kestra.plugin.notifications.slack.SlackIncomingWebhook&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;secret('SLACK_WEBHOOK')&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"text": "📄 New article ready for publication",&lt;/span&gt;
        &lt;span class="s"&gt;"attachments": [&lt;/span&gt;
          &lt;span class="s"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"color": "good",&lt;/span&gt;
            &lt;span class="s"&gt;"fields": [&lt;/span&gt;
              &lt;span class="s"&gt;{&lt;/span&gt;
                &lt;span class="s"&gt;"title": "Author",&lt;/span&gt;
                &lt;span class="s"&gt;"value": "{{ inputs.author_email }}",&lt;/span&gt;
                &lt;span class="s"&gt;"short": true&lt;/span&gt;
              &lt;span class="s"&gt;},&lt;/span&gt;
              &lt;span class="s"&gt;{&lt;/span&gt;
                &lt;span class="s"&gt;"title": "Publish Date",&lt;/span&gt;
                &lt;span class="s"&gt;"value": "{{ inputs.publish_date }}",&lt;/span&gt;
                &lt;span class="s"&gt;"short": true&lt;/span&gt;
              &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;]&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;
        &lt;span class="s"&gt;]&lt;/span&gt;
      &lt;span class="s"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This workflow handles our entire content publishing process: validates articles, optimizes images, generates social media posts, schedules publication, and notifies the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Kestra Works So Well
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Truly Declarative&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Everything is defined in YAML. No code to maintain, no complex dependencies to manage. Just describe what you want to happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Built-in Integrations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Kestra comes with plugins for databases, APIs, cloud services, notifications, and more. Most common tasks don't require custom code.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Visual Workflow Editor&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The web interface lets you build workflows visually, see execution in real-time, and debug issues easily.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Flexible Triggers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Workflows can be triggered by schedules, webhooks, file changes, or other workflows. Mix and match as needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Resource Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tasks run in isolated containers with configurable resources. No more "it works on my machine" issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Installation is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using Docker&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; kestra &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /tmp/kestra:/tmp/kestra &lt;span class="se"&gt;\&lt;/span&gt;
  kestra/kestra:latest &lt;span class="se"&gt;\&lt;/span&gt;
  server standalone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then visit &lt;code&gt;http://localhost:8080&lt;/code&gt; and start building workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Tips
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start simple&lt;/strong&gt;: Begin with basic file processing or notification workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use secrets&lt;/strong&gt;: Never hardcode credentials in workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test incrementally&lt;/strong&gt;: Build workflows task by task&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor resource usage&lt;/strong&gt;: Tasks run in containers, so size appropriately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the visual editor&lt;/strong&gt;: It's genuinely helpful for building complex workflows&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When to Use Kestra
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-step business processes&lt;/li&gt;
&lt;li&gt;Integration between different systems&lt;/li&gt;
&lt;li&gt;Automated workflows that need human oversight&lt;/li&gt;
&lt;li&gt;Complex scheduling requirements&lt;/li&gt;
&lt;li&gt;Mixed workloads (APIs, databases, files, notifications)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Maybe not ideal for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple CI/CD (GitHub Actions might be better)&lt;/li&gt;
&lt;li&gt;Real-time processing (use streaming platforms)&lt;/li&gt;
&lt;li&gt;Very high-frequency tasks (consider event-driven architectures)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Kestra fills a gap that I didn't realize existed. It's more flexible than traditional CI/CD tools, simpler than complex workflow engines, and more powerful than basic scheduling tools.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>gitlab</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
