<?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>Forem: Abhishek Laha</title>
    <description>The latest articles on Forem by Abhishek Laha (@cloudwithabhi).</description>
    <link>https://forem.com/cloudwithabhi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1686411%2Fc698555f-8d5d-43df-a854-44001e44dd2a.png</url>
      <title>Forem: Abhishek Laha</title>
      <link>https://forem.com/cloudwithabhi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/cloudwithabhi"/>
    <language>en</language>
    <item>
      <title>Google I/O 2025: New Tools, APIs and Everything Devs Need to Know</title>
      <dc:creator>Abhishek Laha</dc:creator>
      <pubDate>Thu, 22 May 2025 05:47:45 +0000</pubDate>
      <link>https://forem.com/cloudwithabhi/google-io-2025-new-tools-apis-and-everything-devs-need-to-know-59ok</link>
      <guid>https://forem.com/cloudwithabhi/google-io-2025-new-tools-apis-and-everything-devs-need-to-know-59ok</guid>
      <description>&lt;p&gt;Google I/O was a landmark event for developers, with the company doubling down on its vision on AI-first software development. This year's announcements were lazer-focussed on empowering builders with new AI models, APIs and tools especially through &lt;strong&gt;Gemini&lt;/strong&gt; platform. Here's a deep dive into the developer-centric innovations unveiled at unveiled at Google I/O 2025.&lt;/p&gt;




&lt;h1&gt;
  
  
  Gemini 2.5: Smarter, Faster, and More Controllable
&lt;/h1&gt;

&lt;p&gt;The centerpiece of Google’s developer story is the Gemini 2.5 family of AI models. Gemini 2.5 Pro, now featuring the advanced "Deep Think" mode, enables the model to consider multiple hypotheses before responding. It dramatically boosted its performance on complex coding and math tasks. This upgrade positions Gemini at the top of industry benchmarks, with significant improvements in reasoning and accuracy.&lt;/p&gt;

&lt;p&gt;Gemini 2.5 Flash, the more efficient sibling, has also been enhanced for better reasoning, multimodality, coding, and long-context capabilities. It delivers near-Pro performance while using 20–30% fewer tokens, making it ideal for cost-sensitive applications.&lt;/p&gt;

&lt;p&gt;Developers now have more transparency and control over how Gemini models operate. Features like "thought summaries" help explain model decisions, and the upcoming "thinking budgets" will allow fine-tuning of cost and response quality.&lt;/p&gt;




&lt;h1&gt;
  
  
  Gemini API and Google AI Studio: Rapid Prototyping and Agentic Apps
&lt;/h1&gt;

&lt;p&gt;Google AI Studio, now integrated with Gemini 2.5 Pro, is the fastest environment for evaluating models and building with the Gemini API. The platform’s native code editor and GenAI SDK let developers instantly generate web apps from text, images, or video prompts. Starter apps and templates help jumpstart projects, while new generative media models like Imagen and Veo expand creative possibilities.&lt;/p&gt;

&lt;p&gt;A major leap is the ability to build "agentic" experiences. With Gemini’s advanced reasoning, developers can create agents that understand context, perform tasks, and even browse the web using the new Computer Use API. The experimental URL Context feature lets Gemini pull full-page context from URLs, making it far easier to build assistants and research tools.&lt;/p&gt;

&lt;p&gt;Gemini SDKs are also adopting the Model Context Protocol (MCP), simplifying integration with open-source tools and expanding the ecosystem for agentic applications.&lt;/p&gt;




&lt;h1&gt;
  
  
  Jules Coding Agent: Automating Codebase Tasks
&lt;/h1&gt;

&lt;p&gt;Jules, Google’s new asynchronous coding agent, is now in public beta. Designed to work directly with GitHub repositories, Jules can automate tasks such as version upgrades, writing tests, updating features, and fixing bugs. It operates autonomously on a cloud VM, makes coordinated codebase edits, runs tests, and allows developers to review and merge changes via pull requests. This tool aims to dramatically speed up development cycles and reduce manual coding overhead.&lt;/p&gt;




&lt;h1&gt;
  
  
  Stitch UI Designer: AI-Powered UI Generation
&lt;/h1&gt;

&lt;p&gt;Stitch is an experimental tool that leverages Gemini 2.5 Pro to generate user interface designs and frontend code from natural language or image prompts. Developers and designers can describe their desired application, specify layout or color preferences, and Stitch will produce visual designs and exportable code. It also supports iterative design, allowing multiple variants and seamless export to tools like Figma for further refinement&lt;/p&gt;




&lt;h1&gt;
  
  
  ML Kit GenAI APIs: On-Device AI for Android
&lt;/h1&gt;

&lt;p&gt;Google introduced new ML Kit GenAI APIs powered by Gemini Nano, enabling developers to add intelligent, personalized features to Android apps that run directly on-device. A showcase app, Androidify, demonstrates how users can create personalized Android robots from selfies, illustrating the creative potential of these new APIs.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building Across Platforms: Android, Web, and XR
&lt;/h1&gt;

&lt;p&gt;While AI took center stage, Google reinforced its commitment to cross-platform development:&lt;/p&gt;

&lt;p&gt;Android: The new Material Three Expressive design system (announced pre-I/O) and deep Gemini integration in Android Studio streamline app creation and testing.&lt;/p&gt;

&lt;p&gt;Web: Chrome 135 introduces new CSS primitives for interactive UI elements, while the Interest Invoker API enables advanced UI without JavaScript.&lt;/p&gt;

&lt;p&gt;XR and Spatial Computing: Google previewed advancements in Android XR, supporting immersive experiences and spatial devices, and teased new smart glasses and 3D video calling via Project Astra and Google Beam.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary Table: Key Developer-Focused Features
&lt;/h1&gt;

&lt;p&gt;Here's a summary for all the above unveiled features and releases.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature/Tool&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;Gemini 2.5 Pro &amp;amp; Flash&lt;/td&gt;
&lt;td&gt;Advanced AI models with improved reasoning, multimodality, audio-visual input/output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini API &amp;amp; SDK&lt;/td&gt;
&lt;td&gt;Rapid prototyping, URL Context, MCP support, GenAI SDK for app generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jules Coding Agent&lt;/td&gt;
&lt;td&gt;Asynchronous coding agent for automating codebase tasks via GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stitch UI Designer&lt;/td&gt;
&lt;td&gt;AI-powered UI design and code generation tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini in Android Studio&lt;/td&gt;
&lt;td&gt;AI coding companion, Journeys for testing, Version Upgrade Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML Kit GenAI APIs&lt;/td&gt;
&lt;td&gt;On-device AI APIs for Android apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome/Web APIs&lt;/td&gt;
&lt;td&gt;New CSS primitives for carousels, Interest Invoker API for advanced UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android XR &amp;amp; Beam&lt;/td&gt;
&lt;td&gt;Tools and APIs for spatial computing, 3D video calls, and XR device support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  The Future: Open, Powerful, and Accessible AI
&lt;/h1&gt;

&lt;p&gt;Google’s I/O 2025 developer announcements mark a shift toward open, accessible, and highly capable AI for everyone building the next generation of apps. With Gemini 2.5’s reasoning power, multimodal capabilities, and new APIs, developers can now create smarter, more adaptive, and more human-like software than ever before.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We believe developers are the architects of the future. That’s why Google I/O is our most anticipated event of the year, and a perfect moment to bring developers together and share our efforts for all the amazing builders out there.”&lt;br&gt;
— Google AI Team&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From agentic assistants to creative media apps and immersive XR experiences, Google has put the tools of tomorrow’s software in developers’ hands today.&lt;/p&gt;

&lt;p&gt;What do you think about the announcements made by Google at Google I/O 2025? Let me know in the comments. Thanks for visiting and stay tuned for the next one. Until then, keep learning and stay secure! &lt;/p&gt;

</description>
      <category>google</category>
      <category>android</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>Kubernetes Ingress Essentials: Setup, Routing, Annotations and Best Practices</title>
      <dc:creator>Abhishek Laha</dc:creator>
      <pubDate>Thu, 01 May 2025 18:42:05 +0000</pubDate>
      <link>https://forem.com/cloudwithabhi/kubernetes-ingress-essentials-setup-routing-annotations-and-best-practices-5163</link>
      <guid>https://forem.com/cloudwithabhi/kubernetes-ingress-essentials-setup-routing-annotations-and-best-practices-5163</guid>
      <description>&lt;p&gt;As you start exposing your services in Kubernetes beyond the cluster, Ingress becomes a powerful resource to manage external access. In this article, we’ll break down the Ingress Controller, how it works, how to set it up, and what to avoid while working with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an Ingress Controller?
&lt;/h2&gt;

&lt;p&gt;In Kubernetes, Services expose your application internally (ClusterIP) or externally (NodePort/LoadBalancer). But when you need a smarter routing mechanism (like routing based on host or path), that’s where Ingress and Ingress Controllers come in.&lt;/p&gt;

&lt;p&gt;An Ingress is a Kubernetes object that defines how traffic should be routed to your services. However, it does nothing on its own — it needs an Ingress Controller to fulfill the routing rules defined in the Ingress resource.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ingress resource = Routing rules&lt;/li&gt;
&lt;li&gt;Ingress Controller = The engine that applies those rules using a reverse proxy (like NGINX, Traefik, HAProxy, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Key Components You Should Know
&lt;/h2&gt;

&lt;p&gt;Here are some core terms to get comfortable with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ingress Resource: Declares HTTP/S routing rules (host/path based).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ingress Controller: The actual implementation that listens to the Ingress resources and configures a reverse proxy accordingly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backend Service: The Kubernetes Service that receives the traffic routed by the Ingress Controller.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Annotations: Often used to enable advanced features like rewrites, SSL redirects, and timeouts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up an Ingress Controller (NGINX Example)
&lt;/h2&gt;

&lt;p&gt;Let’s walk through a simple example using the popular NGINX Ingress Controller.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Install the Ingress Controller
&lt;/h4&gt;

&lt;p&gt;For Minikube:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube addons &lt;span class="nb"&gt;enable &lt;/span&gt;ingress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For general Kubernetes (using Helm):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm &lt;span class="nb"&gt;install &lt;/span&gt;ingress-nginx ingress-nginx/ingress-nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Deploy Your Services
&lt;/h4&gt;

&lt;p&gt;Assume you have two deployments &lt;strong&gt;app1 and app2&lt;/strong&gt; each exposed via a ClusterIP service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create deploy app1 &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx
kubectl expose deploy app1 &lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80 &lt;span class="nt"&gt;--target-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80

kubectl create deploy app2 &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;httpd
kubectl expose deploy app2 &lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80 &lt;span class="nt"&gt;--target-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Create an Ingress Resource
&lt;/h4&gt;

&lt;p&gt;Here’s how you can define routing rules for both apps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo-ingress&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Add your domain here if present&lt;/span&gt;
  &lt;span class="c1"&gt;# - host: myapps.local &lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/app1&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
        &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app1&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/app2&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
        &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app2&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; ingress.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Useful Annotations and Advanced Configuration
&lt;/h2&gt;

&lt;p&gt;Once your Ingress is working, annotations can help you unlock more powerful features of the Ingress Controller. Below are some practical and commonly used annotations for the NGINX Ingress Controller:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rewrite Target&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful when your backend app doesn't know it's running behind a path prefix.&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;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you forget to rewrite the target or misconfigure the path, you’ll often see 404 errors from your backend.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Force SSL Redirect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redirect all HTTP traffic to HTTPS.&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;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/ssl-redirect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
Be careful when testing locally or using self-signed certs — this can cause redirect loops or unexpected failures if TLS isn’t set up correctly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom Timeout Settings
Control how long the ingress waits before timing out.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/proxy-connect-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/proxy-send-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/proxy-read-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Make sure these timeouts are also reflected in your backend if you want consistent behavior&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Enable CORS (Cross-Origin Resource Sharing)
If your frontend and backend are on different domains/subpaths:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/enable-cors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/cors-allow-origin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Using "*" in production is discouraged for security. Instead, specify allowed origins precisely.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic Authentication
Add HTTP basic auth to your exposed service.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/auth-type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;basic"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/auth-secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;basic-auth"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/auth-realm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authentication&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Required"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Don’t forget to create the basic-auth secret using htpasswd. Without it, requests will fail with a 503.&lt;/p&gt;


&lt;h2&gt;
  
  
  Ingress Configuration Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Use Path-Based Routing Thoughtfully&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Group related paths under a common prefix (/api, /admin, etc.) for easier rewrites.&lt;/li&gt;
&lt;li&gt;Always define pathType as Prefix or Exact explicitly to avoid unintended matches.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use Path-Based Routing Thoughtfully&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Group related paths under a common prefix (/api, /admin, etc.) for easier rewrites.&lt;/li&gt;
&lt;li&gt;Always define pathType as Prefix or Exact explicitly to avoid unintended matches.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avoid Wildcard CORS in Production&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instead of cors-allow-origin: "*", define specific trusted domains.&lt;/li&gt;
&lt;li&gt;This improves security, especially if APIs return sensitive data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use Proper Timeout Settings&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid overly high timeouts, which can tie up Ingress resources.&lt;/li&gt;
&lt;li&gt;Set appropriate proxy timeouts for each app depending on expected response times.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;nginx.ingress.kubernetes.io/proxy-read-timeout: "10"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Limit Exposure Using Authentication&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protect internal services or admin panels using basic auth or JWT-based auth (with external plugins).&lt;/li&gt;
&lt;li&gt;Never expose sensitive apps directly without some form of access control.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use Unique Ingress Names and Hosts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid conflicting hostnames across multiple Ingress resources.&lt;/li&gt;
&lt;li&gt;Prefer centralized or consolidated Ingress configs per domain where possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test with a Local DNS Entry&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use /etc/hosts to map custom domains (like myapp.local) for local testing.&lt;/li&gt;
&lt;li&gt;Always verify behavior in dev/stage environments before deploying to production.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watch Resource Limits&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ingress controllers run as pods — make sure they have CPU/memory limits.&lt;/li&gt;
&lt;li&gt;Monitor their performance, especially under load or when you have many rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use Readiness Probes for Backend Services&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a backend service isn't ready, the Ingress will return 502.&lt;/li&gt;
&lt;li&gt;Ensure your Deployments include health checks so services register properly with the Ingress.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable Rate Limiting for Public Endpoints&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helps prevent abuse and accidental DoS from misbehaving clients.&lt;/li&gt;
&lt;li&gt;Use annotations like:
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;nginx.ingress.kubernetes.io/limit-connections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
&lt;span class="na"&gt;nginx.ingress.kubernetes.io/limit-rpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;60"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Putting It All Together: Full Ingress Example with Advanced Annotations
&lt;/h3&gt;

&lt;p&gt;Here’s a complete example of an Ingress resource that includes the most useful annotations we’ve discussed. This Ingress:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Routes traffic to two apps (app1 and app2) based on path.&lt;/li&gt;
&lt;li&gt;Rewrites paths to match backend expectations.&lt;/li&gt;
&lt;li&gt;Forces SSL redirection.&lt;/li&gt;
&lt;li&gt;Enables CORS.&lt;/li&gt;
&lt;li&gt;Sets custom timeouts.&lt;/li&gt;
&lt;li&gt;Adds basic authentication.&lt;/li&gt;
&lt;li&gt;Uses HTTPS
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a TLS Secret&lt;/span&gt;
kubectl create secret tls myapps-tls-secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cert&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;path/to/tls.crt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;path/to/tls.key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; your-namespace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Replace path/to/tls.crt and tls.key with your actual certificate files&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Apply ingress config&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;advanced-demo-ingress&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-namespace&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/ssl-redirect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/enable-cors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/cors-allow-origin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/proxy-connect-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/proxy-send-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/proxy-read-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/auth-type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;basic"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/auth-secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;basic-auth"&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/auth-realm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authentication&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Required"&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;myapps.local&lt;/span&gt;
    &lt;span class="na"&gt;secretName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapps-tls-secret&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapps.local&lt;/span&gt;
    &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/app1&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
        &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app1&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/app2&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
        &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app2&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt;&lt;br&gt;
Don’t forget to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update your /etc/hosts to map myapps.local to your cluster IP.&lt;/li&gt;
&lt;li&gt;Create the basic-auth secret using htpasswd.&lt;/li&gt;
&lt;li&gt;Ensure TLS is properly configured if using HTTPS in your cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Ingress Controllers are essential for managing external traffic to Kubernetes applications. While the basic setup is straightforward, leveraging advanced annotations gives you fine-grained control over routing, security, and performance.&lt;/p&gt;

&lt;p&gt;By understanding and applying these configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You gain flexibility in how apps are exposed.&lt;/li&gt;
&lt;li&gt;You improve security through TLS and authentication.&lt;/li&gt;
&lt;li&gt;You avoid common pitfalls by configuring timeouts, rewrites, and headers properly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next up: In the upcoming article, we’ll explore how to handle configurations with ConfigMaps, and persistent storage in Kubernetes&lt;/p&gt;

&lt;p&gt;Stay Tuned for the next one. Until then, keep learning and stay secure! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Understanding Pods, Deployments, and Services in Kubernetes</title>
      <dc:creator>Abhishek Laha</dc:creator>
      <pubDate>Thu, 24 Apr 2025 06:23:01 +0000</pubDate>
      <link>https://forem.com/cloudwithabhi/understanding-pods-deployments-and-services-in-kubernetes-2m0i</link>
      <guid>https://forem.com/cloudwithabhi/understanding-pods-deployments-and-services-in-kubernetes-2m0i</guid>
      <description>&lt;p&gt;Kubernetes can feel like a complex ecosystem, but once you understand its building blocks, everything starts to make sense. In this article, we’ll explore the three most fundamental components in Kubernetes: Pods, Deployments, and Services.&lt;/p&gt;

&lt;p&gt;By the end, you’ll have a solid understanding of how your applications are deployed, managed, and exposed in a Kubernetes cluster.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is a Pod?
&lt;/h1&gt;

&lt;p&gt;A Pod is the smallest and most basic deployable unit in Kubernetes. A Pod represents a single instance of a running process in your cluster.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Characteristics:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A Pod can contain one or more containers (usually one).&lt;/li&gt;
&lt;li&gt;Containers in a Pod share:

&lt;ul&gt;
&lt;li&gt;The same network namespace (same IP address and port space).&lt;/li&gt;
&lt;li&gt;The same storage volumes, if defined.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of a Pod as a wrapper around one or more tightly coupled containers that must run together.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Pods?
&lt;/h2&gt;

&lt;p&gt;Pods are useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running a containerized app.&lt;/li&gt;
&lt;li&gt;Grouping helper containers (like logging agents) with the main container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple Pod:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-container&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;nginx:latest&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="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Pod with Volumes, Multiple Containers including init containers and environment variables:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp-pod&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MyApp&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp-container&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;busybox:1.28&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-c'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;The&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;app&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;running!&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sleep&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;3600'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ENVIRONMENT&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CONFIG_FILE&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/config/app.conf"&lt;/span&gt;
      &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-vol&lt;/span&gt;
          &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/config&lt;/span&gt;
  &lt;span class="na"&gt;initContainers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;init-myservice&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;busybox:1.28&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-c'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;until&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;nslookup&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;myservice.$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;do&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;waiting&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;myservice;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sleep&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;done"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;init-mydb&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;busybox:1.28&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-c'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;until&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;nslookup&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;mydb.$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;do&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;waiting&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;mydb;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sleep&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;done"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-vol&lt;/span&gt;
      &lt;span class="na"&gt;configMap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;log-config&lt;/span&gt;
        &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;log_level&lt;/span&gt;
            &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;log_level.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Manifest breakup for better understanding
&lt;/h2&gt;

&lt;p&gt;Here are breakdowns for the components used in the above manifest:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Environment Variables
&lt;/h4&gt;


&lt;pre class="highlight yaml"&gt;&lt;code&gt;   &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DEMO_GREETING&lt;/span&gt;
       &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;environment"&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DEMO_FAREWELL&lt;/span&gt;
       &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Such&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sweet&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sorrow"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;
  
  
  Volumes
&lt;/h4&gt;

&lt;p&gt;Volumes are defined in the &lt;code&gt;volumes&lt;/code&gt; section of the manifest. They can be used/mounted by one or more containers in the Pod.&lt;/p&gt;


&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-vol&lt;/span&gt;
        &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/config&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-vol&lt;/span&gt;
      &lt;span class="na"&gt;configMap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;log-config&lt;/span&gt;
        &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;log_level&lt;/span&gt;
            &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;log_level.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;
  
  
  Init Containers
&lt;/h4&gt;

&lt;p&gt;Init containers are used to perform setup tasks before the main containers in the Pod start.&lt;/p&gt;


&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;initContainers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;init-myservice&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;busybox:1.28&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-c'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;until&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;nslookup&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;myservice.$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;do&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;waiting&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;myservice;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sleep&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;done"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;init-mydb&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;busybox:1.28&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-c'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;until&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;nslookup&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;mydb.$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;do&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;waiting&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;mydb;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sleep&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;done"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  What is a Deployment?
&lt;/h1&gt;

&lt;p&gt;While a Pod is great, it’s &lt;strong&gt;not self-healing&lt;/strong&gt;. If a Pod crashes, it won’t come back automatically. That’s where a Deployment comes in.&lt;/p&gt;

&lt;p&gt;A Deployment is a higher-level abstraction that manages Pods and ReplicaSets for you.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Benefits:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ensures desired state is maintained (e.g., always 3 replicas running).&lt;/li&gt;
&lt;li&gt;Supports rolling updates and rollbacks.&lt;/li&gt;
&lt;li&gt;Automatically replaces failed Pods.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple Deployment:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-deployment&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&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;nginx:1.25&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="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Most of the fields in the Deployment manifest are the same as in a Pod manifest. The key difference is that in a Deployment, you specify the number of replicas you want to run. It is specified in the &lt;code&gt;replicas&lt;/code&gt; field.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment with Volumes, Multiple Containers including init containers and environment variables:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo-app&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared-data&lt;/span&gt;
          &lt;span class="na"&gt;emptyDir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-volume&lt;/span&gt;
          &lt;span class="na"&gt;configMap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo-config&lt;/span&gt;
      &lt;span class="na"&gt;initContainers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;init-myservice&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;busybox&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-c'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Initializing..."&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/mnt/data/init.log'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared-data&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/mnt/data&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo-container&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;nginx:1.25&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="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
          &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ENVIRONMENT&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production"&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CONFIG_FILE&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/config/app.conf"&lt;/span&gt;
          &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared-data&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/share/nginx/html/init&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-volume&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/config&lt;/span&gt;
              &lt;span class="na"&gt;readOnly&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;#configmap-manifest&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ConfigMap&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo-config&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app.conf&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;server {&lt;/span&gt;
      &lt;span class="s"&gt;listen 80;&lt;/span&gt;
      &lt;span class="s"&gt;location / {&lt;/span&gt;
        &lt;span class="s"&gt;return 200 "Hello from ConfigMap!";&lt;/span&gt;
      &lt;span class="s"&gt;}&lt;/span&gt;
    &lt;span class="s"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Some more manifest breakups for better understanding
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Shared Volumes
&lt;/h4&gt;

&lt;p&gt;Same volumes can be shared by multiple containers in a Pod. This is useful for sharing data between containers in the same Pod.&lt;/p&gt;


&lt;pre class="highlight yaml"&gt;&lt;code&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared-data&lt;/span&gt;
          &lt;span class="na"&gt;emptyDir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
      &lt;span class="na"&gt;initContainers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared-data&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/mnt/data&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared-data&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/share/nginx/html/init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;
  
  
  Configmap as volumes
&lt;/h4&gt;

&lt;p&gt;ConfigMaps can be used in two primary ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;As environment variables&lt;/li&gt;
&lt;li&gt;As volumes (mounted files inside your container)
In this example, we've mounted it as a volume -
for configmap manifest, refer to the &lt;code&gt;#configmap-manifest&lt;/code&gt; section in the above manifest.&lt;/li&gt;
&lt;/ol&gt;


&lt;pre class="highlight yaml"&gt;&lt;code&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-volume&lt;/span&gt;
          &lt;span class="na"&gt;configMap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo-config&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-volume&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/config&lt;/span&gt;
              &lt;span class="na"&gt;readOnly&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Once deployed, inside the container you’ll have:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;/etc/config/app.conf
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This config file is then used by the container to configure the application using environment variable.&lt;/p&gt;


&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CONFIG_FILE&lt;/span&gt;
              &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/config/app.conf"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Mounting &lt;strong&gt;ConfigMap&lt;/strong&gt; as a &lt;strong&gt;volume&lt;/strong&gt; makes the config &lt;strong&gt;read-only&lt;/strong&gt; by default, which is a nice security feature.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  What is a Service?
&lt;/h1&gt;

&lt;p&gt;A Service in Kubernetes exposes your Pods to other applications inside (or outside) the cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Services:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;ClusterIP (default): Internal communication only.&lt;/li&gt;
&lt;li&gt;NodePort: Exposes the service on a port on each node.&lt;/li&gt;
&lt;li&gt;LoadBalancer: Exposes the service externally using a cloud provider's load balancer.&lt;/li&gt;
&lt;li&gt;ExternalName: Maps the service to an external DNS name.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example (NodePort):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-service&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePort&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&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="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;nodePort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30007&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will expose your nginx deployment on http://:30007.&lt;/p&gt;




&lt;h1&gt;
  
  
  Putting it All Together: A Practical Example
&lt;/h1&gt;

&lt;p&gt;Here’s an example to deploy Nginx and expose it via a NodePort service.&lt;/p&gt;

&lt;p&gt;🧩 Create the Deployment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create deploy nginx &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧪 Check the Pods&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🌐 Create the Service&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl expose deploy nginx &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx-service &lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30007 &lt;span class="nt"&gt;--target-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80 &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NodePort
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🌍 Access the App&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube service nginx-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;a href="http://minikube-ip:nodePort" rel="noopener noreferrer"&gt;http://minikube-ip:nodePort&lt;/a&gt; in your browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can use &lt;code&gt;kubectl apply -f --dry-run=client -o &amp;lt;file&amp;gt;&lt;/code&gt; to validate manifests before applying.&lt;/li&gt;
&lt;li&gt;You can use &lt;code&gt;kubectl &amp;lt;remaining-command&amp;gt; --dry-run=client -o yaml&lt;/code&gt; to generate a manifest.&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Pods, Deployments, and Services form the core trio of any Kubernetes application.&lt;/p&gt;

&lt;p&gt;Pods are your running containers.&lt;/p&gt;

&lt;p&gt;Deployments manage your Pods at scale and keep them healthy.&lt;/p&gt;

&lt;p&gt;Services make sure your application is reachable—internally or externally.&lt;/p&gt;

&lt;p&gt;Understanding these three concepts is crucial for progressing in your Kubernetes journey. Once you’ve mastered them, you’ll be ready to move on to more advanced topics like ConfigMaps, Secrets, Ingress, Volumes, and beyond.&lt;/p&gt;

&lt;p&gt;Next up: In the upcoming article, we’ll explore Ingress controllers, how to handle configurations with ConfigMaps, and persistent storage in Kubernetes.&lt;/p&gt;

&lt;p&gt;Do let me know in the comments if you wish to see a difference in the content style and type. &lt;/p&gt;

&lt;p&gt;Until then, keep learning and stay secure!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Getting Started with Kubernetes</title>
      <dc:creator>Abhishek Laha</dc:creator>
      <pubDate>Sat, 19 Apr 2025 13:01:52 +0000</pubDate>
      <link>https://forem.com/cloudwithabhi/getting-started-with-kubernetes-27gl</link>
      <guid>https://forem.com/cloudwithabhi/getting-started-with-kubernetes-27gl</guid>
      <description>&lt;p&gt;Kubernetes (often referred to as K8s) has become a staple go-to option for container orchestration. It helps you automate the deployment, scaling, and management of containerized applications.&lt;/p&gt;

&lt;p&gt;In this article, we’ll walk through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is Kubernetes&lt;/li&gt;
&lt;li&gt;Introduction to kubectl&lt;/li&gt;
&lt;li&gt;Local Kubernetes installation options&lt;/li&gt;
&lt;li&gt;Setting up Kubernetes using Minikube (cross-platform)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. What is Kubernetes?
&lt;/h2&gt;

&lt;p&gt;Kubernetes is an open-source platform designed to automate deploying, scaling, and operating containerized applications. Originally developed by Google, it's now maintained by the Cloud Native Computing Foundation (CNCF).&lt;/p&gt;

&lt;p&gt;With Kubernetes, you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy applications consistently&lt;/li&gt;
&lt;li&gt;Manage clusters of containers&lt;/li&gt;
&lt;li&gt;Ensure high availability and scalability&lt;/li&gt;
&lt;li&gt;Perform rolling updates and rollbacks&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Introduction to kubectl
&lt;/h2&gt;

&lt;p&gt;kubectl is the Kubernetes command-line tool. It's used to communicate with the Kubernetes API server, allowing you to interact with and manage your Kubernetes clusters. Think of it as the main way you'll deploy applications, inspect cluster resources, and manage the system.&lt;/p&gt;

&lt;p&gt;Head over to the &lt;a href="https://kubernetes.io/docs/reference/kubectl/overview/" rel="noopener noreferrer"&gt;official Kubernetes documentation&lt;/a&gt; for a comprehensive guide on installing and using kubectl.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Local Kubernetes Installation Options
&lt;/h2&gt;

&lt;p&gt;To run Kubernetes locally for learning or testing, you can use any of the following tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Minikube – Lightweight VM-based or container-based local cluster&lt;/li&gt;
&lt;li&gt;Kind – Runs Kubernetes in Docker containers&lt;/li&gt;
&lt;li&gt;k3s – Lightweight Kubernetes distribution&lt;/li&gt;
&lt;li&gt;Docker Desktop – Includes built-in Kubernetes support (macOS/Windows)&lt;/li&gt;
&lt;li&gt;MicroK8s – Minimal, lightweight Kubernetes from Canonical (Ubuntu)&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;We’ll focus on Minikube in this guide.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Setting Up Kubernetes with Minikube
&lt;/h2&gt;

&lt;p&gt;Minikube sets up a single-node Kubernetes cluster by default on your local machine. It’s beginner-friendly and supports all major OS platforms. It is also capable of running multinde clusters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Minikube
&lt;/h3&gt;

&lt;p&gt;➤ Windows: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Download the Minikube installer from the &lt;a href="https://minikube.sigs.k8s.io/docs/start/" rel="noopener noreferrer"&gt;official website&lt;/a&gt; and run it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alternatively, you can use the Chocolatey package manager:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;choco&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;minikube&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If you're using Winget, you can use the following command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;minikube&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➤ macOS: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install using Binary:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LO&lt;/span&gt; https://github.com/kubernetes/minikube/releases/latest/download/minikube-darwin-amd64
&lt;span class="nb"&gt;sudo install &lt;/span&gt;minikube-darwin-amd64 /usr/local/bin/minikube
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Install using Homebrew package manager:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;minikube
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➤ Linux: Install Minikube using the package manager for your Linux distribution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Using Binary:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LO&lt;/span&gt; https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
&lt;span class="nb"&gt;sudo install &lt;/span&gt;minikube-linux-amd64 /usr/local/bin/minikube &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm &lt;/span&gt;minikube-linux-amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Installation for Debian-based systems (Debian, Ubuntu, etc.):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LO&lt;/span&gt; https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; minikube_latest_amd64.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Installation for Red Hat-based systems (RHEL, CentOS, Fedora, etc.):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LO&lt;/span&gt; https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;-Uvh&lt;/span&gt; minikube-latest.x86_64.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Start Minikube
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Prerequisite: You need a container or VM driver installed (like Docker, VirtualBox, or Hyper-V).&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also specify the driver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube start &lt;span class="nt"&gt;--driver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Verify the Cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see one node in the "Ready" state.&lt;/p&gt;

&lt;p&gt;That’s it!&lt;/p&gt;

&lt;p&gt;You’ve successfully installed Kubernetes locally using Minikube. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Getting started with Kubernetes may seem daunting at first, but with tools like Minikube and kubectl, it's easier than ever to set up a local cluster and begin exploring. Whether you're a developer looking to test your containerized apps, or a DevOps engineer diving into orchestration, Kubernetes offers a powerful platform to scale and manage your workloads efficiently.&lt;/p&gt;

&lt;p&gt;Now that you’ve set up your local environment, you’re ready to dive into the world of Kubernetes.&lt;/p&gt;

&lt;p&gt;In future posts, we’ll dive into deploying applications, creating services, and understanding core components like Pods, Deployments, and Services.&lt;/p&gt;

&lt;p&gt;Thanks for visiting and stay tuned for the next one. Until then, keep learning and stay secure!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Docker vs Podman 2025: The Evolution of Container Orchestration</title>
      <dc:creator>Abhishek Laha</dc:creator>
      <pubDate>Tue, 15 Apr 2025 17:38:29 +0000</pubDate>
      <link>https://forem.com/cloudwithabhi/podman-vs-docker-2025-the-evolution-of-container-orchestration-4mcp</link>
      <guid>https://forem.com/cloudwithabhi/podman-vs-docker-2025-the-evolution-of-container-orchestration-4mcp</guid>
      <description>&lt;p&gt;Since its beginning, container orchestration has come a long way. Organizing containerized workloads in the fast-paced development environment of today requires striking a balance between security, flexibility, and performance in addition to automation. In this article, we'll be comparing the newest features of Docker and Podman and look at how they have adjusted to the shifting DevOps landscape in 2025 as we delve into the ongoing development of container orchestration tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Container Orchestration?
&lt;/h2&gt;

&lt;p&gt;Container orchestration is the process of automating the deployment, management, scaling, and networking of containers throughout their lifecycle, making it possible to deploy software consistently across many different environments at scale.&lt;/p&gt;

&lt;p&gt;Containers, which package an application and its runtime environment together in a self-contained unit, are foundational to cloud native application development. Container orchestration is especially important for enterprises that need to deploy and manage hundreds or thousands of containers and hosts. Most container orchestration solutions are built on Kubernetes, a widely adopted open source platform. &lt;a href="https://www.redhat.com/en/topics/containers/what-is-container-orchestration" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Docker Legacy: Then and Now
&lt;/h2&gt;

&lt;p&gt;Docker needs no introduction — it's been the go-to container engine for developers worldwide for a long time. Even in 2025, Docker remains popular thanks to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integrated Tools&lt;/strong&gt;: Docker continues to support a comprehensive suite of tools for building, testing, and running containers. Though Docker Swarm once provided native clustering capabilities, many developers have now transitioned to Kubernetes for large-scale orchestration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Evolving Security&lt;/strong&gt;: With the ever-increasing focus on cybersecurity, Docker has enhanced its rootless container options. This evolution minimizes risk by reducing the need for privileged operations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-Platform Adaptability&lt;/strong&gt;: Docker’s mature ecosystem guarantees consistency whether you’re developing on Linux, Windows, or macOS. Recent improvements further streamline cross-platform deployments, making Docker a reliable choice for hybrid cloud environments.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Enter Podman: The Daemon-less Contender
&lt;/h2&gt;

&lt;p&gt;Podman has steadily gained traction among developers who value its innovative approach to container management. In 2025, Podman continues to impress with several key features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Daemon-less Architecture&lt;/strong&gt;: Unlike Docker, which relies on a long-running daemon, Podman creates containers as child processes of the invoking user. This design inherently reduces security risks by limiting unnecessary privileges.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modular Toolchain&lt;/strong&gt;: In its ecosystem, Podman is complemented by specialized utilities such as Buildah for building images, Skopeo for image inspection, and crun for runtime flexibility. This modularity gives developers the freedom to swap or upgrade components without overhauling the entire workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seamless Integration&lt;/strong&gt;: Podman’s compatibility with Docker’s CLI interface means that teams can transition smoothly or even use both tools simultaneously. This is particularly useful in environments where specific needs — like rootless operation or enhanced systemd integration are paramount.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud-Native Ready&lt;/strong&gt;: With the rapid adoption of microservices, Podman’s support for Kubernetes-like pods has allowed for more granular application management. This makes it easier to group related containers and manage them as a cohesive unit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Differences Revisited
&lt;/h2&gt;

&lt;p&gt;As we assess Docker and Podman in 2025, several differences stand out:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Docker: Employs a client-server model with a central daemon responsible for container lifecycle management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Podman: Operates daemon-less, leveraging Unix processes which translate to improved security and easier process-level management.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Privilege Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Docker: Continues to offer rootless modes, but historically has required elevated privileges for its daemon-based operations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Podman: Has built its identity around non-root operations, making it inherently safer when running multi-tenant or production workloads.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security Considerations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Docker: Ongoing enhancements in its security model include sandboxing and better integration with modern security tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Podman: Its design reduces the attack surface by eliminating the need for a persistent daemon, a feature that remains a significant advantage in environments where security is a top concern.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integration with System Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Docker: Often relies on external solutions like Kubernetes or Docker Compose for service orchestration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Podman: Leverages systemd natively — allowing containers to be managed as system services. This results in smoother deployments and easier handling of service restarts or dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Building and Modularity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Docker: Offers an all-in-one toolchain that simplifies container creation and management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Podman: The separation of tasks (building with Buildah, inspecting with Skopeo, etc.) provides flexibility. Developers who prefer specialized tools for each step often find this approach beneficial, especially when fine-tuning performance and security.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Podman and Docker: Coexistence in a Modern Ecosystem
&lt;/h2&gt;

&lt;p&gt;Despite their differences, Podman and Docker are not mutually exclusive. Many organizations can operate hybrid environments where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Development uses Docker for its familiar interface and straightforward workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Production leverages Podman’s robust security and integration with modern service managers like systemd.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This cooperative usage demonstrates that the choice between Docker and Podman need not be binary. Instead, it can be about selecting the right tool for the task at hand and, in some cases, integrating both to capitalize on their unique strengths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Ahead: The Future of Container Orchestration
&lt;/h2&gt;

&lt;p&gt;As we progress through 2025, the demands on container orchestration continue to evolve. Both Docker and Podman are adapting to meet the challenges posed by increasingly sophisticated cloud-native environments. Key trends we anticipate include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enhanced Security Protocols: Continuous advancements in rootless architectures and secure defaults will drive improvements in container security.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Greater Modularity and Interoperability: The future of container tooling lies in blending specialized utilities with robust orchestration frameworks. This modular approach promises easier updates and better performance tuning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration with Serverless Architectures: As serverless solutions rise in popularity, both Docker and Podman will likely evolve to interface seamlessly with these systems, bridging the gap between containers and ephemeral compute resources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Both Docker and Podman have carved their niches in the container orchestration landscape. Docker’s widespread adoption and user-friendly tooling are complemented by Podman’s focus on security, daemon-less operation, and modularity. In 2025, the key is to understand your project’s unique needs — whether you prefer an all-in-one solution or a combination that leverages the strengths of both tools.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and stay tuned as we continue to explore the evolving world of container technology. Until next time, keep learning and stay secure!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>podman</category>
      <category>containers</category>
    </item>
    <item>
      <title>Getting Started with DevOps</title>
      <dc:creator>Abhishek Laha</dc:creator>
      <pubDate>Tue, 15 Apr 2025 10:41:20 +0000</pubDate>
      <link>https://forem.com/cloudwithabhi/getting-started-with-devops-4n65</link>
      <guid>https://forem.com/cloudwithabhi/getting-started-with-devops-4n65</guid>
      <description>&lt;p&gt;Hi, there. If you are reading this article, this means you are keen to get started with DevOps. Without wasting time, lets get into the specifics.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DevOps?
&lt;/h2&gt;

&lt;p&gt;DevOps, as a term, comes from the smashing together of ‘Development and Operations’ to create a more-or-less self-explanatory term. It is a strategy that bridges the gap between software development and IT operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the role of a DevOps engineer?
&lt;/h2&gt;

&lt;p&gt;The role of a DevOps engineer may vary from one organization to another, but generally, it is some combination of release engineering, infrastructure provisioning and management, system administration, infrastructure optimization and security.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the tools used by DevOps engineers?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr18likrw4bwo9hewuebr.webp" class="article-body-image-wrapper"&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.amazonaws.com%2Fuploads%2Farticles%2Fr18likrw4bwo9hewuebr.webp" alt="devops-life-cycle" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Regardless of the type of DevOps toolchain an organization uses, a DevOps process needs to use the right tools to address the key phases and requirements of the DevOps lifecycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Planning : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.atlassian.com/software/jira" rel="noopener noreferrer"&gt;Jira&lt;/a&gt; (Popular),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.redmine.org/" rel="noopener noreferrer"&gt;Redmine&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://trac.edgewall.org/" rel="noopener noreferrer"&gt;Trac&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.broadcom.com/products/software/value-stream-management/rally" rel="noopener noreferrer"&gt;Rally&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;CI/CD : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.jenkins.io/" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt; (Popular),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;Github Actions&lt;/a&gt; (Popular)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://circleci.com/" rel="noopener noreferrer"&gt;CircleCI&lt;/a&gt; (Popular),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.jetbrains.com/teamcity/" rel="noopener noreferrer"&gt;TeamCity&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/en-us/services/devops/" rel="noopener noreferrer"&gt;Azure DevOps&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Build Tools :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://maven.apache.org/" rel="noopener noreferrer"&gt;Maven&lt;/a&gt; (Popular),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gradle.org/" rel="noopener noreferrer"&gt;Gradle&lt;/a&gt; (Popular),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ant.apache.org/" rel="noopener noreferrer"&gt;Ant&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gnu.org/software/make/" rel="noopener noreferrer"&gt;GNU Make&lt;/a&gt; (Popular), 
etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Containerization :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rancher.com/" rel="noopener noreferrer"&gt;Rancher&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.openshift.com/" rel="noopener noreferrer"&gt;OpenShift&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/en-us/services/kubernetes-service/" rel="noopener noreferrer"&gt;AKS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/eks/" rel="noopener noreferrer"&gt;EKS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cloud.google.com/kubernetes-engine" rel="noopener noreferrer"&gt;GKE&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Configuration Management :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.ansible.com/" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://puppet.com/" rel="noopener noreferrer"&gt;Puppet&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.chef.io/" rel="noopener noreferrer"&gt;Chef&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://saltstack.com/" rel="noopener noreferrer"&gt;SaltStack&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/cloudformation/" rel="noopener noreferrer"&gt;CloudFormation&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/en-us/resources/templates/" rel="noopener noreferrer"&gt;Azure Resource Manager&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Source Code Management :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Git&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://about.gitlab.com/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bitbucket.org/" rel="noopener noreferrer"&gt;BitBucket&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/en-us/services/devops/" rel="noopener noreferrer"&gt;Azure DevOps&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/codecommit/" rel="noopener noreferrer"&gt;AWS CodeCommit&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cloud.google.com/source-repositories" rel="noopener noreferrer"&gt;Google Cloud Source Repositories&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Cloud :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/en-us/" rel="noopener noreferrer"&gt;Azure&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;GCP&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.digitalocean.com/" rel="noopener noreferrer"&gt;Digital Ocean&lt;/a&gt;,&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Monitoring : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt; (Infrastructure), &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://grafana.com/oss/loki/" rel="noopener noreferrer"&gt;Grafana Loki&lt;/a&gt; (Logs), &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.splunk.com/" rel="noopener noreferrer"&gt;Splunk&lt;/a&gt;, &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.elastic.co/elastic-stack" rel="noopener noreferrer"&gt;ELK stack&lt;/a&gt;, &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://newrelic.com/" rel="noopener noreferrer"&gt;NewRelic&lt;/a&gt;, &lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Communication :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://slack.com/" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.microsoft.com/en-us/microsoft-teams/group-chat-software" rel="noopener noreferrer"&gt;Microsoft Teams&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://zoom.us/" rel="noopener noreferrer"&gt;Zoom&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://meet.google.com/" rel="noopener noreferrer"&gt;Google Meet&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are the prerequisites for a DevOps engineer?
&lt;/h2&gt;

&lt;p&gt;You must have got to know by now, the tools should you explore and this will give you a headstart.&lt;/p&gt;

&lt;p&gt;Now, let’s have a look at some of the pre-requisites to be a good DevOps engineer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding Containers&lt;/strong&gt;: Containers virtualize the operating system and not the hardware so that the virtualized environments are lightweight and highly scalable. For more visit here.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding DevOps tools and technologies&lt;/strong&gt;: It is important to understand the tools and technologies generally used in the industry to understand and formulate better strategies and work on efficient solutions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding Scripting languages&lt;/strong&gt;: It is a must to have good experience in common scripting languages like Bash, Batch and Python. Most of the DevOps tools require some level of scripting to automate things to the highest standard. For example, Ansible uses a YAML scripting language for automation, which is primarily based on Python.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Collaboration and Communication Skills&lt;/strong&gt;: A DevOps engineer is known to form the bridge between development teams and IT operations, making communication and collaboration skills the DevOps prerequisites. Communication skills help to avoid misinterpretations enabling a high-performance environment for teams to function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Knowledge of Networking fundamentals&lt;/strong&gt;: Networking helps to integrate the edge services that are deployed on different containers or virtual machines. Networking also helps in troubleshooting various latency and performance issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Overall Computer Science Knowledge&lt;/strong&gt;: DevOps engineers are going to interact with software development teams, testing teams, and the IT operations team regularly. As such, a DevOps engineer must have at least the basic knowledge of almost all the concepts in computer science, including algorithms, networking, cloud, data science, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Logical Attitude&lt;/strong&gt;: DevOps engineers will sometimes have to make spontaneous decisions for smooth functioning in the team. Since DevOps engineers are known to fill the gap between developers and IT operations, communication and collaboration become key. DevOps engineers thus have to carry a sound rationale and logical attitude throughout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Passion&lt;/strong&gt;: A DevOps engineer is expected to be passionate about the work he is doing. Doing work with passion is the ultimate key to success in any career path. It is one of the crucial DevOps prerequisites that should never be overlooked.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;DevOps has taken center stage in the software development field, and it is evolving every day. This blog post is too small, and I can write about DevOps so much because there are so many innovations happening around this field. Companies are experimenting with various ways to accelerate their DevOps process so they can win over the competition.&lt;/p&gt;

&lt;p&gt;So many developers, test engineers, and people from other industries want to learn DevOps because of the importance it has received over recent years. Well, DevOps is a great career; you have made a good choice of choosing it as your career path, and I hope that this article has the fundamentals you require to start your DevOps Journey.&lt;/p&gt;

&lt;p&gt;Thanks for visiting and stay tuned for the next one. Until then, keep learning and stay safe.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloudskills</category>
      <category>cloud</category>
      <category>lifecycle</category>
    </item>
  </channel>
</rss>
