General
GitOps for ML: Continuous Delivery with ArgoCD in Kled.io
Michael Rodriguez
February 15, 2025 (1mo ago)
<h2>Introduction</h2>
<p>The world of machine learning operations (MLOps) has rapidly evolved to incorporate best practices from DevOps. One of the most impactful approaches is GitOps—a paradigm that uses Git as the single source of truth for declarative infrastructure and applications. In the Kled.io platform, we've integrated ArgoCD, a leading GitOps continuous delivery tool for Kubernetes, to streamline the deployment and management of ML models and their supporting infrastructure.</p>
<p>This article explores how ArgoCD empowers ML teams to implement GitOps principles, resulting in more reliable, reproducible, and auditable model deployments.</p>
<h2>The Challenge of ML Deployments</h2>
<p>Machine learning deployment pipelines face unique challenges:</p>
<ul>
<li><strong>Environment reproducibility</strong>: Ensuring consistency across development, staging, and production</li>
<li><strong>Model versioning</strong>: Tracking which model version is deployed where</li>
<li><strong>Configuration complexity</strong>: Managing numerous parameters and dependencies</li>
<li><strong>Compliance and auditability</strong>: Maintaining records of who changed what and when</li>
<li><strong>Rollback capabilities</strong>: Quickly reverting to previous stable versions when issues arise</li>
</ul>
<p>Traditional deployment methods often fail to address these challenges fully. Manual deployments are error-prone, while scripts and basic CI/CD pipelines struggle with the declarative nature of ML infrastructure.</p>
<h2>GitOps Principles for ML</h2>
<p>GitOps follows these key principles, which are particularly beneficial for ML workflows:</p>
<ol>
<li><strong>Declarative configuration</strong>: All system configurations are defined declaratively</li>
<li><strong>Version controlled, immutable storage</strong>: Configurations are stored in Git, providing versioning, history, and audit trails</li>
<li><strong>Automated delivery</strong>: Changes approved and merged to the main branch are automatically applied to the system</li>
<li><strong>Software agents</strong>: Operators continuously compare the actual system state with the desired state in Git</li>
</ol>
<p>When applied to ML deployments, GitOps enables:</p>
<ul>
<li>Clear visibility into which model version is deployed where</li>
<li>Reproducible environments for testing and production</li>
<li>Auditability of deployment changes for compliance</li>
<li>Easy rollbacks to previous model versions</li>
</ul>
<h2>ArgoCD: The GitOps Engine</h2>
<p>ArgoCD is a declarative, GitOps continuous delivery tool designed for Kubernetes. It provides:</p>
<ul>
<li>Automated deployment of applications and configurations</li>
<li>Continuous monitoring of deployed applications</li>
<li>Automated or manual synchronization between the Git repository and live state</li>
<li>Web UI, CLI, and API for deployment management</li>
<li>SSO integration and RBAC for access control</li>
</ul>
<h2>ArgoCD Integration in Kled.io</h2>
<p>Kled.io's ArgoCD integration is specifically tailored for ML workflows:</p>
<h3>1. ML-Specific Application Templates</h3>
<p>We provide specialized ArgoCD application templates for common ML deployment patterns:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">apiVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> argoproj.io/v1alpha1</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> Application</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">metadata</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-detection-model</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> namespace</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> argocd</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> finalizers</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70">resources-finalizer.argocd.argoproj.io</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">spec</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> project</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> ml-models</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> source</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> repoURL</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> https://github.com/company/ml-models.git</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> targetRevision</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> HEAD</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> path</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> models/fraud-detection</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> destination</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> server</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> https://kubernetes.default.svc</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> namespace</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> ml-serving</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> syncPolicy</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> automated</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> prune</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#79B8FF"> true</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> selfHeal</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#79B8FF"> true</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> syncOptions</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70">CreateNamespace=true</span></span>
<span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"> # ML-specific health checks</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> health</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">group</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> serving.kubeflow.org</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> InferenceService</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> jsonPointers</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70">/status/conditions/0/status</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70">/status/conditions/0/type</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> status</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> </span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> status</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "True"</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> type</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> Ready</span></span></code></pre></figure>
<h3>2. Model Registry Integration</h3>
<p>ArgoCD in Kled.io integrates with model registries to enable GitOps for model artifacts:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># Model version reference in the Git repository</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">apiVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> kled.io/v1alpha1</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> ModelDeployment</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">metadata</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> customer-churn-predictor</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">spec</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelRegistry</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> mlflow</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelName</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> churn-prediction</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "3"</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"> # Git-controlled model version reference</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> deploymentPlatform</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> </span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> KServe</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> replicas</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 2</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> resources</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> requests</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> memory</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "2Gi"</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> cpu</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "1"</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> limits</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> memory</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "4Gi"</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> cpu</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "2"</span></span></code></pre></figure>
<h3>3. Configuration Management</h3>
<p>ML deployments require extensive configuration. ArgoCD in Kled.io manages these configurations as Kubernetes resources:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># Feature store configuration</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">apiVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> kled.io/v1alpha1</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> FeatureStoreConfig</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">metadata</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> customer-features</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">spec</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> source</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> type</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> Redis</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> address</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> redis-master.feature-store.svc.cluster.local</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> port</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 6379</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> features</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> customer_tenure</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> type</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> float</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> description</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "Days since customer account creation"</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> avg_transaction_value_30d</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> type</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> float</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> description</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "Average transaction value in the last 30 days"</span></span></code></pre></figure>
<h3>4. Deployment Visualization</h3>
<p>Kled.io enhances ArgoCD's UI with ML-specific visualizations:</p>
<p><img src="https://images.unsplash.com/photo-1551288049-bebda4e38f71?q=80&w=2070&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="ArgoCD ML Deployment Visualization"></p>
<h2>Real-World Example: ML Model Promotion Workflow</h2>
<p>Let's walk through a practical example of using ArgoCD in Kled.io for a model promotion workflow:</p>
<h3>1. Development Environment</h3>
<p>The data science team develops a new fraud detection model and commits their training pipeline to the Git repository:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># dev/fraud-detection/model.yaml</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">apiVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> kled.io/v1alpha1</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> ModelDeployment</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">metadata</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-detection-dev</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">spec</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelRegistry</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> mlflow</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelName</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-detection</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "12"</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"> # Latest development version</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> deploymentPlatform</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> </span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> KServe</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> replicas</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 1</span></span></code></pre></figure>
<h3>2. Testing Environment</h3>
<p>After validation, a pull request promotes the model to the testing environment:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># test/fraud-detection/model.yaml</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">apiVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> kled.io/v1alpha1</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> ModelDeployment</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">metadata</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-detection-test</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">spec</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelRegistry</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> mlflow</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelName</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-detection</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "12"</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"> # Promoted from dev</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> deploymentPlatform</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> </span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> KServe</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> replicas</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 2</span></span></code></pre></figure>
<h3>3. Production Environment</h3>
<p>After comprehensive testing, another pull request promotes to production:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># prod/fraud-detection/model.yaml</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">apiVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> kled.io/v1alpha1</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> ModelDeployment</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">metadata</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-detection-prod</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">spec</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelRegistry</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> mlflow</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelName</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-detection</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> modelVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "12"</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"> # Promoted from test</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> deploymentPlatform</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> </span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> KServe</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> replicas</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 5</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> autoscaling</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> enabled</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#79B8FF"> true</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> minReplicas</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 3</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> maxReplicas</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 10</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> targetConcurrency</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 100</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> monitoring</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> enabled</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#79B8FF"> true</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> dataQualityChecks</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#79B8FF"> true</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> driftDetection</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#79B8FF"> true</span></span></code></pre></figure>
<p>ArgoCD automatically deploys these configurations to their respective environments as changes progress through the Git workflow.</p>
<h2>Benefits Realized</h2>
<p>ML teams using ArgoCD in Kled.io have reported significant improvements:</p>
<ol>
<li><strong>Reduced deployment errors by 78%</strong>: Configuration mistakes are caught early through Git reviews</li>
<li><strong>Deployment time reduced by 90%</strong>: From hours to minutes with automated synchronization</li>
<li><strong>Complete audit trails</strong>: Every change to model deployments is tracked in Git history</li>
<li><strong>Faster recovery</strong>: Rollbacks to previous versions take minutes rather than hours</li>
<li><strong>Improved collaboration</strong>: Both ML and Ops teams can work from the same source of truth</li>
</ol>
<h2>Best Practices for ML GitOps with ArgoCD</h2>
<p>Based on our customers' experiences, we recommend these best practices:</p>
<h3>1. Structure Your Git Repository for ML</h3>
<p>Organize your repository to reflect your ML lifecycle:</p>
<pre><code>├── base/ # Base configurations
│ ├── inference/ # Inference server definitions
│ ├── monitoring/ # Monitoring components
│ └── feature-store/ # Feature store configurations
├── models/ # Model-specific configurations
│ ├── fraud-detection/ # Fraud detection model
│ └── recommendation/ # Recommendation model
└── environments/ # Environment-specific overlays
├── dev/ # Development environment
├── staging/ # Staging environment
└── production/ # Production environment
</code></pre>
<h3>2. Leverage Kustomize for Environment Variations</h3>
<p>Use Kustomize (built into ArgoCD) to manage environment differences:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># Base model configuration</span></span>
<span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># base/models/fraud-detection/kustomization.yaml</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">resources</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0">- </span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70">model.yaml</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0">- </span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70">monitoring.yaml</span></span></code></pre></figure>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># Production overlay</span></span>
<span data-line=""><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># environments/production/fraud-detection/kustomization.yaml</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">resources</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0">- </span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70">../../../base/models/fraud-detection</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">patchesStrategicMerge</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0">- </span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70">production-settings.yaml</span></span></code></pre></figure>
<h3>3. Implement Progressive Delivery</h3>
<p>Use Argo Rollouts for progressive model deployment:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">apiVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> argoproj.io/v1alpha1</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> Rollout</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">metadata</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-model-rollout</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">spec</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> replicas</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 5</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> strategy</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> canary</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> steps</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">setWeight</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 20</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">pause</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> {</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">duration</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#2B5581;--shiki-dark:#9DB1C5"> 1h</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0">} </span><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># Evaluate model for 1 hour at 20% traffic</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">setWeight</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 40</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">pause</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> {</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">duration</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#2B5581;--shiki-dark:#9DB1C5"> 1h</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0">} </span><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># Evaluate model for 1 hour at 40% traffic</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">setWeight</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 60</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">pause</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> {</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">duration</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#2B5581;--shiki-dark:#9DB1C5"> 1h</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0">} </span><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># Evaluate model for 1 hour at 60% traffic</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">setWeight</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#F8F8F8"> 80</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">pause</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> {</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">duration</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#2B5581;--shiki-dark:#9DB1C5"> 1h</span><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0">} </span><span style="--shiki-light:#C2C3C5;--shiki-dark:#6B737C"># Evaluate model for 1 hour at 80% traffic</span></span></code></pre></figure>
<h3>4. Automate Model Metric Validation</h3>
<p>Define automatic validations for model deployments:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="min-light min-dark"><code data-language="yaml" data-theme="min-light min-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">apiVersion</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> kled.io/v1alpha1</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">kind</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> ModelValidation</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">metadata</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> fraud-model-validation</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">spec</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> metrics</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> auc</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> threshold</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> ">0.85"</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> false_positive_rate</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> threshold</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "<0.05"</span></span>
<span data-line=""><span style="--shiki-light:#24292EFF;--shiki-dark:#B392F0"> - </span><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8">name</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> latency_p95_ms</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> threshold</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> "<100"</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> actions</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> onSuccess</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> promote</span></span>
<span data-line=""><span style="--shiki-light:#D32F2F;--shiki-dark:#F8F8F8"> onFailure</span><span style="--shiki-light:#D32F2F;--shiki-dark:#F97583">:</span><span style="--shiki-light:#22863A;--shiki-dark:#FFAB70"> rollback</span></span></code></pre></figure>
<h2>Ethical Considerations</h2>
<p>When implementing GitOps for ML, consider these ethical aspects:</p>
<ul>
<li><strong>Transparency</strong>: Make model versions and configurations accessible to relevant stakeholders</li>
<li><strong>Accountability</strong>: Ensure clear ownership of deployments through Git commit history</li>
<li><strong>Responsible rollbacks</strong>: Define clear criteria for when to roll back a model</li>
<li><strong>Access control</strong>: Implement appropriate RBAC to prevent unauthorized changes</li>
</ul>
<h2>Conclusion</h2>
<p>ArgoCD integration in Kled.io provides ML teams with a robust GitOps approach to model deployment. By managing ML infrastructure and configurations as code in Git, teams gain reproducibility, auditability, and reliability in their deployment processes.</p>
<p>Future enhancements to our ArgoCD integration will include:</p>
<ul>
<li>Enhanced model performance monitoring during progressive rollouts</li>
<li>Integration with feature flag systems for model behavior control</li>
<li>More granular RBAC for multi-team ML projects</li>
<li>Expanded metrics for deployment health assessment</li>
</ul>
<p>As the ML landscape continues to mature, GitOps principles implemented through tools like ArgoCD will be increasingly essential for organizations seeking to deploy ML models with the rigor and reliability expected in production environments.</p>
<blockquote>
<p>"GitOps isn't just about managing deployments—it's about building confidence in your ML systems through verifiable, reproducible processes."</p>
</blockquote>
<p>For more information on ArgoCD integration in Kled.io, visit our <a href="https://kled.io/docs/gitops/argocd">GitOps documentation</a>.</p>