<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: DEVOPS DYNAMO</title>
    <description>The latest articles on Forem by DEVOPS DYNAMO (@devops_dynamo_ae449a82026).</description>
    <link>https://forem.com/devops_dynamo_ae449a82026</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%2F3155068%2Fbc24666f-1e37-4d5b-bdbf-af9a045fc959.png</url>
      <title>Forem: DEVOPS DYNAMO</title>
      <link>https://forem.com/devops_dynamo_ae449a82026</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devops_dynamo_ae449a82026"/>
    <language>en</language>
    <item>
      <title>CKS SecurityContext Patterns You Must Memorize (Pod vs Container + Fast Verification)</title>
      <dc:creator>DEVOPS DYNAMO</dc:creator>
      <pubDate>Thu, 29 Jan 2026 22:47:50 +0000</pubDate>
      <link>https://forem.com/devops_dynamo_ae449a82026/cks-securitycontext-patterns-you-must-memorize-pod-vs-container-fast-verification-39ac</link>
      <guid>https://forem.com/devops_dynamo_ae449a82026/cks-securitycontext-patterns-you-must-memorize-pod-vs-container-fast-verification-39ac</guid>
      <description>&lt;p&gt;CKS securityContext questions look scary until you realize they are mostly the same patterns repeated.&lt;/p&gt;

&lt;p&gt;Here are the ones you should memorize to move fast during the CKS exam and CKS practice labs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pod vs container-level securityContext (quick rule)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pod-level securityContext = generic defaults for all containers&lt;/li&gt;
&lt;li&gt;Container-level securityContext = specific rules for one container&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exam trick:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If they say “Pod”, use Pod-level. If they say “container X”, use container-level. If unsure and lab checker is strict, apply runAs settings in both places.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) runAsNonRoot + UID/GID
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;securityContext:
  runAsNonRoot: true
  runAsUser: 101
  runAsGroup: 101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If strict checker, set both Pod-level and container-level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 101
    runAsGroup: 101
  containers:
  - name: app
    securityContext:
      runAsNonRoot: true
      runAsUser: 101
      runAsGroup: 101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2) allowPrivilegeEscalation false
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;securityContext:
  allowPrivilegeEscalation: false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3) Drop ALL capabilities, add NET_BIND_SERVICE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;securityContext:
  capabilities:
    drop:
    - ALL
    add:
    - NET_BIND_SERVICE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4) readOnlyRootFilesystem true
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;securityContext:
  readOnlyRootFilesystem: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If app breaks, mount emptyDir for writable paths (often /tmp):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;volumeMounts:
- name: tmp
  mountPath: /tmp
volumes:
- name: tmp
  emptyDir: {}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fast verification (kubectl jsonpath)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl -n security-context get pod secure-app -o jsonpath='{.spec.containers[0].securityContext.runAsNonRoot}{"\n"}'
kubectl -n security-context get pod secure-app -o jsonpath='{.spec.containers[0].securityContext.allowPrivilegeEscalation}{"\n"}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RBAC check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl auth can-i create rolebindings -n ci-cd --as=system:serviceaccount:ci-cd:ci-bot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>programming</category>
      <category>cloud</category>
    </item>
    <item>
      <title>nginx-ingress Retirement: Free Checklist To Plan a Safe Migration</title>
      <dc:creator>DEVOPS DYNAMO</dc:creator>
      <pubDate>Thu, 25 Dec 2025 16:04:01 +0000</pubDate>
      <link>https://forem.com/devops_dynamo_ae449a82026/nginx-ingress-retirement-free-checklist-to-plan-a-safe-migration-6mh</link>
      <guid>https://forem.com/devops_dynamo_ae449a82026/nginx-ingress-retirement-free-checklist-to-plan-a-safe-migration-6mh</guid>
      <description>&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%2Flru34qo95v9t3y3fscm0.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%2Flru34qo95v9t3y3fscm0.png" alt=" " width="800" height="1200"&gt;&lt;/a&gt;&lt;br&gt;
Are you responsible for an nginx ingress migration, or someone on your team is?&lt;/p&gt;

&lt;p&gt;I put together a set of free resources to make the process safer and less stressful.&lt;/p&gt;

&lt;p&gt;Free migration checklist (Excel):&lt;br&gt;
Payhip: &lt;a href="https://payhip.com/b/WgBRS" rel="noopener noreferrer"&gt;https://payhip.com/b/WgBRS&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://devopsdynamo.gumroad.com/l/Ingress-nginx-migration" rel="noopener noreferrer"&gt;https://devopsdynamo.gumroad.com/l/Ingress-nginx-migration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want more context and patterns, here’s the article:&lt;br&gt;
Medium: &lt;a href="https://medium.com/@DynamoDevOps/a-zero-panic-guide-to-migrating-off-ingress-nginx-with-a-free-detailed-checklist-caf355088b6a?postPublishedType=repub" rel="noopener noreferrer"&gt;https://medium.com/@DynamoDevOps/a-zero-panic-guide-to-migrating-off-ingress-nginx-with-a-free-detailed-checklist-caf355088b6a?postPublishedType=repub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to share the checklist with teammates who own ingress, DNS, TLS, or cutovers.&lt;br&gt;
If it helps avoid one outage, that’s already a win.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to Enforce Allowed Kubernetes Image Registries with Kyverno</title>
      <dc:creator>DEVOPS DYNAMO</dc:creator>
      <pubDate>Tue, 16 Dec 2025 12:51:35 +0000</pubDate>
      <link>https://forem.com/devops_dynamo_ae449a82026/how-to-enforce-allowed-kubernetes-image-registries-with-kyverno-25i1</link>
      <guid>https://forem.com/devops_dynamo_ae449a82026/how-to-enforce-allowed-kubernetes-image-registries-with-kyverno-25i1</guid>
      <description>&lt;p&gt;If you prefer learning by watching rather than reading, the full lab walkthrough is available in video form on my YouTube channel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=DjaQxtAwnUk" rel="noopener noreferrer"&gt;Kubernetes Image Security with Kyverno (Real-World Lab) - Part 1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Controlling which container registries can be used inside a Kubernetes cluster is a core part of supply chain security. If workloads can pull images from any external source, you lose visibility and risk introducing untrusted software. A simple way to lock this down at admission time is to use Kyverno.&lt;/p&gt;

&lt;p&gt;This guide walks through building policies that only allow images from approved registries and block everything else. The same approach applies in real production clusters and aligns well with CKS preparation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only permit images from:&lt;/p&gt;

&lt;p&gt;registry.company.io&lt;/p&gt;

&lt;p&gt;harbor.internal.local&lt;/p&gt;

&lt;p&gt;Any Pod pulling from an unapproved registry, including Docker Hub, should be denied during admission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confirming the Active Cluster Context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before you start, verify you're working on the correct cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config current-context
kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the context looks wrong, switch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config use-context &amp;lt;context&amp;gt;
kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Move forward once your nodes show Ready.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Kyverno&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kyverno operates as a set of controllers inside the cluster. If it's not already deployed, install it with Helm.&lt;/p&gt;

&lt;p&gt;Check whether it exists:&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 pods -n kyverno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If nothing shows up, add the repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the namespace if needed:&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 namespace kyverno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Kyverno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm install kyverno kyverno/kyverno -n kyverno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the controllers are running:&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 pods -n kyverno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once everything is Running, Kyverno begins intercepting admission requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building the Global Registry Restriction Policy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a ClusterPolicy that validates image sources at admission.&lt;/p&gt;

&lt;p&gt;File: restrict-registries.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: restrict-image-registries
spec:
  validationFailureAction: enforce
  background: true
  rules:
    - name: validate-registries
      match:
        resources:
          kinds:
            - Pod
      validate:
        message: "Only registry.company.io or harbor.internal.local are allowed."
        pattern:
          spec:
            containers:
              - image: "registry.company.io/* | harbor.internal.local/*"

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

&lt;/div&gt;



&lt;p&gt;Apply the policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f restrict-registries.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check registration:&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 clusterpolicy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see restrict-image-registries in the list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing the Policy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need to validate both failure and success paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test 1: Disallowed registry&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 run testbad --image=nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is denied because the image does not match the allowed patterns. The admission error confirms the rule is active.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test 2: Allowed registry&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 run testgood --image=registry.company.io/app:v1
kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Admission succeeds. The Pod may still fail to pull if the registry does not exist, but that is unrelated to the policy.&lt;/p&gt;

&lt;p&gt;This proves the global restriction works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Helpful Verification Commands&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 get clusterpolicy
kubectl describe clusterpolicy restrict-image-registries
kubectl get pods
kubectl describe pod testbad
kubectl describe pod testgood
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Optional Cleanup&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 delete pod testbad testgood --ignore-not-found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Extending the Model for Multi-Environment Clusters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most real clusters run several environments under the same control plane. A common setup is separate dev and prod namespaces. Each environment may rely on different registries, so policy enforcement must reflect that.&lt;/p&gt;

&lt;p&gt;The global policy stays in place. Now add namespace-specific rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating Environment Namespaces&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 namespace dev
kubectl create namespace prod
kubectl get namespaces
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Applying Namespace-Based Registry Policies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a second ClusterPolicy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: registry-per-namespace
spec:
  validationFailureAction: Enforce
  background: true
  rules:
    - name: dev-registry-only
      match:
        resources:
          kinds:
            - Pod
          namespaces:
            - dev
      validate:
        message: "Dev namespace must use registry.dev.company.io."
        pattern:
          spec:
            containers:
              - image: "registry.dev.company.io/*"

    - name: prod-registry-only
      match:
        resources:
          kinds:
            - Pod
          namespaces:
            - prod
      validate:
        message: "Prod namespace must use registry.prod.company.io."
        pattern:
          spec:
            containers:
              - image: "registry.prod.company.io/*"

&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 plaintext"&gt;&lt;code&gt;kubectl apply -f registry-per-namespace.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Testing Namespace Restrictions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dev namespace&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl run bad-dev --image=nginx -n dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should be rejected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl run good-dev --image=registry.dev.company.io/app:1.0 -n dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is accepted.&lt;/p&gt;

&lt;p&gt;Prod namespace&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl run bad-prod --image=nginx -n prod
kubectl run good-prod --image=registry.prod.company.io/web:1.0 -n prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The nginx Pod fails. The registry-approved one passes admission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How the Layered Approach Works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The cluster-wide policy limits image usage to internal registries only. The per-namespace policy adds a second filter:&lt;/p&gt;

&lt;p&gt;dev uses only dev registry images&lt;/p&gt;

&lt;p&gt;prod uses only prod registry images&lt;/p&gt;

&lt;p&gt;Both policies apply together. A Pod must satisfy both to be admitted. This structure prevents accidental cross-environment deployments and tightens supply chain controls without complicating developer workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You installed Kyverno, created a global restriction policy for image registries, and validated correct admission behavior. You then extended the scenario with environment-specific rules, ensuring dev and prod cannot cross-pull container images. This is a core security pattern for Kubernetes and aligns directly with CKS study requirements. Once registry control is established, you can layer in tag policies, digest enforcement, and signing rules.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>devsecops</category>
      <category>kyverno</category>
    </item>
    <item>
      <title>Migrating Off Ingress-NGINX Without Surprises</title>
      <dc:creator>DEVOPS DYNAMO</dc:creator>
      <pubDate>Tue, 16 Dec 2025 12:45:12 +0000</pubDate>
      <link>https://forem.com/devops_dynamo_ae449a82026/migrating-off-ingress-nginx-without-surprises-3eki</link>
      <guid>https://forem.com/devops_dynamo_ae449a82026/migrating-off-ingress-nginx-without-surprises-3eki</guid>
      <description>&lt;p&gt;While preparing for the ingress-nginx retirement, I documented the key things that actually matter during a real migration, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understanding what your ingress layer really does today, not what you think it does&lt;/li&gt;
&lt;li&gt;inventorying annotations, TLS, DNS, and risk across services&lt;/li&gt;
&lt;li&gt;translating ingress-nginx annotations to Gateway API behavior&lt;/li&gt;
&lt;li&gt;running a new controller in parallel to avoid risky cutovers&lt;/li&gt;
&lt;li&gt;designing rollback paths before touching production traffic&lt;/li&gt;
&lt;li&gt;validating observability, security, and DR early&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;full&lt;/strong&gt;, &lt;strong&gt;detailed guide&lt;/strong&gt; is &lt;strong&gt;published&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://medium.com/@DynamoDevOps/a-zero-panic-guide-to-migrating-off-ingress-nginx-with-a-free-detailed-checklist-caf355088b6a" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/strong&gt; and walks through the entire migration step by step, from discovery to cleanup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free migration checklist included&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Medium article also includes a free Excel migration checklist that covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;discovery and inventory&lt;/li&gt;
&lt;li&gt;annotation translation&lt;/li&gt;
&lt;li&gt;staging and validation&lt;/li&gt;
&lt;li&gt;cutover steps&lt;/li&gt;
&lt;li&gt;observability and DR checks&lt;/li&gt;
&lt;li&gt;owners, risks, rollback paths, and environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The checklist is designed for real planning meetings, not documentation theater.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 Read the full article on Medium:&lt;/strong&gt;&lt;br&gt;
A Zero-Panic Guide to Migrating Off Ingress-NGINX&lt;br&gt;
(&lt;a href="https://medium.com/@DynamoDevOps/a-zero-panic-guide-to-migrating-off-ingress-nginx-with-a-free-detailed-checklist-caf355088b6a" rel="noopener noreferrer"&gt;https://medium.com/@DynamoDevOps/a-zero-panic-guide-to-migrating-off-ingress-nginx-with-a-free-detailed-checklist-caf355088b6a&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;If you are planning an ingress-nginx migration before the retirement deadline, the full article and checklist should help you avoid last-minute surprises.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>5 Kubernetes YAML Patterns You’ll Actually Use in the Real World</title>
      <dc:creator>DEVOPS DYNAMO</dc:creator>
      <pubDate>Thu, 03 Jul 2025 21:19:24 +0000</pubDate>
      <link>https://forem.com/devops_dynamo_ae449a82026/5-kubernetes-yaml-patterns-youll-actually-use-in-the-real-world-30jl</link>
      <guid>https://forem.com/devops_dynamo_ae449a82026/5-kubernetes-yaml-patterns-youll-actually-use-in-the-real-world-30jl</guid>
      <description>&lt;p&gt;If you’re studying for the CKA (Certified Kubernetes Administrator) exam — or just trying to get better at managing real production clusters — chances are you've Googled half of these YAMLs at 2AM.&lt;/p&gt;

&lt;p&gt;Let’s save you the trouble.&lt;/p&gt;

&lt;p&gt;Here are 5 Kubernetes YAML patterns that show up over and over in interviews, in exam labs, and in real deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Basic Deployment with Resource Limits&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;apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "200m"
              memory: "256Mi" 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Exam-ready&lt;br&gt;
✅ Production-safe&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pod with ConfigMap Mounted as Volume&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;apiVersion: v1
kind: Pod
metadata:
  name: config-demo
spec:
  containers:
    - name: app
      image: busybox
      command: ["/bin/sh", "-c", "cat /etc/config/myconfig"]
      volumeMounts:
        - name: config
          mountPath: /etc/config
  volumes:
    - name: config
      configMap:
        name: my-configmap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Service + Ingress Combo (for HTTP Routing)&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;apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 8080

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-svc
                port:
                  number: 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Horizontal Pod Autoscaler (HPA)&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;apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Network Policy to Block All but One Namespace&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;apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-traffic
spec:
  podSelector: {}
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: allowed-ns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;📘 Want More? Grab the Full CKA Study Guide (Free + Paid Options)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post is a tiny slice of what’s inside my updated 2025 CKA exam guide. It’s built for engineers who want to actually pass, not just read docs.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Free Version (Preview)&lt;/strong&gt;&lt;br&gt;
Download here → &lt;a href="https://payhip.com/b/1HK5t" rel="noopener noreferrer"&gt;Payhip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Full Edition (50+ Labs + YAML + Traps + 15% Off)&lt;/strong&gt;&lt;br&gt;
Get it here → &lt;a href="https://payhip.com/b/3iAsH" rel="noopener noreferrer"&gt;Payhip&lt;/a&gt;&lt;br&gt;
Use code &lt;strong&gt;CKA15SUMMER&lt;/strong&gt; (expires July 8)&lt;/p&gt;

&lt;p&gt;—&lt;br&gt;
&lt;em&gt;Follow me @DynamoDevOps for more clean Kubernetes content.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
