<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kubernetes on marktaguiad.dev</title>
    <link>https://marktaguiad.dev/tags/kubernetes/</link>
    <description>Recent content in Kubernetes on marktaguiad.dev</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <managingEditor>marktaguiad@marktaguiad.dev (Mark Taguiad)</managingEditor>
    <webMaster>marktaguiad@marktaguiad.dev (Mark Taguiad)</webMaster>
    <copyright>marktaguiad.dev</copyright>
    <lastBuildDate>Tue, 28 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://marktaguiad.dev/tags/kubernetes/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cilium Network Policy: CiliumNetworkPolicy</title>
      <link>https://marktaguiad.dev/post/k8s-cilium-policy-dos/</link>
      <pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-cilium-policy-dos/</guid>
      <description>&lt;p&gt;&lt;code&gt;CiliumNetworkPolicy&lt;/code&gt; (CNP) is the most commonly used policy type in Cilium.&lt;/p&gt;&#xA;&lt;p&gt;It is namespace-scoped, meaning the policy applies only within the namespace where it is created.&lt;/p&gt;&#xA;&lt;p&gt;This is the policy most teams use for real-world application security because it enables zero-trust controls at Layer 3, Layer 4, and Layer 7.&lt;/p&gt;&#xA;&lt;p&gt;If Kubernetes NetworkPolicy is a basic firewall, CiliumNetworkPolicy is the full application-aware policy engine.&lt;/p&gt;&#xA;&lt;p&gt;What discussed and showed here is similar with &lt;code&gt;CiliumClusterwideNetworkPolicy&lt;/code&gt;, the only difference it the policy is cluster wide. Read more on that topic and how to combine these policies.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cilium Network Policy: Kubernetes NetworkPolicy</title>
      <link>https://marktaguiad.dev/post/k8s-cilium-policy-uno/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-cilium-policy-uno/</guid>
      <description>&lt;p&gt;When people first start working with Cilium policies, the easiest way to understand them is to group them into two simple ideas:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Who can talk to what?&lt;/li&gt;&#xA;&lt;li&gt;What they’re allowed to do once connected?&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;That mental model maps directly to how Cilium builds policy enforcement—from basic workload isolation all the way up to application-aware HTTP filtering.&lt;/p&gt;&#xA;&lt;p&gt;If you already think in terms of namespace rules and Layer 7 rules like HTTP GET/POST like we did in &lt;a href=&#34;https://marktaguiad.dev/post/k8s-istio-uno/&#34;&gt;Istio&lt;/a&gt;, you’re already on the right track. Cilium simply expands that model into something much more powerful and much more granular.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cilium Gateway API</title>
      <link>https://marktaguiad.dev/post/k8s-cilium-gateway/</link>
      <pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-cilium-gateway/</guid>
      <description>&lt;p&gt;Cilium Gateway API support is a modern replacement for traditional Kubernetes Ingress controllers.&lt;/p&gt;&#xA;&lt;p&gt;Instead of relying on standalone ingress proxies, Cilium integrates Gateway API directly into the networking stack using &lt;strong&gt;eBPF&lt;/strong&gt; and &lt;strong&gt;Envoy&lt;/strong&gt;, enabling:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTP / HTTPS routing&lt;/li&gt;&#xA;&lt;li&gt;TLS passthrough&lt;/li&gt;&#xA;&lt;li&gt;TLS termination&lt;/li&gt;&#xA;&lt;li&gt;Traffic splitting&lt;/li&gt;&#xA;&lt;li&gt;Header manipulation&lt;/li&gt;&#xA;&lt;li&gt;Standards-based ingress with Kubernetes Gateway API&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Cilium’s operator acts as the Gateway API controller and manages:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;GatewayClass&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Gateway&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;HTTPRoute&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;LoadBalancer Services&lt;/li&gt;&#xA;&lt;li&gt;eBPF traffic routing&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This is similar with Istio Gateway, for our example let&amp;rsquo;s use the same deployments/apps.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cilium ClusterMesh: Connecting Kubernetes Clusters</title>
      <link>https://marktaguiad.dev/post/k8s-cilium-clustermesh/</link>
      <pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-cilium-clustermesh/</guid>
      <description>&lt;p&gt;Cilium is a Kubernetes CNI built on eBPF, replacing the traditional iptables-heavy networking model with kernel-level packet processing. Instead of relying on large iptables chains for routing, filtering, and service load balancing, Cilium injects eBPF programs directly into the Linux kernel datapath for lower latency and better scalability.&lt;/p&gt;&#xA;&lt;p&gt;This would require a whole book in explaining eBPF, so we will not dwell in that. Let&amp;rsquo;s focus first on connecting two Kubernetes Cluster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Sealed Secrets</title>
      <link>https://marktaguiad.dev/post/k8s-sealed-secrets/</link>
      <pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-sealed-secrets/</guid>
      <description>&lt;p&gt;&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-sealed-secrets.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-sealed-secrets.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-sealed-secrets-dark.png&#34;&#xA;  alt=&#34;Secret&#34;&#xA;&gt;&#xA;&#xA;k8s-sealed-secrets.png&#xA;Managing secrets in Kubernetes is a bit tricky. Native &lt;code&gt;Secret&lt;/code&gt; objects are only &lt;code&gt;base64-encoded&lt;/code&gt;—not encrypted—making them unsafe for Git-based workflows. If you&amp;rsquo;re doing GitOps (e.g., with Argo CD), committing raw secrets is not an option.&lt;/p&gt;&#xA;&lt;p&gt;This is where &lt;a href=&#34;https://github.com/bitnami-labs/sealed-secrets&#34;&gt;Sealed Secrets&lt;/a&gt; comes in.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#why-sealed-secret&#34;&gt;Why Sealed Secret?&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#install&#34;&gt;Install&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#cluster&#34;&gt;Cluster&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#client&#34;&gt;Client&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#certificate&#34;&gt;Certificate&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#key&#34;&gt;Key&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#example&#34;&gt;Example&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#default-k8s-secrets&#34;&gt;Default K8S Secrets&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#sealed-secret&#34;&gt;Sealed Secret&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#git&#34;&gt;Git&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;why-sealed-secret&#34;&gt;Why Sealed Secret?&lt;/h3&gt;&#xA;&lt;p&gt;Sealed Secrets uses asymmetric encryption to solve one problem:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Autoscaling</title>
      <link>https://marktaguiad.dev/post/k8s-scaler/</link>
      <pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-scaler/</guid>
      <description>&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-scale.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-scale.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-scale-dark.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;In Kubernetes, scaling is how you adjust your application to handle more or less traffic. There are two main types: &lt;code&gt;horizontal scaling&lt;/code&gt; and &lt;code&gt;vertical scaling&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#horizontal-scaling-vs-vertical-scaling&#34;&gt;Horizontal Scaling vs Vertical Scaling&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#horizontal-scaling&#34;&gt;Horizontal Scaling&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#vertical-scaling&#34;&gt;Vertical Scaling&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;horizontal-scaling-vs-vertical-scaling&#34;&gt;Horizontal Scaling vs Vertical Scaling&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Feature&lt;/th&gt;&#xA;          &lt;th&gt;Horizontal Scaling&lt;/th&gt;&#xA;          &lt;th&gt;Vertical Scaling&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Method&lt;/td&gt;&#xA;          &lt;td&gt;Add/remove pods&lt;/td&gt;&#xA;          &lt;td&gt;Increase/decrease resources&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Tool&lt;/td&gt;&#xA;          &lt;td&gt;HPA&lt;/td&gt;&#xA;          &lt;td&gt;VPA&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Best for&lt;/td&gt;&#xA;          &lt;td&gt;Stateless apps&lt;/td&gt;&#xA;          &lt;td&gt;Stateful or legacy apps&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Downtime&lt;/td&gt;&#xA;          &lt;td&gt;None&lt;/td&gt;&#xA;          &lt;td&gt;Possible restart&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Limit&lt;/td&gt;&#xA;          &lt;td&gt;Cluster size&lt;/td&gt;&#xA;          &lt;td&gt;Node capacity&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;horizontal-scaling&#34;&gt;Horizontal Scaling&lt;/h3&gt;&#xA;&lt;p&gt;This uses the &lt;code&gt;Horizontal Pod Autoscaler&lt;/code&gt; to scale number of pods automatically.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Multi-Tenancy</title>
      <link>https://marktaguiad.dev/post/k8s-multitenant/</link>
      <pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-multitenant/</guid>
      <description>&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-multitenant-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-multitenant-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-multitenant-dark-001.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Multi-tenancy in Kubernetes is the practice of running multiple users, teams, or customers (tenants) on a shared cluster while keeping them isolated, secure, and fairly resourced.&lt;/p&gt;&#xA;&lt;p&gt;At first glance, it sounds simple—just create namespaces and you’re done. In reality, building a safe multi-tenant platform requires layering multiple controls together.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#user-creation&#34;&gt;User Creation&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#access-control&#34;&gt;Access Control&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#resource-allocation&#34;&gt;Resource Allocation&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#networkpolicy&#34;&gt;NetworkPolicy&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;overview&#34;&gt;Overview&lt;/h3&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s assign team &lt;code&gt;web-dev&lt;/code&gt; to namespace &lt;code&gt;web&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create GKE Cluster with Terraform/Opentofu 0x03</title>
      <link>https://marktaguiad.dev/post/gulap-gke-part-tres/</link>
      <pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/gulap-gke-part-tres/</guid>
      <description>&lt;p&gt;Part 3 of this &lt;a href=&#34;https://marktaguiad.dev/post/gulap-gke-part-uno&#34;&gt;post&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#providers&#34;&gt;Providers&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#development-environment&#34;&gt;Development Environment&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#production-environment&#34;&gt;Production Environment&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#deploy&#34;&gt;Deploy&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#kubeconfig&#34;&gt;Kubeconfig&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#verify&#34;&gt;Verify&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;p&gt;To make this really modular let&amp;rsquo;s create environemnt for Dev and Prod.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s assign &lt;code&gt;standard gke&lt;/code&gt; to dev and &lt;code&gt;autopilot gke&lt;/code&gt; to prod.&lt;/p&gt;&#xA;&lt;p&gt;This approach keeps our infrastructure:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;consistent&lt;/li&gt;&#xA;&lt;li&gt;reusable&lt;/li&gt;&#xA;&lt;li&gt;environment-aware&lt;/li&gt;&#xA;&lt;li&gt;easy to scale&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;providers&#34;&gt;Providers&lt;/h3&gt;&#xA;&lt;p&gt;This is present in both environment.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;provider.tf&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;terraform&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;required_providers&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;google&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;source&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;hashicorp/google&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;version&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;7.26.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;kubernetes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;source&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;hashicorp/kubernetes&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;version&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;~&amp;gt; 2.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;helm&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;source&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;hashicorp/helm&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;version&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;~&amp;gt; 2.10&amp;#34;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# or latest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;google&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;credentials&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;credentials_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;project&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;project_id&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;region&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;region&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;google_client_config&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://${module.gke.endpoint}&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;google_client_config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access_token&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;cluster_ca_certificate&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;base64decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gke&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ca_certificate&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;helm&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;kubernetes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://${module.gke.endpoint}&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;google_client_config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access_token&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cluster_ca_certificate&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;base64decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;43&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gke&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ca_certificate&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;44&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;45&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;46&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;development-environment&#34;&gt;Development Environment&lt;/h3&gt;&#xA;&lt;p&gt;The dev environment is designed for flexibility and cost efficiency.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create GKE Cluster with Terraform/Opentofu 0x02</title>
      <link>https://marktaguiad.dev/post/gulap-gke-part-dos/</link>
      <pubDate>Wed, 08 Apr 2026 20:10:15 +0800</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/gulap-gke-part-dos/</guid>
      <description>&lt;p&gt;Part 2 of this &lt;a href=&#34;https://marktaguiad.dev/post/gulap-gke-part-uno&#34;&gt;post&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#gke-module&#34;&gt;GKE Module&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#standard-vs-autopilot&#34;&gt;Standard vs Autopilot&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#standard&#34;&gt;Standard&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#autopilot&#34;&gt;Autopilot&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#storage-module&#34;&gt;Storage Module&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#addons-module&#34;&gt;Addons Module&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#ingress-nginx&#34;&gt;Ingress-Nginx&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#cert-manager&#34;&gt;cert-manager&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;gke-module&#34;&gt;GKE Module&lt;/h3&gt;&#xA;&lt;p&gt;This module is where everything comes together—network, IAM, and node pools—to create a working GKE cluster.&lt;/p&gt;&#xA;&lt;h4 id=&#34;standard-vs-autopilot&#34;&gt;Standard vs Autopilot&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Feature&lt;/th&gt;&#xA;          &lt;th&gt;Standard&lt;/th&gt;&#xA;          &lt;th&gt;Autopilot&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Node control&lt;/td&gt;&#xA;          &lt;td&gt;Full&lt;/td&gt;&#xA;          &lt;td&gt;None&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Scaling&lt;/td&gt;&#xA;          &lt;td&gt;Manual + autoscaler&lt;/td&gt;&#xA;          &lt;td&gt;Fully managed&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Operations&lt;/td&gt;&#xA;          &lt;td&gt;You manage&lt;/td&gt;&#xA;          &lt;td&gt;Google manages&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Flexibility&lt;/td&gt;&#xA;          &lt;td&gt;High&lt;/td&gt;&#xA;          &lt;td&gt;Limited&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;standard&#34;&gt;Standard&lt;/h4&gt;&#xA;&lt;p&gt;Gives you full control over nodes and scaling.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create GKE Cluster with Terraform/Opentofu 0x01</title>
      <link>https://marktaguiad.dev/post/gulap-gke-part-uno/</link>
      <pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/gulap-gke-part-uno/</guid>
      <description>&lt;p&gt;Still a not-so comprehensive guide to create GKE Cluster with Terraform/Opentofu.&lt;/p&gt;&#xA;&lt;p&gt;Visit the previous &lt;a href=&#34;https://marktaguiad.dev/post/gulap-vm&#34;&gt;post&lt;/a&gt; before proceeding with this one.&lt;/p&gt;&#xA;&lt;p&gt;Repo for this post: &lt;a href=&#34;https://github.com/mcbtaguiad/g-ulap-demo.git&#34;&gt;g-ulap-demo&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#overview&#34;&gt;Overview&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#project-structure&#34;&gt;Project Structure&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#services--roles&#34;&gt;Services &amp;amp; Roles&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#iam-module&#34;&gt;IAM Module&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#api&#34;&gt;api&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#service-account&#34;&gt;Service Account&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#network-module&#34;&gt;Network Module&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#vpc&#34;&gt;VPC&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#firewall&#34;&gt;Firewall&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#node-pool-module&#34;&gt;Node Pool Module&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;overview&#34;&gt;Overview&lt;/h3&gt;&#xA;&lt;p&gt;This topic is quite big and not a single blog or post would answer all your question. I advice you to read on documentations and blog posts. This post would be too long if I explain every details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes RBAC</title>
      <link>https://marktaguiad.dev/post/k8s-rbac/</link>
      <pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-rbac/</guid>
      <description>&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-rbac-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-rbac-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-rbac-dark-001.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Role‑Based Access Control (RBAC) is a core part of Kubernetes security — it lets you grant precise permissions to users, groups, or service accounts so they can do only what they’re allowed. In this hands‑on guide, we’ll go step‑by‑step through:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;creating a Kubernetes user&lt;/li&gt;&#xA;&lt;li&gt;assigning permissions using RBAC&lt;/li&gt;&#xA;&lt;li&gt;testing permissions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Read more on this topic &lt;a href=&#34;https://kubernetes.io/docs/reference/access-authn-authz/rbac/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#create-kubernetes-user&#34;&gt;Create Kubernetes User&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#script&#34;&gt;Script&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#create-user&#34;&gt;Create User&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#verify&#34;&gt;Verify&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#test&#34;&gt;Test&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#delete-user&#34;&gt;Delete User&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#roles--rolebindings&#34;&gt;Roles &amp;amp; RoleBindings&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#cluster-roles--cluster-role-bindings&#34;&gt;Cluster Roles &amp;amp; Cluster Role Bindings&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;create-kubernetes-user&#34;&gt;Create Kubernetes User&lt;/h3&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s automate this process-in the perspective of an admin. Use the script to create user.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Istio: A/B Testing and Canary Deployment</title>
      <link>https://marktaguiad.dev/post/k8s-istio-quatro/</link>
      <pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-istio-quatro/</guid>
      <description>&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/istio/ab-testing/k8s-ab-testing-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/istio/ab-testing/k8s-ab-testing-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/istio/ab-testing/k8s-ab-testing-dark-001.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;A/B testing and Canary Deployment allows you to route traffic between different versions of your application to compare performance, behavior, or user experience.&lt;/p&gt;&#xA;&lt;p&gt;With Istio, you can control traffic without changing application code—just by configuring the service mesh.&lt;/p&gt;&#xA;&lt;p&gt;Replicate this using this &lt;a href=&#34;https://github.com/mcbtaguiad/istio-demo&#34;&gt;repo&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;kubectl apply -k kube/ab-testing/demo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#ab-testing-vs-canary-deployment&#34;&gt;A/B Testing vs Canary Deployment&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#ab-testing&#34;&gt;A/B Testing&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#labels&#34;&gt;Labels&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#service&#34;&gt;Service&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#destination-rule&#34;&gt;Destination Rule&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#virtual-service&#34;&gt;Virtual Service&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#rollout-strategy&#34;&gt;Rollout Strategy&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#roll-back-strategy&#34;&gt;Roll-back Strategy&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#canary-deployment&#34;&gt;Canary Deployment&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#rollout-strategy-1&#34;&gt;Rollout Strategy&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#observe-metrics&#34;&gt;Observe Metrics&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;ab-testing-vs-canary-deployment&#34;&gt;A/B Testing vs Canary Deployment&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Aspect&lt;/th&gt;&#xA;          &lt;th&gt;Canary Deployment&lt;/th&gt;&#xA;          &lt;th&gt;A/B Testing&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Purpose&lt;/td&gt;&#xA;          &lt;td&gt;Safe rollout&lt;/td&gt;&#xA;          &lt;td&gt;Experimentation&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Traffic split&lt;/td&gt;&#xA;          &lt;td&gt;Gradual (10% → 100%)&lt;/td&gt;&#xA;          &lt;td&gt;Fixed (often 50/50)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Decision basis&lt;/td&gt;&#xA;          &lt;td&gt;Errors, latency&lt;/td&gt;&#xA;          &lt;td&gt;User behavior, metrics&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;End goal&lt;/td&gt;&#xA;          &lt;td&gt;Replace old version&lt;/td&gt;&#xA;          &lt;td&gt;Pick best variant&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Versions&lt;/td&gt;&#xA;          &lt;td&gt;Usually same feature&lt;/td&gt;&#xA;          &lt;td&gt;Different UX/features&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;ab-testing&#34;&gt;A/B Testing&lt;/h3&gt;&#xA;&lt;h4 id=&#34;labels&#34;&gt;Labels&lt;/h4&gt;&#xA;&lt;p&gt;Label your deployments properly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Istio: Fault Injection, Retries and Circuit Breaker</title>
      <link>https://marktaguiad.dev/post/k8s-istio-tres/</link>
      <pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-istio-tres/</guid>
      <description>&lt;p&gt;Continuation of Kubernetes Istio.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#ingress-gateway&#34;&gt;Ingress Gateway&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#gateway&#34;&gt;Gateway&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#fault-injection&#34;&gt;Fault Injection&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#verify&#34;&gt;Verify&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#retries&#34;&gt;Retries&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#circuit-breaker&#34;&gt;Circuit Breaker&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve mentioned in this &lt;a href=&#34;https://marktaguiad.dev/post/k8s-istio-uno.md&#34;&gt;post&lt;/a&gt; that will sticking with &lt;code&gt;HTTPRoute&lt;/code&gt;, but feature discussed here only support (for now) Istio API.&lt;/p&gt;&#xA;&lt;h3 id=&#34;ingress-gateway&#34;&gt;Ingress Gateway&lt;/h3&gt;&#xA;&lt;p&gt;Istio deploys a default resource for this, and for this example we are using the default ingress gateway &lt;code&gt;ingressgateway&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If you want to create a custom ingress gateway.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;istio-gateway.yaml&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;install.istio.io/v1alpha1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;IstioOperator&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;istio-control-plane&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;istio-system&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;components&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ingressGateways&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;istio-ingressgateway-prod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;istio-system&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;enabled&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;istio&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ingressgateway-prod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;istio-ingressgateway-dev&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;istio-system&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;enabled&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;istio&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ingressgateway-dev&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will create two  ingress gateway.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Istio: mTLS and RBAC</title>
      <link>https://marktaguiad.dev/post/k8s-istio-dos/</link>
      <pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-istio-dos/</guid>
      <description>&lt;p&gt;Continuation of Kubernetes Istio, this time we&amp;rsquo;ll focus on Security.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#security&#34;&gt;Security&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#mtls-mutual-tls&#34;&gt;mTLS (Mutual TLS)&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#authorizationpolicy-rbac&#34;&gt;AuthorizationPolicy (RBAC)&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;security&#34;&gt;Security&lt;/h3&gt;&#xA;&lt;h4 id=&#34;mtls-mutual-tls&#34;&gt;mTLS (Mutual TLS)&lt;/h4&gt;&#xA;&lt;p&gt;This will ensure that service-to-service traffic is encrypted and authenticated.&lt;/p&gt;&#xA;&lt;p&gt;Istio allows you to configure three main modes per namespace, workload, or globally:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Mode&lt;/th&gt;&#xA;          &lt;th&gt;Behavior&lt;/th&gt;&#xA;          &lt;th&gt;When to Use&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;STRICT&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Only allows &lt;strong&gt;mTLS-encrypted traffic&lt;/strong&gt;. Plain HTTP connections are rejected.&lt;/td&gt;&#xA;          &lt;td&gt;Best for production when you want &lt;strong&gt;full security&lt;/strong&gt; between services.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;PERMISSIVE&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Accepts both mTLS-encrypted and plain HTTP traffic.&lt;/td&gt;&#xA;          &lt;td&gt;Useful during &lt;strong&gt;gradual migration&lt;/strong&gt; to mTLS. Old workloads can still communicate without encryption.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;DISABLE&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Does not use mTLS at all.&lt;/td&gt;&#xA;          &lt;td&gt;For testing, legacy workloads, or non-critical traffic.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;You might get confused with the HTTPS traffic, it just mean that all traffic are converted by istio envoy to mTLS. So as long as the request is going through first the sidecar then it is valid.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Istio: Routing</title>
      <link>https://marktaguiad.dev/post/k8s-istio-uno/</link>
      <pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-istio-uno/</guid>
      <description>&lt;p&gt;Modern applications are no longer built as single, monolithic systems—they’re composed of many small, interconnected services. Managing how these services communicate can quickly become complex, especially as systems scale. This is where Istio comes in.&lt;/p&gt;&#xA;&lt;p&gt;Istio acts as a powerful service mesh that sits between your services and handles three critical concerns: traffic management, security, and observability.&lt;/p&gt;&#xA;&lt;p&gt;With Istio, you gain fine-grained control over how traffic flows between services—enabling advanced deployment strategies like A/B testing and canary releases with ease. At the same time, it strengthens service-to-service security and provides deep visibility into your system through metrics, logs, and tracing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Monitoring &amp; Logging</title>
      <link>https://marktaguiad.dev/post/k8s-monitoring-logging/</link>
      <pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-monitoring-logging/</guid>
      <description>&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-mon-log-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-mon-log-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-mon-log-dark-001.png&#34;&#xA;  alt=&#34;Dash&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;If you have used prometheus in your docker or podman environment then this is much easier to setup. Unlike in your docker/podman where you have to create the config and scrape config from scratch, in k8s some good helm repo are already available to use and do all that for you. Also Prometheus in Kubernetes has a dynamic service discovery, so any resources added to the cluster will autotmatically added and monitored.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes KubeVirt</title>
      <link>https://marktaguiad.dev/post/k8s-kubevirt/</link>
      <pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-kubevirt/</guid>
      <description>&lt;p&gt;&lt;div class=&#34;alert alert-info&#34;&gt;&#xA;  &lt;div class=&#34;alert-title&#34;&gt;Info&lt;/div&gt;&#xA;  &lt;div class=&#34;alert-content&#34;&gt;&#xA;    Don&amp;rsquo;t have any use case for this yet, all of my running services is in microservice/container. Will update post if I have more time to explore this, or maybe if used in work which I don&amp;rsquo;t have currently - HIRE ME PO!&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-kubevirt-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-kubevirt-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-kubevirt-dark-001.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Kubernetes is designed to run containerized workloads, but many real-world systems still rely on virtual machines (VMs).&lt;/p&gt;&#xA;&lt;p&gt;KubeVirt extends Kubernetes by allowing you to run and manage Virtual Machines alongside containers using the same Kubernetes API.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Jobs, CronJob and Init Container</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part9/</link>
      <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part9/</guid>
      <description>&lt;p&gt;In Kubernetes, some workloads need to run continuously, such as web servers or APIs. These are typically managed by controllers like Deployments.&lt;/p&gt;&#xA;&lt;p&gt;However, other workloads only need to run once and finish, such as scripts, data processing tasks, or backups. Kubernetes provides Jobs and CronJobs to handle these types of workloads.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#job&#34;&gt;Job&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#cron&#34;&gt;Cron&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#init-container&#34;&gt;Init Container&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;job&#34;&gt;Job&lt;/h3&gt;&#xA;&lt;p&gt;A Job is a Kubernetes resource used to run a task until completion.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Daemonsets</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part8/</link>
      <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part8/</guid>
      <description>&lt;p&gt;&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-notes-daemonset-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-notes-daemonset-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-notes-daemonset-dark-001.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&#xA;Kubernetes has multiple controllers to manage workloads. So far, we’ve learned about Deployments and StatefulSets, which help run Pods that scale and keep state.&#xA;However, some workloads must run on every node in a cluster — this is where DaemonSets come in.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#why-daemonsets&#34;&gt;Why Daemonsets?&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#example-of-daemonsets-systems&#34;&gt;Example of Daemonsets Systems&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#create-daemonsets&#34;&gt;Create Daemonsets&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#service&#34;&gt;Service&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#volume&#34;&gt;Volume&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#excluding-certain-nodes&#34;&gt;Excluding Certain Nodes&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#node-taints&#34;&gt;Node Taints&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#node-affinity--labels&#34;&gt;Node Affinity &amp;amp; Labels&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#anti-affinity&#34;&gt;Anti-affinity&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#node-selector&#34;&gt;Node Selector&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;why-daemonsets&#34;&gt;Why Daemonsets?&lt;/h3&gt;&#xA;&lt;p&gt;Most Kubernetes workloads (like Deployments) allow Pods to run anywhere in the cluster. But some software needs to be present on every node — regardless of what Pods are running there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Statefulsets</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part7/</link>
      <pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part7/</guid>
      <description>&lt;p&gt;&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-notes-statefulset-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-notes-statefulset-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-notes-statefulset-dark-001.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&#xA;Kubernetes has several controllers to manage workloads. While Deployments are ideal for stateless applications, many real‑world use cases require stateful behavior — applications that store data, maintain identity, and rely on stable storage.&lt;/p&gt;&#xA;&lt;p&gt;This is where StatefulSets come in. They provide stable identity, stable storage, and ordered deployment for stateful applications.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#why-statefulsets&#34;&gt;Why StatefulSets?&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#examples-of-stateful-systems&#34;&gt;Examples of Stateful Systems&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#create-statefulset&#34;&gt;Create Statefulset&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#service&#34;&gt;Service&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#volume&#34;&gt;Volume&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#ordered-creation--scaling&#34;&gt;Ordered Creation &amp;amp; Scaling&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#ordered-deletion&#34;&gt;Ordered Deletion&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;why-statefulsets&#34;&gt;Why StatefulSets?&lt;/h3&gt;&#xA;&lt;p&gt;Stateless apps don’t care which instance serves a request. But stateful workloads often require:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Deployments</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part6/</link>
      <pubDate>Fri, 06 Mar 2026 23:07:51 +0800</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part6/</guid>
      <description>&lt;p&gt;&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-notes-deployment-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-notes-deployment-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-notes-deployment-dark-001.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&#xA;In Kubernetes, ReplicaSets ensure that a specific number of Pods are always running. However, most real applications need to be updated frequently. This is where Deployments come in.&lt;/p&gt;&#xA;&lt;p&gt;A Deployment is a higher-level Kubernetes resource that manages ReplicaSets and allows applications to be updated, scaled, and rolled back safely.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#why-deployment&#34;&gt;Why Deployment?&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#architecture&#34;&gt;Architecture&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#example-of-deployment-systems&#34;&gt;Example of Deployment Systems&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#create-deployment&#34;&gt;Create Deployment&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#rolling-updates&#34;&gt;Rolling Updates&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#rollbacks&#34;&gt;Rollbacks&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;why-deployment&#34;&gt;Why Deployment?&lt;/h3&gt;&#xA;&lt;p&gt;ReplicaSets ensure that the correct number of Pods are running, but they do not provide advanced update mechanisms.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Controller</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part5/</link>
      <pubDate>Fri, 06 Mar 2026 12:15:40 +0800</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part5/</guid>
      <description>&lt;p&gt;Kubernetes is designed to keep applications running even when failures occur. One of the key mechanisms that enables this is the Controller.&lt;/p&gt;&#xA;&lt;p&gt;Controllers continuously monitor the cluster and ensure that the actual state matches the desired state. If something goes wrong, Kubernetes automatically corrects it.&lt;/p&gt;&#xA;&lt;p&gt;This behavior is commonly referred to as self-healing.&lt;/p&gt;&#xA;&lt;p&gt;It performs three main tasks:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Observe the current state&lt;/li&gt;&#xA;&lt;li&gt;Compare it with the desired state&lt;/li&gt;&#xA;&lt;li&gt;Take action if they differ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This loop runs continuously inside the Kubernetes control plane.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Volume</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part4/</link>
      <pubDate>Fri, 06 Mar 2026 03:32:32 +0800</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part4/</guid>
      <description>&lt;p&gt;Containers in Kubernetes are ephemeral by default. This means that when a container stops or a Pod is deleted, any data stored inside the container filesystem is lost.&lt;/p&gt;&#xA;&lt;p&gt;To solve this problem, Kubernetes provides Volumes, which allow data to persist and be shared between containers in a Pod.&lt;/p&gt;&#xA;&lt;p&gt;Volumes are mounted into containers and provide persistent or shared storage depending on the type used.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#how-volume-works&#34;&gt;How Volume Works&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#volume-types&#34;&gt;Volume Types&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#emptydir&#34;&gt;emptyDir&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#hostpath&#34;&gt;hostPath&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#persistentvolume-pv&#34;&gt;PersistentVolume (PV)&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#persistentvolumeclaim-pvc&#34;&gt;PersistentVolumeClaim (PVC)&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#persistent-storage-architecture&#34;&gt;Persistent Storage Architecture&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#container-storage-interface&#34;&gt;Container Storage Interface&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;how-volume-works&#34;&gt;How Volume Works&lt;/h3&gt;&#xA;&lt;p&gt;Remember the first example we make, this time we will mount with different type of Kubernetes Volumes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Networking</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part3/</link>
      <pubDate>Thu, 05 Mar 2026 23:54:49 +0800</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part3/</guid>
      <description>&lt;p&gt;For applications running inside Kubernetes to function correctly, they must be able to communicate with each other and with external systems. Kubernetes provides a networking model that enables communication between Pods, Services, and external clients.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#pod-internal&#34;&gt;Pod Internal&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#services&#34;&gt;Services&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#create-using-yaml&#34;&gt;Create Using YAML&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#create-using-kubectl&#34;&gt;Create using kubectl&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#verify&#34;&gt;Verify&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#service-dns&#34;&gt;Service DNS&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#same-namespace&#34;&gt;Same Namespace&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#cluster-wide&#34;&gt;Cluster Wide&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#service-types&#34;&gt;Service Types&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#clusterip-default&#34;&gt;ClusterIP (Default)&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#nodeport&#34;&gt;NodePort&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#loadbalancer&#34;&gt;LoadBalancer&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#hostport-and-hostnetwork&#34;&gt;hostPort and hostNetwork&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#reverse-proxy&#34;&gt;Reverse Proxy&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#ingress-controllers&#34;&gt;Ingress Controllers&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#container-network-interface-cni&#34;&gt;Container Network Interface (CNI)&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;pod-internal&#34;&gt;Pod Internal&lt;/h3&gt;&#xA;&lt;p&gt;Each Pod receives its own internal IP address inside the Kubernetes cluster. This allows Pods to communicate directly with each other using that IP.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Pod</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part2/</link>
      <pubDate>Thu, 05 Mar 2026 17:22:20 +0800</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part2/</guid>
      <description>&lt;p&gt;&lt;img&#xA;  class=&#34;theme-image&#34;&#xA;  src=&#34;https://marktaguiad.dev/images/devops/k8s-notes/k8s-notes-pod-001.png&#34;&#xA;  data-light=&#34;/images/devops/k8s-notes/k8s-notes-pod-001.png&#34;&#xA;  data-dark=&#34;/images/devops/k8s-notes/k8s-notes-pod-dark-001.png&#34;&#xA;  alt=&#34;Architecture Diagram&#34;&#xA;&gt;&#xA;&#xA;In Kubernetes, you do not deploy containers directly. Instead, containers run inside a Pod, which acts as a wrapper around one or more containers. Pods are the smallest deployable unit in the Kubernetes.&lt;/p&gt;&#xA;&lt;p&gt;A Pod provides:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Shared specification for containers&lt;/li&gt;&#xA;&lt;li&gt;Shared storage (volumes)&lt;/li&gt;&#xA;&lt;li&gt;Shared network&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#kubeconfig&#34;&gt;Kubeconfig&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#creating-pods-with-kubectl&#34;&gt;Creating Pods with kubectl&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#using-yaml-for-kubernetes-resources&#34;&gt;Using YAML for Kubernetes Resources&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#multiple-pods&#34;&gt;Multiple Pods&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#manifest&#34;&gt;Manifest&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#namespace&#34;&gt;Namespace&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#deploy&#34;&gt;Deploy&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#listing-the-pod&#34;&gt;Listing the Pod&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#verify&#34;&gt;Verify&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#pod-lifecycle&#34;&gt;Pod Lifecycle&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#pending&#34;&gt;Pending&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#running&#34;&gt;Running&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#succeeded&#34;&gt;Succeeded&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#failed&#34;&gt;Failed&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#completed--terminated&#34;&gt;Completed / Terminated&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#pod-readiness-and-liveliness-probe&#34;&gt;Pod Readiness and Liveliness Probe&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#liveness-probe&#34;&gt;Liveness Probe&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#readiness-probe&#34;&gt;Readiness Probe&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#demo&#34;&gt;Demo&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#pods-are-ephemeral&#34;&gt;Pods Are Ephemeral&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#clean-up&#34;&gt;Clean Up&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#bonus&#34;&gt;Bonus&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;kubeconfig&#34;&gt;Kubeconfig&lt;/h3&gt;&#xA;&lt;p&gt;Before we deploy pods, let&amp;rsquo;s first discuss &lt;code&gt;kubeconfig&lt;/code&gt; for cluster access. Check this &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/&#34;&gt;link&lt;/a&gt; for further explanation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Architecture</title>
      <link>https://marktaguiad.dev/post/k8s-notes-part1/</link>
      <pubDate>Thu, 05 Mar 2026 07:22:20 +0800</pubDate><author>marktaguiad@marktaguiad.dev (Mark Taguiad)</author>
      <guid>https://marktaguiad.dev/post/k8s-notes-part1/</guid>
      <description>&lt;p&gt;Kubernetes (K8s) is an open-source platform used to automate the deployment, scaling, and management of containerized applications. It is designed to simplify running large numbers of containers in production environments.&lt;/p&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ol&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#container-management-problem&#34;&gt;Container Management Problem&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#architecture&#34;&gt;Architecture&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#kubernetes-workflow&#34;&gt;Kubernetes Workflow&lt;/a&gt;&#xA;      &lt;ol&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#client&#34;&gt;Client&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#pod-creation&#34;&gt;Pod Creation&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#service-exposure-workflow&#34;&gt;Service Exposure Workflow&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#traffic-flow&#34;&gt;Traffic Flow&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ol&gt;&#xA;    &lt;/li&gt;&#xA;  &lt;/ol&gt;&#xA;&lt;/nav&gt;&#xA;&lt;h3 id=&#34;container-management-problem&#34;&gt;Container Management Problem&lt;/h3&gt;&#xA;&lt;p&gt;Modern applications often consist of multiple services built with different technologies.&lt;/p&gt;&#xA;&lt;p&gt;Example architecture:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Frontend → Node.js&lt;/li&gt;&#xA;&lt;li&gt;Databases → MySQL&lt;/li&gt;&#xA;&lt;li&gt;Backend service - Java&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;All of these services may run as containers.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
