<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SHARON SHAJI</title>
    <description>The latest articles on DEV Community by SHARON SHAJI (@sharonkynu).</description>
    <link>https://dev.to/sharonkynu</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%2F3597990%2F8d25b6c8-4140-4c8e-b0dd-d38b18f0b4cb.jpg</url>
      <title>DEV Community: SHARON SHAJI</title>
      <link>https://dev.to/sharonkynu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sharonkynu"/>
    <language>en</language>
    <item>
      <title>Why Kubernetes Docs Prefer Headlamp Over the Kubernetes Dashboard</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Sat, 31 Jan 2026 05:34:43 +0000</pubDate>
      <link>https://dev.to/sharonkynu/why-kubernetes-docs-prefer-headlamp-over-the-kubernetes-dashboard-29p5</link>
      <guid>https://dev.to/sharonkynu/why-kubernetes-docs-prefer-headlamp-over-the-kubernetes-dashboard-29p5</guid>
      <description>&lt;p&gt;When people hear &lt;em&gt;“Kubernetes UI”&lt;/em&gt;, the first thing that comes to mind is the &lt;strong&gt;Kubernetes Dashboard&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It used to be the default choice.&lt;/p&gt;

&lt;p&gt;But if you read the &lt;strong&gt;official Kubernetes documentation carefully&lt;/strong&gt;, you’ll notice a shift:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For detailed insight and troubleshooting, tools like &lt;strong&gt;Headlamp&lt;/strong&gt; are preferred.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn’t hype. It’s architectural reality.&lt;/p&gt;

&lt;h2&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%2Frcukzwe84z262lw8e5i3.png" alt=" " width="800" height="482"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  What Is Headlamp?
&lt;/h2&gt;

&lt;p&gt;It is an open-source Kubernetes UI originally developed by Kinvolk (now part of Microsoft).&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;not&lt;/strong&gt; a replacement for &lt;code&gt;kubectl&lt;/code&gt;.&lt;br&gt;
It is a &lt;strong&gt;visual layer on top of the kubectl mental model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of Headlamp as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;kubectl&lt;/code&gt; + context&lt;/li&gt;
&lt;li&gt;resource relationships&lt;/li&gt;
&lt;li&gt;RBAC awareness&lt;/li&gt;
&lt;li&gt;CRD visibility&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Kubernetes Dashboard Is No Longer Enough
&lt;/h2&gt;

&lt;p&gt;Let’s be blunt.&lt;/p&gt;

&lt;p&gt;The Kubernetes Dashboard is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Object-centric&lt;/li&gt;
&lt;li&gt;Shallow in insight&lt;/li&gt;
&lt;li&gt;Designed for basic operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the pod running?&lt;/li&gt;
&lt;li&gt;Can I delete this deployment?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Why&lt;/em&gt; is the pod restarting?&lt;/li&gt;
&lt;li&gt;Which controller owns this resource?&lt;/li&gt;
&lt;li&gt;What RBAC rule is blocking this action?&lt;/li&gt;
&lt;li&gt;How do these objects relate to each other?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern Kubernetes clusters are &lt;strong&gt;systems&lt;/strong&gt;, not collections of objects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Headlamp Is Preferred
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Resource Relationships (The Most Important Reason)
&lt;/h3&gt;

&lt;p&gt;Headlamp shows &lt;strong&gt;ownership and flow&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pod → ReplicaSet → Deployment&lt;/li&gt;
&lt;li&gt;Service → Endpoints → Pods&lt;/li&gt;
&lt;li&gt;Ingress → Service → Workload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This directly matches how Kubernetes works internally.&lt;/p&gt;

&lt;p&gt;The Dashboard treats resources as isolated items.&lt;br&gt;&lt;br&gt;
Headlamp treats them as a &lt;strong&gt;reconciled system&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Matches How Engineers Actually Use Kubernetes
&lt;/h3&gt;

&lt;p&gt;Experienced engineers think in terms of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;namespaces&lt;/li&gt;
&lt;li&gt;contexts&lt;/li&gt;
&lt;li&gt;YAML&lt;/li&gt;
&lt;li&gt;controllers&lt;/li&gt;
&lt;li&gt;CRDs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Headlamp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shows full YAML&lt;/li&gt;
&lt;li&gt;Allows inspection without hiding complexity&lt;/li&gt;
&lt;li&gt;Treats CRDs as first-class citizens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Dashboard tries to abstract YAML away.&lt;br&gt;&lt;br&gt;
That abstraction becomes a problem in real clusters.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. CRDs and Operators Work Properly
&lt;/h3&gt;

&lt;p&gt;Modern Kubernetes is operator-driven:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Argo CD&lt;/li&gt;
&lt;li&gt;Prometheus Operator&lt;/li&gt;
&lt;li&gt;Cert-Manager&lt;/li&gt;
&lt;li&gt;Istio&lt;/li&gt;
&lt;li&gt;KServe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Headlamp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-discovers CRDs&lt;/li&gt;
&lt;li&gt;Displays status fields correctly&lt;/li&gt;
&lt;li&gt;Understands custom schemas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kubernetes Dashboard often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ignores CRDs&lt;/li&gt;
&lt;li&gt;Renders them poorly&lt;/li&gt;
&lt;li&gt;Breaks with non-core resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That alone disqualifies it for production use.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Security Model That Aligns with Kubernetes
&lt;/h3&gt;

&lt;p&gt;Dashboard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs inside the cluster&lt;/li&gt;
&lt;li&gt;Requires long-lived service accounts&lt;/li&gt;
&lt;li&gt;Encourages risky RBAC shortcuts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Headlamp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs locally or externally&lt;/li&gt;
&lt;li&gt;Uses your kubeconfig&lt;/li&gt;
&lt;li&gt;Respects RBAC exactly like &lt;code&gt;kubectl&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No extra attack surface.&lt;br&gt;
No privileged dashboard pods.&lt;/p&gt;

&lt;p&gt;This matches Kubernetes security best practices.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Designed for Insight, Not Click-Ops
&lt;/h3&gt;

&lt;p&gt;Dashboard was built for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Click buttons to manage resources”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Headlamp is built for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Understand what the cluster is doing”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That difference matters when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debugging production issues&lt;/li&gt;
&lt;li&gt;tracing failures&lt;/li&gt;
&lt;li&gt;understanding controller behavior&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Kubernetes Documentation Leans Toward Headlamp
&lt;/h2&gt;

&lt;p&gt;Kubernetes today assumes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRDs are everywhere&lt;/li&gt;
&lt;li&gt;Operators manage most workloads&lt;/li&gt;
&lt;li&gt;YAML is unavoidable&lt;/li&gt;
&lt;li&gt;Security matters more than convenience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Headlamp supports &lt;strong&gt;how Kubernetes is actually used today&lt;/strong&gt;, not how it was used years ago.&lt;/p&gt;

&lt;p&gt;That’s why it’s preferred for &lt;strong&gt;detailed insight&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  When the Kubernetes Dashboard Still Makes Sense
&lt;/h2&gt;

&lt;p&gt;Be honest — it’s not useless.&lt;/p&gt;

&lt;p&gt;Use Kubernetes Dashboard if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are teaching beginners&lt;/li&gt;
&lt;li&gt;You want a quick demo&lt;/li&gt;
&lt;li&gt;You need very basic visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use Headlamp if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You run real workloads&lt;/li&gt;
&lt;li&gt;You debug failures&lt;/li&gt;
&lt;li&gt;You work with operators and CRDs&lt;/li&gt;
&lt;li&gt;You care about RBAC and security&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;Kubernetes is complex by design.&lt;/p&gt;

&lt;p&gt;A UI that hides that complexity becomes a liability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headlamp doesn’t simplify Kubernetes — it explains it.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
That’s why Kubernetes documentation points you in that direction.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you work with production Kubernetes clusters, Headlamp isn’t optional — it’s practical.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>Configuration Management in Kubernetes - ConfigMap &amp; Secrets</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Sun, 18 Jan 2026 06:53:00 +0000</pubDate>
      <link>https://dev.to/sharonkynu/configuration-management-in-kubernetes-configmap-secrets-278</link>
      <guid>https://dev.to/sharonkynu/configuration-management-in-kubernetes-configmap-secrets-278</guid>
      <description>&lt;p&gt;Most Kubernetes failures in real systems &lt;strong&gt;are not caused by Pods crashing&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
They are caused by &lt;strong&gt;bad configuration management&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Wrong URLs, leaked secrets, environment drift, manual edits — these silently break systems.&lt;/p&gt;

&lt;p&gt;Kubernetes provides &lt;strong&gt;first-class tools&lt;/strong&gt; to manage configuration properly.&lt;br&gt;&lt;br&gt;
If you ignore them, your cluster will eventually become unmanageable.&lt;/p&gt;

&lt;p&gt;This post explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What configuration management means in Kubernetes&lt;/li&gt;
&lt;li&gt;Why it is critical&lt;/li&gt;
&lt;li&gt;What tools Kubernetes provides&lt;/li&gt;
&lt;li&gt;Real, simple examples&lt;/li&gt;
&lt;li&gt;Common mistakes to avoid&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  What Is Configuration Management in Kubernetes?
&lt;/h2&gt;

&lt;p&gt;Configuration management is the practice of &lt;strong&gt;separating application behavior from application code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Kubernetes terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code → container image&lt;/li&gt;
&lt;li&gt;Configuration → Kubernetes resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same image across environments&lt;/li&gt;
&lt;li&gt;Config changes without rebuilding images&lt;/li&gt;
&lt;li&gt;Safer secret handling&lt;/li&gt;
&lt;li&gt;Predictable deployments&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Why Configuration Management Is Critical
&lt;/h2&gt;

&lt;p&gt;Without proper configuration management:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You rebuild images for every config change&lt;/li&gt;
&lt;li&gt;Secrets leak into Git repositories&lt;/li&gt;
&lt;li&gt;Dev, Alpha,UAT,staging, and prod drift apart&lt;/li&gt;
&lt;li&gt;Rollbacks become painful&lt;/li&gt;
&lt;li&gt;Debugging becomes guesswork&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kubernetes assumes &lt;strong&gt;configuration will change often&lt;/strong&gt; — images should not.&lt;/p&gt;


&lt;h2&gt;
  
  
  Configuration vs Code (Key Principle)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Images should be immutable&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Configuration should be external&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you violate this rule, Kubernetes loses most of its value.&lt;/p&gt;


&lt;h2&gt;
  
  
  Configuration Tools in Kubernetes
&lt;/h2&gt;

&lt;p&gt;Kubernetes provides multiple ways to manage configuration:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ConfigMaps&lt;/strong&gt; – non-sensitive configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets&lt;/strong&gt; – sensitive data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment variables&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mounted configuration files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Helm values / Kustomize overlays&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CRDs (advanced use cases)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This post focuses on the &lt;strong&gt;core building blocks&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  ConfigMaps: Managing Application Configuration
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;ConfigMap&lt;/strong&gt; stores non-sensitive configuration data as key–value pairs.&lt;/p&gt;

&lt;p&gt;Typical use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment name&lt;/li&gt;
&lt;li&gt;Ports&lt;/li&gt;
&lt;li&gt;Feature flags&lt;/li&gt;
&lt;li&gt;Service URLs&lt;/li&gt;
&lt;li&gt;Log levels&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Example: ConfigMap
&lt;/h3&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;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;app-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_ENV&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
  &lt;span class="na"&gt;APP_PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080"&lt;/span&gt;
  &lt;span class="na"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;info&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; configmap.yaml
kubectl get configmap app-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes stores the configuration&lt;/li&gt;
&lt;li&gt;No pod behavior changes yet&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Using ConfigMap as Environment Variables
&lt;/h3&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;app-pod&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;app&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&lt;/span&gt;
      &lt;span class="na"&gt;envFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;configMapRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$APP_ENV&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$APP_PORT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Using ConfigMap as Files (then no restart of service to apply)
&lt;/h3&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;config-file-pod&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;app&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&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;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;app-config&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Files created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/config/APP_ENV
/etc/config/APP_PORT
/etc/config/LOG_LEVEL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Secrets: Managing Sensitive Configuration
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Secret&lt;/strong&gt; stores sensitive data such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passwords&lt;/li&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;Tokens&lt;/li&gt;
&lt;li&gt;Certificates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secrets are &lt;strong&gt;base64-encoded&lt;/strong&gt;, not encrypted by default.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example: Secret
&lt;/h3&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;Secret&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;db-secret&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;Opaque&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;DB_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;YWRtaW4=&lt;/span&gt;
  &lt;span class="na"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cGFzc3dvcmQ=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create 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; secret.yaml
kubectl get secret db-secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Using Secret in a Pod
&lt;/h3&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;secret-pod&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;app&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&lt;/span&gt;
      &lt;span class="na"&gt;envFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;secretRef&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;db-secret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or as files:&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;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;secret-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/secret&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="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;secret-volume&lt;/span&gt;
    &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="pi"&gt;:&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;db-secret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ConfigMaps vs Secrets
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;ConfigMap&lt;/th&gt;
&lt;th&gt;Secret&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sensitive data&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base64 encoded&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access controlled&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Stronger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git-friendly&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;App config&lt;/td&gt;
&lt;td&gt;Credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rule of thumb:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If it can hurt you when leaked → use a Secret.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Environment-Based Configuration (Best Practice)
&lt;/h2&gt;

&lt;p&gt;One image, multiple environments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev:
  LOG_LEVEL=debug
  DB_HOST=dev-db

prod:
  LOG_LEVEL=info
  DB_HOST=prod-db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only configuration changes — &lt;strong&gt;image stays the same&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configuration Drift (Real Problem)
&lt;/h2&gt;

&lt;p&gt;Configuration drift happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone edits live resources manually&lt;/li&gt;
&lt;li&gt;Config differs between environments&lt;/li&gt;
&lt;li&gt;No source of truth exists&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store manifests in Git&lt;/li&gt;
&lt;li&gt;Apply changes declaratively&lt;/li&gt;
&lt;li&gt;Avoid kubectl edit in production&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Configuration Management Mistakes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Hardcoding config inside images&lt;/li&gt;
&lt;li&gt;Storing secrets in ConfigMaps&lt;/li&gt;
&lt;li&gt;Committing secrets to Git&lt;/li&gt;
&lt;li&gt;Rebuilding images for config changes&lt;/li&gt;
&lt;li&gt;Treating base64 as encryption&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These mistakes &lt;strong&gt;will&lt;/strong&gt; hurt you later.&lt;/p&gt;




&lt;h2&gt;
  
  
  When ConfigMaps &amp;amp; Secrets Are Not Enough
&lt;/h2&gt;

&lt;p&gt;For complex systems, teams use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helm + values.yaml&lt;/li&gt;
&lt;li&gt;Kustomize overlays&lt;/li&gt;
&lt;li&gt;External secret managers (Vault, AWS Secrets Manager)&lt;/li&gt;
&lt;li&gt;CRDs for advanced configuration APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But ConfigMaps and Secrets are still the foundation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good configuration management keeps Kubernetes sane&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Bad configuration management breaks everything quietly&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you master:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ConfigMaps&lt;/li&gt;
&lt;li&gt;Secrets&lt;/li&gt;
&lt;li&gt;Environment-based configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You eliminate a massive class of production failures.&lt;/p&gt;

&lt;p&gt;Say it clearly.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>containers</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>Kubernetes Custom Resources, Custom Resource Definition (CRD) &amp; Controllers</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Sun, 18 Jan 2026 04:34:43 +0000</pubDate>
      <link>https://dev.to/sharonkynu/kubernetes-custom-resources-custom-resource-definition-crd-controllers-bao</link>
      <guid>https://dev.to/sharonkynu/kubernetes-custom-resources-custom-resource-definition-crd-controllers-bao</guid>
      <description>&lt;p&gt;Kubernetes is &lt;strong&gt;not powerful because of Pods or Services&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s powerful because it can be &lt;strong&gt;extended without modifying Kubernetes itself&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That extensibility comes from &lt;strong&gt;Custom Resources + CRDs + Controllers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you don’t understand these three properly, you’re not really &lt;em&gt;using&lt;/em&gt; Kubernetes — you’re just deploying YAML.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why CRDs Exist
&lt;/h2&gt;

&lt;p&gt;Kubernetes solves &lt;strong&gt;generic infrastructure problems&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduling&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But real companies have &lt;strong&gt;domain-specific problems&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Deploy a model”&lt;/li&gt;
&lt;li&gt;“Provision a database”&lt;/li&gt;
&lt;li&gt;“Create a service mesh rule”&lt;/li&gt;
&lt;li&gt;“Manage certificates”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of hardcoding these into Kubernetes, Kubernetes gives us a way to &lt;strong&gt;define our own APIs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That framework is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRD&lt;/strong&gt; → defines a new API type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Resource&lt;/strong&gt; → instance of that API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controller&lt;/strong&gt; → logic that makes it real&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Mental Model (Important)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Kubernetes itself does &lt;strong&gt;nothing&lt;/strong&gt; with your CRDs&lt;br&gt;&lt;br&gt;
It only stores them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you create a CRD &lt;strong&gt;without a controller&lt;/strong&gt;, Kubernetes will happily accept it and do &lt;strong&gt;absolutely nothing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s not a bug. That’s the design.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is a Custom Resource (CR)?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Custom Resource&lt;/strong&gt; is a &lt;strong&gt;new object type&lt;/strong&gt; in Kubernetes.&lt;/p&gt;

&lt;p&gt;Just like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pod&lt;/li&gt;
&lt;li&gt;Service&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can create your own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Application&lt;/li&gt;
&lt;li&gt;MLModel&lt;/li&gt;
&lt;li&gt;Certificate&lt;/li&gt;
&lt;li&gt;Gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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 databases
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; myapp.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kubernetes doesn’t care what &lt;code&gt;Database&lt;/code&gt; means.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a CRD (CustomResourceDefinition)?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;CRD defines a new API schema&lt;/strong&gt; inside Kubernetes.&lt;/p&gt;

&lt;p&gt;Think of a CRD as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey Kubernetes, here is a new kind of object. Please store it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CRD defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API group&lt;/li&gt;
&lt;li&gt;Version&lt;/li&gt;
&lt;li&gt;Kind&lt;/li&gt;
&lt;li&gt;Schema (validation)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Simple CRD Example
&lt;/h2&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;apiextensions.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;CustomResourceDefinition&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;databases.mycompany.io&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;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mycompany.io&lt;/span&gt;
  &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Namespaced&lt;/span&gt;
  &lt;span class="na"&gt;names&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;plural&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;databases&lt;/span&gt;
    &lt;span class="na"&gt;singular&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database&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;Database&lt;/span&gt;
  &lt;span class="na"&gt;versions&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;v1&lt;/span&gt;
      &lt;span class="na"&gt;served&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;openAPIV3Schema&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;object&lt;/span&gt;
          &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
              &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;engine&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;string&lt;/span&gt;
                &lt;span class="na"&gt;version&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;string&lt;/span&gt;
                &lt;span class="na"&gt;storage&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;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After applying this:&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 databases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kubernetes now &lt;strong&gt;recognizes &lt;code&gt;Database&lt;/code&gt; as a valid object&lt;/strong&gt; — nothing more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Creating a Custom Resource (CR)
&lt;/h2&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;mycompany.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;Database&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;user-db&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;engine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15"&lt;/span&gt;
  &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;20Gi&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; database.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Stored in etcd&lt;/li&gt;
&lt;li&gt;No Pod created&lt;/li&gt;
&lt;li&gt;No database started&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where most beginners get confused.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Controllers Are Mandatory
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Controller is the brain&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Watches Custom Resources&lt;/li&gt;
&lt;li&gt;Compares &lt;strong&gt;desired state&lt;/strong&gt; vs &lt;strong&gt;actual state&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Reconciles the difference&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without a controller:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRD = dead schema&lt;/li&gt;
&lt;li&gt;CR = useless YAML&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&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%2F85ej4nhjcgvo72uqv4xt.png" alt=" " width="800" height="533"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Controller Reconciliation Loop
&lt;/h2&gt;

&lt;p&gt;Every controller follows this loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Observe → Compare → Act → Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or in plain terms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while true:
  desired_state = CR.spec
  actual_state = cluster_reality
  if desired_state != actual_state:
    fix_it()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This loop &lt;strong&gt;never stops&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How CRD + Controller Work Together
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 |
 | kubectl apply
 v
Kubernetes API Server
 |
 v
etcd (stores CR)
 |
 v
Controller watches CR
 |
 v
Controller creates / updates:
  - Pods
  - Services
  - PVCs
  - ConfigMaps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real Example: Database Operator
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Custom Resource
&lt;/h3&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;mycompany.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;Database&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;user-db&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;engine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15"&lt;/span&gt;
  &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;20Gi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Controller Logic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IF Database CR is created:
  - Create StatefulSet
  - Create PVC
  - Create Service

IF Database CR is deleted:
  - Cleanup resources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kubernetes doesn’t know databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your controller does.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Desired vs Actual State
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Desired State (CR):
  Database:
    engine: postgres
    replicas: 1

Actual State (Cluster):
  StatefulSet: missing

Controller Action:
  Create StatefulSet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If someone deletes the StatefulSet manually?&lt;/p&gt;

&lt;p&gt;➡️ Controller recreates it.&lt;/p&gt;




&lt;h2&gt;
  
  
  CRDs vs Deployments
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Deployment&lt;/th&gt;
&lt;th&gt;CRD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controller included&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Only if you write one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logic location&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;td&gt;You&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A Deployment is &lt;strong&gt;just a CRD + controller shipped by Kubernetes&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Istio Uses CRDs
&lt;/h2&gt;

&lt;p&gt;Istio extends Kubernetes using CRDs like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VirtualService&lt;/li&gt;
&lt;li&gt;DestinationRule&lt;/li&gt;
&lt;li&gt;Gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;VirtualService&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;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;myapp&lt;/span&gt;
  &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;route&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;destination&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;myapp-v2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Istio controllers convert this into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Envoy config&lt;/li&gt;
&lt;li&gt;Traffic routing&lt;/li&gt;
&lt;li&gt;Load balancing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Istio doesn’t modify Kubernetes.&lt;br&gt;&lt;br&gt;
It &lt;strong&gt;extends it properly&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Companies Build Products Using CRDs
&lt;/h2&gt;

&lt;p&gt;CRDs allow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes-native APIs&lt;/li&gt;
&lt;li&gt;Declarative behavior&lt;/li&gt;
&lt;li&gt;kubectl-first UX&lt;/li&gt;
&lt;li&gt;Strong reconciliation guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Used by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ArgoCD&lt;/li&gt;
&lt;li&gt;Crossplane&lt;/li&gt;
&lt;li&gt;Cert-Manager&lt;/li&gt;
&lt;li&gt;Prometheus Operator&lt;/li&gt;
&lt;li&gt;Istio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All follow the same pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; “CRD automatically creates resources”
&lt;/li&gt;
&lt;li&gt; Writing logic inside YAML
&lt;/li&gt;
&lt;li&gt; Ignoring &lt;code&gt;.status&lt;/code&gt; fields
&lt;/li&gt;
&lt;li&gt; Treating CRDs as config files&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CRDs are &lt;strong&gt;APIs&lt;/strong&gt;, not configs.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Use CRDs?
&lt;/h2&gt;

&lt;p&gt;Use CRDs when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You manage lifecycle, not just deployment&lt;/li&gt;
&lt;li&gt;You need reconciliation&lt;/li&gt;
&lt;li&gt;You’re building a platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; use CRDs for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static configs&lt;/li&gt;
&lt;li&gt;One-time jobs&lt;/li&gt;
&lt;li&gt;Simple values&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CRDs define WHAT you want&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Controllers define HOW it happens&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Kubernetes enforces the loop&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you understand this, you understand Kubernetes beyond YAML.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>containers</category>
      <category>devops</category>
    </item>
    <item>
      <title>🔐 TLS Termination Models - SSL Passthrough vs SSL Termination (Offloading) vs SSL Bridging (Re-Encryption)</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Sat, 10 Jan 2026 06:33:29 +0000</pubDate>
      <link>https://dev.to/sharonkynu/tls-termination-models-ssl-passthrough-vs-ssl-termination-offloading-vs-ssl-bridging-39ck</link>
      <guid>https://dev.to/sharonkynu/tls-termination-models-ssl-passthrough-vs-ssl-termination-offloading-vs-ssl-bridging-39ck</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why They Exist, Why They’re Used, and When Each Matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TLS is not just &lt;em&gt;“turning on HTTPS.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where TLS is terminated defines:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👁️ &lt;strong&gt;Who can see the traffic&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;What security controls are possible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;How scalable your system is&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📋 &lt;strong&gt;Whether auditors will sign off&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;That’s why multiple TLS termination models exist.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Why TLS Termination Models Exist
&lt;/h2&gt;

&lt;p&gt;Because &lt;strong&gt;no single model can optimize all of these at once&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔐 &lt;strong&gt;Security&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Operability&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Scalability&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Traffic visibility&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Cost efficiency&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each TLS termination model &lt;strong&gt;trades one dimension for another&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Understanding these trade-offs prevents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Over-engineered designs
&lt;/li&gt;
&lt;li&gt;Weak security assumptions
&lt;/li&gt;
&lt;li&gt;“Best-practice” architectures that fail in production
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1️⃣ SSL Passthrough (End-to-End TLS)
&lt;/h2&gt;

&lt;p&gt;The proxy or load balancer &lt;strong&gt;does NOT decrypt TLS&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Encrypted traffic is forwarded directly to the backend.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Client
    |
    | HTTPS (TLS)
    v
Load Balancer (Layer 4 – no decryption)
    |
    | HTTPS (TLS)
    v
Backend Application (TLS terminates here)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Why It Exists
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maintain &lt;strong&gt;true end-to-end encryption&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;zero-trust networking&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Keep TLS fully owned by the application&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;gRPC services with mTLS
&lt;/li&gt;
&lt;li&gt;Banking and healthcare backends
&lt;/li&gt;
&lt;li&gt;Kubernetes Ingress with SSL Passthrough enabled
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Why It Matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No intermediate system can inspect or modify traffic
&lt;/li&gt;
&lt;li&gt;Required for strict compliance environments
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Trade-offs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ No path-based routing
&lt;/li&gt;
&lt;li&gt;❌ No WAF, authentication, or rate limiting
&lt;/li&gt;
&lt;li&gt;❌ Certificate management per backend
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best when:&lt;/strong&gt; Security &amp;gt; operability&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Avoid when:&lt;/strong&gt; Traffic inspection is required  &lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ SSL Termination / SSL Offloading (Most Common)
&lt;/h2&gt;

&lt;p&gt;TLS is terminated at the proxy or load balancer.&lt;br&gt;&lt;br&gt;
Backend traffic becomes &lt;strong&gt;plain HTTP&lt;/strong&gt;.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Client
      |
      | HTTPS
      v
Load Balancer / Reverse Proxy (TLS ends here)
      |
      | HTTP
      v
Backend Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Why It Exists
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Centralized certificate management
&lt;/li&gt;
&lt;li&gt;Simplified backend services
&lt;/li&gt;
&lt;li&gt;Enables Layer-7 traffic handling
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS ALB / ELB
&lt;/li&gt;
&lt;li&gt;Nginx Ingress Controller
&lt;/li&gt;
&lt;li&gt;HAProxy, Envoy
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Why It Matters
&lt;/h3&gt;

&lt;p&gt;TLS must be decrypted to enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path-based routing (&lt;code&gt;/api&lt;/code&gt;, &lt;code&gt;/auth&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;WAF and rate limiting
&lt;/li&gt;
&lt;li&gt;Authentication and observability
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Trade-offs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ Backend traffic is unencrypted
&lt;/li&gt;
&lt;li&gt;❌ Internal network must be trusted
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;This model powers most production SaaS platforms today.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3️⃣ SSL Bridging / Re-Encryption (Best of Both, Costs More)
&lt;/h2&gt;

&lt;p&gt;TLS terminates at the proxy, and a &lt;strong&gt;new TLS session&lt;/strong&gt; is created to the backend.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Client
      |
      | HTTPS
      v
Proxy / Load Balancer (TLS #1 terminates)
      |
      | HTTPS (TLS #2 starts)
      v
Backend Application\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔑 Key Characteristics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Two TLS sessions
&lt;/li&gt;
&lt;li&gt;Proxy can inspect traffic
&lt;/li&gt;
&lt;li&gt;Backend still receives encrypted traffic
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;End-to-end encryption preserved
&lt;/li&gt;
&lt;li&gt;Full Layer-7 features at the proxy
&lt;/li&gt;
&lt;li&gt;Strong compliance posture
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Extra CPU overhead (double TLS)
&lt;/li&gt;
&lt;li&gt;Certificates required at both proxy and backend
&lt;/li&gt;
&lt;li&gt;Harder debugging and troubleshooting
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧭 When to Use
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Regulated environments (PCI-DSS, HIPAA)
&lt;/li&gt;
&lt;li&gt;Kubernetes ingress with security mandates
&lt;/li&gt;
&lt;li&gt;Zero-trust internal networks
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ❌ Common Misconceptions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SSL termination is insecure.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;False, if the internal network is controlled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SSL passthrough is always better.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;False, if routing or inspection is required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SSL bridging is free security.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;False — it costs CPU, latency, and operational effort.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Practical Recommendation (No BS)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple public apps / Maximum simplicity&lt;/strong&gt; → &lt;strong&gt;SSL Termination&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance-heavy systems / Security + control&lt;/strong&gt; → &lt;strong&gt;SSL Bridging&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict zero-trust / mTLS / Maximum secrecy&lt;/strong&gt; → &lt;strong&gt;SSL Passthrough&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can’t clearly explain &lt;strong&gt;why&lt;/strong&gt; you chose one,&lt;br&gt;&lt;br&gt;
you probably chose the wrong model.&lt;/p&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%2Fr458ar38xnr3i1y9elc8.png" 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%2Fr458ar38xnr3i1y9elc8.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;SSL Passthrough&lt;/th&gt;
&lt;th&gt;SSL Termination&lt;/th&gt;
&lt;th&gt;SSL Bridging&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TLS decrypted at proxy&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend traffic encrypted&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP routing / WAF&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate management&lt;/td&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Centralized&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational complexity&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security level&lt;/td&gt;
&lt;td&gt;🔒🔒🔒&lt;/td&gt;
&lt;td&gt;🔒🔒&lt;/td&gt;
&lt;td&gt;🔒🔒🔒&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Final Takeaway
&lt;/h2&gt;

&lt;p&gt;SSL/TLS termination models exist because:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security, visibility, scalability, and cost cannot all be optimized at once.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no universal best practice —&lt;br&gt;&lt;br&gt;
only &lt;strong&gt;context-correct architectural decisions&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>networking</category>
      <category>performance</category>
      <category>security</category>
    </item>
    <item>
      <title>Kubernetes Ingress Explained — Routing, TLS, and Real Examples</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Fri, 26 Dec 2025 03:47:55 +0000</pubDate>
      <link>https://dev.to/sharonkynu/kubernetes-ingress-explained-routing-tls-and-real-examples-32kb</link>
      <guid>https://dev.to/sharonkynu/kubernetes-ingress-explained-routing-tls-and-real-examples-32kb</guid>
      <description>&lt;p&gt;Kubernetes networking looks confusing until you understand &lt;strong&gt;Ingress&lt;/strong&gt;.&lt;br&gt;
Kubernetes networking looks confusing until you understand &lt;strong&gt;Ingress&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most confusion happens because people mix &lt;strong&gt;Service exposure&lt;/strong&gt; with &lt;strong&gt;HTTP routing&lt;/strong&gt;.&lt;br&gt;
Ingress exists to solve &lt;strong&gt;one specific problem&lt;/strong&gt; — &lt;strong&gt;how HTTP/HTTPS traffic enters your cluster&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post explains Kubernetes Ingress using &lt;strong&gt;production-relevant concepts&lt;/strong&gt;, with &lt;strong&gt;text diagrams&lt;/strong&gt; and &lt;strong&gt;real examples&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Problem Does Ingress Solve?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Without Ingress
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Every Service needs its own NodePort or LoadBalancer&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each application must be exposed individually instead of sharing one entry point.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Costs increase (cloud load balancers are not free)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you have &lt;strong&gt;100 Services&lt;/strong&gt;, you need &lt;strong&gt;100 LoadBalancers&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;That means &lt;strong&gt;100 public IP addresses&lt;/strong&gt; and &lt;strong&gt;100 separate billing items&lt;/strong&gt; from the cloud provider.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Routing logic lives outside Kubernetes&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traffic routing is handled by external load balancers or manual DNS rules.
&lt;/li&gt;
&lt;li&gt;Kubernetes has no visibility or control over how traffic is routed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TLS management becomes messy&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each Service needs its own TLS certificate.
&lt;/li&gt;
&lt;li&gt;Certificates must be renewed, rotated, and configured &lt;strong&gt;per Service&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Managing HTTPS for dozens of Services becomes error-prone and hard to scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ingress solves this by acting as a &lt;strong&gt;smart HTTP entry point&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is Kubernetes Ingress?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;Ingress&lt;/strong&gt; is a Kubernetes resource that defines &lt;strong&gt;HTTP and HTTPS routing rules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ingress can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route traffic by &lt;strong&gt;host&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Route traffic by &lt;strong&gt;path&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Terminate &lt;strong&gt;TLS (HTTPS)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Forward traffic to Services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Ingress does NOT handle traffic by itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It requires an &lt;strong&gt;Ingress Controller&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Ingress Controller (Critical Concept)
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;Ingress Controller&lt;/strong&gt; is the actual component that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listens for external traffic&lt;/li&gt;
&lt;li&gt;Reads Ingress rules&lt;/li&gt;
&lt;li&gt;Routes traffic accordingly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common controllers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NGINX Ingress Controller&lt;/li&gt;
&lt;li&gt;Traefik&lt;/li&gt;
&lt;li&gt;HAProxy&lt;/li&gt;
&lt;li&gt;Cloud-specific controllers (AWS ALB Ingress)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Without a controller, Ingress resources do nothing.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How Ingress Works
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client (Browser)
            ↓
Ingress Controller (NGINX / Traefik)
           ↓
Ingress Rules
           ↓
Service
           ↓
Pods (Deployment)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ingress operates at &lt;strong&gt;Layer 7 (HTTP/HTTPS)&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Basic Ingress Example (Single Service)
&lt;/h2&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;app-ingress&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="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;app.sharon.com&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;/&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;app-service&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;&lt;strong&gt;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts traffic for &lt;em&gt;app.sharon.com&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Routes all requests to &lt;em&gt;app-service&lt;/em&gt;(k8s service name)&lt;/li&gt;
&lt;li&gt;Service load balances traffic to Pods&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Path-Based Routing Example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ingress can route different paths to different Services.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;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;multi-app-ingress&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="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;sharon.com&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;/api&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;api-service&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;/web&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;web-service&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;&lt;strong&gt;Routing Behaviour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sharon.com/api  → api-service
sharon.com/web  → web-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Host-Based Routing Example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ingress can route traffic by domain name.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;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;host-ingress&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="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;api.sharon.com&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;/&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;api-service&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;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web.sharon.com&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;/&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;web-service&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;&lt;strong&gt;Routing Behaviour&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api.sharon.com → api-service
web.sharon.com → web-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  TLS / HTTPS with Ingress
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Ingress can terminate TLS using Kubernetes Secrets.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ingress can handle &lt;strong&gt;HTTPS (TLS) termination&lt;/strong&gt; for your applications using Kubernetes Secrets.&lt;/p&gt;

&lt;p&gt;This means HTTPS is handled &lt;strong&gt;at the Ingress level&lt;/strong&gt;, not inside the application Pods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLS Secert&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create secret tls app-tls \
  --cert=cert.pem \
  --key=key.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ingress with TLS&lt;/strong&gt;*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;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;tls-ingress&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;app.sharon.com&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;app-tls&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;app.sharon.com&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;/&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;app-service&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;&lt;strong&gt;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terminates HTTPS at the Ingress Controller&lt;/li&gt;
&lt;li&gt;Traffic inside the cluster remains HTTP&lt;/li&gt;
&lt;li&gt;TLS certificates are centrally managed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Ingress vs LoadBalancer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Ingress&lt;/th&gt;
&lt;th&gt;LoadBalancer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Layer&lt;/td&gt;
&lt;td&gt;L7 (HTTP/HTTPS)&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Routing&lt;/td&gt;
&lt;td&gt;Host &amp;amp; path based&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Low (single load balancer)&lt;/td&gt;
&lt;td&gt;High (per Service)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Ingress is preferred for HTTP-based applications.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Creating Ingress without an Ingress Controller
&lt;/li&gt;
&lt;li&gt;Using LoadBalancer for every Service
&lt;/li&gt;
&lt;li&gt;Forgetting DNS configuration
&lt;/li&gt;
&lt;li&gt;Mixing Service exposure and routing logic
&lt;/li&gt;
&lt;li&gt;Managing TLS separately for every Service
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When You Should Use Ingress
&lt;/h2&gt;

&lt;p&gt;Use Ingress when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You run &lt;strong&gt;HTTP/HTTPS applications&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;routing by domain or path&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;centralized TLS management&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;reduce cloud load balancer costs&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Complete Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet
   |
   v
DNS (Domain → IP)
   |
   v
Ingress Controller (NGINX / Traefik)
   |
   v
Ingress Rules (Host / Path / TLS)
   |
   v
Service (Stable Endpoint)
   |
   v
Pods (Managed by Deployment)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Without Ingress
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Every Service needs its own NodePort or LoadBalancer&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each application must be exposed individually instead of sharing one entry point.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Costs increase (cloud load balancers are not free)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you have &lt;em&gt;100 Services&lt;/em&gt;, you need &lt;em&gt;100 LoadBalancers&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;That means &lt;strong&gt;100 public IP addresses&lt;/strong&gt; and &lt;strong&gt;100 separate billing items&lt;/strong&gt; from the cloud provider.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Routing logic lives outside Kubernetes&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traffic routing is handled by external load balancers or manual DNS rules.
&lt;/li&gt;
&lt;li&gt;Kubernetes has no visibility or control over how traffic is routed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;TLS management becomes messy&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each Service needs its own TLS certificate.
&lt;/li&gt;
&lt;li&gt;Certificates must be renewed, rotated, and configured &lt;strong&gt;per Service&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Managing HTTPS for dozens of Services becomes error-prone and hard to scale.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Ingress is not optional in production — it is the control plane for HTTP traffic in Kubernetes.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>containers</category>
      <category>devops</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>Stop Memorizing Kubernetes: Pods, Deployments, and Services Explained</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Thu, 18 Dec 2025 05:22:29 +0000</pubDate>
      <link>https://dev.to/sharonkynu/stop-memorizing-kubernetes-pods-deployments-and-services-explained-3e64</link>
      <guid>https://dev.to/sharonkynu/stop-memorizing-kubernetes-pods-deployments-and-services-explained-3e64</guid>
      <description>&lt;p&gt;Kubernetes feels complicated mostly because its core concepts are poorly explained.&lt;br&gt;
This post explains &lt;strong&gt;Pods&lt;/strong&gt;, &lt;strong&gt;Deployments&lt;/strong&gt;, &lt;strong&gt;Services&lt;/strong&gt;, and &lt;strong&gt;Ingress&lt;/strong&gt; using only &lt;strong&gt;production-relevant details&lt;/strong&gt;, with &lt;strong&gt;real YAML examples&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  1️⃣ Kubernetes Pod
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What is a Pod?
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Pod&lt;/strong&gt; is the &lt;strong&gt;smallest deployable unit&lt;/strong&gt; in Kubernetes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A pod can run &lt;strong&gt;one or more containers&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Containers inside a pod:

&lt;ul&gt;
&lt;li&gt;Share the &lt;strong&gt;same IP address&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Communicate using &lt;code&gt;localhost&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Share storage volumes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kubernetes schedules &lt;strong&gt;pods&lt;/strong&gt;, not containers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pods are &lt;strong&gt;ephemeral&lt;/strong&gt; by design.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pod Example
&lt;/h3&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-pod&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: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;p&gt;&lt;strong&gt;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs a single NGINX container&lt;/li&gt;
&lt;li&gt;Exposes port 80 inside the pod&lt;/li&gt;
&lt;li&gt;Assigns a temporary IP address&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;⚠️ If this pod crashes, Kubernetes will not recreate it automatically.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That is why pods are not used directly in production.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  2️⃣ Kubernetes Deployment
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What is a Deployment?
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Deployment&lt;/strong&gt; is a controller that &lt;strong&gt;creates, manages, and maintains Pods&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It exists to solve the problems Pods have.&lt;/p&gt;

&lt;p&gt;A Deployment provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic pod recreation (self-healing)&lt;/li&gt;
&lt;li&gt;Horizontal scaling using replicas&lt;/li&gt;
&lt;li&gt;Rolling updates with zero downtime&lt;/li&gt;
&lt;li&gt;Rollback to a previous version if something breaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In real systems, you &lt;strong&gt;deploy Deployments, not Pods&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deployment Example
&lt;/h3&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;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Runs 3 identical Pods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatically replaces failed Pods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensures the desired state is always maintained&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;If one Pod crashes, Kubernetes creates a new Pod automatically.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaling a Deployment&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;kubectl scale deployment nginx-deployment --replicas=5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Kubernetes adds or removes Pods &lt;strong&gt;without downtime&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Kubernetes Service
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Services Exist
&lt;/h3&gt;

&lt;p&gt;Pods have fundamental limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pod IP addresses are &lt;strong&gt;not stable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Pods can be &lt;strong&gt;destroyed and recreated at any time&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of this, &lt;strong&gt;you should never access Pods directly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Service&lt;/strong&gt; provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A stable virtual IP address&lt;/li&gt;
&lt;li&gt;Built-in load balancing&lt;/li&gt;
&lt;li&gt;DNS-based service discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How Services Work
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A Service selects Pods using &lt;strong&gt;labels&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Traffic sent to the Service is distributed across matching Pods&lt;/li&gt;
&lt;li&gt;Clients never need to know Pod IP addresses&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Service Types
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ClusterIP&lt;/td&gt;
&lt;td&gt;Internal cluster communication (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NodePort&lt;/td&gt;
&lt;td&gt;External access via node IP and port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoadBalancer&lt;/td&gt;
&lt;td&gt;Cloud-managed external access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ClusterIP Service Example
&lt;/h3&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;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;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterIP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a stable internal endpoint (nginx-service)&lt;/li&gt;
&lt;li&gt;Load balances traffic across all matching Pods&lt;/li&gt;
&lt;li&gt;Decouples clients from Pod lifecycles&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  NodePort Service Example
&lt;/h3&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-nodeport&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;30080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to access&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;http://&amp;lt;node-ip&amp;gt;:30080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;NodePort is useful for testing and demos, but not ideal for production.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  LoadBalancer Service Type
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;LoadBalancer Service&lt;/strong&gt; exposes an application externally using a &lt;strong&gt;cloud provider’s load balancer&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically assigns a &lt;strong&gt;public IP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Distributes traffic across Pods&lt;/li&gt;
&lt;li&gt;Works only on &lt;strong&gt;cloud Kubernetes clusters&lt;/strong&gt; (AWS, Azure, GCP)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  LoadBalancer Example
&lt;/h3&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-loadbalancer&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;LoadBalancer&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a cloud-managed external load balancer&lt;/li&gt;
&lt;li&gt;Assigns a public IP address&lt;/li&gt;
&lt;li&gt;Load balances traffic across Pods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Get the external IP:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get svc nginx-loadbalancer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;LoadBalancer is simple for direct exposure, but Ingress is preferred for large-scale HTTP applications.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pod&lt;/strong&gt; → Smallest runtime unit, temporary by nature
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt; → Manages Pods, ensures availability and scaling
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service&lt;/strong&gt; → Stable networking and load balancing
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ingress&lt;/strong&gt; → HTTP/HTTPS routing with a single entry point
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LoadBalancer&lt;/strong&gt; → Cloud-based external exposure
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each component solves a &lt;strong&gt;specific problem&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Using the right one at the right place is what makes Kubernetes manageable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Kubernetes is not complicated — unclear explanations make it look that way.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once Pods, Deployments, Services, and Ingress are understood as &lt;strong&gt;building blocks&lt;/strong&gt;, the rest of Kubernetes becomes predictable.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>containers</category>
    </item>
    <item>
      <title>Modern Logging with Grafana Alloy + Loki</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Wed, 26 Nov 2025 05:19:00 +0000</pubDate>
      <link>https://dev.to/sharonkynu/modern-logging-with-grafana-alloy-loki-53ll</link>
      <guid>https://dev.to/sharonkynu/modern-logging-with-grafana-alloy-loki-53ll</guid>
      <description>&lt;p&gt;A guide to collect Docker and host logs using Grafana Alloy + Loki, and why Alloy is replacing Promtail. Includes diagrams, permissions, docker-compose, and config files.&lt;/p&gt;

&lt;p&gt;Containers made deployments fast, portable, and efficient.&lt;br&gt;&lt;br&gt;
But collecting logs from hosts + containers + services quickly becomes chaotic.&lt;/p&gt;

&lt;p&gt;That’s why the modern stack uses &lt;strong&gt;Grafana Alloy + Loki&lt;/strong&gt; instead of the older Promtail-based approach.&lt;/p&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%2Fbbcw7j57n4ktxzfamgwk.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%2Fbbcw7j57n4ktxzfamgwk.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Why Grafana Loki Uses Alloy Instead of Promtail
&lt;/h2&gt;

&lt;p&gt;Promtail served its purpose well — but infrastructure evolved.&lt;br&gt;&lt;br&gt;
Grafana introduced &lt;strong&gt;Alloy&lt;/strong&gt; as its unified, modern, extensible telemetry collector.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔥 Promtail vs Alloy (Honest Breakdown)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Promtail&lt;/th&gt;
&lt;th&gt;Alloy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Log Collection&lt;/td&gt;
&lt;td&gt;✔️ Yes&lt;/td&gt;
&lt;td&gt;✔️ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metrics Collection&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✔️ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traces Collection&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✔️ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unified pipeline&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️ Logs + Metrics + Traces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker auto-discovery&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;✔️ Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processing pipeline&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;✔️ Powerful&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensibility&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;✔️ High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Future support&lt;/td&gt;
&lt;td&gt;🟥 Legacy&lt;/td&gt;
&lt;td&gt;🟩 Actively developed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  📌 The real reason Alloy replaces Promtail
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Promtail = &lt;strong&gt;log-only agent&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Alloy = &lt;strong&gt;one collector for logs, metrics, and traces&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Promtail is now maintenance-only.&lt;br&gt;&lt;br&gt;
Alloy is the future.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The logging pipeline includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alloy&lt;/strong&gt; → collector
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loki&lt;/strong&gt; → log store
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana&lt;/strong&gt; → visualization
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔥 High-level workflow
&lt;/h3&gt;

&lt;p&gt;Host Logs → Alloy → Loki → Grafana&lt;/p&gt;

&lt;p&gt;Docker Logs → Alloy → Loki → Grafana&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Architecture Diagram (Text View)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  ┌───────────────────────┐
                  │        Grafana        │
                  │  (Dashboards + Logs)  │
                  └──────────┬────────────┘
                             │
                    ┌────────┴─────────┐
                    │       Loki       │
                    │    (Log Store)   │
                    └────────┬─────────┘
                             │
            ┌────────────────┴────────────────┐
            │              Alloy              │
            │   (Unified Telemetry Collector) │
            └───────────┬───────────┬─────────┘
                        │           │
                 Host Logs      Docker Logs
             (/var/log/*)   (via Docker Engine)
                            (/var/lib/docker/containers/*)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📁 Folder Structure
&lt;/h2&gt;

&lt;p&gt;/opt/alloy/&lt;br&gt;
├── alloy/&lt;br&gt;
│   └── config.alloy&lt;br&gt;
├── grafana-data/&lt;br&gt;
├── loki/&lt;br&gt;
│   └── loki-config.yaml&lt;br&gt;
├── loki-data/&lt;br&gt;
└── docker-compose.yml&lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 Required Permissions (Critical)
&lt;/h2&gt;

&lt;p&gt;Loki &amp;amp; Grafana &lt;strong&gt;will fail&lt;/strong&gt; without correct folder ownership.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loki storage (UID/GID 10001)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/alloy/loki-data
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 10001:10001 /opt/alloy/loki-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/alloy/grafana-data
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 472:472 /opt/alloy/grafana-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🐳 docker-compose.yaml (Production Ready)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;services:
  loki:
    image: grafana/loki:3.1.0
    container_name: loki
    &lt;span class="nb"&gt;command&lt;/span&gt;: &lt;span class="nt"&gt;-config&lt;/span&gt;.file&lt;span class="o"&gt;=&lt;/span&gt;/etc/loki/local-config.yaml
    volumes:
      - ./loki/loki-config.yaml:/etc/loki/loki-config.yaml:ro
      - ./loki-data:/loki
    ports:
      - &lt;span class="s2"&gt;"3100:3100"&lt;/span&gt;

  alloy:
    image: grafana/alloy:latest
    container_name: alloy
    privileged: &lt;span class="nb"&gt;true
    &lt;/span&gt;volumes:
      - ./alloy/config.alloy:/etc/alloy/config.alloy:ro
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/log:/var/log:ro
    ports:
      - &lt;span class="s2"&gt;"12345:12345"&lt;/span&gt;

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    volumes:
      - ./grafana-data:/var/lib/grafana    
  ports:
      - &lt;span class="s2"&gt;"3000:3000"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚙️ config.alloy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="c"&gt;### Send Alloy’s internal logs to Loki&lt;/span&gt;
logging &lt;span class="o"&gt;{&lt;/span&gt;
  level  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"info"&lt;/span&gt;
  format &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"logfmt"&lt;/span&gt;
  write_to &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;loki.relabel.alloy_logs.receiver]
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;### Auto-discover Docker containers&lt;/span&gt;
discovery.docker &lt;span class="s2"&gt;"local_docker"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  host &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unix:///var/run/docker.sock"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;### Match host logs (/var/log/*log)&lt;/span&gt;
local.file_match &lt;span class="s2"&gt;"host_logs"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  path_targets &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt; __path__ &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/var/log/*log"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;### Tail host logs&lt;/span&gt;
loki.source.file &lt;span class="s2"&gt;"host_tail"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  targets    &lt;span class="o"&gt;=&lt;/span&gt; local.file_match.host_logs.targets
  forward_to &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;loki.process.host_pipeline.receiver]
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;### Add static labels to host logs&lt;/span&gt;
loki.process &lt;span class="s2"&gt;"host_pipeline"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  forward_to &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;loki.write.local.receiver]

  stage.static_labels &lt;span class="o"&gt;{&lt;/span&gt;
    values &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      job     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"varlogs"&lt;/span&gt;,
      &lt;span class="nb"&gt;source&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"host"&lt;/span&gt;,
      &lt;span class="nb"&gt;env&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"dev"&lt;/span&gt;,
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;### Collect logs from Docker containers (stdout/stderr)&lt;/span&gt;
loki.source.docker &lt;span class="s2"&gt;"docker_engine"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  host &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unix:///var/run/docker.sock"&lt;/span&gt;

  targets &lt;span class="o"&gt;=&lt;/span&gt; discovery.docker.local_docker.targets

  labels &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    job     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"docker_logs"&lt;/span&gt;,
    &lt;span class="nb"&gt;env&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"dev"&lt;/span&gt;,
    cluster &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"local"&lt;/span&gt;,
  &lt;span class="o"&gt;}&lt;/span&gt;

  forward_to &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;loki.write.local.receiver]
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;### Loki ingest endpoint&lt;/span&gt;
loki.write &lt;span class="s2"&gt;"local"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  endpoint &lt;span class="o"&gt;{&lt;/span&gt;
    url &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"http://loki:3100/loki/api/v1/push"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;### Add label to internal Alloy logs&lt;/span&gt;
loki.relabel &lt;span class="s2"&gt;"alloy_logs"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  forward_to &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;loki.write.local.receiver]

  rule &lt;span class="o"&gt;{&lt;/span&gt;
    target_label &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"service"&lt;/span&gt;
    replacement  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"alloy"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  loki-config.yaml
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;auth_enabled: &lt;span class="nb"&gt;false

&lt;/span&gt;server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /loki
  storage:
    filesystem:
      chunks_directory: /loki/chunks
      rules_directory: /loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: &lt;span class="nb"&gt;true
        &lt;/span&gt;max_size_mb: 100

limits_config:
  ingestion_rate_mb: 10
  ingestion_burst_size_mb: 20
  max_concurrent_tail_requests: 20
  max_cache_freshness_per_query: 10m
  max_streams_per_user: 50
  allow_structured_metadata: &lt;span class="nb"&gt;false

&lt;/span&gt;schema_config:
  configs:
    - from: 2024-01-01
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Restart and Run
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;✔ All Docker logs collected
&lt;/li&gt;
&lt;li&gt;✔ All host logs collected
&lt;/li&gt;
&lt;li&gt;✔ Alloy logs included with label &lt;code&gt;service=alloy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✔ Grafana fully functional
&lt;/li&gt;
&lt;li&gt;✔ No permission errors
&lt;/li&gt;
&lt;li&gt;✔ Production-grade observability pipeline
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Alloy replaces Promtail&lt;/strong&gt; and simplifies the entire telemetry ecosystem — logs, metrics, traces — in one place.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>tutorial</category>
      <category>devops</category>
      <category>docker</category>
    </item>
    <item>
      <title>🚀 Kubernetes Architecture Explained.</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Fri, 07 Nov 2025 05:57:21 +0000</pubDate>
      <link>https://dev.to/sharonkynu/kubernetes-architecture-explained-5eom</link>
      <guid>https://dev.to/sharonkynu/kubernetes-architecture-explained-5eom</guid>
      <description>&lt;p&gt;Containers revolutionized software delivery — fast, portable, and reliable.&lt;br&gt;&lt;br&gt;
But managing &lt;em&gt;hundreds&lt;/em&gt; of containers across servers? That’s where &lt;strong&gt;Kubernetes (K8s)&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;Let’s explore the &lt;strong&gt;complete architecture of Kubernetes&lt;/strong&gt;, why it’s used, and how it powers modern cloud infrastructure. 🌩️&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What is Kubernetes?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; (K8s) is an &lt;strong&gt;open-source container orchestration platform&lt;/strong&gt; originally developed by Google and now maintained by the &lt;strong&gt;Cloud Native Computing Foundation (CNCF)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It automates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧩 Deployment of containers
&lt;/li&gt;
&lt;li&gt;⚙️ Scaling and load balancing
&lt;/li&gt;
&lt;li&gt;🛠️ Self-healing and rolling updates
&lt;/li&gt;
&lt;li&gt;🔐 Configuration and secrets management
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kubernetes ensures your containerized applications &lt;strong&gt;run exactly as intended — automatically and reliably&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 Kubernetes Core Architecture Overview
&lt;/h2&gt;

&lt;p&gt;Kubernetes is built on two major layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Control Plane (Master)&lt;/strong&gt; → Brains of the cluster
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker Nodes&lt;/strong&gt; → Muscles that actually run workloads
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s break them down 👇&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 1️⃣ Control Plane (Master Components)
&lt;/h3&gt;

&lt;p&gt;These components manage the &lt;strong&gt;overall cluster state&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API Server (&lt;code&gt;kube-apiserver&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The front door of the cluster. Handles REST requests, validates configuration, and updates the cluster state in &lt;code&gt;etcd&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;etcd&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A distributed key-value store that holds all cluster data (desired &amp;amp; current state). Acts as the source of truth.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scheduler (&lt;code&gt;kube-scheduler&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Decides which node runs a new Pod based on available resources and policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Controller Manager (&lt;code&gt;kube-controller-manager&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ensures the cluster matches the desired configuration (e.g., if a Pod fails, it starts a new one).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Controller Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connects Kubernetes with underlying cloud services like load balancers and storage.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  💪 2️⃣ Worker Nodes (Data Plane)
&lt;/h3&gt;

&lt;p&gt;Worker nodes actually &lt;strong&gt;run your containers&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Each node runs the following key components:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kubelet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Node agent that ensures containers are running as per the API server’s instructions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kube Proxy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manages networking, traffic routing, and load balancing between services.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runs containers (e.g., Docker, containerd, CRI-O). Responsible for pulling images and starting containers.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🧱 3️⃣ Kubernetes Objects
&lt;/h3&gt;

&lt;p&gt;Kubernetes uses &lt;strong&gt;declarative configuration files (YAML)&lt;/strong&gt; to manage workloads.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Object&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Pod&lt;/strong&gt; 🧫&lt;/td&gt;
&lt;td&gt;The smallest deployable unit; runs one or more containers together.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ReplicaSet&lt;/strong&gt; 🔁&lt;/td&gt;
&lt;td&gt;Ensures the desired number of identical Pods are always running.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Deployment&lt;/strong&gt; 🚀&lt;/td&gt;
&lt;td&gt;Manages rollout, rollback, and scaling of applications.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Service&lt;/strong&gt; 🔗&lt;/td&gt;
&lt;td&gt;Provides stable networking and load balancing between Pods.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ConfigMap / Secret&lt;/strong&gt; 🔐&lt;/td&gt;
&lt;td&gt;Externalize configuration and sensitive data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Ingress&lt;/strong&gt; 🌍&lt;/td&gt;
&lt;td&gt;Routes external HTTP(S) traffic to internal services.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Namespace&lt;/strong&gt; 📦&lt;/td&gt;
&lt;td&gt;Organizes cluster resources logically for isolation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🏗️ 6️⃣ Kubernetes Architecture Diagram (Text View)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

               ┌──────────────────────────┐
               │     Load Balancer (LB)   │
               └──────────────┬───────────┘
                              │
         ┌────────────────────┴──────────────────────┐
         │            Control Plane Nodes            │
         │ (API Server, etcd, Scheduler, Controllers)│
         └────────────────────┬──────────────────────┘
                              │
         ┌────────────────────┴──────────────────────┐
         │              Worker Nodes                 │
         │ (Kubelet, Kube Proxy, Containers/Pods)    │
         └────────────────────┬──────────────────────┘
                              │
                ┌─────────────┴─────────────┐
                │     Services &amp;amp; Ingress    │
                └─────────────┬─────────────┘
                              │
                        User Traffic 🌍
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>devops</category>
      <category>containers</category>
      <category>kubernetes</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🚀 Kubernetes Explained — What It Is, Why It’s Used, and How It Differs from Docker</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Fri, 07 Nov 2025 02:14:45 +0000</pubDate>
      <link>https://dev.to/sharonkynu/kubernetes-explained-what-it-is-why-its-used-and-how-it-differs-from-docker-591m</link>
      <guid>https://dev.to/sharonkynu/kubernetes-explained-what-it-is-why-its-used-and-how-it-differs-from-docker-591m</guid>
      <description>&lt;p&gt;If you’ve ever wondered &lt;em&gt;“What exactly is Kubernetes?”&lt;/em&gt; or &lt;em&gt;“How is it different from Docker?”&lt;/em&gt;, you’re not alone.&lt;br&gt;&lt;br&gt;
Let’s break it down step by step — in simple terms but with real DevOps depth 👇  &lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 What is Kubernetes?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes (K8s)&lt;/strong&gt; is an &lt;strong&gt;open-source container orchestration platform&lt;/strong&gt; developed by Google and maintained by the &lt;strong&gt;Cloud Native Computing Foundation (CNCF)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In simpler words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kubernetes is like the &lt;strong&gt;brain of your containerized infrastructure&lt;/strong&gt; — it automatically decides &lt;strong&gt;where&lt;/strong&gt;, &lt;strong&gt;when&lt;/strong&gt;, and &lt;strong&gt;how&lt;/strong&gt; your containers should run.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ⚙️ Why Do We Need Kubernetes?
&lt;/h3&gt;

&lt;p&gt;Before Kubernetes, developers used &lt;strong&gt;Docker&lt;/strong&gt; to package applications into containers — which was great…&lt;br&gt;&lt;br&gt;
Until you had &lt;strong&gt;hundreds&lt;/strong&gt; of containers running across &lt;strong&gt;dozens of servers&lt;/strong&gt; 😬  &lt;/p&gt;

&lt;p&gt;Managing them manually became chaotic — think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restarting crashed containers 🧩
&lt;/li&gt;
&lt;li&gt;Balancing traffic between services ⚖️
&lt;/li&gt;
&lt;li&gt;Updating apps without downtime 🚀
&lt;/li&gt;
&lt;li&gt;Scaling up under heavy load 📈
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where &lt;strong&gt;Kubernetes&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;It automates all of these complex tasks with &lt;strong&gt;precision and intelligence&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 Key Benefits of Kubernetes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Automation&lt;/strong&gt; 🤖&lt;/td&gt;
&lt;td&gt;Automatically deploys, restarts, and scales containers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-healing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Restarts failed containers and replaces unhealthy nodes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Load Balancing&lt;/strong&gt; ⚖️&lt;/td&gt;
&lt;td&gt;Distributes traffic evenly across Pods.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; 📈&lt;/td&gt;
&lt;td&gt;Scales apps up/down automatically based on metrics.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Rolling Updates&lt;/strong&gt; 🔁&lt;/td&gt;
&lt;td&gt;Updates apps without downtime.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Portability&lt;/strong&gt; 🌎&lt;/td&gt;
&lt;td&gt;Runs anywhere — cloud, on-premises, or hybrid.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Resource Efficiency&lt;/strong&gt; ⚙️&lt;/td&gt;
&lt;td&gt;Optimizes CPU and memory across workloads.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🧩 Kubernetes Core Components (Simplified)
&lt;/h3&gt;

&lt;p&gt;Here’s how a Kubernetes cluster is structured 👇  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Components&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Control Plane&lt;/strong&gt; 🧠&lt;/td&gt;
&lt;td&gt;API Server, Scheduler, Controller Manager, etcd&lt;/td&gt;
&lt;td&gt;Makes global decisions (what should run, where, and how).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Worker Nodes&lt;/strong&gt; 💪&lt;/td&gt;
&lt;td&gt;Kubelet, Kube Proxy, Container Runtime&lt;/td&gt;
&lt;td&gt;Actually run your containers and handle networking.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Objects&lt;/strong&gt; 📦&lt;/td&gt;
&lt;td&gt;Pods, Deployments, Services, Ingress&lt;/td&gt;
&lt;td&gt;Define what applications run and how users access them.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The &lt;strong&gt;Control Plane&lt;/strong&gt; manages the cluster.&lt;br&gt;&lt;br&gt;
The &lt;strong&gt;Worker Nodes&lt;/strong&gt; execute workloads.  &lt;/p&gt;




&lt;h3&gt;
  
  
  🐳 Kubernetes vs Docker — The Big Question
&lt;/h3&gt;

&lt;p&gt;People often say &lt;em&gt;“Kubernetes vs Docker”&lt;/em&gt;, but actually, they’re &lt;strong&gt;not competitors&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
They solve &lt;strong&gt;different problems&lt;/strong&gt; in the container ecosystem.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🧩 &lt;strong&gt;Feature&lt;/strong&gt;
&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Kubernetes (K8s)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Containerization platform&lt;/td&gt;
&lt;td&gt;Container orchestration system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Builds and runs containers&lt;/td&gt;
&lt;td&gt;Manages and scales containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Focus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single container lifecycle&lt;/td&gt;
&lt;td&gt;Multiple containers across clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developer-level tool&lt;/td&gt;
&lt;td&gt;Cluster-level management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple bridge network&lt;/td&gt;
&lt;td&gt;Advanced service networking (CNI, Ingress)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual scaling&lt;/td&gt;
&lt;td&gt;Auto-scaling based on CPU/Memory metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-healing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Automatically replaces failed Pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited volumes&lt;/td&gt;
&lt;td&gt;Persistent Volumes &amp;amp; dynamic storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load Balancing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Needs manual setup&lt;/td&gt;
&lt;td&gt;Built-in service load balancing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🧠 &lt;strong&gt;In Summary:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker = How you &lt;strong&gt;build and run containers&lt;/strong&gt; 🐋
&lt;/li&gt;
&lt;li&gt;Kubernetes = How you &lt;strong&gt;orchestrate and manage containers&lt;/strong&gt; across multiple servers ☸️
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
    </item>
    <item>
      <title>Understanding Logrotate — The Silent Hero of Linux Logs</title>
      <dc:creator>SHARON SHAJI</dc:creator>
      <pubDate>Thu, 06 Nov 2025 05:26:56 +0000</pubDate>
      <link>https://dev.to/sharonkynu/understanding-logrotate-the-silent-hero-of-linux-logs-bdc</link>
      <guid>https://dev.to/sharonkynu/understanding-logrotate-the-silent-hero-of-linux-logs-bdc</guid>
      <description>&lt;p&gt;Ever wondered how Linux systems manage logs so efficiently without filling up disk space?&lt;/p&gt;

&lt;p&gt;That’s where Logrotate comes in — a simple yet powerful tool that automatically handles log file rotation, compression, and cleanup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧠 What Logrotate Does:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Rotates logs based on size or time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compresses old logs to save disk space&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deletes outdated logs automatically&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keeps your services running smoothly — no restarts needed!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;💡 Example:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
If your application writes to /var/log/app.log, Logrotate can:&lt;/p&gt;

&lt;p&gt;Rename it to app.log.1, app.log.2.gz, etc.&lt;/p&gt;

&lt;p&gt;Create a new, clean app.log for fresh entries&lt;/p&gt;

&lt;p&gt;Remove older files after a few rotations&lt;/p&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%2F4kldx4if7tyn9xkapesk.png" 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%2F4kldx4if7tyn9xkapesk.png" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ Why It Matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In production environments — especially with Docker, web servers, or microservices — logs can grow to gigabytes quickly.&lt;br&gt;
Without Logrotate, this can lead to disk full errors and potential downtime.&lt;br&gt;
With it, space is freed automatically — no system or service restart required.&lt;/p&gt;

&lt;p&gt;📊 Integrate Logrotate with Docker volumes or systemd units for complete automation across environments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;gt; “Logrotate silently keeps your servers clean, efficient, and logging — without ever needing a restart.”&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
