<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Day 1 on Eriks training corner</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/index.html</link><description>Recent content in Day 1 on Eriks training corner</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://training.caha.cloud/en/kubernetes-gt/day-01/index.xml" rel="self" type="application/rss+xml"/><item><title>Ecosystem, containers and orchestration</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/01-ecosystem-containers/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/01-ecosystem-containers/index.html</guid><description>&lt;h1 id="ecosystem-containers-and-orchestration"&gt;Ecosystem, containers and orchestration&lt;/h1&gt;
&lt;h2 id="container-in-one-paragraph"&gt;Container in one paragraph&lt;/h2&gt;
&lt;p&gt;A container is a &lt;strong&gt;process on the host kernel&lt;/strong&gt;, isolated by namespaces and
limited by cgroups. It starts from an &lt;strong&gt;image&lt;/strong&gt;: read-only layers plus one thin
writable layer that disappears with the container. No guest OS, so start-up
takes milliseconds.&lt;/p&gt;
&lt;div class="mermaid align-center"&gt;graph TB
subgraph VMs
H1[Hardware] --&amp;gt; HV[Hypervisor]
HV --&amp;gt; G1[Guest OS &amp;#43; App]
HV --&amp;gt; G2[Guest OS &amp;#43; App]
end
subgraph Containers
H2[Hardware] --&amp;gt; OS[Host OS kernel]
OS --&amp;gt; CR[Container runtime]
CR --&amp;gt; C1[App]
CR --&amp;gt; C2[App]
end&lt;/div&gt;&lt;h2 id="why-orchestration"&gt;Why orchestration&lt;/h2&gt;
&lt;p&gt;One host and &lt;code&gt;docker run&lt;/code&gt; do not answer the questions production asks:&lt;/p&gt;</description></item><item><title>Architecture: control plane and worker nodes</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/02-architecture/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/02-architecture/index.html</guid><description>&lt;h1 id="architecture-control-plane-and-worker-nodes"&gt;Architecture: control plane and worker nodes&lt;/h1&gt;
&lt;h2 id="the-one-big-idea"&gt;The one big idea&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Desired state vs current state.&lt;/strong&gt; You declare what you want; controllers
compare it with reality and act until the two match.&lt;/p&gt;
&lt;h2 id="components"&gt;Components&lt;/h2&gt;
&lt;div class="mermaid align-center"&gt;graph TB
subgraph control01 [Control plane]
API[kube-apiserver]
ETCD[(etcd)]
SCH[kube-scheduler]
CM[kube-controller-manager]
end
subgraph worker0X [Worker node]
KL[kubelet]
KP[kube-proxy]
CRI[containerd]
end
API --- ETCD
SCH --- API
CM --- API
KL --- API
KP --- API
KL --- CRI&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;kube-apiserver&lt;/td&gt;
&lt;td&gt;control plane&lt;/td&gt;
&lt;td&gt;the only door to the cluster; authN, authZ, validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;etcd&lt;/td&gt;
&lt;td&gt;control plane&lt;/td&gt;
&lt;td&gt;key-value store of all objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kube-scheduler&lt;/td&gt;
&lt;td&gt;control plane&lt;/td&gt;
&lt;td&gt;picks a node for each new Pod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kube-controller-manager&lt;/td&gt;
&lt;td&gt;control plane&lt;/td&gt;
&lt;td&gt;runs the reconciliation loops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kubelet&lt;/td&gt;
&lt;td&gt;every node&lt;/td&gt;
&lt;td&gt;starts containers, reports status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kube-proxy&lt;/td&gt;
&lt;td&gt;every node&lt;/td&gt;
&lt;td&gt;Service routing (iptables / IPVS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;containerd&lt;/td&gt;
&lt;td&gt;every node&lt;/td&gt;
&lt;td&gt;container runtime (CRI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CoreDNS&lt;/td&gt;
&lt;td&gt;Pods in kube-system&lt;/td&gt;
&lt;td&gt;cluster DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Only the API server talks to etcd. Every other component - including kubectl -
talks only to the API server.&lt;/p&gt;</description></item><item><title>The Kubernetes API and kubectl</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/03-kubernetes-api/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/03-kubernetes-api/index.html</guid><description>&lt;h1 id="the-kubernetes-api-and-kubectl"&gt;The Kubernetes API and kubectl&lt;/h1&gt;
&lt;p&gt;Everything in Kubernetes is a REST resource behind the API server. &lt;code&gt;kubectl&lt;/code&gt; is
just an HTTP client with good manners.&lt;/p&gt;
&lt;h2 id="groups-versions-resources"&gt;Groups, versions, resources&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/api/v1/namespaces/dev/pods/web core group (&amp;#34;&amp;#34;) -&amp;gt; apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/apis/apps/v1/namespaces/dev/deployments group apps -&amp;gt; apiVersion: apps/v1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/apis/networking.k8s.io/v1/ingresses group networking.k8s.io
&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;Verb&lt;/th&gt;
&lt;th&gt;HTTP&lt;/th&gt;
&lt;th&gt;kubectl&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;create&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;get / list / watch&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get&lt;/code&gt;, &lt;code&gt;describe&lt;/code&gt;, &lt;code&gt;get -w&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;update / patch&lt;/td&gt;
&lt;td&gt;PUT / PATCH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apply&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, &lt;code&gt;patch&lt;/code&gt;, &lt;code&gt;scale&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delete&lt;/td&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;See the real calls: &lt;code&gt;kubectl get pods -v=6&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Declarative vs. imperative</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/04-declarative-imperative/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/04-declarative-imperative/index.html</guid><description>&lt;h1 id="declarative-vs-imperative"&gt;Declarative vs. imperative&lt;/h1&gt;
&lt;p&gt;Three ways to manage objects. Use one per object - mixing them is where drift
comes from.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technique&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;You say&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Imperative commands&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl run&lt;/code&gt;, &lt;code&gt;create deploy&lt;/code&gt;, &lt;code&gt;scale&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;do this&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;exploring, one-offs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imperative object config&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl create -f&lt;/code&gt;, &lt;code&gt;replace -f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;create exactly this file&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;rarely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Declarative object config&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl apply -f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;make it look like this&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;everything you keep&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl create deploy web --image nginx:1.27 &lt;span class="c1"&gt;# fails if it exists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f web.yaml &lt;span class="c1"&gt;# creates or updates - idempotent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-workflow"&gt;The workflow&lt;/h2&gt;
&lt;div class="mermaid align-center"&gt;graph LR
G[&amp;#34;generate&amp;lt;br/&amp;gt;--dry-run=client -o yaml&amp;#34;] --&amp;gt; E[edit YAML]
E --&amp;gt; D[&amp;#34;kubectl diff -f&amp;#34;]
D --&amp;gt; A[&amp;#34;kubectl apply -f&amp;#34;]
A --&amp;gt; V[version in git]&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl create deploy web --image nginx:1.27 --dry-run&lt;span class="o"&gt;=&lt;/span&gt;client -o yaml &amp;gt; web.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl diff -f web.yaml &lt;span class="c1"&gt;# what would change?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f web.yaml --dry-run&lt;span class="o"&gt;=&lt;/span&gt;server &lt;span class="c1"&gt;# validated by the API, not stored&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f web.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="how-apply-knows-what-to-remove"&gt;How apply knows what to remove&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;apply&lt;/code&gt; compares three things: your file, the live object and the &lt;strong&gt;last
applied&lt;/strong&gt; configuration. Client-side apply stores the last one in the
annotation &lt;code&gt;kubectl.kubernetes.io/last-applied-configuration&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Namespaces</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/05-namespaces/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/05-namespaces/index.html</guid><description>&lt;h1 id="namespaces"&gt;Namespaces&lt;/h1&gt;
&lt;p&gt;A virtual cluster inside the cluster: a name scope for objects, and the place
to attach quotas, RBAC and network policies.&lt;/p&gt;
&lt;div class="mermaid align-center"&gt;graph TB
subgraph cluster
subgraph ns1 [namespace: dev]
P1[pod web] --- P2[pod db]
end
subgraph ns2 [namespace: prod]
P3[pod web] --- P4[pod db]
end
N[nodes, PVs, StorageClasses - not namespaced]
end&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get ns
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl create ns dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -n dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl config set-context --current --namespace&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl api-resources --namespaced&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;# what lives outside namespaces&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;Namespaced&lt;/th&gt;
&lt;th&gt;Cluster-scoped&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pods, Deployments, Services, ConfigMaps, Secrets, PVCs, Roles&lt;/td&gt;
&lt;td&gt;Nodes, PersistentVolumes, StorageClasses, ClusterRoles, CRDs, Namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Built in: &lt;code&gt;default&lt;/code&gt;, &lt;code&gt;kube-system&lt;/code&gt;, &lt;code&gt;kube-public&lt;/code&gt;, &lt;code&gt;kube-node-lease&lt;/code&gt;. Never
deploy your own work into &lt;code&gt;kube-system&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Labels, selectors and annotations</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/06-labels-annotations/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/06-labels-annotations/index.html</guid><description>&lt;h1 id="labels-selectors-and-annotations"&gt;Labels, selectors and annotations&lt;/h1&gt;
&lt;p&gt;Both are key/value pairs in &lt;code&gt;metadata&lt;/code&gt;. The difference is &lt;strong&gt;who reads them&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Labels&lt;/th&gt;
&lt;th&gt;Annotations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;identify and &lt;strong&gt;select&lt;/strong&gt; objects&lt;/td&gt;
&lt;td&gt;attach non-identifying info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used by&lt;/td&gt;
&lt;td&gt;Services, ReplicaSets, scheduler, &lt;code&gt;kubectl -l&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tools, humans, controllers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;short (63 chars value)&lt;/td&gt;
&lt;td&gt;up to 256 KB total&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Example&lt;/td&gt;
&lt;td&gt;&lt;code&gt;app=web&lt;/code&gt;, &lt;code&gt;env=prod&lt;/code&gt;, &lt;code&gt;tier=frontend&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;, build commit, Ingress settings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;metadata&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;web-7d9f&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;labels&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;app.kubernetes.io/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;web&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;app.kubernetes.io/part-of&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;shop&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;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prod&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;annotations&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;team.example.com/owner&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;platform&amp;#34;&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;kubernetes.io/change-cause&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;image 1.28&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="selectors"&gt;Selectors&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -l &lt;span class="nv"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod &lt;span class="c1"&gt;# equality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -l &lt;span class="s1"&gt;&amp;#39;env!=prod&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -l &lt;span class="s1"&gt;&amp;#39;env in (dev,test),tier&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# set-based; &amp;#39;tier&amp;#39; = key exists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -l &lt;span class="s1"&gt;&amp;#39;!tier&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# key does not exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -L env,tier &lt;span class="c1"&gt;# labels as columns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods --field-selector status.phase&lt;span class="o"&gt;=&lt;/span&gt;Running &lt;span class="c1"&gt;# fields, not labels&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="mermaid align-center"&gt;graph LR
S[&amp;#34;Service&amp;lt;br/&amp;gt;selector: app=web&amp;#34;] --&amp;gt; P1[&amp;#34;Pod app=web&amp;#34;]
S --&amp;gt; P2[&amp;#34;Pod app=web&amp;#34;]
RS[&amp;#34;ReplicaSet&amp;lt;br/&amp;gt;selector: app=web&amp;#34;] --&amp;gt; P1
RS --&amp;gt; P2
X[&amp;#34;Pod app=db&amp;#34;]&lt;/div&gt;&lt;p&gt;Controllers find their Pods &lt;strong&gt;only&lt;/strong&gt; through label selectors. Change a Pod&amp;rsquo;s
label and it leaves the ReplicaSet and the Service - a common debugging trick.&lt;/p&gt;</description></item><item><title>Objects and their lifecycle</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/07-object-lifecycle/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/07-object-lifecycle/index.html</guid><description>&lt;h1 id="objects-and-their-lifecycle"&gt;Objects and their lifecycle&lt;/h1&gt;
&lt;h2 id="anatomy-of-every-object"&gt;Anatomy of every object&lt;/h2&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;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apps/v1 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# group/version&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="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# type&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="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# identity: name, namespace, labels, uid, ...&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;web&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="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# desired state - written by you&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;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&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="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# current state - written by controllers&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;readyReplicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&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;metadata field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;uid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;unique for the object&amp;rsquo;s lifetime; a recreated object gets a new one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resourceVersion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;changes on every write; used for optimistic locking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;increments when &lt;code&gt;spec&lt;/code&gt; changes; compare with &lt;code&gt;status.observedGeneration&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ownerReferences&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;who owns me - drives garbage collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;finalizers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;work that must finish before deletion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deletionTimestamp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;set when deletion was requested&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="lifecycle"&gt;Lifecycle&lt;/h2&gt;
&lt;div class="mermaid align-center"&gt;stateDiagram-v2
[*] --&amp;gt; Created: create / apply
Created --&amp;gt; Reconciled: controllers act on spec
Reconciled --&amp;gt; Reconciled: spec changes (generation&amp;#43;&amp;#43;)
Reconciled --&amp;gt; Terminating: delete (deletionTimestamp set)
Terminating --&amp;gt; [*]: finalizers empty&lt;/div&gt;&lt;h2 id="ownership-and-garbage-collection"&gt;Ownership and garbage collection&lt;/h2&gt;
&lt;div class="mermaid align-center"&gt;graph LR
D[Deployment] --&amp;gt;|owns| RS[ReplicaSet]
RS --&amp;gt;|owns| P1[Pod]
RS --&amp;gt;|owns| P2[Pod]&lt;/div&gt;&lt;p&gt;Delete the owner and the garbage collector deletes the dependents.&lt;/p&gt;</description></item><item><title>Pods</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/08-pods/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/08-pods/index.html</guid><description>&lt;h1 id="pods"&gt;Pods&lt;/h1&gt;
&lt;p&gt;The smallest schedulable unit. Not a container - an &lt;em&gt;environment&lt;/em&gt; for one or
more containers.&lt;/p&gt;
&lt;div class="mermaid align-center"&gt;graph TB
subgraph pod [Pod - one IP, one network namespace]
C1[container: app]
C2[container: sidecar]
V[(shared volume)]
C1 --- V
C2 --- V
end&lt;/div&gt;&lt;p&gt;Containers in a Pod share the IP, ports and volumes, always run on the same
node, and talk over &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="minimal-manifest"&gt;Minimal manifest&lt;/h2&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;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&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="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod&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="nt"&gt;metadata&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;nginx-pod&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;labels&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;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;web&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="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;nginx&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;nginx:1.27&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;ports&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;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&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 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;50m&amp;#34;&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;64Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&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;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&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;200m&amp;#34;&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;128Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Requests&lt;/strong&gt; drive scheduling, &lt;strong&gt;limits&lt;/strong&gt; are enforced at runtime - details on
Day 3.&lt;/p&gt;</description></item><item><title>ReplicaSets and Deployments</title><link>https://training.caha.cloud/en/kubernetes-gt/day-01/09-replicasets-deployments/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/en/kubernetes-gt/day-01/09-replicasets-deployments/index.html</guid><description>&lt;h1 id="replicasets-and-deployments"&gt;ReplicaSets and Deployments&lt;/h1&gt;
&lt;h2 id="replicaset---keep-n-copies-running"&gt;ReplicaSet - keep N copies running&lt;/h2&gt;
&lt;div class="mermaid align-center"&gt;graph LR
RS[ReplicaSet replicas=3] --&amp;gt; P1[Pod]
RS --&amp;gt; P2[Pod]
RS --&amp;gt; P3[Pod]
P2 -.node dies.-&amp;gt; X((gone))
RS --&amp;gt;|reconcile| P4[new Pod]&lt;/div&gt;&lt;p&gt;Count Pods matching the selector, compare with &lt;code&gt;spec.replicas&lt;/code&gt;, create or
delete the difference. Self-healing and scaling are the same loop.&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;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&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;selector&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;matchLabels&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;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;web&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;template&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;metadata&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;labels&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;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;web &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# must match the selector&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;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;web&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;nginx:1.27&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pods are bound by &lt;strong&gt;selector&lt;/strong&gt;, not by name - a loose Pod with a matching label
gets adopted. A ReplicaSet has no rollout logic: a changed template does not
touch running Pods.&lt;/p&gt;</description></item></channel></rss>