<?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: TheYAMLGuy</title>
    <description>The latest articles on DEV Community by TheYAMLGuy (@theyamlguy).</description>
    <link>https://dev.to/theyamlguy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4037802%2F87b6a2ab-3052-4a27-8114-3c9f2f1d4496.png</url>
      <title>DEV Community: TheYAMLGuy</title>
      <link>https://dev.to/theyamlguy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/theyamlguy"/>
    <language>en</language>
    <item>
      <title>Kubernetes Troubleshooting 101 (Part 1): Pod Errors Explained</title>
      <dc:creator>TheYAMLGuy</dc:creator>
      <pubDate>Wed, 22 Jul 2026 14:25:53 +0000</pubDate>
      <link>https://dev.to/theyamlguy/kubernetes-troubleshooting-101-part-1-pod-errors-explained-4gii</link>
      <guid>https://dev.to/theyamlguy/kubernetes-troubleshooting-101-part-1-pod-errors-explained-4gii</guid>
      <description>&lt;p&gt;If you’ve worked with Kubernetes for more than a day, you’ve seen a Pod get stuck in a state that isn't Running.When a production system throws an error at 2 AM, your goal isn't just to restart the Pod, it's to understand why it failed so it doesn't happen again.&lt;/p&gt;




&lt;p&gt;Welcome to Part 1 of Kubernetes Troubleshooting 101.&lt;br&gt;
In this series, we unpack common Kubernetes failure modes, translate cryptic status codes into plain English, and provide practical YAML/kubectl fixes.&lt;/p&gt;



&lt;p&gt;Today, we cover the 4 most common Pod-level errors: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CrashLoopBackOff&lt;/li&gt;
&lt;li&gt;ImagePullBackOff / ErrImagePull&lt;/li&gt;
&lt;li&gt;OOMKilled (Exit Code 137)&lt;/li&gt;
&lt;li&gt;Pending&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  1. CrashLoopBackOff
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What it means
&lt;/h3&gt;

&lt;p&gt;Kubernetes started your container, but the application inside exited or crashed immediately. Kubernetes then attempts to restart it, fails again, and enters an exponential delay loop (backoff) to prevent overloading the node.&lt;/p&gt;
&lt;h3&gt;
  
  
  Common Root Causes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Missing or misconfigured environment variables.&lt;/li&gt;
&lt;li&gt;The main process exited (e.g., a script finished executing instead of running an ongoing service).&lt;/li&gt;
&lt;li&gt;Misconfigured application code or broken dependencies.&lt;/li&gt;
&lt;li&gt;Incorrect command or args in the Pod manifest.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The Fix Workflow
&lt;/h3&gt;

&lt;p&gt;Don't just delete the Pod! First, check the logs of the failed container instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl logs &amp;lt;pod-name&amp;gt; &lt;span class="nt"&gt;--previous&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; The &lt;em&gt;--previous&lt;/em&gt; flag fetches logs from the container instance that just crashed, which is essential if the new instance hasn't logged anything yet.&lt;/p&gt;

&lt;p&gt;Next, inspect the exact termination state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look under Last State:&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;State&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;          &lt;span class="s"&gt;Waiting&lt;/span&gt;
  &lt;span class="s"&gt;Reason&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;CrashLoopBackOff&lt;/span&gt;
&lt;span class="na"&gt;Last State&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;     &lt;span class="s"&gt;Terminated&lt;/span&gt;
  &lt;span class="s"&gt;Reason&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;Error&lt;/span&gt;
  &lt;span class="s"&gt;Exit Code&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;    &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the exit code is 1, your application code threw an unhandled exception. Fix the app configuration, update your ConfigMap or Secret and redeploy.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. ImagePullBackOff / ErrImagePull
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What it means
&lt;/h3&gt;

&lt;p&gt;The Kubelet cannot pull the container image specified in your Deployment manifest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Root Causes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Typos in the image name or tag (e.g., nginx:latst).&lt;/li&gt;
&lt;li&gt;The container image does not exist or was deleted from the registry.&lt;/li&gt;
&lt;li&gt;Private registry authentication failure (missing imagePullSecrets).&lt;/li&gt;
&lt;li&gt;Network issues or container registry rate limits (e.g., Docker Hub limits).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Fix Workflow
&lt;/h3&gt;

&lt;p&gt;Run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and scroll down to the Events section at the bottom. The event log tells you the exact reason:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Warning  Failed     12s (x2 over 34s)     kubelet            Failed to pull image "my-app:v1.0.4": rpc error: code = NotFound
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fix typos:&lt;/strong&gt; Double-check the image name and tag in your YAML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Registries:&lt;/strong&gt; Ensure your Pod manifest references a valid imagePullSecret:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;imagePullSecrets&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;my-registry-key&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;my-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;private-registry.io/my-app:v1.0.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. OOMKilled (Exit Code 137)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What it means
&lt;/h3&gt;

&lt;p&gt;Your container was terminated by the Linux Kernel Out-Of-Memory (OOM) killer because it exceeded its allocated memory limit defined in the Pod manifest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Root Causes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Memory leaks in the application.&lt;/li&gt;
&lt;li&gt;Memory limits set too aggressively low in the manifest.&lt;/li&gt;
&lt;li&gt;Sudden traffic spikes causing high memory usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Fix Workflow
&lt;/h3&gt;

&lt;p&gt;Checking&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 describe pod &amp;lt;pod-name&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will reveal Exit Code: 137:&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;Last State&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;     &lt;span class="s"&gt;Terminated&lt;/span&gt;
  &lt;span class="s"&gt;Reason&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;OOMKilled&lt;/span&gt;
  &lt;span class="s"&gt;Exit Code&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;    &lt;span class="m"&gt;137&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fixes:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Short term:&lt;/strong&gt; Increase the limits.memory in your container spec:&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;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;256Mi"&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;512Mi"&lt;/span&gt; &lt;span class="c1"&gt;# Increase this value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Long term:&lt;/strong&gt; Profile your application to identify memory leaks before simply giving it more resources.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Pending
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What it means
&lt;/h3&gt;

&lt;p&gt;The Pod has been accepted by the Kubernetes cluster, but the Scheduler cannot assign it to any node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Root Causes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Insufficient Resources:&lt;/strong&gt; No node in the cluster has enough CPU/Memory to satisfy the Pod's requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unsatisfiable Constraints:&lt;/strong&gt; Rigid nodeSelector, affinity, or tolerations rules that no active node matches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unbound PVCs:&lt;/strong&gt; The Pod uses a PersistentVolumeClaim that isn't bound to a volume yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Fix Workflow
&lt;/h3&gt;

&lt;p&gt;Run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and check the Events section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Events:
  Type     Reason            Age   From                Message
  ----     ------            ----  ----                -------
  Warning  FailedScheduling  45s   default-scheduler   0/3 nodes are available: 3 Insufficient memory.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fixes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lower your resources.requests if they are unrealistically high.&lt;/li&gt;
&lt;li&gt;Scale up your cluster nodes (or allow the Cluster Autoscaler to add nodes).&lt;/li&gt;
&lt;li&gt;Verify that required PersistentVolumeClaims (PVCs) exist and are bound.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Primary Cause&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;First Command to Run&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CrashLoopBackOff&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;App crashed / Bad env vars&lt;/td&gt;
&lt;td&gt;kubectl logs  --previous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ImagePullBackOff&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wrong image name / Registry auth&lt;/td&gt;
&lt;td&gt;kubectl describe pod &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OOMKilled&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exceeded memory limits&lt;/td&gt;
&lt;td&gt;kubectl describe pod  (Check for Code 137)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pending&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No available node resources&lt;/td&gt;
&lt;td&gt;kubectl describe pod  (Check Events)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>softwareengineering</category>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>5 Kubernetes YAML Anti-Patterns I Still See in Production (And How to Fix Them)</title>
      <dc:creator>TheYAMLGuy</dc:creator>
      <pubDate>Tue, 21 Jul 2026 14:25:45 +0000</pubDate>
      <link>https://dev.to/theyamlguy/5-kubernetes-yaml-anti-patterns-i-still-see-in-production-and-how-to-fix-them-5318</link>
      <guid>https://dev.to/theyamlguy/5-kubernetes-yaml-anti-patterns-i-still-see-in-production-and-how-to-fix-them-5318</guid>
      <description>&lt;p&gt;Unfortunately, I still see serious security risks in production environments. Therefore, I would like to highlight five common mistakes, explain their impact, and show how to fix them.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Using the &lt;code&gt;latest&lt;/code&gt; Image Tag
&lt;/h2&gt;

&lt;p&gt;Classic one.&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="c1"&gt;# BAD: Using the latest tag&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-container&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myregistry.azurecr.io/app:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it's a problem:&lt;/p&gt;

&lt;p&gt;This flaw opens the door to supply chain attacks. An attacker with access to the image registry can publish an infected version; Kubernetes would then deploy that infected version, resulting in a security incident.&lt;/p&gt;

&lt;p&gt;Additionally, it breaks deterministic deployments, two pods started on different days might run completely different code versions without you realizing it.&lt;br&gt;
How to fix it:&lt;/p&gt;

&lt;p&gt;Always pin your container images to explicit semantic versions or immutable SHA-256 digests.&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="c1"&gt;# GOOD: Using explicit versioning&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-container&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myregistry.azurecr.io/app:v1.4.2&lt;/span&gt;
    &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;IfNotPresent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Running Containers as Root&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By default, Kubernetes containers run as the root user unless you explicitly tell them not to.&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="c1"&gt;# BAD: No security context defined&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;web-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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it's a problem:&lt;/p&gt;

&lt;p&gt;If an attacker exploits an application vulnerability (like a Remote Code Execution), they instantly get root privileges inside the container. This makes container escape attacks on the host node significantly easier.&lt;br&gt;
How to fix it:&lt;/p&gt;

&lt;p&gt;Enforce non-root execution via the securityContext.&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="c1"&gt;# GOOD: Restricting privileges&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;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runAsNonRoot&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;runAsUser&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10001&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;web-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;nginxinc/nginx-unprivileged:alpine&lt;/span&gt;
    &lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;allowPrivilegeEscalation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Omitting CPU and Memory Limits&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Deploying workloads without setting boundaries for compute resources.&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="c1"&gt;# BAD: Unbounded resource consumption&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;backend&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;backend-service:v1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it's a problem:&lt;/p&gt;

&lt;p&gt;A single pod with a memory leak can consume all available memory on a worker node. This triggers the Node OOM killer, causing unexpected evictions of other critical pods running on the same node.&lt;br&gt;
How to fix it:&lt;/p&gt;

&lt;p&gt;Define clear requests for scheduling and limits to set an absolute ceiling.&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="c1"&gt;# GOOD: Explicit resource boundaries&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;backend&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;backend-service:v1.0&lt;/span&gt;
    &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;256Mi"&lt;/span&gt;
        &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;100m"&lt;/span&gt;
      &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;512Mi"&lt;/span&gt;
        &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Missing Liveness and Readiness Probes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Assuming Kubernetes knows your application state just because the process hasn't crashed.&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="c1"&gt;# BAD: No health checks configured&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;api&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;api-service:v2.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it's a problem:&lt;/p&gt;

&lt;p&gt;If your app takes 30 seconds to boot or gets deadlocked in a database connection loop, Kubernetes will still route live user traffic to it, resulting in HTTP 500 errors for your users.&lt;br&gt;
How to fix it:&lt;/p&gt;

&lt;p&gt;Add explicit readiness and liveness endpoints.&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="c1"&gt;# GOOD: Probes configured&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;api&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;api-service:v2.0&lt;/span&gt;
    &lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;httpGet&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;/healthz/ready&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;8080&lt;/span&gt;
    &lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;httpGet&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;/healthz/live&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;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Hardcoding Secrets in ConfigMaps&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Putting raw API keys, tokens, or passwords directly into plain-text manifests.&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="c1"&gt;# BAD: Plain-text credentials&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ConfigMap&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;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;DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NothingToSeeHere"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it's a problem:&lt;/p&gt;

&lt;p&gt;ConfigMaps are stored unencrypted in etcd by default and can be read by anyone with basic namespace read access. They also frequently leak into system logs.&lt;br&gt;
How to fix it:&lt;/p&gt;

&lt;p&gt;Use native Kubernetes Secrets (encrypted at rest) or inject them via a Secret Manager (e.g., HashiCorp Vault, AWS Secrets Manager).&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="c1"&gt;# GOOD: Referencing a secret object&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;app:v1.0&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DB_PASSWORD&lt;/span&gt;
      &lt;span class="na"&gt;valueFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;secretKeyRef&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-credentials&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Fixing these five points, makes your cluster a bit safer.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>security</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Kubernetes: StatefulSet vs. Deployment</title>
      <dc:creator>TheYAMLGuy</dc:creator>
      <pubDate>Mon, 20 Jul 2026 10:11:23 +0000</pubDate>
      <link>https://dev.to/theyamlguy/kubernetes-statefulset-vs-deployment-nh7</link>
      <guid>https://dev.to/theyamlguy/kubernetes-statefulset-vs-deployment-nh7</guid>
      <description>&lt;p&gt;When I've started with &lt;strong&gt;Kubernetes&lt;/strong&gt; it took me a long time to understand when to use a &lt;strong&gt;StatefulSet&lt;/strong&gt; instead of a &lt;strong&gt;Deployment&lt;/strong&gt; and whats the difference between them.&lt;/p&gt;

&lt;p&gt;The truth is: &lt;strong&gt;Deployments&lt;/strong&gt; are for things that don't care if they die. &lt;strong&gt;StatefulSets&lt;/strong&gt; are for things that do.&lt;/p&gt;

&lt;p&gt;Let's break down on when to use which and whats the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Difference (TL;DR)
&lt;/h2&gt;

&lt;p&gt;If you remember only one thing from this article, make it this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployments manage Stateless pods.&lt;/strong&gt; Every pod is identical, anonymous and completely replaceable. Think of them like cattle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StatefulSets manage Stateful pods.&lt;/strong&gt; Every pod has a unique identity, a persistent name and its own dedicated storage. Think of them like pets.&lt;/li&gt;
&lt;/ul&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;Deployment&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;StatefulSet&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pod Names&lt;/td&gt;
&lt;td&gt;Random hash (web-89768dx878-asdff)&lt;/td&gt;
&lt;td&gt;Sticky index (db-0, db-1, ...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling Order&lt;/td&gt;
&lt;td&gt;All at once (Random)&lt;/td&gt;
&lt;td&gt;One by one (0, then 1, then 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage (PVs)&lt;/td&gt;
&lt;td&gt;Shared or ephemeral&lt;/td&gt;
&lt;td&gt;Dedicated per pod via Templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best For&lt;/td&gt;
&lt;td&gt;APIs, Frontends, Microservices&lt;/td&gt;
&lt;td&gt;Databases, Queues, Cluster apps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When to use a Deployment (Stateless)
&lt;/h2&gt;

&lt;p&gt;Go with a &lt;strong&gt;Deployment&lt;/strong&gt; if your application &lt;strong&gt;doesn't save any data locally.&lt;/strong&gt; If Pod A dies, Pod B spins up on a different node, your users shouldn't notice anything because the actual State lives somewhere else like an external DB or S3 Bucket.&lt;/p&gt;

&lt;h2&gt;
  
  
  How K8s handles it
&lt;/h2&gt;

&lt;p&gt;When you scale a &lt;strong&gt;Deployment&lt;/strong&gt;, &lt;strong&gt;Kubernetes&lt;/strong&gt; creates a ReplicaSet, which spins up pods using random hashes at the end. It doesn't care about the order. If you delete pod-xyz, K8s replaces it with pod-abc.&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;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;api-deployment&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;api&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;api&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;api&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;api&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;h2&gt;
  
  
  When to use a StatefulSet (Stateful)
&lt;/h2&gt;

&lt;p&gt;You have to use a &lt;strong&gt;StatefulSet&lt;/strong&gt; the moment your pods &lt;strong&gt;need to remember who they are or need their own private disk space.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about a PostgreSQL cluster. You have a Primary node (writes) and Replicas (reads). The replicas need to know where the primary node is. You can't just use a random pod name that changes every time a node restarts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Magic behind StatefulSets
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Predictable DNS:&lt;/strong&gt; Your pods will be named postgres-1, postgres-2. etc. If postgres-0 crashes, it terminates and Kubernetes spins up a new pod with the exact same name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orderly Scaling:&lt;/strong&gt; K8s won't start postgres-1 until postgres-0 is completely up and running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedicated Storage(volumeClaimTemplates):&lt;/strong&gt; Instead of all pods fighting over the same persistent volume, a StatefulSet automatically provisions a unique Persistent Volume (PV) for each pod. postgres-0 gets data-postgres-0, postgres-1 gets data-postgres-1. Even if a pod dies, when it comes back, K8s attaches the exact same disk to it.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;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;StatefulSet&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;postgres-set&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;serviceName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postgres-headless"&lt;/span&gt; &lt;span class="c1"&gt;# Requires a Headless Service for network identity&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;postgres&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;postgres&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;postgres&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;postgres:16&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;5432&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&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;pgdata&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;/var/lib/postgresql/data&lt;/span&gt;
  &lt;span class="na"&gt;volumeClaimTemplates&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# This automatically creates a unique PVC per pod&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pgdata&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;accessModes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ReadWriteOnce"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&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;10Gi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope that is helpful for somebody. If you're a beginner, what topics should I write about next?&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>beginners</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
