<?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 Software Engineering Learning Paths</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/</link><description>Recent content in Kubernetes on Software Engineering Learning Paths</description><generator>Hugo</generator><language>en</language><atom:link href="https://kyngo.github.io/learning-paths/paths/kubernetes/index.xml" rel="self" type="application/rss+xml"/><item><title>Core Concepts</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/01-core-concepts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/kubernetes/01-core-concepts/</guid><description>&lt;h1 id="core-concepts"&gt;Core Concepts&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Understanding what Kubernetes solves, how a cluster is structured, and the fundamental building blocks that everything else rests upon.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-kubernetes-solves"&gt;What Kubernetes Solves&lt;a class="anchor" href="#what-kubernetes-solves"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before Kubernetes, deploying containers at scale meant manually managing placement, networking, scaling, and failure recovery. Kubernetes automates all of this:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Problem&lt;/th&gt;
					&lt;th&gt;Without K8s&lt;/th&gt;
					&lt;th&gt;With K8s&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Container placement&lt;/td&gt;
					&lt;td&gt;Manual SSH, docker run&lt;/td&gt;
					&lt;td&gt;Scheduler decides optimal node&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Scaling&lt;/td&gt;
					&lt;td&gt;Write custom scripts&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl scale&lt;/code&gt; or autoscaler&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Self-healing&lt;/td&gt;
					&lt;td&gt;Monitor + restart manually&lt;/td&gt;
					&lt;td&gt;Automatic restart, reschedule&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Service discovery&lt;/td&gt;
					&lt;td&gt;Hardcode IPs, use Consul&lt;/td&gt;
					&lt;td&gt;Built-in DNS and Services&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Rolling updates&lt;/td&gt;
					&lt;td&gt;Downtime or custom tooling&lt;/td&gt;
					&lt;td&gt;Declarative rolling update strategy&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Configuration&lt;/td&gt;
					&lt;td&gt;Baked into image or env files&lt;/td&gt;
					&lt;td&gt;ConfigMaps, Secrets, mounted at runtime&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Storage&lt;/td&gt;
					&lt;td&gt;Manual volume management&lt;/td&gt;
					&lt;td&gt;Dynamic provisioning via StorageClasses&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Kubernetes provides a &lt;strong&gt;declarative API&lt;/strong&gt; — you describe the desired state, and the system continuously reconciles actual state to match it.&lt;/p&gt;</description></item><item><title>Workloads</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/02-workloads/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/kubernetes/02-workloads/</guid><description>&lt;h1 id="workloads"&gt;Workloads&lt;a class="anchor" href="#workloads"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Higher-level abstractions that manage pods — ensuring the right number are running, handling updates gracefully, and supporting both stateless and stateful applications.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="workload-resources-overview"&gt;Workload Resources Overview&lt;a class="anchor" href="#workload-resources-overview"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Resource&lt;/th&gt;
					&lt;th&gt;Use Case&lt;/th&gt;
					&lt;th&gt;Pod Identity&lt;/th&gt;
					&lt;th&gt;Scaling&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Stateless apps (APIs, web servers)&lt;/td&gt;
					&lt;td&gt;Interchangeable&lt;/td&gt;
					&lt;td&gt;Horizontal (replicas)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;ReplicaSet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Ensures N identical pods run (managed by Deployment)&lt;/td&gt;
					&lt;td&gt;Interchangeable&lt;/td&gt;
					&lt;td&gt;Horizontal&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;DaemonSet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;One pod per node (agents, log collectors)&lt;/td&gt;
					&lt;td&gt;Per-node&lt;/td&gt;
					&lt;td&gt;Tied to node count&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;StatefulSet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Stateful apps (databases, queues)&lt;/td&gt;
					&lt;td&gt;Stable, ordered&lt;/td&gt;
					&lt;td&gt;Horizontal (ordered)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Job&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Run-to-completion tasks (batch, migrations)&lt;/td&gt;
					&lt;td&gt;Ephemeral&lt;/td&gt;
					&lt;td&gt;Parallelism setting&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;CronJob&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Scheduled Jobs&lt;/td&gt;
					&lt;td&gt;Ephemeral&lt;/td&gt;
					&lt;td&gt;Per schedule&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="deployments"&gt;Deployments&lt;a class="anchor" href="#deployments"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The most common workload resource. A Deployment manages ReplicaSets, which manage Pods.&lt;/p&gt;</description></item><item><title>Networking</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/03-networking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/kubernetes/03-networking/</guid><description>&lt;h1 id="networking"&gt;Networking&lt;a class="anchor" href="#networking"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;How pods communicate with each other, how services expose pods to the cluster and the outside world, and how to control traffic flow.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="pod-networking-model"&gt;Pod Networking Model&lt;a class="anchor" href="#pod-networking-model"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kubernetes imposes a flat networking model with three fundamental rules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Every pod gets its own IP address&lt;/strong&gt; — no NAT between pods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;All pods can communicate with all other pods&lt;/strong&gt; without NAT (across nodes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agents on a node can communicate with all pods on that node&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is implemented by CNI (Container Network Interface) plugins:&lt;/p&gt;</description></item><item><title>Storage</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/04-storage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/kubernetes/04-storage/</guid><description>&lt;h1 id="storage"&gt;Storage&lt;a class="anchor" href="#storage"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Managing persistent and ephemeral data in Kubernetes — from temporary scratch space to durable database volumes, plus configuration and secrets injection.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="volume-types-overview"&gt;Volume Types Overview&lt;a class="anchor" href="#volume-types-overview"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Volume Type&lt;/th&gt;
					&lt;th&gt;Persistence&lt;/th&gt;
					&lt;th&gt;Use Case&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;emptyDir&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Pod lifetime only&lt;/td&gt;
					&lt;td&gt;Scratch space, inter-container sharing&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;hostPath&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Node lifetime&lt;/td&gt;
					&lt;td&gt;Node-level logs, dev/testing only&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;configMap&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Cluster lifetime&lt;/td&gt;
					&lt;td&gt;Configuration files mounted as volumes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;secret&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Cluster lifetime&lt;/td&gt;
					&lt;td&gt;Sensitive data mounted as files&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;persistentVolumeClaim&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Independent of pod&lt;/td&gt;
					&lt;td&gt;Databases, stateful workloads&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;nfs&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;External NFS server&lt;/td&gt;
					&lt;td&gt;Shared read-write across pods&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;csi&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Depends on driver&lt;/td&gt;
					&lt;td&gt;Any storage backend via CSI standard&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="volumes-ephemeral"&gt;Volumes (Ephemeral)&lt;a class="anchor" href="#volumes-ephemeral"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="emptydir"&gt;emptyDir&lt;a class="anchor" href="#emptydir"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Created when a pod is assigned to a node. Deleted when the pod is removed.&lt;/p&gt;</description></item><item><title>Configuration &amp; Scaling</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/05-configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/kubernetes/05-configuration/</guid><description>&lt;h1 id="configuration--scaling"&gt;Configuration &amp;amp; Scaling&lt;a class="anchor" href="#configuration--scaling"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Resource management, autoscaling strategies, and fine-grained pod scheduling — controlling where pods run and how much of the cluster they consume.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="resource-requests-and-limits"&gt;Resource Requests and Limits&lt;a class="anchor" href="#resource-requests-and-limits"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Every container should declare how much CPU and memory it needs (requests) and the maximum it may consume (limits).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;myapp:1.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;250m&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 0.25 CPU cores (guaranteed minimum)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;256Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 256 MiB (guaranteed minimum)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1000m&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 1 CPU core (throttled beyond this)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;512Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 512 MiB (OOM-killed beyond this)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Concept&lt;/th&gt;
					&lt;th&gt;CPU Behavior&lt;/th&gt;
					&lt;th&gt;Memory Behavior&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Request&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Guaranteed allocation; used for scheduling&lt;/td&gt;
					&lt;td&gt;Guaranteed allocation; used for scheduling&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Limit&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Throttled (not killed) when exceeded&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;OOM-killed&lt;/strong&gt; when exceeded&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;No request set&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Best-effort scheduling&lt;/td&gt;
					&lt;td&gt;Best-effort scheduling&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;No limit set&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Can consume all available CPU&lt;/td&gt;
					&lt;td&gt;Can consume all available memory&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="qos-classes"&gt;QoS Classes&lt;a class="anchor" href="#qos-classes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kubernetes assigns a Quality of Service class based on resource declarations:&lt;/p&gt;</description></item><item><title>Helm &amp; Packaging</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/06-helm-and-packaging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/kubernetes/06-helm-and-packaging/</guid><description>&lt;h1 id="helm--packaging"&gt;Helm &amp;amp; Packaging&lt;a class="anchor" href="#helm--packaging"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Packaging, templating, and managing Kubernetes applications — from Helm charts to Kustomize overlays, and when to use each approach.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="why-packaging-matters"&gt;Why Packaging Matters&lt;a class="anchor" href="#why-packaging-matters"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Raw Kubernetes manifests work for simple deployments, but real applications need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parameterisation&lt;/strong&gt; — different values per environment (dev, staging, prod)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reusability&lt;/strong&gt; — deploy the same app pattern across teams/clusters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versioning&lt;/strong&gt; — track which version of your manifests are deployed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependencies&lt;/strong&gt; — install prerequisites (databases, message queues) together&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="helm-overview"&gt;Helm Overview&lt;a class="anchor" href="#helm-overview"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Helm is the package manager for Kubernetes. It packages manifests into &lt;strong&gt;charts&lt;/strong&gt;, parameterises them with &lt;strong&gt;values&lt;/strong&gt;, and tracks &lt;strong&gt;releases&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Security</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/07-security/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/kubernetes/07-security/</guid><description>&lt;h1 id="security"&gt;Security&lt;a class="anchor" href="#security"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Controlling access to the cluster and its resources, securing workloads, managing secrets safely, and hardening the supply chain.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="security-layers"&gt;Security Layers&lt;a class="anchor" href="#security-layers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;graph TB
 subgraph Cluster Access
 AUTH[Authentication]
 AUTHZ[Authorization - RBAC]
 ADM[Admission Controllers]
 end
 subgraph Workload Security
 PSS[Pod Security Standards]
 NP[Network Policies]
 SEC[Secrets Management]
 end
 subgraph Supply Chain
 IMG[Image Security]
 SCAN[Vulnerability Scanning]
 SIGN[Image Signing]
 end
 AUTH --&amp;gt; AUTHZ --&amp;gt; ADM --&amp;gt; PSS
 PSS --&amp;gt; NP
 NP --&amp;gt; SEC
 IMG --&amp;gt; SCAN --&amp;gt; SIGN&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="rbac-role-based-access-control"&gt;RBAC (Role-Based Access Control)&lt;a class="anchor" href="#rbac-role-based-access-control"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RBAC controls &lt;strong&gt;who&lt;/strong&gt; can do &lt;strong&gt;what&lt;/strong&gt; on &lt;strong&gt;which resources&lt;/strong&gt;. It&amp;rsquo;s the primary authorization mechanism in Kubernetes.&lt;/p&gt;</description></item><item><title>Operations</title><link>https://kyngo.github.io/learning-paths/paths/kubernetes/08-operations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/kubernetes/08-operations/</guid><description>&lt;h1 id="operations"&gt;Operations&lt;a class="anchor" href="#operations"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Running Kubernetes in production requires proficiency in debugging, monitoring, logging, upgrades, and disaster recovery. This section covers day-to-day operational tasks and the tooling that supports them.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="essential-kubectl-commands"&gt;Essential kubectl Commands&lt;a class="anchor" href="#essential-kubectl-commands"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Task&lt;/th&gt;
					&lt;th&gt;Command&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;List all pods (all namespaces)&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl get pods -A&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Describe a pod (events + config)&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl describe pod &amp;lt;name&amp;gt; -n &amp;lt;ns&amp;gt;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Get pod logs&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl logs &amp;lt;pod&amp;gt; -n &amp;lt;ns&amp;gt;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Follow logs in real time&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl logs -f &amp;lt;pod&amp;gt; -n &amp;lt;ns&amp;gt;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Logs from a previous crash&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl logs &amp;lt;pod&amp;gt; --previous&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Exec into a container&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl exec -it &amp;lt;pod&amp;gt; -- /bin/sh&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Port-forward for local access&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl port-forward svc/&amp;lt;name&amp;gt; 8080:80&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Get events sorted by time&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl get events --sort-by=.metadata.creationTimestamp&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Get resource YAML&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl get pod &amp;lt;name&amp;gt; -o yaml&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Apply a manifest&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl apply -f manifest.yaml&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Dry-run a change&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl apply -f manifest.yaml --dry-run=server&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Scale a deployment&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl scale deployment &amp;lt;name&amp;gt; --replicas=5&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Rollout status&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl rollout status deployment/&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Rollback a deployment&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl rollout undo deployment/&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Top nodes (resource usage)&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl top nodes&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Top pods&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl top pods -A --sort-by=memory&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="debugging-workflow"&gt;Debugging Workflow&lt;a class="anchor" href="#debugging-workflow"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When a pod is unhealthy, follow this escalation path:&lt;/p&gt;</description></item></channel></rss>