<?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: suresh devops</title>
    <description>The latest articles on DEV Community by suresh devops (@suresh_devops_ffa0728a190).</description>
    <link>https://dev.to/suresh_devops_ffa0728a190</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3761300%2F92deda14-6c82-4fd9-b585-fa6555c3d99f.png</url>
      <title>DEV Community: suresh devops</title>
      <link>https://dev.to/suresh_devops_ffa0728a190</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suresh_devops_ffa0728a190"/>
    <language>en</language>
    <item>
      <title>From DevSecOps to Operational Resilience: 26 Engineering Improvements Across Cloud, Kubernetes and ML Infrastructure</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Wed, 21 Oct 2026 03:48:54 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/from-devsecops-to-operational-resilience-26-engineering-improvements-across-cloud-kubernetes-and-1ce5</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/from-devsecops-to-operational-resilience-26-engineering-improvements-across-cloud-kubernetes-and-1ce5</guid>
      <description>&lt;p&gt;*&lt;em&gt;From Security Scanning to Operational Resilience: Engineering Improvements Across DevSecOps, Cloud and ML Infrastructure *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lessons from integrating security into CI/CD, strengthening observability, automating recovery, modernising API gateways and improving production operations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern platform engineering is not just about deploying applications faster. It is about building secure, reliable, recoverable and maintainable systems while reducing manual operational effort.&lt;/p&gt;

&lt;p&gt;In a multi-cloud environment supporting pharmaceutical SaaS applications, API platforms, Kubernetes clusters and machine learning services, operational excellence requires a combination of DevSecOps, observability, automation, capacity management and disciplined change control.&lt;/p&gt;

&lt;p&gt;Over time, I have worked on a series of engineering improvements across CI/CD pipelines, on-premises infrastructure, Azure Kubernetes Service (AKS), Oracle Cloud Infrastructure (OCI), API gateways, databases, monitoring platforms and ML workloads.&lt;/p&gt;

&lt;p&gt;These improvements share a common objective: &lt;strong&gt;shift operational practices from reactive troubleshooting towards proactive controls, repeatable automation and evidence-based engineering decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article explores the key improvements, the engineering considerations behind them and the operational value they bring.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Integrating Gitleaks with CI/CD: Bringing Secret Detection into the Development Workflow
&lt;/h2&gt;

&lt;p&gt;Security vulnerabilities can enter a production environment long before deployment. Hard-coded credentials, API tokens, passwords and private keys committed to source control are examples of risks that should be detected as early as possible.&lt;/p&gt;

&lt;p&gt;To address this, I integrated &lt;strong&gt;Gitleaks into the CI/CD workflow&lt;/strong&gt; to identify potential secrets in source code and related repository content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;p&gt;When credentials are committed to a repository, the risk extends beyond the immediate application. Credentials may be copied into build logs, cached artifacts, cloned repositories or downstream environments. Removing the secret from the latest commit does not necessarily remove it from the repository's history or eliminate the need to rotate it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Engineering approach
&lt;/h3&gt;

&lt;p&gt;The integration introduces secret scanning into the software delivery process, allowing findings to be identified closer to the point where code changes are introduced.&lt;/p&gt;

&lt;p&gt;A mature implementation should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scanning code changes and, where appropriate, repository history.&lt;/li&gt;
&lt;li&gt;Reviewing findings to distinguish genuine secrets from false positives.&lt;/li&gt;
&lt;li&gt;Assigning ownership for remediation.&lt;/li&gt;
&lt;li&gt;Rotating exposed credentials rather than relying solely on deleting them from source code.&lt;/li&gt;
&lt;li&gt;Defining severity-based handling and exception procedures.&lt;/li&gt;
&lt;li&gt;Retaining scan results and remediation evidence according to policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next level of maturity is to enforce pipeline failure for confirmed policy violations, subject to an agreed exception process. Detection and build-blocking enforcement are separate controls and should be implemented and verified independently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Earlier detection of credential exposure, improved security awareness in development workflows and a foundation for policy-driven DevSecOps.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Strengthening Security Visibility with Wazuh Across On-Premises Servers
&lt;/h2&gt;

&lt;p&gt;Security controls are more effective when infrastructure events can be observed centrally.&lt;/p&gt;

&lt;p&gt;I worked on installing Wazuh across on-premises servers to improve security monitoring and centralise visibility into relevant host events.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key considerations
&lt;/h3&gt;

&lt;p&gt;A successful deployment involves more than installing an agent. It requires attention to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent connectivity and health.&lt;/li&gt;
&lt;li&gt;Collection of relevant security events.&lt;/li&gt;
&lt;li&gt;Alert rules and severity classification.&lt;/li&gt;
&lt;li&gt;Investigation and escalation procedures.&lt;/li&gt;
&lt;li&gt;Ownership of findings and remediation.&lt;/li&gt;
&lt;li&gt;Monitoring of agent coverage and reporting gaps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The operational objective is to make security events visible to the appropriate teams and provide a consistent basis for investigation.&lt;/p&gt;

&lt;p&gt;A useful follow-up measure is coverage: the number of in-scope servers reporting successfully compared with the total number of servers that should be monitored. Additional measures can include alert investigation time and the age of unresolved high-priority findings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Improved security visibility across the on-premises server estate and a stronger basis for operational risk monitoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Evaluating Root-Access Changes Through a Proof of Concept
&lt;/h2&gt;

&lt;p&gt;Privileged access is one of the most sensitive areas of infrastructure administration. Excessive or poorly controlled root access can increase the impact of accidental changes, compromised credentials and unauthorised activity.&lt;/p&gt;

&lt;p&gt;I worked on a proof of concept for changing root-access practices, with broader rollout identified as a subsequent step.&lt;/p&gt;

&lt;p&gt;A controlled approach to privileged access should consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether administrative access can be performed through named accounts and approved privilege elevation.&lt;/li&gt;
&lt;li&gt;Authentication and authorisation requirements.&lt;/li&gt;
&lt;li&gt;Audit logging for privileged commands and sessions.&lt;/li&gt;
&lt;li&gt;Emergency access procedures.&lt;/li&gt;
&lt;li&gt;Service dependencies that may require special treatment.&lt;/li&gt;
&lt;li&gt;A tested rollback and recovery approach.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A proof of concept should validate compatibility with existing administration procedures before wider deployment. Production rollout should include a staged migration, clear ownership, exception handling and a method to recover access if the new controls fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; A structured path towards stronger privileged-access governance without introducing avoidable operational disruption.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Upgrading Trivy to Improve Vulnerability-Scanning Currency
&lt;/h2&gt;

&lt;p&gt;Container and infrastructure security scanning must evolve alongside the tools, libraries and vulnerabilities they are intended to detect.&lt;/p&gt;

&lt;p&gt;I upgraded Trivy from version &lt;strong&gt;0.58.1 to 0.64.1&lt;/strong&gt; as part of maintaining the security tooling used in the engineering environment.&lt;/p&gt;

&lt;p&gt;Tool upgrades are an important operational activity, but the upgrade alone does not establish that vulnerabilities have been eliminated.&lt;/p&gt;

&lt;p&gt;A sound upgrade process should include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reviewing release notes and compatibility considerations.&lt;/li&gt;
&lt;li&gt;Testing the new version against representative images and repositories.&lt;/li&gt;
&lt;li&gt;Validating vulnerability database access and scan output.&lt;/li&gt;
&lt;li&gt;Comparing findings and investigating material differences.&lt;/li&gt;
&lt;li&gt;Confirming that CI/CD integrations continue to operate correctly.&lt;/li&gt;
&lt;li&gt;Documenting the deployed version and the upgrade outcome.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The broader objective is to ensure that scanning remains a dependable part of the delivery process and that findings can be prioritised and remediated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Updated vulnerability-scanning tooling and a stronger foundation for maintaining consistent container security checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Resolving Certificate Trust Issues Between On-Premises Containers and OCI OpenSearch
&lt;/h2&gt;

&lt;p&gt;Secure communication between distributed systems depends on correct certificate trust configuration.&lt;/p&gt;

&lt;p&gt;An SSL connectivity issue was encountered when on-premises containers communicated with OCI OpenSearch. The issue was resolved by adding the required CA certificate to the operating system on the OCI server.&lt;/p&gt;

&lt;p&gt;This illustrates an important troubleshooting principle: TLS failures are not always caused by application code or network connectivity. They can arise from certificate chains, trust stores, hostname verification, certificate expiry or configuration differences between environments.&lt;/p&gt;

&lt;p&gt;A systematic investigation should validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The certificate presented by the remote endpoint.&lt;/li&gt;
&lt;li&gt;The certificate chain and relevant CA certificates.&lt;/li&gt;
&lt;li&gt;The trust store used by the client process.&lt;/li&gt;
&lt;li&gt;Hostname and certificate validity checks.&lt;/li&gt;
&lt;li&gt;Certificate expiry and renewal procedures.&lt;/li&gt;
&lt;li&gt;Connectivity and TLS negotiation using approved diagnostic tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The durable fix should also be documented and incorporated into configuration management where appropriate, rather than relying on manual changes that may be lost during rebuilds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Restored secure connectivity and a clearer understanding of certificate trust dependencies between environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Improving Cloud Hygiene by Removing Unused Route 53 Records
&lt;/h2&gt;

&lt;p&gt;Cloud resources and DNS records can remain after services are migrated, retired or replaced. Unused records create unnecessary configuration complexity and may introduce security, ownership or troubleshooting risks.&lt;/p&gt;

&lt;p&gt;I removed unused Route 53 URLs after identifying records that were no longer required.&lt;/p&gt;

&lt;p&gt;DNS cleanup should be performed carefully because a record that appears unused may still support a legacy integration, scheduled job, external client or certificate-validation workflow.&lt;/p&gt;

&lt;p&gt;A controlled cleanup process should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identifying the record owner and associated service.&lt;/li&gt;
&lt;li&gt;Reviewing traffic and dependency evidence where available.&lt;/li&gt;
&lt;li&gt;Confirming that the target service has been decommissioned or migrated.&lt;/li&gt;
&lt;li&gt;Checking certificate, redirect and integration dependencies.&lt;/li&gt;
&lt;li&gt;Recording the change and retaining a recovery path where appropriate.&lt;/li&gt;
&lt;li&gt;Validating service behaviour after removal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Reduced DNS clutter and improved configuration maintainability, provided that dependency checks and post-change validation are completed.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. API Gateway Modernisation: WSO2, Kong, Azure API Management and OCI API Gateway
&lt;/h2&gt;

&lt;p&gt;API gateways are critical infrastructure components because they sit on the path between clients and backend services. Their configuration, availability and migration strategy can directly affect application connectivity.&lt;/p&gt;

&lt;p&gt;My API gateway improvement work included WSO2-to-Kong migration activities, Kong failover-related implementation, API migration from Azure API Management to OCI API Gateway and work involving migration of services to Standard API Manager from Basic SKU.&lt;/p&gt;

&lt;h3&gt;
  
  
  Addressing OCI API Gateway service limits
&lt;/h3&gt;

&lt;p&gt;During the migration to OCI API Gateway, a service configuration constraint involving the limit of 50 APIs per service required attention. The engineering team reduced the number of APIs configured per service to remain below that limit.&lt;/p&gt;

&lt;p&gt;This is an example of adapting API architecture to the constraints of the target platform instead of treating migration as a direct copy of the source configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolving Jasper API compatibility issues
&lt;/h3&gt;

&lt;p&gt;Jasper APIs that were invoked from Azure did not function as expected after the move to OCI API Gateway. OCI Functions were used to address the integration issue.&lt;/p&gt;

&lt;p&gt;The broader engineering lesson is that API migration requires functional validation, not just successful deployment. Differences in request handling, authentication, integration behaviour, routing and platform capabilities can affect API compatibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reliability and failover
&lt;/h3&gt;

&lt;p&gt;Kong failover implementation and related proof-of-concept activities were also part of the improvement work.&lt;/p&gt;

&lt;p&gt;A robust failover implementation should verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Health detection and failure thresholds.&lt;/li&gt;
&lt;li&gt;Routing to the correct healthy endpoint.&lt;/li&gt;
&lt;li&gt;Connection and session behaviour.&lt;/li&gt;
&lt;li&gt;Authentication, rate limiting and TLS configuration.&lt;/li&gt;
&lt;li&gt;Recovery when the original node becomes healthy again.&lt;/li&gt;
&lt;li&gt;Logging, alerting and operational ownership.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A failover design should be tested under controlled failure scenarios before it is treated as production-ready.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Improved migration readiness, more deliberate gateway architecture and a structured approach to API availability and failover.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Automating Kong API Manager Administration
&lt;/h2&gt;

&lt;p&gt;Manual API management can become difficult to maintain as the number of services, configurations and environments grows.&lt;/p&gt;

&lt;p&gt;I developed an automated script for managing Kong API Manager activities.&lt;/p&gt;

&lt;p&gt;Automation is especially useful for repeatable administrative tasks when it reduces configuration inconsistency and improves execution speed. However, API-management automation must also protect against accidental changes to routes, credentials, upstream services or access policies.&lt;/p&gt;

&lt;p&gt;A reliable automation workflow should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validated inputs and environment selection.&lt;/li&gt;
&lt;li&gt;Authentication using appropriately protected credentials.&lt;/li&gt;
&lt;li&gt;Pre-change checks and configuration validation.&lt;/li&gt;
&lt;li&gt;Logging of actions and results.&lt;/li&gt;
&lt;li&gt;Error handling and safe failure behaviour.&lt;/li&gt;
&lt;li&gt;Change traceability and controlled permissions.&lt;/li&gt;
&lt;li&gt;Post-change verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; A foundation for more repeatable API administration and reduced reliance on manual configuration steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Building a More Reliable Backup and Recovery Practice
&lt;/h2&gt;

&lt;p&gt;Backups are only useful when they are available, consistent and recoverable when required.&lt;/p&gt;

&lt;p&gt;I implemented automated backup processes across several infrastructure and data platforms, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zabbix&lt;/li&gt;
&lt;li&gt;Kong&lt;/li&gt;
&lt;li&gt;Grafana&lt;/li&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;li&gt;Weaviate&lt;/li&gt;
&lt;li&gt;Dgraph&lt;/li&gt;
&lt;li&gt;Legal-Elastic&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;MLflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional work included automated PostgreSQL database backups and the use of an NFS server on &lt;code&gt;separate box&lt;/code&gt; to receive backups from the five-node Elasticsearch cluster on &lt;code&gt;Master Node&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The objective was to make backup execution more repeatable and reduce dependence on manual intervention.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backup automation is only the first step
&lt;/h3&gt;

&lt;p&gt;A production-ready backup process should also monitor completion, validate backup integrity, control access, manage retention and verify that the recovery process works.&lt;/p&gt;

&lt;p&gt;Key questions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the backup complete?&lt;/li&gt;
&lt;li&gt;Does the backup contain the expected data?&lt;/li&gt;
&lt;li&gt;Is it protected from accidental or unauthorised deletion?&lt;/li&gt;
&lt;li&gt;Can it be restored independently of the production failure?&lt;/li&gt;
&lt;li&gt;Can the service be recovered within its agreed RTO?&lt;/li&gt;
&lt;li&gt;Is the amount of data lost within the agreed RPO?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These checks are essential because a successful backup job is not proof of recoverability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; More repeatable backup execution across a diverse technology stack and a foundation for better recovery readiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Restoring Legal-Elastic and Weaviate Data
&lt;/h2&gt;

&lt;p&gt;Backup processes become more meaningful when recovery is demonstrated.&lt;/p&gt;

&lt;p&gt;As part of the operational work, I restored Legal-Elastic on &lt;code&gt;Backup Server&lt;/code&gt; and restored Weaviate data on &lt;code&gt;Master node&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These activities provided practical experience with data restoration and the operational dependencies involved in bringing data services back into service.&lt;/p&gt;

&lt;p&gt;A restoration procedure should validate more than whether a process starts. Depending on the platform, verification may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database or index health.&lt;/li&gt;
&lt;li&gt;Expected collections, indices or records.&lt;/li&gt;
&lt;li&gt;Data consistency and application connectivity.&lt;/li&gt;
&lt;li&gt;Authentication and access controls.&lt;/li&gt;
&lt;li&gt;Application-level queries.&lt;/li&gt;
&lt;li&gt;Evidence that the restored service is fit for its intended use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next maturity step is to formalise recurring restore tests, record the duration and results, and compare them against recovery objectives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Demonstrated restoration capability for the specific systems involved and a basis for improving recovery procedures.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Recovering a 2 TB Disk Snapshot for a UAT Environment
&lt;/h2&gt;

&lt;p&gt;A disk recovery activity involved using a 2 TB disk snapshot to create and mount a disk on the UAT virtual machine on &lt;code&gt;Azure&lt;/code&gt;. The restored data was checked with Ayan, after which the original 2 TB disk was depleted and decommissioned.&lt;/p&gt;

&lt;p&gt;This activity highlights the importance of managing the complete lifecycle of recovered storage—not just creating the disk.&lt;/p&gt;

&lt;p&gt;A controlled process should confirm:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The correct snapshot and recovery point were selected.&lt;/li&gt;
&lt;li&gt;The restored disk was attached and mounted safely.&lt;/li&gt;
&lt;li&gt;The expected data was available and validated by the relevant owner.&lt;/li&gt;
&lt;li&gt;The UAT environment could access the required data.&lt;/li&gt;
&lt;li&gt;The original disk was no longer required before decommissioning.&lt;/li&gt;
&lt;li&gt;The storage change and decommissioning were documented.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The principle is simple: validate the recovery target and data before retiring the original resource.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Recovered storage and validated data availability for the UAT environment, followed by the removal of the original disk after confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Expanding Elasticsearch Cluster Capacity
&lt;/h2&gt;

&lt;p&gt;I added &lt;code&gt;Node 4&lt;/code&gt; and &lt;code&gt;Node 5&lt;/code&gt; as Elasticsearch nodes to an existing cluster having 3 nodes.&lt;/p&gt;

&lt;p&gt;Adding nodes can increase available capacity and provide more flexibility in distributing data and workload. However, node addition must be accompanied by cluster-health and capacity validation.&lt;/p&gt;

&lt;p&gt;Important checks include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cluster health before and after the change.&lt;/li&gt;
&lt;li&gt;Node discovery and membership.&lt;/li&gt;
&lt;li&gt;Shard allocation and rebalancing.&lt;/li&gt;
&lt;li&gt;Disk utilisation and storage watermarks.&lt;/li&gt;
&lt;li&gt;Heap utilisation, CPU and query latency.&lt;/li&gt;
&lt;li&gt;Replication and recovery activity.&lt;/li&gt;
&lt;li&gt;Any application impact during rebalancing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Expanded the cluster's node footprint, creating additional capacity potential. The actual performance or capacity improvement should be established from before-and-after metrics.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Resource Optimisation Through Pod and Docker Profiling
&lt;/h2&gt;

&lt;p&gt;Infrastructure capacity decisions should be based on observed workloads rather than assumptions.&lt;/p&gt;

&lt;p&gt;I carried out proof-of-concept work for pod profiling and then profiled pods across Development, QA, Sales and UAT Kubernetes clusters. I also performed Docker profiling for ML services.&lt;/p&gt;

&lt;p&gt;Profiling helps identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU and memory utilisation patterns.&lt;/li&gt;
&lt;li&gt;Workloads with excessive or insufficient resource requests.&lt;/li&gt;
&lt;li&gt;Potential memory leaks or unexpected growth.&lt;/li&gt;
&lt;li&gt;Containers that frequently restart or encounter OOM termination.&lt;/li&gt;
&lt;li&gt;Opportunities for resource right-sizing.&lt;/li&gt;
&lt;li&gt;Workloads that may benefit from isolation or separate scaling policies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is particularly important for ML workloads, where resource demand can vary significantly between model types and execution patterns.&lt;/p&gt;

&lt;p&gt;Profiling should cover normal usage as well as peak periods. Reducing resource allocations based only on average usage can introduce instability during traffic spikes or concurrent workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Better evidence for capacity planning and resource optimisation across Kubernetes and containerised ML services.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. ML Service Rationalisation and Ollama Configuration
&lt;/h2&gt;

&lt;p&gt;I worked on ML service deprecation activities, Ollama configuration changes for ML services and Ollama model availability on GPU hosts.&lt;/p&gt;

&lt;p&gt;These activities relate to managing an evolving ML infrastructure footprint and aligning deployed services and models with operational requirements.&lt;/p&gt;

&lt;p&gt;For service deprecation, a controlled process should verify service ownership, consumer dependencies, traffic usage, replacement availability and rollback requirements before a service is retired.&lt;/p&gt;

&lt;p&gt;For model and GPU-host configuration, important operational considerations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPU and memory utilisation.&lt;/li&gt;
&lt;li&gt;Model compatibility and loading behaviour.&lt;/li&gt;
&lt;li&gt;Concurrent request capacity.&lt;/li&gt;
&lt;li&gt;Model-serving latency and error rates.&lt;/li&gt;
&lt;li&gt;Process health and recovery.&lt;/li&gt;
&lt;li&gt;Version consistency and configuration management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective is to maintain a service footprint that is operationally supportable while ensuring that active workloads continue to meet their functional requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Improved management of ML service and model configurations. Quantified resource savings or inference-performance improvements should be reported only after measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. Automating ML Service Deployment
&lt;/h2&gt;

&lt;p&gt;I completed proof-of-concept work for ML service deployment automation, with broader automation across all ML services identified as a next step.&lt;/p&gt;

&lt;p&gt;ML deployment automation can reduce manual configuration, improve repeatability and help maintain consistency across multiple environments.&lt;/p&gt;

&lt;p&gt;A mature workflow should cover:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Versioned deployment configuration.&lt;/li&gt;
&lt;li&gt;Validation of required secrets and environment variables.&lt;/li&gt;
&lt;li&gt;Image and dependency checks.&lt;/li&gt;
&lt;li&gt;Resource configuration and health probes.&lt;/li&gt;
&lt;li&gt;Deployment execution with appropriate permissions.&lt;/li&gt;
&lt;li&gt;Post-deployment smoke tests and service validation.&lt;/li&gt;
&lt;li&gt;Failure handling and rollback.&lt;/li&gt;
&lt;li&gt;Audit-friendly records of what was deployed and when.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important distinction is between a working proof of concept and a fully operationalised deployment framework. Broader rollout should include testing, documentation, ownership and support procedures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; A foundation for consistent ML deployment and a path towards reducing manual deployment effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  16. Operational Resilience Through Swap Configuration
&lt;/h2&gt;

&lt;p&gt;Swap configuration was standardised based on available host memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosts with 8 GB RAM: 4 GB swap.&lt;/li&gt;
&lt;li&gt;Hosts with 16 GB RAM: 8 GB swap.&lt;/li&gt;
&lt;li&gt;Hosts with 32 GB RAM: 8 GB swap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Swap can provide a buffer during memory pressure, but it is not a replacement for adequate physical memory. Excessive swapping can also degrade application performance, especially for latency-sensitive services.&lt;/p&gt;

&lt;p&gt;A production implementation should monitor swap usage, memory pressure, OOM events and application response times. It should also consider workload characteristics and the performance implications of swapping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; More consistent swap configuration across the specified host sizes, with the actual reliability benefit dependent on workload behaviour and monitoring evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  17. Safer Service Isolation and Environment Segregation
&lt;/h2&gt;

&lt;p&gt;I worked on separating the vigilance data service by deploying &lt;code&gt;vigilance-qa&lt;/code&gt; in the &lt;code&gt;QA&lt;/code&gt; cluster and &lt;code&gt;vigilance-prod&lt;/code&gt; in the &lt;code&gt;Prod&lt;/code&gt; cluster. I also worked on &lt;code&gt;service-ner&lt;/code&gt; environment segregation.&lt;/p&gt;

&lt;p&gt;Separating services by environment can improve operational isolation, reduce the risk of accidental cross-environment interaction and make deployment ownership clearer.&lt;/p&gt;

&lt;p&gt;However, segregation requires more than separate deployment names. It should also consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Namespace and cluster boundaries.&lt;/li&gt;
&lt;li&gt;Service accounts and permissions.&lt;/li&gt;
&lt;li&gt;Network access.&lt;/li&gt;
&lt;li&gt;Environment-specific secrets and configuration.&lt;/li&gt;
&lt;li&gt;Database and external-service connectivity.&lt;/li&gt;
&lt;li&gt;Monitoring, logging and alert routing.&lt;/li&gt;
&lt;li&gt;Deployment and rollback procedures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Clearer environment separation and a more controlled foundation for managing service configurations across QA and Sales.&lt;/p&gt;

&lt;h2&gt;
  
  
  18. Improving Kubernetes Deployment Safety with Health Probes and Strategies
&lt;/h2&gt;

&lt;p&gt;I updated &lt;code&gt;deployment.yaml&lt;/code&gt; configurations with liveness probes, readiness probes and deployment strategies for backend services across Development, QA and Prod environments.&lt;/p&gt;

&lt;p&gt;These controls address different aspects of application availability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Readiness probes&lt;/strong&gt; help prevent traffic from reaching pods that are not ready to serve requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liveness probes&lt;/strong&gt; help detect applications that need to be restarted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment strategies&lt;/strong&gt; control how application versions are rolled out and how old and new instances coexist during a change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Correct configuration is critical. A liveness probe that is too aggressive can cause restart loops, while an inadequate readiness probe can expose users to an application that has started but is not ready.&lt;/p&gt;

&lt;p&gt;Deployment validation should cover normal startup, slow startup, dependency failures, rolling updates and rollback scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Stronger deployment-level health controls and a more structured approach to managing backend service updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  19. Liquibase CI/CD for Database Changes
&lt;/h2&gt;

&lt;p&gt;Database changes require a controlled approach because schema modifications can affect application compatibility, data integrity and recovery.&lt;/p&gt;

&lt;p&gt;I worked on Liquibase CI/CD for database delivery.&lt;/p&gt;

&lt;p&gt;A well-designed database deployment pipeline should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version-controlled migration scripts.&lt;/li&gt;
&lt;li&gt;Review and approval of changes.&lt;/li&gt;
&lt;li&gt;Validation against the target database.&lt;/li&gt;
&lt;li&gt;Controlled execution in the appropriate environment.&lt;/li&gt;
&lt;li&gt;Compatibility checks between application and schema versions.&lt;/li&gt;
&lt;li&gt;Verification after migration.&lt;/li&gt;
&lt;li&gt;A documented recovery or forward-fix strategy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Database rollback requires special consideration. Not every schema or data transformation can be safely reversed, so the recovery strategy must be designed for the specific change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; A foundation for repeatable, traceable database changes and closer integration between application and database delivery processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  20. Jenkins Upgrade and Deployment Hygiene
&lt;/h2&gt;

&lt;p&gt;I upgraded Jenkins from version &lt;strong&gt;2.479.2 to 2.504.3&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;CI/CD infrastructure is itself a critical production dependency. An upgrade should therefore include plugin compatibility checks, configuration and job validation, backup verification, access-control review and post-upgrade testing.&lt;/p&gt;

&lt;p&gt;I also updated deployment scripts to automatically delete TAR files from 52 hosts after deployment, and backed up deployment scripts from those hosts to Bitbucket.&lt;/p&gt;

&lt;p&gt;These activities address two operational concerns: managing deployment artefacts after use and retaining version-controlled copies of operational scripts.&lt;/p&gt;

&lt;p&gt;A strong implementation should verify that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The artefact is no longer needed by the running application or rollback process.&lt;/li&gt;
&lt;li&gt;Cleanup only targets the intended files and directories.&lt;/li&gt;
&lt;li&gt;Script failures are logged and surfaced.&lt;/li&gt;
&lt;li&gt;The deployment outcome is not reported as successful when required cleanup or validation fails.&lt;/li&gt;
&lt;li&gt;The version-controlled script is accessible to authorised maintainers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; More consistent deployment cleanup and improved version-control coverage for deployment scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  21. Standardising the Linux Operating-System Baseline
&lt;/h2&gt;

&lt;p&gt;I worked on upgrading Ubuntu from version 20.04 to 22.04.&lt;/p&gt;

&lt;p&gt;Operating-system upgrades require a balance between security maintenance, application compatibility and service availability. A safe upgrade process should include dependency assessment, testing, backup validation, change approval, rollback planning and post-upgrade health checks.&lt;/p&gt;

&lt;p&gt;For production systems, I would also verify monitoring-agent compatibility, service startup behaviour, network configuration, scheduled jobs and application dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; Progress towards a more current operating-system baseline for the systems included in the upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  22. Managing ML Automation with Locking Controls
&lt;/h2&gt;

&lt;p&gt;I worked on a lock script for ML automation.&lt;/p&gt;

&lt;p&gt;Concurrent automation can create conflicts when multiple jobs attempt to modify the same resource, deploy the same service or run an operation that should only have one active execution.&lt;/p&gt;

&lt;p&gt;Locking controls can help prevent duplicate execution, but they must handle stale locks, abnormal termination, ownership and safe release.&lt;/p&gt;

&lt;p&gt;A production-ready implementation should define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What resource is protected.&lt;/li&gt;
&lt;li&gt;How lock ownership is established.&lt;/li&gt;
&lt;li&gt;How stale locks are detected and recovered.&lt;/li&gt;
&lt;li&gt;How concurrent execution attempts are handled.&lt;/li&gt;
&lt;li&gt;What happens when a job fails midway.&lt;/li&gt;
&lt;li&gt;How execution is logged and monitored.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; A mechanism for controlling concurrent ML automation and reducing the risk of conflicting operations, subject to the lock implementation and its failure handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  23. Infrastructure Connectivity and Network Resilience
&lt;/h2&gt;

&lt;p&gt;Network availability is a fundamental dependency for monitoring, application connectivity and operational support.&lt;/p&gt;

&lt;p&gt;I changed the primary ISP from ACT to TATA after the ACT Fair Usage Policy threshold was exceeded and firewall bandwidth dropped to 3 Mbps.&lt;/p&gt;

&lt;p&gt;The change addressed an operational connectivity constraint. It also illustrates why network-provider performance should be evaluated against actual business requirements rather than assumed service capacity.&lt;/p&gt;

&lt;p&gt;Useful follow-up measurements include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Available bandwidth and utilisation.&lt;/li&gt;
&lt;li&gt;Packet loss and latency.&lt;/li&gt;
&lt;li&gt;Connection stability.&lt;/li&gt;
&lt;li&gt;VPN and remote-access performance.&lt;/li&gt;
&lt;li&gt;Incident frequency and duration.&lt;/li&gt;
&lt;li&gt;Failover capability and recovery time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where possible, network changes should be validated against representative workloads and documented alongside the associated firewall and routing configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; A change in primary ISP to address a bandwidth limitation affecting operational connectivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  24. Observability with OpenTelemetry
&lt;/h2&gt;

&lt;p&gt;I worked on introducing an OpenTelemetry pod in AKS.&lt;/p&gt;

&lt;p&gt;OpenTelemetry provides a common approach for collecting telemetry such as traces, metrics and logs through supported instrumentation and collectors. Its value comes from making it easier to correlate application behaviour across distributed components.&lt;/p&gt;

&lt;p&gt;For a production rollout, I would validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which telemetry signals are collected.&lt;/li&gt;
&lt;li&gt;Whether the instrumentation covers the required services.&lt;/li&gt;
&lt;li&gt;Exporter and collector configuration.&lt;/li&gt;
&lt;li&gt;Access controls and protection of sensitive telemetry.&lt;/li&gt;
&lt;li&gt;Sampling, retention and data-volume implications.&lt;/li&gt;
&lt;li&gt;Collector health and telemetry delivery.&lt;/li&gt;
&lt;li&gt;Integration with the organisation's observability platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; A foundation for more consistent telemetry collection and cross-service troubleshooting, with the actual observability improvement depending on instrumentation coverage and integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  25. Resolving an Infrastructure Capacity Constraint in the Network Path
&lt;/h2&gt;

&lt;p&gt;The network-provider change from ACT to TATA also illustrates a broader operational principle: infrastructure capacity issues can originate outside the application or server layer.&lt;/p&gt;

&lt;p&gt;When firewall throughput falls, application symptoms can resemble a backend problem—slow requests, timeouts, unstable remote sessions or delayed monitoring data.&lt;/p&gt;

&lt;p&gt;A layered investigation should therefore examine the full service path, including the local network, firewall, ISP, VPN, routing and remote endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational value:&lt;/strong&gt; A practical reminder to correlate application symptoms with network performance before making unnecessary changes to application infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  26. Bringing the Improvements Together
&lt;/h2&gt;

&lt;p&gt;The individual changes become more valuable when managed as part of a coherent operational improvement programme.&lt;/p&gt;

&lt;p&gt;I group this work into six engineering themes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Security and control
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gitleaks integration with CI/CD.&lt;/li&gt;
&lt;li&gt;Wazuh deployment across on-premises servers.&lt;/li&gt;
&lt;li&gt;Trivy upgrade.&lt;/li&gt;
&lt;li&gt;Root-access change proof of concept.&lt;/li&gt;
&lt;li&gt;Certificate trust remediation.&lt;/li&gt;
&lt;li&gt;DNS hygiene.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reliability and recovery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automated backups across multiple platforms.&lt;/li&gt;
&lt;li&gt;Legal-Elastic and Weaviate restoration.&lt;/li&gt;
&lt;li&gt;Disk snapshot recovery for UAT.&lt;/li&gt;
&lt;li&gt;Elasticsearch cluster expansion.&lt;/li&gt;
&lt;li&gt;Kong failover-related implementation.&lt;/li&gt;
&lt;li&gt;Kubernetes health probes and deployment strategies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automation and engineering consistency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kong API Manager automation.&lt;/li&gt;
&lt;li&gt;Liquibase CI/CD.&lt;/li&gt;
&lt;li&gt;Jenkins upgrade.&lt;/li&gt;
&lt;li&gt;ML deployment automation proof of concept.&lt;/li&gt;
&lt;li&gt;ML automation locking.&lt;/li&gt;
&lt;li&gt;Deployment-script cleanup and version control.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cloud and API modernisation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;WSO2-to-Kong migration work.&lt;/li&gt;
&lt;li&gt;Azure API Management to OCI API Gateway migration.&lt;/li&gt;
&lt;li&gt;OCI API configuration-limit remediation.&lt;/li&gt;
&lt;li&gt;Jasper API integration remediation using OCI Functions.&lt;/li&gt;
&lt;li&gt;API migration work involving Standard API Manager.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Capacity and platform optimisation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pod and Docker profiling.&lt;/li&gt;
&lt;li&gt;ML service rationalisation.&lt;/li&gt;
&lt;li&gt;Ollama configuration and GPU model management.&lt;/li&gt;
&lt;li&gt;Swap configuration.&lt;/li&gt;
&lt;li&gt;Elasticsearch node expansion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operational hygiene and environment management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Linux OS upgrades.&lt;/li&gt;
&lt;li&gt;Service segregation across environments.&lt;/li&gt;
&lt;li&gt;Removal of unused DNS records.&lt;/li&gt;
&lt;li&gt;Network-provider change to address bandwidth constraints.&lt;/li&gt;
&lt;li&gt;OpenTelemetry deployment work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  27. Measuring Operational Improvement
&lt;/h2&gt;

&lt;p&gt;Engineering changes should ultimately be evaluated using evidence. For this programme, I would track a focused set of measures.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Improvement area&lt;/th&gt;
&lt;th&gt;Useful measure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Secret scanning&lt;/td&gt;
&lt;td&gt;Repositories covered, findings triaged and remediation time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security monitoring&lt;/td&gt;
&lt;td&gt;Server coverage, agent health and high-priority finding age&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability scanning&lt;/td&gt;
&lt;td&gt;Scan coverage, finding severity and remediation status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup and recovery&lt;/td&gt;
&lt;td&gt;Backup success, restore-test success, RPO and RTO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API gateway reliability&lt;/td&gt;
&lt;td&gt;Availability, request errors, latency and failover test results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes operations&lt;/td&gt;
&lt;td&gt;Pod restarts, OOM events, deployment failures and readiness failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capacity optimisation&lt;/td&gt;
&lt;td&gt;Resource utilisation, headroom and cost per workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;td&gt;Manual effort avoided, automation failures and repeat-ticket reduction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database delivery&lt;/td&gt;
&lt;td&gt;Migration success, rollback or forward-fix events and post-deployment validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network performance&lt;/td&gt;
&lt;td&gt;Latency, packet loss, throughput and connectivity incidents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I would establish a baseline before claiming a percentage improvement. Where measurements are unavailable, the correct approach is to describe the engineering change and its intended benefit without inventing an outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Engineering Operations as a Continuous Improvement Discipline
&lt;/h2&gt;

&lt;p&gt;These improvements demonstrate how DevSecOps, observability, automation, infrastructure management and recovery planning work together.&lt;/p&gt;

&lt;p&gt;Security scanning helps identify risks earlier. Monitoring makes operational behaviour visible. Backup and restoration processes support recovery. Kubernetes health controls improve deployment management. API gateway and infrastructure changes address platform constraints. Automation reduces repetitive work, while capacity profiling provides evidence for optimisation.&lt;/p&gt;

&lt;p&gt;The next level of maturity is to connect these activities to measurable operational outcomes: fewer recurring incidents, faster and safer recovery, more reliable deployments, stronger security-control coverage and better use of infrastructure resources.&lt;/p&gt;

&lt;p&gt;For me, the central principle is straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational excellence is not the absence of incidents. It is the ability to detect problems early, recover safely, learn systematically and engineer the conditions that make the next incident less likely.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the direction I continue to pursue across DevSecOps, cloud platforms, API infrastructure and ML operations.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>security</category>
    </item>
    <item>
      <title>No-Code Platform Deployment : Surprising Lessons from Appsmith on Azure</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Wed, 30 Sep 2026 05:00:19 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/no-code-platform-deployment-surprising-lessons-from-appsmith-on-azure-1po0</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/no-code-platform-deployment-surprising-lessons-from-appsmith-on-azure-1po0</guid>
      <description>&lt;p&gt;*&lt;em&gt;1. Introduction: The Complexity Behind the "No-Code" Curtain *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No-code platforms are built on a compelling architectural paradox: they deliver an abstract, frictionless experience for the end-user while demanding a highly sophisticated, high-performance infrastructure under the hood. While spinning up a local development environment is a matter of a few Docker commands, re-architecting for cloud-native resilience on Microsoft Azure is a different beast entirely.&lt;/p&gt;

&lt;p&gt;Taking a tool like Appsmith from a local machine to a commercial-grade SaaS requires moving beyond simple containerization. It demands a transition into a world of managed services, multi-tenant security models, and global traffic orchestration. This guide reveals the architectural blueprints necessary to bridge that gap, transforming a local build into an enterprise-ready Azure deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Invisible Engine: Why the RTS Server is Non-Negotiable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Real-Time Server (RTS) is the "heartbeat" of the Appsmith stack, facilitating the reactive nature of the platform. In a local testing environment, this typically involves pinning the environment to Node version 20.11.1 and executing ./start-server.sh within the packages directory. When moving to Azure, the RTS becomes the primary networking pivot point.&lt;/p&gt;

&lt;p&gt;"Appsmith’s architecture relies heavily on specific networking constraints (like the RTS server communicating with the main backend)..."&lt;/p&gt;

&lt;p&gt;In a production Azure environment, the RTS cannot be an afterthought. Whether deployed in Azure Container Apps (ACA) or Azure Kubernetes Service (AKS), you must ensure low-latency, persistent connectivity between the RTS and the main Java/Maven backend. If this networking link is brittle, the real-time synchronization that users expect from a modern no-code IDE will degrade, leading to state inconsistencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The MongoDB "Replica Set" Requirement: More Than Just a Database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A common pitfall in Appsmith deployments is treating the database as a standard standalone instance. Appsmith requires MongoDB to be initialized with a replica set to handle its internal event-driven architecture. Locally, this is achieved by starting the container with the --replSet rs0 flag and executing the mandatory initialization:&lt;/p&gt;

&lt;p&gt;rs.initiate({"_id": "rs0", "members": [{"_id": 0, "host": "localhost:27017"}]})&lt;/p&gt;

&lt;p&gt;In a professional Azure deployment, we shift this operational burden to Azure Cosmos DB for MongoDB. The transformative value of this managed service is that it handles replica set requirements and high availability "under the hood," removing the manual overhead of managing mongosh commands. To complement this, Azure Cache for Redis should be integrated as the session and caching layer. For cost-efficiency in multi-tenant builds, architects can utilize a single Redis tier and segment data using unique prefix keys, providing isolation without the price tag of multiple dedicated instances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The "Scale-to-Zero" Secret: Why Azure Container Apps (ACA) Wins for SaaS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For platforms targeting product-led growth (PLG), the infrastructure must be as elastic as the user base. Azure Container Apps (ACA) is our recommended path because it enables a "Scale-to-Zero" model that traditional VMs or always-on clusters cannot match.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost-Efficiency for Inactive Tenants: Drastically reduces hosting overhead by only charging for compute when a user is actively building or executing queries.&lt;/li&gt;
&lt;li&gt;Isolated Environments: ACA provides a secure, serverless container boundary for each tenant, ensuring that one customer’s heavy workload does not impact the compute availability of another.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Choosing Your Fortress: The High-Stakes Choice Between Siloed and Shared Tenancy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Architects must decide between "Siloed (Multi-Instance)" and "Shared (Logical) Backend" models. This choice dictates your security posture and your Azure bill. For Shared models, Microsoft Entra External ID (formerly Azure AD B2C) becomes the essential pillar for managing cross-tenant identity and routing users to their specific workspace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature   The Winner / Architectural Trade-off&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data Isolation  Siloed: &lt;br&gt;
Offers physical separation; zero risk of cross-tenant leaks.&lt;br&gt;
Cost    Shared: &lt;br&gt;
Higher efficiency; tenants share unused cluster headroom.&lt;br&gt;
No-Code Complexity  Shared: &lt;br&gt;
Simple infra, but requires complex "tenant_id" app-level logic.&lt;/p&gt;

&lt;p&gt;Scalability Siloed: Predictable; avoids the "noisy neighbor" resource exhaustion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. The "Noisy Neighbor" Problem: The Logical vs. Physical Reality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When opting for a Shared Backend model, you face the "Noisy Neighbor" challenge. Here, logical separation relies on the integrity of your application code—specifically, "bug-free code filters" where every query must be scoped by a tenant_id.&lt;/p&gt;

&lt;p&gt;To mitigate this at the database level, Azure Cosmos DB for MongoDB utilizes hierarchical partition keys (e.g., /tenant_id). This strategy co-locates a single tenant's data within the same physical partition, optimizing performance and providing a structural layer of separation even within a shared cluster.&lt;/p&gt;

&lt;p&gt;"Requires aggressive resource throttling to avoid 'noisy neighbor' issues."&lt;/p&gt;

&lt;p&gt;Without these throttles, a single tenant’s runaway script could consume the RU/s (Request Units) of the entire cluster, starving other users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Conclusion: The Future of Democratized Infrastructure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The transition from a local Dockerized setup to a global Azure deployment underscores the evolution of democratized infrastructure. By integrating managed services like Azure Cosmos DB for data resilience and Azure Front Door for global routing, SSL termination, and WAF (Web Application Firewall) protection, enterprise-grade multi-tenancy is now accessible to every developer.&lt;/p&gt;

&lt;p&gt;As we move toward a "scale-to-zero" world, we must ask ourselves: Is the biggest challenge of the next decade building the app itself, or orchestrating the infrastructure that lets it live?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>azure</category>
      <category>cloud</category>
      <category>deployment</category>
    </item>
    <item>
      <title>Disaster Recovery Strategies for AKS Web Applications Backed by On-Prem ML Services</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Fri, 11 Sep 2026 04:05:19 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/disaster-recovery-strategies-for-aks-web-applications-backed-by-on-prem-ml-services-3c47</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/disaster-recovery-strategies-for-aks-web-applications-backed-by-on-prem-ml-services-3c47</guid>
      <description>&lt;p&gt;&lt;strong&gt;Popular DR Strategies in Cloud:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Backup and Restore (Lowest Cost, Slowest Speed)&lt;/li&gt;
&lt;li&gt; Pilot Light (Low Cost, Moderate Speed)&lt;/li&gt;
&lt;li&gt; Warm Standby (Higher Cost, Fast Speed)&lt;/li&gt;
&lt;li&gt; Multi-Site (Highest Cost, Fastest Speed)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We planned below Disaster Recovery strategies for our Web applications hosted on AKS , backed up by 50 + ML Services running on On-Prem:&lt;/p&gt;

&lt;p&gt;Our Infra setup with running hybrid architectures: Many web application layers deployed on Azure Kubernetes Service (AKS) in the cloud, calling back into machine learning inference services still hosted on-premises — often because of data residency rules, GPU capex already sunk into a data center, or ML models trained on sensitive data that can't leave the corporate network.&lt;/p&gt;

&lt;p&gt;This hybrid pattern is powerful, but it introduces a DR problem that pure cloud-native architectures don't have: your failure domain now spans two estates you don't fully control together — a cloud region that can fail, and a data center that can fail independently of it, connected by a network link that can also fail on its own.&lt;/p&gt;

&lt;p&gt;This post adapts the classic four-tier DR framework (Backup &amp;amp; Restore → Pilot Light → Warm Standby → Multi-Site) to this AKS + on-prem ML topology, and then walks through a concrete highly-available, multi-zone reference architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Two Foundational Metrics:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every DR conversation starts with the same two numbers, and in a hybrid AKS/on-prem design you should define them separately for each tier of the stack (web/API layer, data layer, and the ML inference layer), because they will not be the same:&lt;/p&gt;

&lt;p&gt;• Recovery Time Objective (RTO) — how long the business can tolerate the web app or the ML-backed feature being down.&lt;/p&gt;

&lt;p&gt;• Recovery Point Objective (RPO) — how much data (user data, &lt;br&gt;
feature-store data, model state) you can afford to lose.&lt;/p&gt;

&lt;p&gt;A typical mismatch: the web tier might have an RTO of 15 minutes, while the on-prem ML training pipeline has an RTO of 24 hours because it depends on a single data center's GPU cluster. Your DR strategy has to account for that gap explicitly, usually through graceful degradation rather than pretending both tiers fail over at the same speed.&lt;/p&gt;

&lt;p&gt;The Four DR Tiers, Adapted for AKS + On-Prem ML&lt;br&gt;
As you move from lowest cost to highest cost, recovery speed increases (lower RTO/RPO). Here's how each tier translates when the backend dependency is an on-prem ML service rather than another cloud region.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Backup and Restore (Lowest Cost, Slowest Speed)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How it works in this topology:&lt;/p&gt;

&lt;p&gt;• AKS/cluster state: Back up Kubernetes manifests, Helm releases, and persistent volumes with Velero (targeting an Azure Storage Account), plus Azure Backup for any managed disks.&lt;br&gt;
• Container images: Enable geo-replication on Azure Container Registry (ACR) so images are already durable in a second region without a manual restore step.&lt;br&gt;
• Application/config data: Regular exports of Azure SQL/Cosmos DB via native backup, or Azure Backup Vault for PaaS data stores.&lt;br&gt;
• On-prem ML artifacts: Nightly (or more frequent) replication of trained model binaries, feature-store snapshots, and the model registry (e.g., MLflow) to Azure Blob Storage. This is the critical, often-forgotten piece — if the on-prem site is unreachable, you need the last known good model sitting in the cloud, not just the app tier.&lt;br&gt;
Cost vs. Speed: Minimal ongoing spend — nothing is running idle. But recovery means provisioning a fresh AKS cluster, redeploying workloads from Velero, and standing up an emergency inference service (see the "ML fallback" pattern below) from the last replicated model. Expect RTO in hours, RPO measured from the last backup cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pilot Light (Low Cost, Moderate Speed)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;p&gt;• A minimal secondary AKS cluster exists in a second Azure region, defined entirely as code (Bicep, Terraform, or ARM templates), scaled to near-zero (e.g., a single system node pool, no user workloads running).&lt;br&gt;
• Core namespaces, secrets (via Azure Key Vault + CSI driver), and networking (VNet, private endpoints) are pre-provisioned so the "light" is already on — you're not starting from a blank slate.&lt;br&gt;
• On-prem ML fallback: A lightweight, always-warm inference stub — a smaller/quantized model or a cached-prediction service — is kept deployed in the secondary region's AKS cluster. It isn't meant to replace the full on-prem model; it's meant to keep the application functional but degraded while the primary ML path is restored.&lt;br&gt;
Cost vs. Speed: Low ongoing cost since only skeleton infrastructure runs continuously. Failover means scaling the node pools up via automation and pointing traffic to the secondary cluster — RTO typically drops to tens of minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Warm Standby (Higher Cost, Fast Speed)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;p&gt;• A partially scaled AKS cluster runs continuously in the secondary region with real (not stub) application pods and the Horizontal Pod Autoscaler and Cluster Autoscaler configured to burst on failover.&lt;/p&gt;

&lt;p&gt;• Data layer is continuously replicated (e.g., Azure SQL active geo-replication, Cosmos DB multi-region writes).&lt;/p&gt;

&lt;p&gt;• For the ML dependency, this tier is where a secondary on-prem site or a colocated edge inference cluster becomes worth the investment — either a second data center with replicated models, or GPU-backed nodes in Azure (via Azure Machine Learning endpoints or GPU node pools in AKS) that mirror the on-prem model's behavior closely enough to serve as a live hot backup, fed by continuous model-artifact sync.&lt;/p&gt;

&lt;p&gt;• Azure Traffic Manager or Azure Front Door health-probes the primary path (app + on-prem ML) and can redirect traffic before a human intervenes.&lt;/p&gt;

&lt;p&gt;Cost vs. Speed: Meaningfully higher cost — you're running real capacity around the clock. In return, RTO drops to single-digit minutes because the standby path is already serving low-volume traffic and simply needs to absorb the full load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Multi-Site / Active-Active (Highest Cost, Fastest Speed)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;p&gt;• Fully active AKS clusters in two or more Azure regions, each capable of independently serving 100% of traffic, fronted by Azure Front Door or Traffic Manager with active-active routing.&lt;br&gt;
• The ML dependency is the hard part here: true multi-site requires either (a) two independent on-prem data centers with synchronized model registries and load-balanced inference traffic over redundant ExpressRoute circuits, or (b) accepting that ML inference is migrated into the cloud (Azure ML / GPU AKS node pools in each region) so the cloud becomes multi-site while on-prem becomes a batch training source rather than a real-time dependency.&lt;br&gt;
• This is also where you decouple the app from synchronous calls to on-prem ML entirely, using an event/queue-based pattern (Azure Service Bus, Event Hubs, or Kafka) so a slow or unreachable on-prem inference path never blocks the web tier — the app degrades to cached/default predictions instead of failing outright.&lt;/p&gt;

&lt;p&gt;Cost vs. Speed: Highest cost by far — full redundant capacity, redundant network circuits, and (usually) a redesign to remove hard synchronous coupling to a single on-prem site. In exchange, RTO/RPO approach near-zero, and the on-prem site's failure stops being a single point of failure for the whole product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparison at a Glance&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;Tier    Ongoing Cost    RTO RPO On-Prem ML Handling&lt;/p&gt;

&lt;p&gt;Backup &amp;amp; Restore    $   Hours   Hours (last backup) Model artifacts backed up to cloud storage; emergency stub built on demand&lt;/p&gt;

&lt;p&gt;Pilot Light $$  Tens of minutes Tens of minutes Warm stub/quantized model kept ready in secondary region&lt;/p&gt;

&lt;p&gt;Warm Standby    $$$ Single-digit minutes    Minutes Hot secondary inference path (2nd DC or cloud GPU nodes), continuously synced&lt;/p&gt;

&lt;p&gt;Multi-Site  $$$$    Near-zero   Near-zero   Dual on-prem sites or ML migrated fully into cloud; async decoupling via queues&lt;/p&gt;

&lt;p&gt;Designing a Highly Available, Multi-Zone AKS Web Application&lt;br&gt;
and extending it to cover the on-prem hop:&lt;/p&gt;

&lt;p&gt;• Azure Front Door: Acts as the global entry point and CDN — caches static content at the edge, applies WAF policies, and performs global health-probing/failover across regions, similar in role to CloudFront + Route 53 combined.&lt;/p&gt;

&lt;p&gt;• Azure Load Balancer / Application Gateway (with AGIC): Distributes traffic across AKS ingress controllers, providing L4/L7 load balancing and SSL termination in front of the cluster.&lt;/p&gt;

&lt;p&gt;• AKS with Availability Zones: Deploy node pools across all three Availability Zones in the region, and set topologySpreadConstraints / pod anti-affinity so replicas of each deployment are spread across zones — this is the direct equivalent of an EC2 Auto Scaling Group spanning multiple AZs. Combine with the Cluster Autoscaler and HPA so pod and node counts flex with demand automatically.&lt;/p&gt;

&lt;p&gt;• Azure Cache for Redis: Sits in front of both the application data layer and, importantly, in front of the on-prem ML calls — caching recent inference results so that a transient blip in on-prem connectivity or latency doesn't degrade every user request, only new/uncached ones.&lt;/p&gt;

&lt;p&gt;• Hybrid connectivity resilience: This is the piece with no AWS-native equivalent, since it's the link back to the data center. Provision redundant ExpressRoute circuits (from different peering locations) with a Site-to-Site VPN as a tertiary fallback, and front the on-prem ML endpoint with Azure Private Link/Private Endpoint so the AKS workloads always resolve to the healthiest available path. Wrap every call to the on-prem service in a circuit breaker (e.g., Polly in .NET, resilience4j-style patterns in other stacks) so a struggling on-prem dependency fails fast and the app falls back to cached or default responses instead of cascading timeouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Putting it together&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A request flows: Azure Front Door → Application Gateway → AKS ingress (zone-redundant pods) → Redis cache check → ExpressRoute (primary) / VPN (fallback) → on-prem ML inference → response cached in Redis for subsequent requests.&lt;/p&gt;

&lt;p&gt;Every hop in that chain has its own failure mode, and the DR tier you choose should be applied consciously at each hop rather than uniformly across the whole system — it's common, and often the right cost/speed trade-off, to run the web/app tier at Warm Standby while the on-prem ML tier only reaches Pilot Light, compensated for with aggressive caching and graceful degradation in the application logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Define RTO/RPO per tier, not just per application — the web layer and the on-prem ML layer will almost never share the same recovery targets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backup on-prem ML artifacts (models, feature stores, registries) to cloud storage regardless of which DR tier you choose elsewhere — it's cheap insurance and enables an emergency fallback at any tier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decouple the web tier from synchronous, blocking calls to on-prem ML wherever possible using caching and queue-based patterns — this alone can turn an on-prem outage from a full outage into a graceful degradation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Treat network connectivity (ExpressRoute/VPN) as its own failure domain with its own redundancy plan — it's the one link in this architecture that doesn't exist in a pure single-cloud design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-zone AKS deployment (Front Door, App Gateway, zone-spread node pools, Redis) gives you regional high availability essentially "for free" at moderate cost — treat it as the baseline, then layer the four DR tiers on top for cross-region and cross-site resilience.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>architecture</category>
      <category>azure</category>
      <category>infrastructure</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Our Ollama /LLM Production Setup</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Sat, 08 Aug 2026 05:16:35 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/our-ollama-llm-production-setup-3anf</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/our-ollama-llm-production-setup-3anf</guid>
      <description>&lt;h1&gt;
  
  
  Response to Ollama Production Queries to the previous post
&lt;/h1&gt;

&lt;p&gt;Excellent questions — you've clearly been in the trenches with Ollama at scale! Let me address your specific concerns about our production setup, now updated with our actual deployment architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  On GPU Residency &amp;amp; VRAM Thrashing
&lt;/h2&gt;

&lt;p&gt;You're absolutely right — this is the &lt;strong&gt;single biggest operational challenge&lt;/strong&gt; with Ollama in production. We've implemented a hybrid strategy:&lt;/p&gt;

&lt;h3&gt;
  
  
  Our Approach:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hot Models Pinned in Memory&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;qwen3:8b&lt;/code&gt; (primary inference)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bge-m3&lt;/code&gt; (embedding service)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;qwen3:4b-instruct&lt;/code&gt; (NER-specific)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These stay resident with &lt;code&gt;OLLAMA_KEEP_ALIVE=-1&lt;/code&gt; in the container environment.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cold Models on Separate Instance&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gemma3:4b&lt;/code&gt;, &lt;code&gt;llama3.2&lt;/code&gt;, custom &lt;code&gt;RatnaDveLinga&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;These run on a secondary Ollama instance with a lower concurrency limit&lt;/li&gt;
&lt;li&gt;The load balancer routes to this instance only for specific workloads&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VRAM Monitoring&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# We run this in a sidecar container&lt;/span&gt;
   watch &lt;span class="nt"&gt;-n&lt;/span&gt; 1 nvidia-smi &lt;span class="nt"&gt;--query-gpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;memory.used,memory.free &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Keep-Alive Tuning We Use:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose environment section&lt;/span&gt;
&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_KEEP_ALIVE=5m&lt;/span&gt;  &lt;span class="c1"&gt;# Not -1 to avoid holding all models&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_NUM_PARALLEL=4&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_MAX_LOADED_MODELS=3&lt;/span&gt;  &lt;span class="c1"&gt;# Critical! Prevents thrashing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight&lt;/strong&gt;: Setting &lt;code&gt;OLLAMA_MAX_LOADED_MODELS&lt;/code&gt; to 3 forces eviction behavior to be predictable rather than reactive. We learned this after a production incident where p99 latency jumped from 200ms to 8 seconds during a batch processing job!&lt;/p&gt;




&lt;h2&gt;
  
  
  On Concurrent Load &amp;amp; Service Architecture
&lt;/h2&gt;

&lt;p&gt;Great observation about &lt;code&gt;OLLAMA_NUM_PARALLEL&lt;/code&gt; — default is 1 in many versions! Here's our production design at scale:&lt;/p&gt;

&lt;h3&gt;
  
  
  Our Actual Deployment Architecture:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Instance Count&lt;/th&gt;
&lt;th&gt;RAM (GB)&lt;/th&gt;
&lt;th&gt;CPU (Cores)&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;LLM inference engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama-WebUI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Web interface for model management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;forms-service-ner-v4-api&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;Production NER API endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;forms-service-ner-v4-celery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;Async NER task workers (prod)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;forms-service-ner-qa-api&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;3.9&lt;/td&gt;
&lt;td&gt;QA environment NER APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;forms-service-ner-qa-celery-server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;3.9&lt;/td&gt;
&lt;td&gt;QA async task workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;forms-service-ner-api(sales)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;3.9&lt;/td&gt;
&lt;td&gt;Production -specific NER APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;forms-service-ner-celery(sales)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;3.9&lt;/td&gt;
&lt;td&gt;Production async task workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;signal-summarizer-llm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Main summarizer service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;signal-summarizer-llm workflow-aggregator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Workflow orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;signal-summarizer-llm worker-model1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Model execution workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;signal-summarizer-llm celery-flower&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Celery monitoring dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Load Distribution Strategy:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────────────────────────┐
                    │       KONG API Gateway               │
                    │  (Least Connection Algorithm)        │
                    └─────────────┬────────────────────────┘
                                  │
            ┌─────────────────────┼─────────────────────┐
            │                     │                     │
    ┌───────▼──────┐    ┌────────▼────────┐    ┌───────▼──────┐
    │  NER Services │    │  Summarizer     │    │  Ad-hoc      │
    │  (17 pods)    │    │  Services       │    │  Queries     │
    └───────┬──────┘    │  (20 pods)      │    └───────┬──────┘
            │           └────────┬────────┘            │
            └─────────────────────┼─────────────────────┘
                                  │
                    ┌─────────────▼─────────────┐
                    │   21 Ollama Instances      │
                    │   (Distributed Pool)       │
                    └────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How KONG's Least Connection Load Balancing Helps:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. NER Service Distribution (17 instances total):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Production NER&lt;/strong&gt;: 2 API + 3 Celery = 5 instances (high memory/CPU)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QA NER&lt;/strong&gt;: 2 API + 6 Celery = 8 instances (lower CPU, more workers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales NER&lt;/strong&gt;: 4 API + 4 Celery = 8 instances (balanced)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KONG routes traffic to the least loaded instance, which is crucial for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preventing any single NER instance from being overwhelmed by large document batches&lt;/li&gt;
&lt;li&gt;Allowing Celery workers to scale independently based on queue depth&lt;/li&gt;
&lt;li&gt;Isolating QA traffic from production traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Summarizer Service Distribution (20 instances total):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Main service&lt;/strong&gt;: 2 instances&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow aggregators&lt;/strong&gt;: 9 instances (coordinating multi-step summaries)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model workers&lt;/strong&gt;: 9 instances (doing the heavy lifting)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Celery flower&lt;/strong&gt;: 1 instance (monitoring)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Request Flow with Backpressure:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simplified version of our queue management with distributed instances
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OllamaLoadBalancer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Track load across all 21 Ollama instances
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;discover_ollama_instances&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;route_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service_type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Find least loaded instance via KONG
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;service_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ner&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Route to NER-specific Celery queue
&lt;/span&gt;            &lt;span class="c1"&gt;# Celery distributes across 13 NER workers (2+3+4+4)
&lt;/span&gt;            &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_least_loaded&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;forms-ner-v4&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;forms-ner-qa&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;forms-ner-sales&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;service_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;summarizer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Route to summarizer Celery queue
&lt;/span&gt;            &lt;span class="c1"&gt;# Celery distributes across 9 model workers
&lt;/span&gt;            &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_least_loaded&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;summarizer-workflow&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;summarizer-model1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# Set appropriate parallelism per service type
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;service_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ner&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ollama_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;  &lt;span class="c1"&gt;# seconds
&lt;/span&gt;            &lt;span class="n"&gt;ollama_concurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="c1"&gt;# OLLAMA_NUM_PARALLEL
&lt;/span&gt;        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# summarizer
&lt;/span&gt;            &lt;span class="n"&gt;ollama_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;  &lt;span class="c1"&gt;# seconds (larger context)
&lt;/span&gt;            &lt;span class="n"&gt;ollama_concurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="c1"&gt;# careful with VRAM
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_least_loaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Query KONG's least-connection algorithm
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kong_api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_least_connected_instance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What We've Learned at This Scale
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Good:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;21 Ollama instances&lt;/strong&gt; across servers provide excellent fault tolerance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Least connection algorithm&lt;/strong&gt; naturally handles hot spots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate QA vs Production&lt;/strong&gt; instances (8 NER QA pods) allow safe testing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales-specific NER&lt;/strong&gt; (8 pods) isolates business-critical workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Challenges:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model Consistency&lt;/strong&gt;: Keeping all 21 Ollama instances synchronized with same models and versions&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solution: We use a shared NFS volume for models, or have a model-sync cron job&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Celery Worker Configuration&lt;/strong&gt;: With 13 NER Celery workers and 9 summarizer workers, we had to tune:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="c1"&gt;# Celery config
&lt;/span&gt;   &lt;span class="n"&gt;CELERYD_PREFETCH_MULTIPLIER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# Prevent worker hogging
&lt;/span&gt;   &lt;span class="n"&gt;CELERY_ACKS_LATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;  &lt;span class="c1"&gt;# Re-queue if worker crashes
&lt;/span&gt;   &lt;span class="n"&gt;CELERY_TASK_TIME_LIMIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;  &lt;span class="c1"&gt;# 5 min max
&lt;/span&gt;   &lt;span class="n"&gt;CELERY_TASK_SOFT_TIME_LIMIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;240&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;KONG Routing Complexity&lt;/strong&gt;: With least-connection across heterogeneous instance types (some 7.5 CPU cores, some 3.9), we had to implement:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;   &lt;span class="c1"&gt;-- Kong plugin to weigh instances by capacity&lt;/span&gt;
   &lt;span class="c1"&gt;-- Instance with 7.5 cores should get ~2x traffic of 3.9 core instance&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Specific Q &amp;amp; A
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: "Given your NER and summarizer run on the large-document path, how are you handling concurrent load — one instance per service, or a shared pool with request queuing in front?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A: Distributed pool with service-specific queues&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NER&lt;/strong&gt;: 17 total instances (5 prod + 8 QA + 4 sales) each with &lt;code&gt;OLLAMA_NUM_PARALLEL=4&lt;/code&gt; → &lt;strong&gt;68 concurrent NER requests possible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarizer&lt;/strong&gt;: 20 total instances (2 main + 9 workflow + 9 workers) with &lt;code&gt;OLLAMA_NUM_PARALLEL=2&lt;/code&gt; → &lt;strong&gt;40 concurrent summarizer requests possible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All fronted by KONG with least-connection algorithm&lt;/strong&gt; → no single point of overload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The key insight&lt;/strong&gt;: With 21 Ollama instances, even if one gets busy, KONG routes to the next least-loaded. Celery handles the queue depth and retries.&lt;/p&gt;




&lt;h2&gt;
  
  
  Critical Monitoring in Production
&lt;/h2&gt;

&lt;p&gt;We track these metrics per service:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Critical Metrics&lt;/th&gt;
&lt;th&gt;Alert Threshold&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NER (All)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Queue length &amp;gt; 50 per celery worker&lt;/td&gt;
&lt;td&gt;Scale up workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NER (Prod)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99th percentile latency &amp;gt; 3s&lt;/td&gt;
&lt;td&gt;Investigate model/instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Summarizer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;99th percentile latency &amp;gt; 8s&lt;/td&gt;
&lt;td&gt;Check GPU usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama Instances&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory usage &amp;gt; 80%&lt;/td&gt;
&lt;td&gt;Evict cold models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KONG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;504/502 errors rate &amp;gt; 1%&lt;/td&gt;
&lt;td&gt;Check instance health&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  One More Thing: Metrics Are Your Friend
&lt;/h2&gt;

&lt;p&gt;With 21 Ollama instances and 37 service instances (NER + Summarizer), observability is critical:&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;# Distributed tracing across services&lt;/span&gt;
&lt;span class="c"&gt;# We use OpenTelemetry with Jaeger&lt;/span&gt;
&lt;span class="c"&gt;# This helps identify if latency is in:&lt;/span&gt;
&lt;span class="c"&gt;# 1. KONG routing&lt;/span&gt;
&lt;span class="c"&gt;# 2. Celery queuing&lt;/span&gt;
&lt;span class="c"&gt;# 3. Ollama inference&lt;/span&gt;
&lt;span class="c"&gt;# 4. Network between instances&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Bottom line&lt;/strong&gt;: Your assessment is spot-on. The production challenges with Ollama aren't getting it running — they're keeping it running &lt;em&gt;predictably&lt;/em&gt; under mixed workloads across 21 instances. We've found that explicit model management with &lt;code&gt;OLLAMA_MAX_LOADED_MODELS&lt;/code&gt;, proper Celery tuning, and KONG's least-connection balancing are non-negotiable at this scale.&lt;/p&gt;

&lt;p&gt;The 21-instance deployment gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High availability&lt;/strong&gt; (can lose 2-3 instances without impact)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; (can route QA vs Prod traffic separately)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; (least-connection ensures no single instance is overwhelmed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to dive deeper into any of these aspects further 🚀&lt;/p&gt;

</description>
      <category>devops</category>
      <category>infrastructure</category>
      <category>llm</category>
      <category>ollama</category>
    </item>
    <item>
      <title>Posted our LLM / Ollama process here:

https://dev.to/suresh_devops_ffa0728a190/powering-ml-services-with-ollama-a-complete-setup-for-self-hosted-llms-3o7f</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Fri, 07 Aug 2026 09:08:36 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/posted-our-llm-ollama-process-here-1lab</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/posted-our-llm-ollama-process-here-1lab</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/suresh_devops_ffa0728a190/powering-ml-services-with-ollama-a-complete-setup-for-self-hosted-llms-3o7f" class="crayons-story__hidden-navigation-link"&gt;Powering ML Services with Ollama: A Complete Setup for Self-Hosted LLMs&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/suresh_devops_ffa0728a190" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3761300%2F92deda14-6c82-4fd9-b585-fa6555c3d99f.png" alt="suresh_devops_ffa0728a190 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/suresh_devops_ffa0728a190" class="crayons-story__secondary fw-medium m:hidden"&gt;
              suresh devops
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                suresh devops
                
              
              &lt;div id="story-author-preview-content-4339042" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/suresh_devops_ffa0728a190" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3761300%2F92deda14-6c82-4fd9-b585-fa6555c3d99f.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;suresh devops&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/suresh_devops_ffa0728a190/powering-ml-services-with-ollama-a-complete-setup-for-self-hosted-llms-3o7f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 7&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/suresh_devops_ffa0728a190/powering-ml-services-with-ollama-a-complete-setup-for-self-hosted-llms-3o7f" id="article-link-4339042"&gt;
          Powering ML Services with Ollama: A Complete Setup for Self-Hosted LLMs
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ollama"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ollama&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mlops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mlops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/suresh_devops_ffa0728a190/powering-ml-services-with-ollama-a-complete-setup-for-self-hosted-llms-3o7f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/suresh_devops_ffa0728a190/powering-ml-services-with-ollama-a-complete-setup-for-self-hosted-llms-3o7f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              4&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Powering ML Services with Ollama: A Complete Setup for Self-Hosted LLMs</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Fri, 07 Aug 2026 09:05:23 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/powering-ml-services-with-ollama-a-complete-setup-for-self-hosted-llms-3o7f</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/powering-ml-services-with-ollama-a-complete-setup-for-self-hosted-llms-3o7f</guid>
      <description>&lt;p&gt;Our ML Services need LLMs to process the large documents and data. We started using Ollama since 2024 and the learnings below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ollama&lt;/strong&gt;, an open-source tool that packages LLMs into a simple CLI and REST server, has emerged as a game-changer for developers and organizations seeking privacy, cost-efficiency, and offline capabilities&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;What is Ollama and Why Use It? *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ollama is often described as "Docker for LLMs" – you pull a model by name, and Ollama handles quantization, memory mapping, and inference runtime behind the scenes. The core reasons developers choose Ollama over cloud APIs include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: Your prompts and data never leave your machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Zero per-token charges after the one-time model download&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency&lt;/strong&gt;: No network round-trip, especially fast on modern GPUs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline use&lt;/strong&gt;: Works without any internet connection once models are downloaded &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our ML Services Environment&lt;/p&gt;

&lt;p&gt;Our setup runs a variety of models optimized for different tasks, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3 series&lt;/strong&gt; (8B, 4B-instruct, 0.6B) for general-purpose inference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Llama3.2&lt;/strong&gt; and custom variants for specialized tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma3:4b&lt;/strong&gt; and &lt;strong&gt;Gemma2:2b&lt;/strong&gt; for lightweight processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BGE-M3&lt;/strong&gt; for embedding generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;llm&lt;/strong&gt; – a custom model created from GGUF format &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also maintain two dedicated services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ner&lt;/strong&gt;: For Named Entity Recognition in forms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;summarizer-llm&lt;/strong&gt;: For summarizing signals and communications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Complete Setup Walkthrough&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Dependencies&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start by updating your system and installing essential packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
apt &lt;span class="nb"&gt;install &lt;/span&gt;git docker-compose curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Install NVIDIA Drivers and Container Toolkit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For GPU acceleration (which provides 10-100x speedup over CPU inference) , install NVIDIA drivers and the NVIDIA Container Toolkit:&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="nv"&gt;distribution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; /etc/os-release&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ID$VERSION_ID&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://nvidia.github.io/nvidia-docker/gpgkey | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://nvidia.github.io/nvidia-docker/&lt;span class="nv"&gt;$distribution&lt;/span&gt;/nvidia-docker.list | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/nvidia-docker.list

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nvidia-docker2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;ubuntu-drivers autoinstall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot the system after driver installation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone and Configure the Ollama Repository
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/sujithrpillai/ollama.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;docker-compose.yml&lt;/code&gt; file with GPU support:&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ollama&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama/ollama:latest&lt;/span&gt;
    &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama&lt;/span&gt;
    &lt;span class="na"&gt;ports&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;11434:11434"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./models:/root/.ollama/models&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;genai-network&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;reservations&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia&lt;/span&gt;
              &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;
              &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;gpu&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

  &lt;span class="na"&gt;open-webui&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/open-webui/open-webui:main&lt;/span&gt;
    &lt;span class="na"&gt;ports&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;3000:8080"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_BASE_URL=http://ollama:11434&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./backend/data:/app/backend/data&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;genai-network&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;genai-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&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;genai-network&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The GPU configuration in the &lt;code&gt;deploy&lt;/code&gt; section enables hardware acceleration for supported NVIDIA GPUs .&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start the Services
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Pull Models&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Access the Ollama container and download models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama ollama pull qwen3:8b
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama ollama pull gemma2:2b
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama ollama pull llama3.2:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create Custom Models from GGUF Files&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ollama allows creating custom models from GGUF format files :&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="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;git-lfs
git clone https://huggingface.co/org/llm-v3-270k-GGUF
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;Modelfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; /home/RatnaDveLinga-v3-270k-GGUF/RatnaDveLinga-v3-270k.gguf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama create llmname &lt;span class="nt"&gt;-f&lt;/span&gt; Modelfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verify Setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Check models available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@ollama:/ ollama list

NAME                                ID              SIZE      MODIFIED
qwen3:8b                            500a1f067a9f    5.2 GB    8 months ago
qwen3:4b-instruct                   0edcdef34593    2.5 GB    8 months ago
qwen2.5:1.5b                        65ec06548149    986 MB    9 months ago
gemma3:4b                           a2af6cc3eb7f    3.3 GB    13 months ago
llama3.2:latest                     a80c4f17acd5    2.0 GB    13 months ago
bge-m3:latest                       790764642607    1.2 GB    13 months ago
RatnaDveLinga:latest                decc819a53b1    1.7 GB    21 months ago
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Model Management Commands&lt;/p&gt;

&lt;p&gt;Essential CLI commands for managing your Ollama setup :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ollama list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List all downloaded models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ollama pull &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Download a model without running it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ollama run &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run a model interactively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ollama stop &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop a running model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ollama rm &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove a model from disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ollama ps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show currently running models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ollama show &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Display model metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Performance Considerations&lt;/p&gt;

&lt;p&gt;GPU acceleration can provide &lt;strong&gt;10-100x faster inference&lt;/strong&gt; compared to CPU-only operation . To verify GPU usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Open WebUI interface available at &lt;code&gt;http://localhost:3000&lt;/code&gt; provides a user-friendly way to interact with models, pull new ones, and manage your setup without using the command line .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This setup provides a robust, self-hosted LLM environment with GPU acceleration, a comprehensive model library, and a web interface for easy interaction. Whether you're running specialized NER services, summarization tasks, or general-purpose inference, Ollama combined with Open WebUI delivers a powerful and private AI platform.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Happy prompting!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>ollama</category>
      <category>mlops</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Why Your Elasticsearch Backups Might Fail When You Need Them Most</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Tue, 04 Aug 2026 04:01:43 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/why-your-elasticsearch-backups-might-fail-when-you-need-them-most-2cid</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/why-your-elasticsearch-backups-might-fail-when-you-need-them-most-2cid</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why Your Elasticsearch Backups Might Fail When You Need Them Most: Lessons from the July 2026 Recovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the world of Site Reliability Engineering, there is a painful, often career-defining difference between having a backup and having a recovery. This reality hit our team with visceral clarity during a high-stakes production recovery event in July 2026. &lt;/p&gt;

&lt;p&gt;While we believed our standard operating procedures were robust, the technical nuances of Elasticsearch 7.17.x proved otherwise. Our previous SOP didn't just have "gaps"—it allowed for a "Partial" success state that nearly resulted in total data loss.&lt;/p&gt;

&lt;p&gt;The following insights are derived from the hard-won lessons of that recovery. We have since scrapped the old methods and codified these findings into our formal SOP (Version 1.0). If you are responsible for Elasticsearch clusters, these changes are the difference between a clean restoration and a catastrophic failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Partial" Snapshot is a Silent Failure:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most dangerous trap in Elasticsearch administration is accepting a snapshot that isn't perfect. In July 2026, we learned that a snapshot can complete with a state of PARTIAL, a "silent failure" that often occurs due to node shutdowns, shard unavailability, or filesystem issues on the NFS server. A partial snapshot means some shards were simply skipped, leaving invisible data holes that you won't discover until your application is back online and throwing errors.&lt;/p&gt;

&lt;p&gt;Our updated SOP now strictly forbids proceeding with a restoration if the state is anything other than SUCCESS. If you encounter a PARTIAL state, do not attempt to overwrite or restart the full process immediately. Instead, you must resolve the underlying infrastructure issue and take a NEW, dedicated snapshot specifically for the missing indices.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"A backup is considered successful when: Snapshot state is SUCCESS."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Global State Bloat:&lt;/strong&gt;&lt;br&gt;
When executing a backup, the default behaviour is often to capture the cluster’s global state. While this seems comprehensive, it is an architectural poison when restoring to a different environment. During our recovery, we moved data from our source cluster (Primary Node) to a target cluster (Restore Cluster). Including the global state risked "poisoning" the new cluster with shard allocation awareness attributes and persistent tasks that were specific to the old hardware.&lt;/p&gt;

&lt;p&gt;By explicitly setting "include_global_state": false, we ensure the backup is truly portable.&lt;/p&gt;

&lt;p&gt;PUT /&lt;em&gt;snapshot/es_backup/all_indices&lt;/em&gt;&lt;br&gt;
{&lt;br&gt;
  "indices":"*",&lt;br&gt;
  "include_global_state":false&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This prevents the target cluster from trying to mimic the source's runtime configuration, which is essential for a clean start on the Restore Cluster cluster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't Restore the "Ghost" Indices:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A common reflex during a disaster is to restore everything inside the snapshot. However, our recovery post-mortem identified several "ghost" indices—system indices like .tasks and .geoip_databases—that should be ignored.&lt;/p&gt;

&lt;p&gt;These are runtime indices that Elasticsearch 7.17.x recreates automatically. Attempting to force a restore of .tasks, for example, can cause the target cluster to hang or crash as it tries to resume background tasks that were specific to the source cluster's state. &lt;/p&gt;

&lt;p&gt;Always exclude these system indices to allow the target cluster’s native operations to initialize correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Green" Health Mandate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A successful recovery begins long before the PUT command is run; it starts with the health of the source. One of our key lessons from July 2026 was that snapshots taken during node restarts or maintenance windows are inherently unreliable.&lt;/p&gt;

&lt;p&gt;We now mandate a "Status Green" precondition. If your cluster is "Yellow," you have unassigned or initializing shards. Taking a snapshot of a degraded cluster is effectively building on shifting sand—it is the primary recipe for the PARTIAL failures mentioned earlier. Before you touch the backup API, verify that there are no relocating shards and the cluster is stable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metadata is the True Backup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A snapshot file residing on the NFS server is useless if the cluster that created it is gone and you have no record of what was inside. During the heat of a recovery, you cannot rely on the Elasticsearch API to tell you what you have if the cluster itself is down.&lt;/p&gt;

&lt;p&gt;We now require engineers to archive snapshot metadata—JSON output detailing index counts, shard status, and failure logs—off-cluster. This metadata should be stored in a version-controlled repository or a secondary secure bucket, not just on the cluster being backed up.&lt;/p&gt;

&lt;p&gt;GET /_snapshot/es_backup/?pretty&lt;/p&gt;

&lt;p&gt;"Archive snapshot metadata (indices, failures, timestamps, shard status) along with operational records for future audits and disaster recovery."&lt;br&gt;
This allows you to verify that the document counts on your new Restore Cluster exactly match what was captured from the Primary Node source, providing the empirical proof required for a successful sign-off.&lt;br&gt;
The Quarterly Integrity Test&lt;/p&gt;

&lt;p&gt;The "set it and forget it" mentality is the enemy of Site Reliability. You do not have a backup until you have proven you can restore it. Our SOP now mandates a test restore on a non-production cluster under three specific triggers:&lt;/p&gt;

&lt;p&gt;• Quarterly: A routine scheduled validation.&lt;br&gt;
• Post-Upgrade: Immediately following any Elasticsearch version change.&lt;br&gt;
• Infrastructure Change: Whenever there are modifications to the NFS backup server or network pathing.&lt;/p&gt;

&lt;p&gt;These tests verify more than just data; they validate your Recovery Time Objective (RTO) and ensure that your application remains compatible with the restored mappings and settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion: The Future of Resilience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The transition to Version 1.0 of our Elasticsearch SOP marks our shift from "checking a box" to building true operational resilience. By enforcing "Green" state preconditions, excluding dangerous global state, and rigorously archiving metadata off-cluster, we have replaced "Partial" hope with technical certainty.&lt;/p&gt;

&lt;p&gt;The July 2026 recovery was a wake-up call that forced us to evolve. If your primary cluster vanished today, would your metadata stored off the Backup server be enough to rebuild, or are you currently relying on a "Partial" hope?&lt;/p&gt;

</description>
      <category>elasticsearch</category>
      <category>es</category>
      <category>cluster</category>
      <category>devops</category>
    </item>
    <item>
      <title>Can we survive as DevOps Engineers in AI Era ?</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Sat, 21 Feb 2026 12:11:06 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/can-we-survive-as-devops-engineers-in-ai-era--2gc5</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/can-we-survive-as-devops-engineers-in-ai-era--2gc5</guid>
      <description>&lt;p&gt;&lt;strong&gt;_(Haunted by AI and trying to find answers - Notes -1)&lt;br&gt;
_&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As DevOps professionals, the most dangerous thing we can do right now is mistake our ability to write a CI/CD pipeline for job security. We are witnessing a violent divergence in the DevOps career path. &lt;/p&gt;

&lt;p&gt;AI is not coming for the architects; it is coming for the executors—the engineers who have spent their careers living at "YAML-level depth."&lt;/p&gt;

&lt;p&gt;The central thesis of this new era is : The manual pipeline builder is a dying breed. The AI-Orchestrating Architect is the future.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The Great Split: Tool Operators vs. Platform Architects&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
The industry is bifurcating into two distinct paths with vastly different lifespans. Understanding which path you are on is the difference between professional obsolescence and becoming a linchpin of the enterprise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Divergent Paths&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Path 1&lt;/strong&gt;: The Tool Operator (High Risk) This role is defined by routine execution: writing pipelines, drafting Helm charts, deploying containers, and patching minor configuration drift. Because AI can already automate 60–70% of these commodity tasks, this layer of the profession is rapidly becoming a low-value commodity.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Path 2&lt;/strong&gt;: The Platform Architect / Reliability Strategist (High Value) This is the domain of the AI-Orchestrating Architect. It involves high-level systemic design: failure domains, multi-region architecture, SLO/SLA strategy, and governing how AI is integrated into the SDLC.&lt;br&gt;
Analysis: The automation of commodity tasks makes the move to Path 2 an urgent strategic necessity. To survive this shift, you must stop being the person who moves the bricks and start being the person who designs the structural integrity of the building.&lt;/p&gt;

&lt;p&gt;"AI will replace DevOps engineers who stay at YAML-level depth."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1: Distributed Systems Depth Over CLI Commands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mastering Kubernetes syntax or specific CLI flags is no longer a competitive advantage—it’s a baseline. AI can generate infrastructure code and deploy clusters with high proficiency. However, AI lacks the systemic intuition required to prevent or debug a total system collapse. To reach the architect level, you must master the mechanics of distributed systems:&lt;/p&gt;

&lt;p&gt;• Consensus &amp;amp; Leader Election: Mastering the Raft protocol and how state is maintained.&lt;br&gt;
• The CAP Theorem: Navigating the brutal trade-offs between Consistency, Availability, and Partition Tolerance.&lt;br&gt;
• Failure Management: Managing Eventual Consistency, Backpressure, Circuit Breaking, and the logic required to survive Retry Storms.&lt;br&gt;
• Idempotency: Ensuring that system operations can be repeated without unintended side effects.&lt;/p&gt;

&lt;p&gt;Analysis: While AI can build the infrastructure, human architectural thinking is required to manage the complexity of distributed failure. AI might build the bridge, but the Architect understands why the resonance of a thousand footsteps will make it collapse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2: The SRE Mindset and the "Error Budget"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The definition of "success" is shifting from binary uptime to Site Reliability Engineering (SRE). A Strategic Lead doesn't just ask if a service is "up"; they manage the reliability of the system as a product feature.&lt;/p&gt;

&lt;p&gt;Key SRE pillars from the source include:&lt;/p&gt;

&lt;p&gt;• SLO Design and Golden Signals: Measuring the metrics that actually impact the business.&lt;br&gt;
• Error Budgets: Using data to negotiate the tension between feature velocity and system stability.&lt;br&gt;
• Incident Analysis and Chaos Engineering: Proactively testing resilience and performing deep-dive postmortems to find the "why" behind the "what."&lt;/p&gt;

&lt;p&gt;Analysis: Designing for failure before it happens is a uniquely human skill. It requires a proactive, strategic mindset that views every incident not as a chore, but as an architectural data point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3: FinOps – Cost is Now an Architectural Pillar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the age of massive cloud scale, infrastructure cost is no longer an accounting problem—it is a primary architectural constraint. As an architect, you must treat "Cost Architecture" with the same rigor as security.&lt;/p&gt;

&lt;p&gt;This requires mastering:&lt;/p&gt;

&lt;p&gt;• Bin Packing Math: Optimizing resource density to ensure maximum ROI on compute.&lt;br&gt;
• Spot vs. On-Demand Strategy: Designing workloads that can survive the volatility of spot instances to slash OpEx.&lt;br&gt;
• Observability Cost Control: Ensuring the cost of monitoring the system doesn't exceed the value of the data gathered.&lt;br&gt;
• Workload Rightsizing: Constant, automated tuning of resource requests to match actual utilization.&lt;/p&gt;

&lt;p&gt;Analysis: AI can generate a thousand instances in seconds, but it lacks the organizational context to know if those instances are a waste of capital. FinOps isn't just about saving money; it’s about reclaiming the innovation budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4: The Rise of the Internal Developer Platform (IDP)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The future of DevOps is Platform Engineering. &lt;em&gt;&lt;u&gt;This marks a fundamental shift from "deploying applications" to "designing the systems that deploy applications."&lt;/u&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The goal of the Architect is to move from being a manual bottleneck to becoming a platform provider. This is achieved through:&lt;/p&gt;

&lt;p&gt;• Golden Path Templates: "Secure-by-default" workflows that make the right way the easy way.&lt;br&gt;
• Guardrails and Policy as Code: Automated governance that prevents disasters before they are committed to main.&lt;br&gt;
• Self-Service Environments: Empowering developers to move at speed within safe, pre-defined boundaries.&lt;/p&gt;

&lt;p&gt;Analysis: When you stop being the person who manually runs the deployment and start being the architect of the IDP, you become a force multiplier for the entire engineering organization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5: Judgment Under Uncertainty – The Irreplaceable Skill&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What makes a professional truly irreplaceable is not a collection of certifications, but judgment under uncertainty. You must become the AI-Orchestrating Architect who uses AI for root cause exploration, log pattern detection, threat modeling, and IaC reviews, but retains the final word.&lt;/p&gt;

&lt;p&gt;Critical "When to..." decisions include:&lt;/p&gt;

&lt;p&gt;• When to re-architect a legacy system vs. when to maintain the "technical debt."&lt;br&gt;
• When to deprecate a service that no longer serves the business.&lt;br&gt;
• When to accept calculated risk for the sake of market speed.&lt;br&gt;
"AI suggests. Architect decides."&lt;/p&gt;

&lt;p&gt;Analysis: This level of judgment is your career "moat." It is the protective layer that automation cannot cross because it requires context, experience, and the accountability to own the outcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Strategic Roadmap:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Transitioning from an executor to a Reliability Strategist requires a structured evolution:&lt;/p&gt;

&lt;p&gt;Foundations &amp;amp; Distributed Systems Deep dive into Raft/Consensus, master observability, design High Availability (HA) across zones/regions, and take the lead on high-stakes incident analysis.&lt;/p&gt;

&lt;p&gt;Platform Ownership &amp;amp; Governance Own the platform architecture, design organization-wide cost governance models, and build the reusable DevOps frameworks that others consume.&lt;/p&gt;

&lt;p&gt;Strategy &amp;amp; Enterprise Architecture Define the enterprise-level DevOps strategy, lead multi-cluster/multi-region global designs, and move into the role of Principal Engineer or Enterprise Architect.&lt;/p&gt;

&lt;p&gt;The Hard Truth:&lt;/p&gt;

&lt;p&gt;The era of the "pipeline builder" is ending. &lt;u&gt;&lt;em&gt;The demand for those who can navigate platform engineering, reliability, cost optimization, and AI governance is exploding.&lt;/em&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Ignoring AI is the only certain way to be replaced. Those who integrate AI to handle the "grunt work" of log analysis and threat modeling will always outperform those who try to compete with the machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps as “platform + reliability + cost + AI governance” will expand massively&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How we fixed Real Kubernetes Production Incidents</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Wed, 18 Feb 2026 15:30:28 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/kubernetes-advanced-scheduling-we-fixed-real-production-incidents-43de</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/kubernetes-advanced-scheduling-we-fixed-real-production-incidents-43de</guid>
      <description>&lt;p&gt;We Used 'Kubernetes Advanced Scheduling' to Fix Real Production Incidents as below:&lt;/p&gt;

&lt;p&gt;Kubernetes scheduling looks simple — until production traffic hits.&lt;br&gt;
In lower environments, the default scheduler works beautifully.&lt;/p&gt;

&lt;p&gt;In production, under load, across multiple AZs, with service mesh, sidecars, GPUs, and mixed workloads?&lt;/p&gt;

&lt;p&gt;That’s when we discovered:&lt;br&gt;
The scheduler is not “basic.”&lt;/p&gt;

&lt;p&gt;It’s powerful — if we know how to use it.&lt;/p&gt;

&lt;p&gt;Based on real issues we resolved in a live Kubernetes environment running critical workloads, these were 2 AM incidents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incident 1: All Pods in One AZ – The Near-Outage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Situation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We had a 3-zone cluster.&lt;br&gt;
A critical API deployment had 9 replicas.&lt;br&gt;
One evening, during a traffic spike, one Availability Zone had network degradation.&lt;br&gt;
Suddenly, 6 of our 9 pods were unreachable.&lt;br&gt;
Why?&lt;br&gt;
Because the default scheduler had “helpfully” packed pods into fewer zones for efficiency.&lt;br&gt;
ReplicaSet guarantees count.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;It does NOT guarantee distribution.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That night we learned:&lt;br&gt;
High Availability is not automatic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix: Pod Topology Spread Constraints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We implemented:&lt;br&gt;
• topologyKey: topology.kubernetes.io/zone&lt;br&gt;
• maxSkew: 1&lt;br&gt;
• whenUnsatisfiable: DoNotSchedule&lt;/p&gt;

&lt;p&gt;This forced the scheduler to maintain balanced pod distribution across zones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Changed Immediately&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Pods spread 3-3-3 across AZs&lt;br&gt;
• Rolling updates maintained balance&lt;br&gt;
• Zone failure no longer meant partial collapse&lt;/p&gt;

&lt;p&gt;**Why This Matters &lt;/p&gt;

&lt;p&gt;Unlike anti-affinity (which is binary), &lt;strong&gt;Topology Spread Constraints are quantitative.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They enforce distribution math.&lt;br&gt;
That’s the difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Real Production Lesson&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During a rolling update before the fix:&lt;/p&gt;

&lt;p&gt;New pods filled one AZ first.&lt;br&gt;
Traffic imbalance followed.&lt;br&gt;
Latency spikes happened.&lt;/p&gt;

&lt;p&gt;After implementing spread constraints:&lt;/p&gt;

&lt;p&gt;Updates remained balanced from the first pod.&lt;br&gt;
No traffic concentration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incident 2: Node Memory Pressure – “But Requests Look Fine”&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;The Situation&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;We were using:&lt;br&gt;
• Service mesh (Istio sidecars)&lt;br&gt;
• Kata Containers for isolated workloads&lt;/p&gt;

&lt;p&gt;Pods were requesting 512MB.&lt;br&gt;
Nodes were showing allocatable capacity sufficient for 20 pods.&lt;/p&gt;

&lt;p&gt;But after deploying 15 pods:&lt;/p&gt;

&lt;p&gt;• Memory pressure started&lt;br&gt;
• Evictions happened&lt;br&gt;
• Latency increased&lt;/p&gt;

&lt;p&gt;Metrics didn’t make sense.&lt;br&gt;
Until we realized:&lt;br&gt;
The scheduler was blind to runtime overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix: Pod Overhead via RuntimeClass&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We defined a RuntimeClass with:&lt;/p&gt;

&lt;p&gt;overhead:&lt;br&gt;
  podFixed:&lt;br&gt;
    memory: "50Mi"&lt;br&gt;
    cpu: "50m"&lt;br&gt;
Now every pod using that RuntimeClass automatically added overhead to scheduling math.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Changed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before:&lt;br&gt;
Scheduler thought 512MB per pod.&lt;/p&gt;

&lt;p&gt;After:&lt;br&gt;
Scheduler calculated ~562MB per pod.&lt;br&gt;
Node fitting became accurate.&lt;br&gt;
Evictions stopped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical Insight&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pod Overhead creates an “invisible container” in scheduling math.&lt;/p&gt;

&lt;p&gt;Without it:&lt;br&gt;
You overcommit silently.&lt;/p&gt;

&lt;p&gt;With it:&lt;br&gt;
Scheduling becomes financially and operationally accurate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incident 3: GPU Pods Landing on Spot Nodes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Situation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We had:&lt;/p&gt;

&lt;p&gt;• GPU nodes (on-demand)&lt;br&gt;
• General compute nodes (Spot instances)&lt;br&gt;
A training workload got scheduled on a Spot node without GPU.&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;• CrashLoopBackOff&lt;br&gt;
• Wasted compute&lt;br&gt;
• Delayed ML training pipeline&lt;/p&gt;

&lt;p&gt;Node labels existed.&lt;br&gt;
But scheduling preference wasn’t strict enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix: Scheduler Profiles&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of rewriting the scheduler, we:&lt;/p&gt;

&lt;p&gt;• Created a separate scheduler profile&lt;br&gt;
• Configured specific scoring behavior for ML workloads&lt;br&gt;
• Used taints + tolerations + stricter filtering&lt;/p&gt;

&lt;p&gt;Now:&lt;/p&gt;

&lt;p&gt;• General workloads used default scheduling&lt;br&gt;
• ML workloads used a GPU-aware scheduling profile&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production Impact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Zero misplacements&lt;br&gt;
• Predictable GPU utilization&lt;br&gt;
• Better cost control&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incident 4: Bin Packing Wasn’t Actually Packing&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Situation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We were optimizing for cost.&lt;br&gt;
Using bin packing strategy (MostRequested scoring).&lt;br&gt;
But nodes were underutilized by 5–7%.&lt;/p&gt;

&lt;p&gt;Finance asked:&lt;/p&gt;

&lt;p&gt;“Why are we scaling nodes when CPU is still free?”&lt;br&gt;
The missing variable?&lt;br&gt;
Pod Overhead wasn’t being considered in our mental math.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Scheduler Math&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When NodeResourceFit runs:&lt;/p&gt;

&lt;p&gt;Total Pod Compute =&lt;br&gt;
(Sum of container requests) + (Pod Overhead)&lt;/p&gt;

&lt;p&gt;During scoring:&lt;br&gt;
Scheduler evaluates:&lt;br&gt;
(Current Node Usage + Total Pod Compute)&lt;/p&gt;

&lt;p&gt;With overhead included,&lt;br&gt;
Bin packing becomes more accurate.&lt;br&gt;
Without understanding this,&lt;br&gt;
You miscalculate cluster density.&lt;/p&gt;

&lt;p&gt;After adjusting runtime overhead correctly:&lt;br&gt;
• Node utilization improved&lt;br&gt;
• Fewer nodes required&lt;br&gt;
• Monthly cloud cost dropped noticeably&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Most Teams Don’t Realize&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The scheduler is not a black box.&lt;/p&gt;

&lt;p&gt;It has phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Filtering&lt;/li&gt;
&lt;li&gt; Scoring&lt;/li&gt;
&lt;li&gt; Binding&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can influence each phase.&lt;br&gt;
Advanced scheduling is not “nice to have.”&lt;/p&gt;

&lt;p&gt;It is production engineering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lessons learnt&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Replica count ≠ High Availability :
Use Topology Spread Constraints.&lt;/li&gt;
&lt;li&gt;Container request ≠ Total consumption :
Use Pod Overhead when sidecars or microVMs are involved.&lt;/li&gt;
&lt;li&gt;One scheduler profile ≠ All workloads :
Use Scheduler Profiles for workload classes.&lt;/li&gt;
&lt;li&gt;Bin packing requires correct math
Understand NodeResourceFit + Overhead interaction.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Running Kubernetes vs Engineering Kubernetes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anyone can deploy pods.&lt;br&gt;
Engineering Kubernetes means:&lt;br&gt;
• Designing failure domains intentionally&lt;br&gt;
• Accounting for invisible compute&lt;br&gt;
• Aligning scheduling with business rules&lt;br&gt;
• Optimizing cost through math, not guesswork&lt;/p&gt;

&lt;p&gt;The scheduler is not just a placement tool.&lt;/p&gt;

&lt;p&gt;It is:&lt;br&gt;
A control plane decision engine.&lt;br&gt;
And this separates:&lt;br&gt;
Clusters that survive production&lt;br&gt;
from&lt;br&gt;
Clusters that collapse under it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;(You no need to be a Kubestronaut to learn and apply not so known features of Kubernetes. All you need is a 'crisis' at 2 AM)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>sre</category>
    </item>
    <item>
      <title>DevOps Books - A DevOps enthusiast's bucket list</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Wed, 18 Feb 2026 09:57:28 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/8-devops-books-that-rewire-you-into-a-devops-architect-1oof</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/8-devops-books-that-rewire-you-into-a-devops-architect-1oof</guid>
      <description>&lt;p&gt;Today’s default learning path for most techies looks like this:&lt;/p&gt;

&lt;p&gt;Problem → Panic → Open GPT → Copy → Deploy → Pray.&lt;/p&gt;

&lt;p&gt;We’ve optimized for speed of answers, not depth of understanding.&lt;/p&gt;

&lt;p&gt;Here’s the uncomfortable truth:&lt;/p&gt;

&lt;p&gt;GPT can give you answers.&lt;br&gt;
Books rewire how you think.&lt;/p&gt;

&lt;p&gt;And DevOps at the Architect level?&lt;br&gt;
It’s not about YAML. It’s about perception.&lt;/p&gt;

&lt;p&gt;If you want to think like a DevOps Architect — beyond what you do — you need something deeper than prompts.&lt;/p&gt;

&lt;p&gt;You need frameworks.&lt;br&gt;
You need mental models.&lt;br&gt;
You need immersion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The DevOps Architect Bucket List&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you truly want to think beyond tools and certifications, add these to your professional bucket list:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;☐ The Phoenix Project – Understand organizational chaos&lt;br&gt;
☐ Accelerate – Learn what high performance actually looks like&lt;br&gt;
☐ Continuous Delivery – Master deployment flow&lt;br&gt;
☐ The DevOps Handbook – Structure transformation&lt;br&gt;
☐ The Docker Book – Build container foundations&lt;br&gt;
☐ Lean IT: Enabling and Sustaining Your Lean Transformation – Eliminate systemic waste&lt;br&gt;
☐ The Journey to DevOps – A Testing Perspective – Strengthen quality culture&lt;/p&gt;

&lt;p&gt;This is about intentionally studying 7 foundational works that shape how DevOps Architects think — beyond how tool operates, configure pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Book: The Phoenix Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Author: Gene Kim&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Starts with story.&lt;/p&gt;

&lt;p&gt;This book humanizes DevOps. It exposes silos, burnout, firefighting culture, and broken flow.&lt;/p&gt;

&lt;p&gt;Before you design scalable systems, you must understand why organizations collapse under their own complexity.&lt;/p&gt;

&lt;p&gt;Architects first learn to see the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Book: Accelerate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Authors:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Nicole Forsgren, Jez Humble, Gene Kim&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;(Based on research from the State of DevOps Reports)&lt;/p&gt;

&lt;p&gt;This book moves DevOps from belief to evidence.&lt;/p&gt;

&lt;p&gt;Deployment frequency.&lt;br&gt;
Lead time.&lt;br&gt;
Change failure rate.&lt;br&gt;
MTTR.&lt;/p&gt;

&lt;p&gt;Now you’re not “suggesting improvements.”&lt;br&gt;
You’re defending architecture with science.&lt;br&gt;
Architects use data as leverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Book: Continuous Delivery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Authors:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Jez Humble, David Farley&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is your technical deep dive.&lt;/p&gt;

&lt;p&gt;Understanding how code moves safely from commit to production is more important than learning any specific CI/CD tool.&lt;/p&gt;

&lt;p&gt;Tools evolve.&lt;br&gt;
Delivery principles do not.&lt;/p&gt;

&lt;p&gt;Spend time mapping these concepts into your real infrastructure.&lt;/p&gt;

&lt;p&gt;Architects understand flow before scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Book: The DevOps Handbook&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authors:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Gene Kim, Patrick Debois, John Willis, Jez Humble&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If DevOps had a constitution, this would be it.&lt;/p&gt;

&lt;p&gt;Culture.&lt;br&gt;
Automation.&lt;br&gt;
Measurement.&lt;br&gt;
Sharing.&lt;/p&gt;

&lt;p&gt;This book connects technical practices with leadership and organizational design.&lt;/p&gt;

&lt;p&gt;It transforms DevOps from “engineering initiative” into “business strategy.”&lt;/p&gt;

&lt;p&gt;Architects think beyond pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Book: The Docker Book&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Author: James Turnbull&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before Kubernetes.&lt;br&gt;
Before large-scale orchestration.&lt;/p&gt;

&lt;p&gt;You must understand containers deeply.&lt;/p&gt;

&lt;p&gt;Isolation.&lt;br&gt;
Portability.&lt;br&gt;
Consistency.&lt;/p&gt;

&lt;p&gt;Modern cloud architecture stands on this foundation.&lt;/p&gt;

&lt;p&gt;Architects master primitives before abstractions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Book: Lean IT: Enabling and Sustaining Your Lean Transformation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Authors:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Mike Orzen, Steven Bell&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DevOps without Lean becomes automation theater.&lt;/p&gt;

&lt;p&gt;Lean IT teaches systems thinking.&lt;/p&gt;

&lt;p&gt;Every delay.&lt;br&gt;
Every handoff.&lt;br&gt;
Every unnecessary approval.&lt;/p&gt;

&lt;p&gt;That’s waste.&lt;/p&gt;

&lt;p&gt;Architects remove friction before automating it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Book: The Journey to DevOps – A Testing Perspective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Author: Chris Riley&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This phase sharpens your quality mindset.&lt;/p&gt;

&lt;p&gt;DevOps is incomplete without testing strategy.&lt;/p&gt;

&lt;p&gt;Automation without validation is chaos at scale.&lt;/p&gt;

&lt;p&gt;This book reinforces that DevOps maturity includes strong testing culture and continuous validation.&lt;/p&gt;

&lt;p&gt;Architects design reliability into the system — not after it breaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Difference comes from Long-form reading:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It Builds pattern recognition, Strengthens systems thinking, Improves strategic communication , Develops architectural intuition&lt;/p&gt;

&lt;p&gt;Most engineers consume snippets.&lt;br&gt;
Architects build frameworks.&lt;/p&gt;

&lt;p&gt;These Seven books.&lt;br&gt;
(May be in Twelve months?)&lt;/p&gt;

&lt;p&gt;That’s the blueprint.&lt;/p&gt;

&lt;p&gt;By committing to this roadmap, you move from:&lt;/p&gt;

&lt;p&gt;Tool operator&lt;br&gt;
  to&lt;br&gt;
  Systems thinker&lt;br&gt;
  to&lt;br&gt;
  Strategic DevOps Architect&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Most engineers collect certifications&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Architects collect mental models.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Choose wisely.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(I completed some. The rest are scheduled — long before the final production shutdown)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>containers</category>
      <category>kubernetes</category>
      <category>ai</category>
    </item>
    <item>
      <title>My Accidental 20-Year DevOps Journey : from Cruise Control to Cloud Native</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Mon, 16 Feb 2026 04:49:48 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/from-cruisecontrol-to-cloud-native-my-accidental-20-year-devops-journey-2kgc</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/from-cruisecontrol-to-cloud-native-my-accidental-20-year-devops-journey-2kgc</guid>
      <description>&lt;h2&gt;
  
  
  **Or: How I Learned to Stop Worrying and start living with Pipelines
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2007.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I was there, typing away in a dimly lit office, surrounded by the gentle hum of servers that were actually in the same building (kids, ask your parents about "server rooms").&lt;/p&gt;

&lt;p&gt;My tools of the trade? CruiseControl (bless its XML-filled heart). Ant scripts that looked like ancient scrolls. ClearCase—the version control system that required a PhD in theoretical physics and the patience of a saint. And good old SVC, because Git was still just a twinkle in Linus Torvalds' eye.&lt;/p&gt;

&lt;p&gt;Back then, we called it "Build Release and Management." BRM. It sounded like a mild skin condition or perhaps a small-town accounting firm. Nobody outside our immediate team knew what we did. When people asked my job title, I'd say "I handle builds" and watch their eyes glaze over faster than a Windows 98 boot screen.&lt;/p&gt;

&lt;p&gt;I had absolutely zero idea that I was standing at the foot of a mountain that would consume the next two decades of my professional life—and fundamentally reshape how the entire world builds software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Accidental Pioneer:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the thing about being "early" to something: you don't know it's early. You just know you're tired of manually deploying code at 2 AM while the developer who broke the build sleeps peacefully, dreaming of clean compilations.&lt;br&gt;
We weren't trying to start a revolution. We were just trying to get CruiseControl to send emails that weren't caught by the corporate spam filter.&lt;br&gt;
But somewhere between wrestling with ClearCase branching strategies and writing Ant targets that would make a masochist wince, something was happening. The seeds were being planted. The industry was slowly realizing: "Wait, maybe the people who write code and the people who run it should probably... talk to each other?"&lt;br&gt;
Revolutionary stuff, I know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Unstoppable Tidal Wave&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then DevOps happened. Or rather, DevOps happened to us.&lt;br&gt;
Suddenly, everyone cared about what we did. Developers wanted to know about deployment pipelines. Ops wanted to understand the build process. Managers started using words like "synergy" and "continuous delivery" in meetings, usually incorrectly, but the intent was there!&lt;/p&gt;

&lt;p&gt;The tools exploded:&lt;br&gt;
• Jenkins rose from the ashes of Hudson&lt;br&gt;
• Git arrived like a glorious messiah of branching&lt;br&gt;
• Puppet, Chef, Ansible—we could finally script servers like code&lt;br&gt;
• Docker containers (containers! that weren't Solaris Zones!)&lt;br&gt;
• Kubernetes—because one container is lonely, but thousands need a therapist&lt;br&gt;
• Terraform—infrastructure as code, because why should apps have all the fun?&lt;br&gt;
Every few years, just when I thought, "Okay, surely we've automated everything now," the universe would respond: "Hold my beer."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From BRM Newbie to DevSecOps Eng. Lead&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast forward to 2026. Two decades later:&lt;/p&gt;

&lt;p&gt;I'm now DevSecOps strategist, FinOps Focal, ML Ops Starter, AI OPS enthusiast, Forced Innovationist across multiple Platforms. &lt;/p&gt;

&lt;p&gt;The naive BRM learner who once celebrated getting CruiseControl to trigger a build without crashing now spends days thinking about:&lt;/p&gt;

&lt;p&gt;• Shifting security left—so far left that security is practically in the parking lot before development even starts&lt;/p&gt;

&lt;p&gt;• Platform engineering—building internal developer platforms that feel like magic, but with better documentation&lt;/p&gt;

&lt;p&gt;• Compliance as code—because auditors shouldn't need spreadsheets in 2026&lt;/p&gt;

&lt;p&gt;• MLOps—applying DevOps principles to models that have opinions about cats vs. dogs&lt;/p&gt;

&lt;p&gt;• FinOps—because the cloud isn't actually "infinite," it's just "very large and surprisingly expensive"&lt;/p&gt;

&lt;p&gt;• Cognitive load reduction—fancy term for "making sure my engineers don't quit to become goat farmers"&lt;/p&gt;

&lt;p&gt;The tools have changed. The complexity has multiplied exponentially. But the mission remains surprisingly similar: get good software to users reliably, securely, and without waking anyone up at 2 AM.&lt;/p&gt;

&lt;p&gt;Because We're All Still Here…&lt;/p&gt;

&lt;p&gt;After twenty years, here's what I've learned:&lt;/p&gt;

&lt;p&gt;Lesson 1. Nothing ages faster than "cutting edge."&lt;/p&gt;

&lt;p&gt;I once gave a talk about why Maven was the future. I stand by what I said, but I also stand by my cargo shorts from 2007. Some things should stay in the past.&lt;/p&gt;

&lt;p&gt;Lesson 2. The more things change, the more they break.&lt;/p&gt;

&lt;p&gt;We have GitOps, policy-as-code, canary deployments, and chaos engineering. And yet, somewhere today, a developer is pushing directly to main and wondering why prod is on fire. That developer was me in 2008. It might still be me occasionally in 2026.&lt;/p&gt;

&lt;p&gt;Lesson 3. DevOps is still growing because software is still eating the world.&lt;br&gt;
Every industry, every company, every idea eventually becomes software-driven. And software needs to be built, deployed, and run. We're not running out of work anytime soon.&lt;/p&gt;

&lt;p&gt;Lesson 4. The best tool is still the one your team will actually use.&lt;br&gt;
Kubernetes is amazing. So is Bash. So is that weird shell script Frank wrote in 2019 that everyone pretends to understand. The technology matters less than the culture.&lt;/p&gt;

&lt;p&gt;Lesson 5. We're all still learning.&lt;/p&gt;

&lt;p&gt;I've been doing this for twenty years. I still Google basic YAML syntax. I still panic when a pipeline fails. I still celebrate small victories like a deployment that works on the first try.&lt;/p&gt;

&lt;p&gt;I have had infinite lessons with finite scars in my DevOps journey.&lt;/p&gt;

&lt;p&gt;To start with my 'epiphany' during my DevOps dark days, I would refer below books for 'Serious only' DevOps enthusiasts.&lt;/p&gt;

&lt;p&gt;Patrick Debois -   The DevOps Handbook&lt;br&gt;
Gene Kim -          The Phoenix Project, The DevOps Handbook&lt;br&gt;
Jez Humble -        Continuous Delivery, The DevOps Handbook&lt;br&gt;
John Willis -       The DevOps Handbook, Docker tutorial series&lt;br&gt;
James Turnbull-  The Docker Book, The Art Of Monitoring&lt;br&gt;
Nicole Forsgren- State of DevOps Report, The Data on DevOps&lt;br&gt;
Alan Shimel-        Founder DevOps.com &amp;amp; DevOpsInstitute.com&lt;br&gt;
Mike Orzen -        Lean IT: Enabling and Sustaining Your Lean Transformation, Field Guide&lt;br&gt;
Chris Riley -       DevOps.com,  The Journey to DevOps – A Testing Perspective&lt;br&gt;
Sean Hull -         Authors AWS, databases, scalability, and the cloud&lt;/p&gt;

&lt;p&gt;What's Next?&lt;/p&gt;

&lt;p&gt;If someone told me in 2007 that I'd still be doing this in 2026, writing blogs about DevSecOps and platform engineering, I'd have laughed. Then asked if ClearCase finally added Git integration. (It didn't. It really didn't.)&lt;/p&gt;

&lt;p&gt;But here we are. DevOps isn't a job title anymore—it's how software gets made. It's not a team—it's a culture. It's not a trend—it's the baseline.&lt;/p&gt;

&lt;p&gt;And the best part? It's still growing. Still evolving. Still full of problems to solve and puzzles to untangle.&lt;/p&gt;

&lt;p&gt;To the BRM newbies, the DevOps engineers, the platform builders, the SREs, the release managers, and everyone who's ever spent four hours debugging a YAML indentation issue:&lt;/p&gt;

&lt;p&gt;Welcome. The journey is weird, wonderful, and absolutely nowhere near finished.&lt;br&gt;
Come for the automation. Stay for the people. And never, ever trust a deployment on a Friday afternoon.&lt;/p&gt;




&lt;p&gt;A Former BRM Enthusiast, Current YAML Survivor&lt;/p&gt;

&lt;p&gt;P.S. - If anyone needs me, I'll be writing Ant scripts for old times' sake. Just kidding. I'm not a masochist.&lt;/p&gt;

</description>
      <category>career</category>
      <category>cicd</category>
      <category>devjournal</category>
      <category>devops</category>
    </item>
    <item>
      <title>Kubernetes Advanced Scheduling ( Hidden gems of Kubernetes )</title>
      <dc:creator>suresh devops</dc:creator>
      <pubDate>Sun, 15 Feb 2026 12:40:49 +0000</pubDate>
      <link>https://dev.to/suresh_devops_ffa0728a190/kubernetes-advanced-scheduling-hidden-gems-of-kubernetes-1--29l9</link>
      <guid>https://dev.to/suresh_devops_ffa0728a190/kubernetes-advanced-scheduling-hidden-gems-of-kubernetes-1--29l9</guid>
      <description>&lt;p&gt;Kubernetes is often described as a scheduler’s operating system. The default scheduler (kube-scheduler) does an excellent job of placing pods on nodes based on basic resource requests and limits. However, in complex, production-grade environments, the default "fit and spread" logic is often not enough.&lt;/p&gt;

&lt;p&gt;While Custom Resource Definitions (CRDs) and Operators get most of the spotlight in the ecosystem, the control plane itself hides a treasure trove of powerful scheduling levers. Here is a deep dive into the advanced scheduling features that separate a functional cluster from a finely-tuned, production-ready one.&lt;/p&gt;

&lt;p&gt;Problem 1: Pod Topology Spread Constraints: Orchestrating Disaster Recovery&lt;/p&gt;

&lt;p&gt;The Problem:&lt;br&gt;
By default, a ReplicaSet ensures a certain number of replicas are running, but it doesn't care where they run. In a cloud environment, if all pods land on the same Availability Zone (AZ) and that zone fails, you experience a full outage. Similarly, if pods are packed onto the same node, a node failure takes out the entire service.&lt;/p&gt;

&lt;p&gt;The Solution:&lt;br&gt;
Pod Topology Spread Constraints allow you to enforce strict or best-effort distribution rules across arbitrary failure domains (e.g., zones, nodes, or even custom host labels).&lt;/p&gt;

&lt;p&gt;How it works:&lt;br&gt;
You define a topologySpreadConstraints field in your Pod spec. You specify:&lt;br&gt;
• topologyKey : The label key on nodes that defines the domain (e.g., topology.kubernetes.io/zone).&lt;br&gt;
• maxSkew : The maximum allowable difference in the number of pods across domains.&lt;br&gt;
• whenUnsatisfiable : What to do if the skew can't be met (DoNotSchedule vs ScheduleAnyway).&lt;/p&gt;

&lt;p&gt;Technical Deep Dive:&lt;br&gt;
Unlike PodAffinity/AntiAffinity, which are binary (must be/not be), Spread Constraints are quantitative. They look at the distribution delta.&lt;br&gt;
• Use Case 1: Strict HA: You can ensure that if you have 3 zones, a deployment of 6 pods is scheduled exactly 2 per zone. If a zone is unhealthy and a pod reschedules, the scheduler will wait until the zone recovers or another pod moves to maintain balance.&lt;br&gt;
• Use Case 2: Rolling Updates: During a rolling update, new pods are created. Without spread constraints, the scheduler might fill up one zone first to bin-pack. With spread constraints, the new pods are spread evenly from the start, maintaining balance during the transition.&lt;/p&gt;

&lt;p&gt;Problem 2. Pod Overhead: Accounting for the Invisible Resources&lt;/p&gt;

&lt;p&gt;The Problem:&lt;br&gt;
When using "microVMs" (Kata Containers, gVisor) or sidecar-heavy meshes (Istio), the user container is not the only thing consuming resources. The runtime shim or the sidecar proxy consumes CPU and memory before the main process starts. If the scheduler ignores this, it will overcommit the node, leading to throttling or node pressure.&lt;/p&gt;

&lt;p&gt;The Solution:&lt;br&gt;
Pod Overhead is a feature used primarily with RuntimeClasses. It allows you to define the resources consumed by the infrastructure (the runtime) per pod.&lt;/p&gt;

&lt;p&gt;How it works:&lt;br&gt;
You define a RuntimeClass that includes an overhead field. Any pod using that RuntimeClass automatically adds this overhead to its scheduling calculations.&lt;/p&gt;

&lt;p&gt;Technical Deep Dive:&lt;br&gt;
Scheduling is a math problem. The scheduler sums pod.spec.containers[*].resources.requests to determine node fit.&lt;br&gt;
Pod Overhead injects an additional "invisible container" into this calculation.&lt;/p&gt;

&lt;p&gt;• Example: A Kata container might need 50MB of memory and 5% CPU for the VM kernel and agent. The user requests 512MB for their app. The scheduler will see a total demand of 562MB. Without this, the node would be overprovisioned, and the VM might crash.&lt;br&gt;
• Monitoring Impact: This also affects kubectl top node. The "allocatable" resources now account for this overhead, giving a more accurate picture of node utilization.&lt;/p&gt;

&lt;p&gt;Problem 3. Scheduler Profiles &amp;amp; Extenders: Custom Logic Without Custom Code&lt;/p&gt;

&lt;p&gt;The Problem:&lt;br&gt;
You need a specific scheduling rule (e.g., "Don't schedule GPU pods on nodes with Spot instances," or "Prefer nodes with SSDs for databases"). Rewriting the entire Kubernetes scheduler from scratch is a daunting and fragile task.&lt;/p&gt;

&lt;p&gt;The Solution:&lt;br&gt;
Scheduler Profiles (introduced in v1.18) and Scheduler Extenders (legacy but powerful) allow you to inject custom logic into the scheduling pipeline.&lt;br&gt;
• Scheduler Profiles (Multi-point): Allow you to run multiple scheduling configurations in parallel. You can configure which set of plugins (default or custom) run for specific pods.&lt;br&gt;
• Scheduler Extenders: A process external to the scheduler that acts as a "webhook" for scheduling. The scheduler sends it a list of filtered nodes, and the extender filters or prioritizes them further.&lt;/p&gt;

&lt;p&gt;Technical Deep Dive:&lt;br&gt;
The scheduling cycle is split into phases: Filtering (Predicates), Scoring (Priorities), and Binding.&lt;br&gt;
• Multi-scheduling: With Profiles, you could have one profile for general workloads that bin-packs tightly, and another profile for critical workloads that spreads thinly across nodes.&lt;br&gt;
• Extenders: Imagine you have a hardware accelerator connected via USB to some nodes. The scheduler doesn't know about USB devices. An extender can look at the pod annotation, check an inventory database, and filter out nodes that don't have the USB device plugged in, allowing the pod to land only on physically capable hardware.&lt;/p&gt;

&lt;p&gt;Problem 4. NodeResourceFit with Pod Overhead: The Hidden Math&lt;/p&gt;

&lt;p&gt;The Problem:&lt;br&gt;
While we covered Pod Overhead, it exists in isolation. The real magic happens when the scheduler's NodeResourceFit plugin interacts with it. Many engineers assume that if they set Pod Overhead, the scheduler just "adds it." But understanding how it adds it reveals potential pitfalls.&lt;/p&gt;

&lt;p&gt;The Solution:&lt;br&gt;
The NodeResourceFit plugin is the component that checks if a node has enough resources. Its integration with Pod Overhead ensures that overhead is treated as a first-class citizen during the Filtering and Scoring phases.&lt;/p&gt;

&lt;p&gt;Technical Deep Dive:&lt;br&gt;
There is a nuance here regarding Scoring. The scoring algorithm usually calculates a score based on the ratio of pod requests to node allocatable resources. With Pod Overhead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Total Pod Compute: (Sum of Container Requests) + (Pod Overhead)&lt;/li&gt;
&lt;li&gt; Node Consumption Calculation: When scoring, the scheduler looks at the current node usage + Total Pod Compute.&lt;/li&gt;
&lt;li&gt; MostRequested vs LeastRequested: If you are using MostRequested (bin packing) strategy, the inclusion of overhead means the scheduler will actually pack nodes tighter because it accounts for the "wasted" overhead resource, ensuring the user payload is dense relative to the total claimed resources. If you forget this, your bin-packing algorithm will be inaccurate by the margin of your overhead, potentially leaving CPU on the table.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Conclusion :&lt;/p&gt;

&lt;p&gt;These scheduling features represent the difference between "running Kubernetes" and "engineering Kubernetes." By leveraging Topology Spread Constraints, you ensure business continuity. By using Pod Overhead, you maintain financial and operational accuracy in mixed runtime environments. And by utilizing Scheduler Profiles, you unlock the ability to tailor the control plane to your specific hardware and business logic without fighting the upstream project.&lt;/p&gt;

&lt;p&gt;The scheduler is not a black box; it is a configurable engine. These "hidden gems" are the keys to unlocking its full potential.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>containers</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
