<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Den 2 on Eriks training corner</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/index.html</link><description>Recent content in Den 2 on Eriks training corner</description><generator>Hugo -- gohugo.io</generator><language>cs</language><atom:link href="https://training.caha.cloud/cs/kubernetesintro/day-02/index.xml" rel="self" type="application/rss+xml"/><item><title>Postup při ladění</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/01-troubleshooting/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/01-troubleshooting/index.html</guid><description>&lt;h1 id="postup-při-ladění"&gt;Postup při ladění&lt;/h1&gt;
&lt;p&gt;Jedno pořadí kroků, pokaždé stejné. Je krátké, protože funguje.&lt;/p&gt;
&lt;div class="mermaid align-center"&gt;graph TB
A[&amp;#34;kubectl get pod -o wide&amp;lt;br/&amp;gt;jaký stav? který uzel?&amp;#34;] --&amp;gt; B[&amp;#34;kubectl describe pod&amp;lt;br/&amp;gt;přečti Events dole&amp;#34;]
B --&amp;gt; C{&amp;#34;nastartoval kontejner?&amp;#34;}
C --&amp;gt;|ne| D[&amp;#34;oprav podle události:&amp;lt;br/&amp;gt;image, plánování, volume, probe&amp;#34;]
C --&amp;gt;|ano| E[&amp;#34;kubectl logs [--previous]&amp;lt;br/&amp;gt;co řekla aplikace?&amp;#34;]
E --&amp;gt; F[&amp;#34;kubectl exec -it -- sh&amp;lt;br/&amp;gt;jen když běží&amp;#34;]&lt;/div&gt;&lt;h2 id="stavy-a-kde-hledat-odpověď"&gt;Stavy a kde hledat odpověď&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stav&lt;/th&gt;
&lt;th&gt;Kde je odpověď&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Pending&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;describe&lt;/code&gt; → FailedScheduling: kapacita, taint, nenavázaný PVC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ContainerCreating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;describe&lt;/code&gt; → stahování image nebo připojení volume (probíhá, nebo visí)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ImagePullBackOff&lt;/code&gt; / &lt;code&gt;ErrImagePull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;špatné jméno či tag image, nebo přihlašovací údaje do registru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CrashLoopBackOff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;logs --previous&lt;/code&gt; – aplikace nastartovala a skončila&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Running&lt;/code&gt;, ale ne &lt;code&gt;Ready&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;padá readiness probe; Service takový pod obejde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OOMKilled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;describe&lt;/code&gt; → Last State; příliš nízký paměťový limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;věčný &lt;code&gt;Terminating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;finalizer, nebo kontejner ignorující SIGTERM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="širší-pohled"&gt;Širší pohled&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 events --sort-by&lt;span class="o"&gt;=&lt;/span&gt;.lastTimestamp &lt;span class="p"&gt;|&lt;/span&gt; tail -20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get events -A --field-selector &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Warning
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -A -o wide &lt;span class="p"&gt;|&lt;/span&gt; grep -v Running
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl top nodes &lt;span class="p"&gt;;&lt;/span&gt; kubectl top pods
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="když-aplikace-neodpovídá"&gt;Když aplikace neodpovídá&lt;/h2&gt;
&lt;p&gt;Postupujte směrem ven od podu: je pod ready, má Service endpointy, překládá se
DNS, směruje Gateway.&lt;/p&gt;</description></item><item><title>Namespaces</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/02-namespaces/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/02-namespaces/index.html</guid><description>&lt;h1 id="namespaces"&gt;Namespaces&lt;/h1&gt;
&lt;p&gt;Virtuální cluster uvnitř clusteru: jmenný prostor pro objekty a místo, kam se
věší kvóty a politiky.&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[uzly, PV – mimo namespace]
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;# co žije mimo namespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;V namespace: pody, Deploymenty, Services, ConfigMapy, Secrety, PVC, HTTPRoute.
Mimo namespace: uzly, PersistentVolumes, StorageClasses, ClusterRoles, CRD.&lt;/p&gt;</description></item><item><title>ReplicaSets</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/03-replicasets/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/03-replicasets/index.html</guid><description>&lt;h1 id="replicasets"&gt;ReplicaSets&lt;/h1&gt;
&lt;p&gt;ReplicaSet udržuje běžet &lt;em&gt;N&lt;/em&gt; kopií podu. To je celá jeho práce.&lt;/p&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 -.uzel spadne.-&amp;gt; X((pryč))
RS --&amp;gt;|reconcile| P4[nový Pod]&lt;/div&gt;&lt;p&gt;Smyčka se nikdy nezastaví: spočítej pody odpovídající selektoru, porovnej se
&lt;code&gt;spec.replicas&lt;/code&gt;, rozdíl dotvoř nebo smaž. Samoléčení a škálování je tentýž
mechanismus.&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;# musí odpovídat selektoru&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;Pody váže &lt;strong&gt;selektor&lt;/strong&gt;, ne jméno: volný pod s odpovídajícím labelem bude
adoptován a započítán.&lt;/p&gt;</description></item><item><title>Deployments</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/04-deployments/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/04-deployments/index.html</guid><description>&lt;h1 id="deployments"&gt;Deployments&lt;/h1&gt;
&lt;p&gt;Deployment vlastní ReplicaSety a každý ReplicaSet vlastní pody. Právě to patro
navíc umožňuje aktualizace bez výpadku a návraty zpět.&lt;/p&gt;
&lt;div class="mermaid align-center"&gt;graph TB
D[Deployment nginx] --&amp;gt; RS1[ReplicaSet v1 – replicas 0]
D --&amp;gt; RS2[ReplicaSet v2 – replicas 3]
RS2 --&amp;gt; P1[Pod]
RS2 --&amp;gt; P2[Pod]
RS2 --&amp;gt; P3[Pod]&lt;/div&gt;&lt;p&gt;Změna šablony vytvoří &lt;strong&gt;nový&lt;/strong&gt; ReplicaSet a starý po krocích zmenší. Starý
zůstane na nule replik – to je váš rollback.&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;strategy&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;RollingUpdate&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;rollingUpdate&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;maxUnavailable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# kolik smí být mimo provoz&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;maxSurge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# kolik smí přebývat navíc&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;Protože &lt;code&gt;maxUnavailable&lt;/code&gt; chrání staré pody, rozbitý nový image aplikaci
&lt;strong&gt;nepoloží&lt;/strong&gt;: nový ReplicaSet selhává, starý dál obsluhuje a rollout se prostě
nikdy nedokončí.&lt;/p&gt;</description></item><item><title>DaemonSets</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/05-daemonsets/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/05-daemonsets/index.html</guid><description>&lt;h1 id="daemonsets"&gt;DaemonSets&lt;/h1&gt;
&lt;p&gt;Jeden pod na každém uzlu – automaticky, včetně uzlů, které přibudou později.&lt;/p&gt;
&lt;div class="mermaid align-center"&gt;graph TB
DS[DaemonSet log-agent] --&amp;gt; P1[Pod na control01]
DS --&amp;gt; P2[Pod na worker01]
DS --&amp;gt; P3[Pod na worker02]
DS --&amp;gt; P4[Pod na worker03]
N[přidá se nový uzel] -.-&amp;gt; P5[pod vznikne automaticky]&lt;/div&gt;&lt;p&gt;Žádné pole &lt;code&gt;replicas&lt;/code&gt; neexistuje. Počtem replik je seznam uzlů.&lt;/p&gt;
&lt;p&gt;Typičtí uživatelé: CNI agenti, kube-proxy, sběrače logů, node exportery, storage
drivery. Váš cluster jich už několik provozuje – &lt;code&gt;kubectl get ds -A&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Plánování: taints, tolerations, affinity</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/06-scheduling/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/06-scheduling/index.html</guid><description>&lt;h1 id="plánování-taints-tolerations-affinity"&gt;Plánování: taints, tolerations, affinity&lt;/h1&gt;
&lt;p&gt;Scheduler standardně umístí pod tam, kde se vejde. Tři mechanismy to umí změnit
a fungují proti sobě.&lt;/p&gt;
&lt;div class="mermaid align-center"&gt;graph LR
N[Uzel] --&amp;gt;|taint: odpuzuje| P1[Pod bez tolerance – odmítnut]
N --&amp;gt;|taint tolerován| P2[Pod s tolerancí – povolen]
P3[Pod] --&amp;gt;|nodeSelector / affinity: přitahuje| N&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mechanismus&lt;/th&gt;
&lt;th&gt;Sedí na&lt;/th&gt;
&lt;th&gt;Říká&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Taint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;uzlu&lt;/td&gt;
&lt;td&gt;„drž pody dál, pokud tohle netolerují“&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Toleration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;podu&lt;/td&gt;
&lt;td&gt;„tenhle taint mi nevadí“&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;nodeSelector / node affinity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;podu&lt;/td&gt;
&lt;td&gt;„chci běžet na uzlu tohohle typu“&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ta dvojice je záměrně nesymetrická. Tolerance &lt;strong&gt;povoluje&lt;/strong&gt;, ale nepřitahuje: pod,
který taint toleruje, může stejně přistát kdekoli jinde. Chcete-li ho &lt;em&gt;na těch&lt;/em&gt;
uzlech, potřebujete k tomu ještě affinity.&lt;/p&gt;</description></item><item><title>Services</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/07-services/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/07-services/index.html</guid><description>&lt;h1 id="services"&gt;Services&lt;/h1&gt;
&lt;p&gt;Pody vznikají a zanikají a jejich IP se mění. Service je stabilní adresa před
nimi, se zabudovaným rozkládáním zátěže.&lt;/p&gt;
&lt;div class="mermaid align-center"&gt;graph LR
C[Klient] --&amp;gt; S[Service nginx-svc&amp;lt;br/&amp;gt;ClusterIP 10.96.x.x]
S --&amp;gt; P1[Pod 10.244.1.5]
S --&amp;gt; P2[Pod 10.244.2.7]
S --&amp;gt; P3[Pod 10.244.3.9]&lt;/div&gt;&lt;p&gt;Service vybírá pody podle &lt;strong&gt;labelů&lt;/strong&gt;. IP odpovídajících &lt;em&gt;připravených&lt;/em&gt; podů
skončí v EndpointSlice a kube-proxy podle toho naprogramuje každý uzel.&lt;/p&gt;
&lt;h2 id="typy"&gt;Typy&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Typ&lt;/th&gt;
&lt;th&gt;Odkud je dostupná&lt;/th&gt;
&lt;th&gt;Poznámka&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ClusterIP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;jen zevnitř clusteru&lt;/td&gt;
&lt;td&gt;výchozí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NodePort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ip-libovolného-uzlu&amp;gt;:30000-32767&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;otevře port na všech uzlech&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LoadBalancer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;zvenčí&lt;/td&gt;
&lt;td&gt;potřebuje cloud nebo MetalLB – v tomto clusteru není&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ExternalName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;jen DNS CNAME&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;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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NodePort&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;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;nginx &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# musí odpovídat labelům 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;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;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# port Service&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;targetPort&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 class="c"&gt;# port kontejneru&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;nodePort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30080&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# port na každém uzlu&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="dns"&gt;DNS&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;nginx-svc # stejný namespace
nginx-svc.dev # jiný namespace
nginx-svc.dev.svc.cluster.local # plně kvalifikované
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="headless-services"&gt;Headless Services&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;clusterIP: None&lt;/code&gt; znamená žádnou virtuální IP; DNS vrátí přímo adresy podů.
Takhle dává StatefulSet každé replice stabilní jméno – viz
&lt;a href="https://training.caha.cloud/cs/kubernetesintro/day-03/03-statefulsets/"&gt;StatefulSets&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Gateway API</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/08-gateway-api/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/08-gateway-api/index.html</guid><description>&lt;h1 id="gateway-api"&gt;Gateway API&lt;/h1&gt;
&lt;p&gt;NodePort na každou aplikaci se nedá udržet: skončíte tím, že si pamatujete, že
e-shop je na 30080 a wiki na 30081. Chcete jeden HTTP vstupní bod, který směruje
podle jména hosta a cesty.&lt;/p&gt;
&lt;p&gt;Kubernetes na to má dvě odpovědi. &lt;strong&gt;Ingress&lt;/strong&gt; je ta stará – stabilní, ale
zmrazená: každý controller si ji rozšířil vlastními anotacemi, takže rewrite
pravidlo pro nginx neznamená pro Traefik nic. &lt;strong&gt;Gateway API&lt;/strong&gt; je náhrada: tatáž
úloha vyjádřená skutečnými typovanými objekty, a veškerý vývoj teď probíhá tam.&lt;/p&gt;</description></item><item><title>Uzly (nodes)</title><link>https://training.caha.cloud/cs/kubernetesintro/day-02/09-nodes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://training.caha.cloud/cs/kubernetesintro/day-02/09-nodes/index.html</guid><description>&lt;h1 id="uzly-nodes"&gt;Uzly (nodes)&lt;/h1&gt;
&lt;p&gt;Uzel je stroj, na kterém běží pody. Je cluster-scoped – nepatří do namespace.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Úkol&lt;/th&gt;
&lt;th&gt;Příkaz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Výpis&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl get nodes -o wide&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detail, podmínky, taints, kapacita&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl describe node worker01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zastavit plánování nových podů&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl cordon worker01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cordon &lt;strong&gt;a&lt;/strong&gt; vystěhování&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl drain worker01 --ignore-daemonsets --delete-emptydir-data&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Znovu povolit plánování&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl uncordon worker01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Odebrat z clusteru&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl delete node worker01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="mermaid align-center"&gt;stateDiagram-v2
[*] --&amp;gt; Ready
Ready --&amp;gt; SchedulingDisabled: cordon
SchedulingDisabled --&amp;gt; Ready: uncordon
SchedulingDisabled --&amp;gt; Drained: drain
Drained --&amp;gt; Ready: uncordon&lt;/div&gt;&lt;p&gt;Drain je příkaz pro údržbu. Co nepřesune:&lt;/p&gt;</description></item></channel></rss>