<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Network Security | FirewallSync</title><link>https://firewallsync.com/tags/network-security/</link><description>Practical cybersecurity writing for engineering teams that ship fast.</description><language>en-us</language><image><url>https://firewallsync.com/icon-512.png</url><title>FirewallSync</title><link>https://firewallsync.com/</link></image><lastBuildDate>Thu, 22 Oct 2026 18:42:00 +0000</lastBuildDate><atom:link href="https://firewallsync.com/tags/network-security/index.xml" rel="self" type="application/rss+xml"/><item><title>Kubernetes NetworkPolicy Default Deny: A Safe Rollout</title><link>https://firewallsync.com/posts/kubernetes-networkpolicy-default-deny-safe-rollout/</link><guid>https://firewallsync.com/posts/kubernetes-networkpolicy-default-deny-safe-rollout/</guid><pubDate>Thu, 22 Oct 2026 18:42:00 +0000</pubDate><dc:creator>John Marshall</dc:creator><category>Cloud Security</category><description>Kubernetes allows all pod traffic until a NetworkPolicy selects a pod. A default-deny policy flips that, but it also blocks DNS, needs allow rules on both ends of every connection and does nothing without a network plugin that enforces it. Here is how the rules combine and an order to roll it out without an outage.</description><enclosure url="https://firewallsync.com/posts/kubernetes-networkpolicy-default-deny-safe-rollout/cover_hu4373152309049702664.jpg" type="image/jpeg" length="0"/><media:content url="https://firewallsync.com/posts/kubernetes-networkpolicy-default-deny-safe-rollout/cover_hu4373152309049702664.jpg" medium="image" type="image/jpeg" width="1200" height="630"/><content:encoded><![CDATA[<p><img src="https://firewallsync.com/posts/kubernetes-networkpolicy-default-deny-safe-rollout/cover_hu4373152309049702664.jpg" alt="Close-up of black Ethernet cables plugged into lit ports on the side of a grey network switch" width="1200" height="630"></p><p>In a Kubernetes cluster with no NetworkPolicies, every pod can talk to every other pod and to the internet. A default-deny policy changes that for one namespace: nothing gets in or out unless a policy allows it. It is one of the most effective controls against lateral movement after a pod is compromised, and one of the easiest to get wrong, because it silently depends on your network plugin, breaks DNS, and needs allow rules on both ends of every connection.</p>
<p><strong>Scope.</strong> This guide is based on the Kubernetes documentation for v1.37 (the &ldquo;Network Policies&rdquo; concept page and its example manifests in the kubernetes/website repository, read on October 22, 2026). The manifests below passed schema validation with kubeconform 0.6.7 in strict mode against the Kubernetes 1.34 schema. We did not apply them to a running cluster, and behavior can vary by network plugin, as the documentation itself notes.</p>
<h2 id="how-isolation-works">How isolation works</h2>
<p>The documentation describes two independent kinds of isolation for a pod, ingress and egress:</p>
<ul>
<li><strong>By default a pod is non-isolated</strong> in both directions: all inbound and outbound connections are allowed.</li>
<li><strong>A pod becomes isolated for a direction</strong> when any NetworkPolicy both selects it and lists that direction (<code>Ingress</code> or <code>Egress</code>) in <code>policyTypes</code>.</li>
<li><strong>Once isolated, only allowed traffic passes.</strong> The allowed set is the union of what every applicable policy allows. Reply traffic for allowed connections is permitted automatically.</li>
<li><strong>Policies are additive and don&rsquo;t conflict.</strong> There is no deny rule and no ordering. The documentation lists explicit deny as something the API cannot do.</li>
<li><strong>Both ends must agree.</strong> For a connection from pod A to pod B, A&rsquo;s egress and B&rsquo;s ingress must both allow it.</li>
<li><strong>Traffic from the pod&rsquo;s own node is always allowed</strong> for ingress, and a pod cannot block access to itself.</li>
</ul>
<p>Two practical consequences follow. First, the first policy that selects a pod for a direction is what isolates it, even if that policy was meant only to allow something. Second, &ldquo;default deny&rdquo; is not a special setting; it is a policy that selects all pods and allows nothing.</p>
<p>One more prerequisite: the documentation states that creating a NetworkPolicy without a network plugin that implements it &ldquo;will have no effect&rdquo;. Check that your CNI plugin enforces NetworkPolicy before you rely on any of this.</p>
<h2 id="the-default-deny-manifests">The default-deny manifests</h2>
<p>The Kubernetes documentation provides three variants. This one denies both directions:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">networking.k8s.io/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">NetworkPolicy</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">default-deny-all</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">namespace</span>: <span style="color:#ae81ff">shop</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">podSelector</span>: {}
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">policyTypes</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">Ingress</span>
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">Egress</span>
</span></span></code></pre></div><p><code>podSelector: {}</code> selects every pod in the namespace, including pods created later. The ingress-only and egress-only versions list only one entry in <code>policyTypes</code>.</p>
<p>A detail that trips people up: if you omit <code>policyTypes</code>, the documentation says <code>Ingress</code> is always set and <code>Egress</code> is set only if the policy has egress rules. A policy with no egress rules and no <code>policyTypes</code> therefore does not isolate egress. Write <code>policyTypes</code> explicitly.</p>
<h2 id="allow-dns-in-the-same-change">Allow DNS in the same change</h2>
<p>The documentation has a caution next to the egress example: a default-deny egress policy also blocks DNS. Add the allow before or with the deny:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">networking.k8s.io/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">NetworkPolicy</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">allow-dns-egress</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">namespace</span>: <span style="color:#ae81ff">shop</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">podSelector</span>: {}
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">policyTypes</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">Egress</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">egress</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">to</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">namespaceSelector</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">kubernetes.io/metadata.name</span>: <span style="color:#ae81ff">kube-system</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">podSelector</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">k8s-app</span>: <span style="color:#ae81ff">kube-dns</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">UDP</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">port</span>: <span style="color:#ae81ff">53</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">TCP</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">port</span>: <span style="color:#ae81ff">53</span>
</span></span></code></pre></div><p>The <code>k8s-app: kube-dns</code> label is the one the upstream documentation uses for CoreDNS, kept for backward compatibility with the older kube-dns. Managed clusters and node-local DNS caches can differ, so check with <code>kubectl get pods -n kube-system --show-labels</code> before applying. Allow TCP as well as UDP: DNS falls back to TCP for large responses.</p>
<h2 id="writing-the-allow-rules">Writing the allow rules</h2>
<h3 id="the-selector-indentation-trap">The selector indentation trap</h3>
<p>The documentation highlights one YAML detail that changes meaning completely:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#75715e"># ONE peer: pods labelled role=client IN namespaces labelled user=alice</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">from</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">namespaceSelector</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">user</span>: <span style="color:#ae81ff">alice</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">podSelector</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">role</span>: <span style="color:#ae81ff">client</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#75715e"># TWO peers: role=client pods in THIS namespace, OR any pod in user=alice namespaces</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">from</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">namespaceSelector</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">user</span>: <span style="color:#ae81ff">alice</span>
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">podSelector</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">role</span>: <span style="color:#ae81ff">client</span>
</span></span></code></pre></div><p>The second form is far broader than it looks. The documentation suggests <code>kubectl describe networkpolicy</code> to see how Kubernetes interpreted a policy.</p>
<h3 id="both-ends-of-an-internal-connection">Both ends of an internal connection</h3>
<p>With a namespace-wide default deny, a <code>web</code> to <code>api</code> call on port 9000 needs two policies:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">networking.k8s.io/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">NetworkPolicy</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">web-to-api-egress</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">namespace</span>: <span style="color:#ae81ff">shop</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">podSelector</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">app</span>: <span style="color:#ae81ff">web</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">policyTypes</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">Egress</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">egress</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">to</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">podSelector</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">app</span>: <span style="color:#ae81ff">api</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">TCP</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">port</span>: <span style="color:#ae81ff">9000</span>
</span></span><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">networking.k8s.io/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">NetworkPolicy</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">api-from-web</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">namespace</span>: <span style="color:#ae81ff">shop</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">podSelector</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">app</span>: <span style="color:#ae81ff">api</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">policyTypes</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">Ingress</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">ingress</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">from</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">podSelector</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">app</span>: <span style="color:#ae81ff">web</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">TCP</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">port</span>: <span style="color:#ae81ff">9000</span>
</span></span></code></pre></div><p>Traffic from your ingress controller is another namespace-to-pod rule. Use the immutable <code>kubernetes.io/metadata.name</code> label, which the control plane sets on every namespace, rather than a label someone can edit. The example below assumes the controller runs in a namespace called <code>ingress-nginx</code>; adjust it to yours.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>  <span style="color:#f92672">ingress</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">from</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">namespaceSelector</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">kubernetes.io/metadata.name</span>: <span style="color:#ae81ff">ingress-nginx</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">TCP</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">port</span>: <span style="color:#ae81ff">8080</span>
</span></span></code></pre></div><h3 id="use-ipblock-only-for-addresses-outside-the-cluster">Use ipBlock only for addresses outside the cluster</h3>
<p>The documentation says <code>ipBlock</code> should be used for cluster-external addresses, because pod IPs are ephemeral. It also warns that source and destination rewriting by load balancers or Service implementations may happen before or after policy evaluation, so the source IP a policy sees for ingress could be a load balancer&rsquo;s or node&rsquo;s address. Test any <code>ipBlock</code> rule with your actual plugin.</p>
<h2 id="what-networkpolicy-does-not-do">What NetworkPolicy does not do</h2>
<p>From the documentation&rsquo;s own list, as of v1.37 the API cannot:</p>
<ul>
<li>Apply a default policy to all namespaces. You need a policy per namespace, or a third-party tool.</li>
<li>Log blocked or allowed connections.</li>
<li>Express explicit deny rules.</li>
<li>Block traffic from the pod&rsquo;s node, or loopback.</li>
<li>Do anything TLS-related, force traffic through a gateway, or target Services by name.</li>
</ul>
<p>It is defined for TCP, UDP and SCTP. For other protocols such as ICMP, the documentation says behavior is undefined and varies by plugin. Policy behavior for <code>hostNetwork</code> pods is also undefined; most plugins treat their traffic as node traffic.</p>
<h2 id="a-rollout-order-that-avoids-outages">A rollout order that avoids outages</h2>
<p>These steps are our recommendations, not part of the Kubernetes documentation.</p>
<ol>
<li>
<p><strong>Confirm enforcement.</strong> Check that your CNI plugin enforces NetworkPolicy, and whether it supports <code>endPort</code> and SCTP if you need them.</p>
</li>
<li>
<p><strong>Find namespaces with no policy at all.</strong> For example (illustrative, not run against a cluster):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>comm -23 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  &lt;<span style="color:#f92672">(</span>kubectl get ns -o jsonpath<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;{range .items[*]}{.metadata.name}{&#34;\n&#34;}{end}&#39;</span> | sort<span style="color:#f92672">)</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  &lt;<span style="color:#f92672">(</span>kubectl get netpol -A -o jsonpath<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;{range .items[*]}{.metadata.namespace}{&#34;\n&#34;}{end}&#39;</span> | sort -u<span style="color:#f92672">)</span>
</span></span></code></pre></div></li>
<li>
<p><strong>Inventory real flows</strong> for one namespace: Services it exposes, what calls it, and every outbound dependency (databases, other namespaces, external APIs, metadata endpoints, DNS). Your plugin&rsquo;s flow logs, if it has them, are the best source.</p>
</li>
<li>
<p><strong>Apply the allow policies first, in complete sets.</strong> Remember that any policy selecting a pod isolates it in that direction. The DNS policy above selects every pod for egress, so on its own it already blocks all egress except DNS. Apply it together with every other egress allow rule for the namespace, and each pod&rsquo;s ingress allows together. Start with low-risk namespaces.</p>
</li>
<li>
<p><strong>Apply the default deny,</strong> ingress first, then egress. Egress is where unknown dependencies hide.</p>
</li>
<li>
<p><strong>Test from inside the pods</strong> and watch error rates. The documentation notes that newly created pods may briefly start before policies are applied, and that a pod may start with no connectivity until allow rules arrive; make startup tolerant of that, for example with an init container that waits for dependencies.</p>
</li>
<li>
<p><strong>Lock down namespace labels.</strong> Selectors depend on labels, and the Kubernetes RBAC good-practices page warns that users who can patch a Namespace can change labels to gain access an administrator did not intend. Our <a href="/posts/kubernetes-rbac-audit-11-permissions-that-escalate-access/">RBAC audit guide</a> covers who holds that permission.</p>
</li>
</ol>
<p>Changing policies under live traffic has one more caveat: the documentation says whether a change affects existing connections is implementation-defined.</p>
<p>NetworkPolicy pairs naturally with the admission controls we have covered. <a href="/posts/kubernetes-pod-security-admission-namespace-labels-modes-and-a-safe-rollout-from-warn-to-enforce/">Pod Security Admission</a> is also driven by namespace labels, and a <a href="/posts/kubernetes-validatingadmissionpolicy-cel-rules-for-registry-allowlists-and-memory-limits-with-a-warn-first-rollout/">ValidatingAdmissionPolicy</a> can require that every new namespace gets a default-deny policy through your deployment tooling.</p>
<h2 id="limits-of-this-article">Limits of this article</h2>
<p>We validated the manifests against the Kubernetes schema but did not apply them to a cluster or test them with a specific network plugin. The DNS label and the ingress-controller namespace are common defaults, not universal. Plugin-specific features such as cluster-wide policies, logging and layer 7 rules are outside this article.</p>
<h2 id="sources-and-verification">Sources and verification</h2>
<p>Checked on October 22, 2026.</p>
<table>
  <thead>
      <tr>
          <th>Important claim</th>
          <th>Source</th>
          <th>Verification</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Default non-isolation; isolation by policyTypes; additive union; both ends must allow; node traffic always allowed; no effect without an enforcing plugin</td>
          <td><a href="https://kubernetes.io/docs/concepts/services-networking/network-policies/">Kubernetes: Network Policies</a> (v1.37 docs, source in kubernetes/website)</td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>Default-deny example manifests; DNS caution; policyTypes default when omitted; selector indentation example</td>
          <td>Same page and its example files</td>
          <td>Verified</td>
      </tr>
      <tr>
          <td><code>kubernetes.io/metadata.name</code> immutable label</td>
          <td>Same page</td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>ipBlock for external IPs; rewriting before or after policy is undefined; TCP/UDP/SCTP only; hostNetwork undefined; list of unsupported features; existing connections implementation-defined; pod startup timing</td>
          <td>Same page</td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>CoreDNS keeps the <code>k8s-app: kube-dns</code> label</td>
          <td><a href="https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/">Kubernetes: Debugging DNS Resolution</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>Namespace patch permission can change labels and widen NetworkPolicy access</td>
          <td><a href="https://kubernetes.io/docs/concepts/security/rbac-good-practices/">Kubernetes: RBAC Good Practices</a></td>
          <td>Verified</td>
      </tr>
      <tr>
          <td>Manifests are schema-valid</td>
          <td>kubeconform 0.6.7, <code>-strict</code>, Kubernetes 1.34 schema, run on October 22, 2026</td>
          <td>Verified; not applied to a cluster</td>
      </tr>
      <tr>
          <td>Rollout order</td>
          <td>Our recommendations</td>
          <td>Qualified: not tested on a cluster</td>
      </tr>
  </tbody>
</table>
]]></content:encoded></item></channel></rss>