<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Avinash Goyal on Medium]]></title>
        <description><![CDATA[Stories by Avinash Goyal on Medium]]></description>
        <link>https://medium.com/@avinashgoyal_91684?source=rss-6269ce7a2be4------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*L6KYF69lJbqhCLzhGElleQ.jpeg</url>
            <title>Stories by Avinash Goyal on Medium</title>
            <link>https://medium.com/@avinashgoyal_91684?source=rss-6269ce7a2be4------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 27 May 2026 23:55:19 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@avinashgoyal_91684/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Accelerating Delivery Excellence with DevOps-infused Agile Release Train (ART)]]></title>
            <link>https://faun.pub/accelerating-delivery-excellence-with-devops-infused-agile-release-train-art-73cf0d9e821f?source=rss-6269ce7a2be4------2</link>
            <guid isPermaLink="false">https://medium.com/p/73cf0d9e821f</guid>
            <category><![CDATA[continuous-delivery]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[continuous-integration]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[agile-release-train]]></category>
            <dc:creator><![CDATA[Avinash Goyal]]></dc:creator>
            <pubDate>Mon, 27 Nov 2023 00:14:15 GMT</pubDate>
            <atom:updated>2023-12-06T18:02:06.868Z</atom:updated>
            <content:encoded><![CDATA[<p>In the fast-paced realm of Agile development, where synchronization and automation are key, managing an <strong>Agile Release Train (ART)</strong> with multiple delivery teams is a formidable challenge. Picture this: multiple delivery teams, each fervently working towards their respective business objectives, yet intricately interconnected by shared applications. The need to Plan, Develop, Test, and Release together became not just a preference but a necessity — an urgency to accelerate our delivery cycle.</p><p><strong>Why ART and DevOps Matter:</strong><br>In the complex landscape of modern software development, the challenges of multiple teams working on shared applications require a transformative approach. Here’s why <strong>Agile Release Train (ART) with DevOps</strong> emerged as not just a solution but the only solution.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lUbXuooYbe42iS31gsbO9w.png" /></figure><p>At <strong>Landmark Group</strong>, our journey with Agile Release Train (ART) has been a transformative experience, and after a considerable period of implementation, I would like to share my key thoughts based on my personal experience:</p><p><strong>1. Seamless Collaboration:</strong><br>ART brings together cross-functional teams into a cohesive unit. This structure encourages seamless collaboration, breaking down silos and fostering a shared understanding of business objectives. As part of ART meet, cross-functional teams comes together and discuss, align and collaborate on the features to be released to production.</p><p><strong>2. Accelerated Delivery Cycle:</strong><br>The time-boxed nature of ART, coupled with DevOps practices, accelerates the entire development lifecycle. Continuous Integration and Continuous Deployment ensure that code moves swiftly from development to production. Automated builds and deployments helps the engineering team to execute multiple executions during the day to validate latest changes.</p><p><strong>3. Synchronized Planning:</strong><br>PI Planning sessions within ART synchronize the efforts of all teams, providing a dedicated forum for planning, alignment, and prioritization. This ensures that every team is marching to the same beat. With Program Increment, teams get a quarterly backlog that they need to release in 4–6 sprints and that is where ART plays an important role in synchronization between multiple agile teams.</p><p><strong>4. Efficient Handling of Dependencies:</strong><br>DevOps practices integrated into the ART process efficiently manage dependencies. Teams can work concurrently without bottlenecks, reducing wait times and enhancing overall productivity.</p><p><strong>5. Continuous Feedback and Improvement:</strong><br>The Inspect and Adapt (I&amp;A) workshops within ART, fueled by DevOps metrics, create a culture of continuous improvement. This iterative feedback loop ensures that the development process is refined with each cycle.</p><p><strong>6. Quality Assurance Through Automation:</strong><br>Automated testing, an integral part of DevOps, ensures that the quality of deliverables is maintained throughout the development lifecycle. This minimizes the risk of defects and enhances overall software reliability. Automated regression and performance suite minimizes the manual effort, saves time and ensure product build is of high quality.</p><p><strong>7. Security as an Inseparable Component:</strong><br>DevOps practices embed security seamlessly into the development pipeline. The concept of ‘Security as Code’ ensures that security is not an afterthought but an integral part of every development stage. Plugins like Sonarlint that easily integrates with IDE and Sonarqube helps ensure code is good from quality and security standpoint.</p><p><strong>8. Proactive Monitoring for Predictive Action:</strong><br>Real-time monitoring, a crucial component of DevOps, provides insights into system health and performance. This proactive approach allows teams to identify and address issues before they escalate. With use of Observability platforms like Appdynamics, Dynatrace, one can detect health and performance issues and improve.</p><p><strong>Conclusion:</strong><br>In facing the challenge of multiple delivery teams collaborating on shared applications, the Agile Release Train with DevOps emerged as the optimal solution. This integrated approach not only addresses the challenge head-on but brings forth a new era of efficiency, collaboration, and accelerated value delivery.</p><p><strong>Closing Thoughts:</strong><br>In the intricate dance of Agile and DevOps, the collaboration of multiple Agile delivery teams within an ART is not just a response to a challenge — it’s a strategic move towards sustained success. As your organization evolves, so too will this <strong>DevOps-infused ART</strong>, orchestrating DevOps harmony and driving success at scale.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*0rM_F_9XoS3sP5GW.png" /></figure><h4>👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇</h4><h4>🚀<a href="http://from.faun.to/r/8zxxd">Join FAUN Developer Community &amp; Get Similar Stories in your Inbox Each Week</a></h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=73cf0d9e821f" width="1" height="1" alt=""><hr><p><a href="https://faun.pub/accelerating-delivery-excellence-with-devops-infused-agile-release-train-art-73cf0d9e821f">Accelerating Delivery Excellence with DevOps-infused Agile Release Train (ART)</a> was originally published in <a href="https://faun.pub">FAUN.dev() 🐾</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[FinOps Cookbook for Kubernetes]]></title>
            <link>https://faun.pub/finops-cookbook-for-kubernetes-f99c490a93d3?source=rss-6269ce7a2be4------2</link>
            <guid isPermaLink="false">https://medium.com/p/f99c490a93d3</guid>
            <category><![CDATA[finops]]></category>
            <category><![CDATA[kubecost]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Avinash Goyal]]></dc:creator>
            <pubDate>Tue, 18 Jul 2023 09:20:56 GMT</pubDate>
            <atom:updated>2023-07-18T11:30:33.822Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4EeiCvUWwuHVVCyer6SSkg.png" /><figcaption>FinOps phases</figcaption></figure><p>Elasticity, Scalability and Resiliency are some of the most common enablers today to host microservices on Kubernetes platform but as the saying goes with great power comes the responsibilities and the challenges that gives birth to increased cost.</p><p><strong>Challenges</strong></p><p>Let’s understand why Kubernetes is so complex when it comes to cost optimization:</p><ol><li>Shared compute resources — Applications are packaged in pods and run in shared compute resources. The monthly bill from the cloud provider will not give visibility at pod level and thus becomes a black hole for us.</li><li>Right sizing of pods — If the pods are not sized with right requests and limits, this will have a direct impact to node being under utilized and paying for unused resources.</li><li>Right sizing of persistent volumes — Cost will increase if the persistent volumes are not rightly sized.</li><li>Unclaimed resources — Over a period of time, there are many unclaimed volumes and unassigned resources exist in the cluster which are lying there and burning cost without being in use.</li></ol><p>We embarked on migrating our microservices to Kubernetes two years back and we realized the cost is increasing year on year and we now need to put our prime focus on Kubernetes cost optimization and governance to ensure resources are efficiently getting utilized and insights are available for continuous tracking of unused resources.</p><p><strong>Solution</strong></p><p>We break this journey into two phases:</p><p><strong>Phase I</strong></p><p>As part of first phase, our focus is to look for a solution which not only gives the insights of our cost usage but also provides recommendations on what needs to be done. After exploring multiple options, we decided to go with <a href="https://www.kubecost.com/">Kubecost</a>.</p><p>Why Kubecost?</p><ol><li>Provides complete visibility of Kubernetes spend through cost allocation, optimization recommendations and governance (Picture 1).</li><li>Provides estimated savings against key recommendations (Picture 2 and 3).</li><li>Fully on-premise deployment, doesn’t require to egress any data to a remote service</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7yUPkP9dLchODuZYXEZbDg.png" /><figcaption>Picture 1 — Overview page</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2VjlyZkReXB5Yub6rohahg.png" /><figcaption>Picture 2 — Savings page</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P9BkiOGgUJNVscG8_Rs2fA.png" /><figcaption>Picture 3 — Recommendation page</figcaption></figure><p>We were surprised to see the overall Kubernetes spend was drastically reduced by <strong>44%</strong>.</p><p><strong>Phase II</strong></p><p>Once we right-sized the resources and cleaned up the abandoned and unclaimed resources, we realize there is further scope of cost optimization by running the non-prod kubernetes clusters with zero to minimal load during non-business hours.</p><p>To achieve this, we need a solution that can scale down the pods in a cluster and with cluster auto-scaler reduces the number of worker nodes during non-business hours and again scale the pods and bring back the worker nodes to its original state during business hours.</p><p>With <a href="https://kube-green.dev/">Kube-green</a>, we were able to suspend pods and scale down our kubernetes cluster during non-business hours.</p><p>Kube-green to summarize is a Kubernetes controller that defines a Custom Resource Definition called SleepInfo which decides when to stop and start the pods in a namespace. We decided to suspend pods for 8 hours on weekdays and full days on weekend.</p><p>This helped in further reduction by <strong>16%</strong> making the overall cost reduction by <strong>53%</strong>.</p><p><strong>Conclusion</strong></p><p>Cost governance and optimization are the primary needs for organization today that runs their modern application workloads on Kubernetes. While elasticity, scalability and resiliency are some of the key strengths but leads to over provisioning of resources resulting in excessive spending and increased cost. With lack of visibility on how pods are efficiently consumed within the Kubernetes cluster it remains a primary challenge to get insights and manage overall costs. Tools like Kubecost and Kube-green provides the right FinOps solutions to control pod level consumption for efficient cost monitoring and governance.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*ayFZ20zExMFQT54t.png" /></figure><h4>👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇</h4><h4>🚀<a href="http://from.faun.to/r/8zxxd">Join FAUN Developer Community &amp; Get Similar Stories in your Inbox Each Week</a></h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f99c490a93d3" width="1" height="1" alt=""><hr><p><a href="https://faun.pub/finops-cookbook-for-kubernetes-f99c490a93d3">FinOps Cookbook for Kubernetes</a> was originally published in <a href="https://faun.pub">FAUN.dev() 🐾</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Achieving Zero-Downtime deployment in Kubernetes]]></title>
            <link>https://faun.pub/achieving-zero-downtime-deployment-in-kubernetes-9a13ae165949?source=rss-6269ce7a2be4------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a13ae165949</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[graceful-shutdown]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[zero-downtime-deployment]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Avinash Goyal]]></dc:creator>
            <pubDate>Tue, 13 Sep 2022 11:30:07 GMT</pubDate>
            <atom:updated>2022-09-19T10:51:19.905Z</atom:updated>
            <content:encoded><![CDATA[<p>Over the years Kubernetes has become the go to platform for running container workloads. By default, Kubernetes uses <strong>rolling update</strong> strategy for deployments. This strategy aims to prevent downtime ensuring some container instances are up and running at any point in time while performing updates. Old version of containers only gets shutdown after new version of containers are ready to receive live traffic.</p><p>While theoretically this may seem right but there’s a twist. Let’s understand this in detail.</p><h4>Kubernetes Pod Termination Process</h4><p>Before starting with the pod eviction process, let’s understand the two main components of Kubernetes which plays a very important role during the eviction process:</p><p><strong>Kubelet</strong> — Kubelet collects all details of the pod e.g., IP address and report them back to the control plane and continuously polls the control plane for updates.</p><p><strong>Endpoint </strong>— Kube-proxy uses the endpoints to setup iptables rules on the nodes. Every time there is a change to the endpoint, kube-proxy retrieves the new list of IP addresses, ports and configure the new iptables rules.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2FnRX1PqBYBuXE8o.png" /></figure><p>When the pod eviction process is initiated, the API server modifies the pod state in <strong>etcd</strong> database to <strong>Terminating</strong> state. The node’s <strong>kubelet</strong> and <strong>endpoints-controller</strong> continuously monitoring the pod’s state. As soon as they notice the termination state, they start the eviction process in no order (both operations are asynchronous):</p><ol><li>Kubelet sends the <strong>SIGTERM</strong> signal to terminate the pod</li><li>Endpoints-controller handles the endpoint removal process to stop the incoming traffic</li></ol><p>Now here’s the twist.</p><p>If the endpoint removal process finishes before the SIGTERM signal, no new requests will arrive while the containers are terminating (happy path).</p><p>But if the containers start terminating before the endpoint removal process, the containers will continue to receive the requests until the endpoint is removed resulting in <strong>application downtime</strong> as Kubernetes is still routing traffic to the IP address, but the pod is no longer there.</p><h3>Graceful shutdown</h3><p>We need to ensure the pods are terminated gracefully by closing all persistent connections (DB’s, queues. Websockets etc.) and wait for all active requests to drain.</p><p><strong>Solution — Pre-stop hooks</strong></p><p>To achieve graceful shutdown, we need to ensure we handle <strong>SIGTERM </strong>(Signal to terminate the pod)<strong> </strong>and<strong> SIGKILL </strong>(Signal to forcibly kill the pod)<strong> </strong>commands gracefully.</p><p>We can achieve this by implementing pre-stop hooks in the following two ways:</p><ol><li><strong>Adding sleep in the pre-stop hook</strong> — This will pause the pod eviction process and wait for the endpoint removal process which will delay the <strong>SIGTERM </strong>signal and create time for the endpoint removal to propagate. A value between 5–10 seconds will be enough for most of the cases.</li><li><strong>Setting terminationGracePeriodSeconds</strong> — This is the time limit where kubelet will wait before forcibly killing the container. Based on your application and cluster behavior, this can vary between 15–45 seconds.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BFAc-ZbcHf-jEVQC.png" /></figure><p>With the above two options, we can ensure all the in-flights requests are handled gracefully before the pod gets terminated achieving zero downtime.</p><p><strong>Conclusion</strong></p><p>I would like to conclude this blog by stating that pre-stop hooks play a major role in achieving zero downtime in Kubernetes and ensures all the in-flight requests during the pod eviction journey are handled gracefully.</p><p>References:</p><p><a href="https://learnk8s.io/graceful-shutdown">Graceful shutdown and zero downtime deployments in Kubernetes</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*FqmT4fc4qdwk2If7.png" /></figure><p><strong>If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇</strong></p><h4>🚀<a href="http://from.faun.to/r/8zxxd">Read similar stories by joining FAUN</a>.</h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a13ae165949" width="1" height="1" alt=""><hr><p><a href="https://faun.pub/achieving-zero-downtime-deployment-in-kubernetes-9a13ae165949">Achieving Zero-Downtime deployment in Kubernetes</a> was originally published in <a href="https://faun.pub">FAUN.dev() 🐾</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>