<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Talos on Eric Daly&#39;s Blog</title>
    <link>https://blog.dalydays.com/tags/talos/</link>
    <description>Recent content in Talos on Eric Daly&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Tue, 21 Jan 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.dalydays.com/tags/talos/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Upgrade Talos Linux and Kubernetes</title>
      <link>https://blog.dalydays.com/post/kubernetes-talos-upgrades/</link>
      <pubDate>Tue, 21 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>https://blog.dalydays.com/post/kubernetes-talos-upgrades/</guid>
      <description>A quick rundown of Talos OS upgrades and Kubernetes version upgrades</description>
      <content:encoded><![CDATA[<h1 id="upgrade-kubernetes-version">Upgrade Kubernetes Version</h1>
<p><a href="https://www.talos.dev/v1.9/kubernetes-guides/upgrading-kubernetes/">https://www.talos.dev/v1.9/kubernetes-guides/upgrading-kubernetes/</a></p>
<blockquote>
<p>Upgrading Kubernetes is non-disruptive to the cluster workloads.</p>
</blockquote>
<p>You can do this live, assuming you don&rsquo;t have single-replica workloads that are node-specific.</p>
<p>Today I will be upgrading to Kubernetes version <code>v1.31.5</code>. I&rsquo;m currently on <code>v1.30.0</code> but I want to make sure I&rsquo;m running the same version that is being tested on the CKA exam that I&rsquo;m studying for which is currently 1.31.</p>
<p>Talos recommends using the <code>talosctl upgrade-k8s</code> command which automatically upgrades the entire cluster and has built in safety checks. They explain how to do it manually, but I chose Talos Linux partly based on the ease of ongoing maintenance and upgrades so I will be using the easy button here!</p>
<ul>
<li>Check current version: <code>kubectl get node</code></li>
<li>Upgrade: <code>talosctl -n 10.0.50.11 upgrade-k8s --to 1.31.5</code>
<ul>
<li>You only need to specify a single control plane node, but this will upgrade the whole cluster</li>
<li>You need to choose a real Kubernetes version - <a href="https://kubernetes.io/releases/">https://kubernetes.io/releases/</a></li>
<li>This will take a while, so try to be patient.</li>
</ul>
</li>
<li>Verify version: <code>kubectl get node</code></li>
</ul>
<p>I like to update my local talosconfig repo which was used to deploy the original Talos cluster and also includes secrets used to recover in case of any problems. This is a good time to update the Kubernetes version in controlplane.yaml and worker.yaml for any new nodes you deploy.</p>
<h1 id="upgrade-talos-os">Upgrade Talos OS</h1>
<p><a href="https://www.talos.dev/v1.9/talos-guides/upgrading-talos/">https://www.talos.dev/v1.9/talos-guides/upgrading-talos/</a></p>
<p>The Talos team recommends using the same version of <code>talosctl</code> that your nodes are running. You will then upgrade <code>talosctl</code> after the node upgrades are complete.</p>
<p>Be sure to upgrade one node at a time and check that it&rsquo;s healthy before moving on. You can blast through them using a for loop, or do them by hand. Just don&rsquo;t do them all at the same time :)</p>
<ul>
<li>Check versions:
<ul>
<li>Client: <code>talosctl version --client</code></li>
<li>Server: <code>kubectl get node -o wide</code> (OS-IMAGE column)</li>
</ul>
</li>
<li>Get a new Talos OS image from the factory: <a href="https://factory.talos.dev">https://factory.talos.dev</a>
<ul>
<li>Make sure to add any existing extensions you&rsquo;re using such is <code>iscsi-tools</code></li>
<li>Copy the image string under the &ldquo;Upgrading Talos Image&rdquo; header. In my case this looks like <code>factory.talos.dev/installer/88d1f7a5c4f1d3aba7df787c448c1d3d008ed29cfb34af53fa0df4336a56040b:v1.9.2</code></li>
</ul>
</li>
<li>Upgrade one node: <code>talosctl upgrade -n 10.0.50.11 --image factory.talos.dev/installer/88d1f7a5c4f1d3aba7df787c448c1d3d008ed29cfb34af53fa0df4336a56040b:v1.9.2 --preserve</code>
<ul>
<li><code>-n</code>: Specify the node to upgrade</li>
<li><code>--image</code>: Specify the factory image to use</li>
<li><code>--preserve</code>: Don&rsquo;t wipe extraMounts if applicable. I default to using this unless I have a specific reason to wipe additional mounts.</li>
</ul>
</li>
<li>Repeat the upgrade command for each node, one at a time, until all nodes have been upgraded.</li>
</ul>
<p>In my homelab, I am comfortable blasting through upgrades with a for loop, so my upgrade command looks like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="k">for</span> node in <span class="m">11</span> <span class="m">12</span> <span class="m">13</span> <span class="m">21</span> <span class="m">22</span> <span class="m">23</span> <span class="m">31</span> <span class="m">32</span> 33<span class="p">;</span> <span class="k">do</span> talosctl upgrade -n 10.0.50.<span class="nv">$node</span> --image factory.talos.dev/installer/88d1f7a5c4f1d3aba7df787c448c1d3d008ed29cfb34af53fa0df4336a56040b:v1.9.2 --preserve<span class="p">;</span> <span class="k">done</span>
</span></span></code></pre></div><p>Once Nodes have been upgraded, upgrade the <code>talosctl</code> client so the version matches the Talos node version.</p>
<ul>
<li><code>rm /usr/local/bin/talosctl</code></li>
<li><code>curl -sL https://talos.dev/install | sh</code> (this gets the latest version)
<ul>
<li>You can also download a specific release from <a href="https://github.com/siderolabs/talos/releases">https://github.com/siderolabs/talos/releases</a>, e.g. <code>curl -LJO https://github.com/siderolabs/talos/releases/download/v1.8.3/talosctl-linux-amd64</code></li>
</ul>
</li>
<li>Verify: <code>talosctl version --client</code></li>
</ul>
<p>I like to update my local talosconfig repo which was used to deploy the original Talos cluster and also includes secrets used to recover in case of any problems. This is a good time to update the factory image in controlplane.yaml and worker.yaml for any new nodes you deploy.</p>
<p>That&rsquo;s it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Kubernetes Homelab Series Part 1 - Introduction and Talos Installation</title>
      <link>https://blog.dalydays.com/post/kubernetes-homelab-series-part-1-talos-linux-proxmox/</link>
      <pubDate>Thu, 10 Oct 2024 00:00:00 +0000</pubDate>
      
      <guid>https://blog.dalydays.com/post/kubernetes-homelab-series-part-1-talos-linux-proxmox/</guid>
      <description>This in depth series will walk through building a Kubernetes cluster beyond the basics, including dynamically provisioned storage, certificate management, and backups.</description>
      <content:encoded><![CDATA[<h1 id="introduction">Introduction</h1>
<p>This series will go through the process of building a Kubernetes cluster on Proxmox using Talos Linux from the ground up. I intend for this to go into a lot more depth than a lot of basic tutorials, and by the end you should have a cluster that you can actually trust to run workloads with high availability, backups, etc.</p>
<p>The goal of this series is not to be a Kubernetes tutorial, but more of a step by step to building a Talos Linux cluster that has all the components you might need, along with some insights I&rsquo;ve learned over time that you might find helpful.</p>
<p>I use Proxmox in my homelab, but this could be followed easily in ESXi or other hypervisors of choice.</p>
<p>Building a bare cluster is easy. Making it work for you is not. Not because it&rsquo;s hard, but because there are a lot of components and decisions to make. As many problems as Kubernetes solves, it introduces many new challenges and new ways of thinking about things. One of the hardest problems in my opinion is storage, which we will talk about and I will show you how I decided to do this in my homelab. It is possible to achieve dynamically provisioned storage with a single disk, and not just with hostPath. You don&rsquo;t have to use Rancher Longhorn, OpenEBS (Mayastor) or Portworx. You don&rsquo;t have to use NFS. It&rsquo;s mix and match!</p>
<p>Other topics will include LoadBalancer services using MetalLB, secret management using Sealed Secrets (and also talking about SOPS with age), cluster backup of the etcd cluster along with Velero to back up cluster resources, and ingress with Traefik (plus Gateway API which is the successor to ingress controllers).</p>
<p>Finally, and this will actually be the first topic, I will be using Talos Linux because I believe it&rsquo;s the easiest option overall considering the initial build and also ongoing maintenance such as OS upgrades and Kubernetes version upgrades.</p>
<p>Using Talos Linux in theory makes managing the cluster itself very simple because their API is the only way to make changes and they include safe upgrade options for both the Talos nodes and Kubernetes versions. It does introduce some complexity, especially relating to storage, but we&rsquo;ll talk about that a little later.</p>
<h1 id="prerequisites-and-assumptions">Prerequisites and Assumptions</h1>
<ul>
<li>You have a homelab of some sort and can download ISOs and create VMs.</li>
<li>You have a disk or virtual disk to dedicate for storage (or you can do clustered storage, we&rsquo;ll talk about it).</li>
<li>You are able to read and follow along :)</li>
</ul>
<h1 id="getting-started-with-talos-overview">Getting Started With Talos (Overview)</h1>
<p><a href="https://www.talos.dev/">https://www.talos.dev/</a><br>
Talos Linux is Linux designed for Kubernetes – secure, immutable, and minimal.</p>
<ul>
<li>Supports cloud platforms, bare metal, and virtualization platforms</li>
<li>All system management is done via an API. No SSH, shell or console</li>
<li>Production ready: supports some of the largest Kubernetes clusters in the world</li>
<li>Open source project from the team at Sidero Labs</li>
</ul>
<p>It&rsquo;s the easiest solution to deploy (and maintain) a Kubernetes cluster.</p>
<h2 id="proxmox-setup">Proxmox Setup</h2>
<ul>
<li>Download latest Talos Linux release, grabbing metal-amd64.iso version from the GitHub releases page <a href="https://github.com/siderolabs/talos/releases">https://github.com/siderolabs/talos/releases</a></li>
<li>Upload it to proxmox ISOs, or have proxmox download it directly from the URL</li>
<li>Optionally rename the file manually on the filesystem: /tank/isos/template/iso/</li>
<li>Create VMs in Proxmox (3 control plane nodes, 3 worker nodes)</li>
<li>For OS, the talos metal-amd64 iso image. It will be replaced later during bootstrapping, so getting the latest image with added extensions now is not important.
<ul>
<li>Enable QEMU guest agent (requires qemu guest extensions in Talos)</li>
<li>For disks, choose something on SSD storage (required for reasonable etcd performance)</li>
<li>Enable Discard and SSD emulation options</li>
<li>20GB should be plenty</li>
<li>4CPU (2 minimum)</li>
<li>4GB RAM (2 minimum)</li>
<li>VLAN 50, DHCP (VLAN is optional, use whatever VLAN you want for your cluster if you have one, otherwise leave this blank)</li>
</ul>
</li>
<li>Start the VMs, and check the console for each to verify they are running (and have an IP assigned on the kubernetes VLAN if applicable)</li>
</ul>
<h2 id="talos-linux-setup">Talos Linux Setup</h2>
<ul>
<li>Check out the talos project: <a href="https://www.talos.dev/v1.8/talos-guides/install/virtualized-platforms/proxmox/">https://www.talos.dev/v1.8/talos-guides/install/virtualized-platforms/proxmox/</a></li>
<li>On whichever machine you are using to manage Talos such as your local workstation, install talosctl and verify it&rsquo;s the same version you are deploying
<ul>
<li>See <a href="https://www.talos.dev/v1.8/talos-guides/install/talosctl/">https://www.talos.dev/v1.8/talos-guides/install/talosctl/</a></li>
<li>The recommended method is <code>brew install siderolabs/tap/talosctl</code></li>
<li>The alternative method is <code>curl -sL https://talos.dev/install | sh</code></li>
<li>Note: if you are upgrading talosctl, the <code>curl</code> method will tell you it&rsquo;s already installed with a message saying <code>To force re-downloading, delete '/usr/local/bin/talosctl' then run me again.</code>
<ul>
<li>Delete the current binary with <code>sudo rm -rf /usr/local/bin/talosctl</code></li>
<li>Re-run <code>curl -sL https://talos.dev/install | sh</code></li>
</ul>
</li>
</ul>
</li>
<li>Create a new folder for your Talos cluster. You will be initializing a git repo here and eventually pushing to a remote repo.
<ul>
<li><code>mkdir -p taloscluster &amp;&amp; cd taloscluster</code></li>
</ul>
</li>
<li>Generate new Talos secrets. These are used to authenticate with the Talos cluster.
<ul>
<li><code>talosctl gen secrets</code></li>
<li>This stores a file in the current directory named <code>secrets.yaml</code></li>
</ul>
</li>
<li>Build the Talos image you will be using to install Talos to each node. This allows you to add extensions which add capabilities such as iSCSI support and QEMU guest agent for Proxmox.
<ul>
<li>Go to <a href="https://factory.talos.dev/">https://factory.talos.dev/</a> - Bare Metal Machine &gt; 1.8.1 (or the version you want) &gt; AMD64 &gt; Check siderolabs/qemu-guest-agent &gt; Check siderolabs/iscsi-tools &gt; (no customization) &gt; copy the factory image string under &ldquo;Initial Install&rdquo; section, e.g. <code>factory.talos.dev/installer/88d1f7a5c4f1d3aba7df787c448c1d3d008ed29cfb34af53fa0df4336a56040b:v1.8.1</code></li>
</ul>
</li>
<li>Generate base machine configs: <a href="https://www.talos.dev/v1.8/talos-guides/install/virtualized-platforms/proxmox/#generate-machine-configurations">https://www.talos.dev/v1.8/talos-guides/install/virtualized-platforms/proxmox/#generate-machine-configurations</a>
<ul>
<li>The <code>CONTROL_PLANE_IP</code> needs to point to one of the control plane nodes. The best practice is to use a VIP, allowing for HA due to the fact that it is automatically assigned to another control plane node if one goes offline (<a href="https://www.talos.dev/v1.8/talos-guides/network/vip/">https://www.talos.dev/v1.8/talos-guides/network/vip/</a>)
<ul>
<li>You can use a hostname that points to the VIP, but I prefer to use the VIP directly.</li>
<li>Adding a VIP is essentially done by configuring <code>machine.network.interfaces.vip.ip</code> in the Talos machine config (see below), which automatically enables the functionality in Talos to load balance this VIP (e.g. if the VIP is on node 1 and that goes down, the VIP will automatically be moved to another node that is online).</li>
<li>It&rsquo;s not recommended to use the VIP for the Talos API (used with <code>talosctl</code>). The main purpose of the VIP is for use with the Kubernetes API (used with <code>kubectl</code>).</li>
<li>If you don&rsquo;t use a VIP, you can just use the IP of one of the control plane nodes, but if that particular node goes down, even if other control plane nodes are still up, you will not be able to run <code>kubectl</code> commands against your cluster without manually editing your <code>kubeconfig</code>. A VIP would also be pointless if you only have a single control plane node.</li>
</ul>
</li>
<li>Feel free to change the cluster name (default is &ldquo;talos-proxmox-cluster&rdquo;)
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># CONTROL_PLANE_IP should be the VIP you plan on using (not the DHCP assigned), or the IP of one of your control plane nodes if not using a VIP</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CONTROL_PLANE_IP</span><span class="o">=</span>10.0.50.160
</span></span><span class="line"><span class="cl"><span class="c1"># FACTORY_IMAGE should be updated to the image you want to install</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">FACTORY_IMAGE</span><span class="o">=</span>factory.talos.dev/installer/88d1f7a5c4f1d3aba7df787c448c1d3d008ed29cfb34af53fa0df4336a56040b:v1.9.2
</span></span><span class="line"><span class="cl">talosctl gen config talos-proxmox-cluster https://<span class="nv">$CONTROL_PLANE_IP</span>:6443 --with-secrets secrets.yaml --output-dir _out --install-image <span class="nv">$FACTORY_IMAGE</span>
</span></span></code></pre></div></li>
</ul>
</li>
<li>In Part 2, I discuss encrypting YAML files with SOPS + age, which you can use to encrypt this file and store it securely in a git repo: <a href="https://blog.dalydays.com/post/kubernetes-homelab-series-part-2-sops-and-age/">https://blog.dalydays.com/post/kubernetes-homelab-series-part-2-sops-and-age/</a> - Feel free to do that now if you want to add a little bit of complexity. Otherwise, continue to the end of this one and circle back to that article afterward so you can safely encrypt and store your configs in a git repo.</li>
<li>Create node specific patches (used for defining a static IP, etc.): <a href="https://www.talos.dev/v1.8/talos-guides/configuration/patching/">https://www.talos.dev/v1.8/talos-guides/configuration/patching/</a>
<ul>
<li>Best practice is to install the base config to each node (<code>controlplane.yaml</code> or <code>worker.yaml</code>), then apply patches to customize nodes to set the name, static IP, etc.</li>
<li>To set a static IP, you have to specify either an <code>interface</code> or a <code>deviceSelector</code> (mutually exclusive). By default, Predictable Interface Names are not enabled, meaning your ethernet name might be something like <code>enxSOMETHING</code> based on the MAC address. One way around this is to enable Predictable Interface Names by setting the kernel argument <code>net.ifnames=0</code> on first boot, or you can use a generic <code>deviceSelector</code> like I did in the example below. If you only have 1 NIC, this will work just fine. If you mave multiple NICs, you can run <code>talosctl get links -n [node-ip]</code> and select the interface name from the ID column, or maybe the MAC address from the HW ADDR column. I&rsquo;m just using <code>busPath: &quot;0*&quot;</code> to select the default NIC without changing any other options.
<ul>
<li><a href="https://www.talos.dev/v1.8/talos-guides/network/predictable-interface-names/#single-network-interface">https://www.talos.dev/v1.8/talos-guides/network/predictable-interface-names/#single-network-interface</a></li>
</ul>
</li>
<li><code>mkdir -p patches</code></li>
<li>Create patches for each controlplane and worker node:
<ul>
<li>cp1.patch</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">machine</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">taloscp1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">interfaces</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">deviceSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">busPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0*&#34;</span><span class="w"> </span><span class="c"># This is an example; adjust based on your hardware</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">addresses</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="m">10.0.50.161</span><span class="l">/24</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">routes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="l">/0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">gateway</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">vip</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">ip</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.160</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nameservers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="m">192.168.1.22</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>cp2.patch</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">machine</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">taloscp2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">interfaces</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">deviceSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">busPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0*&#34;</span><span class="w"> </span><span class="c"># This is an example; adjust based on your hardware</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">addresses</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="m">10.0.50.162</span><span class="l">/24</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">routes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="l">/0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">gateway</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">vip</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">ip</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.160</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nameservers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="m">192.168.1.22</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>cp3.patch</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">machine</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">taloscp3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">interfaces</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">deviceSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">busPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0*&#34;</span><span class="w"> </span><span class="c"># This is an example; adjust based on your hardware</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">addresses</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="m">10.0.50.163</span><span class="l">/24</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">routes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="l">/0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">gateway</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">vip</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">ip</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.160</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nameservers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="m">192.168.1.22</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>wk1.patch</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">machine</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">taloswk1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">interfaces</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">deviceSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">busPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0*&#34;</span><span class="w"> </span><span class="c"># This is an example; adjust based on your hardware</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">addresses</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="m">10.0.50.171</span><span class="l">/24</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">routes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="l">/0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">gateway</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nameservers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="m">192.168.1.22</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>wk2.patch</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">machine</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">taloswk2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">interfaces</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">deviceSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">busPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0*&#34;</span><span class="w"> </span><span class="c"># This is an example; adjust based on your hardware</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">addresses</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="m">10.0.50.172</span><span class="l">/24</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">routes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="l">/0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">gateway</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nameservers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="m">192.168.1.22</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>wk3.patch</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">machine</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">network</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">taloswk3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">interfaces</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">deviceSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">busPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0*&#34;</span><span class="w"> </span><span class="c"># This is an example; adjust based on your hardware</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">addresses</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="m">10.0.50.173</span><span class="l">/24</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">routes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">network</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="l">/0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">gateway</span><span class="p">:</span><span class="w"> </span><span class="m">10.0.50.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nameservers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="m">192.168.1.22</span><span class="w">
</span></span></span></code></pre></div></li>
</ul>
</li>
</ul>
<h2 id="talos-linux-installation">Talos Linux Installation</h2>
<p>Finally, time to actually install Talos!</p>
<ul>
<li>Check the console for Talos CP1 in Proxmox to get the IP address (should have been assigned via DHCP). Let&rsquo;s say it&rsquo;s 10.0.50.129</li>
<li>Install using base controlplane.yaml config: <code>talosctl apply-config --insecure --nodes 10.0.50.129 --file _out/controlplane.yaml</code></li>
<li>Follow this same process for each of the other 2 controlplane nodes.</li>
<li>Follow the same process for all worker nodes, but use <code>_out/worker.yaml</code>: <code>talosctl apply-config --insecure --nodes 10.0.50.132 --file _out/worker.yaml</code></li>
<li>Watch the console in Proxmox to see it install and reboot. When you see the Kubernetes version and Kubelet status Healthy on all 6 nodes, you can proceed to patching each node to assign static IPs.</li>
<li>Patch each node using the corresponding patch file. Endpoint should be the control plane node you&rsquo;re targeting, for controlplane setup. For workers, the endpoint needs to be one of the control plane nodes, and since you&rsquo;ve already updated to 10.0.50.161 in this example, you can use the first control plane as the endpoint when patching all the worker nodes:
<ul>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.129 -n 10.0.50.129 --patch @patches/cp1.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.130 -n 10.0.50.130 --patch @patches/cp2.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.131 -n 10.0.50.131 --patch @patches/cp3.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.132 --patch @patches/wk1.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.133 --patch @patches/wk2.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.134 --patch @patches/wk3.patch</code></li>
</ul>
</li>
<li>Note: the VIP doesn&rsquo;t come online until after bootstrapping the cluster. Don&rsquo;t be like me and try to troubleshoot this right now :)</li>
<li>If you want to deploy metrics-server (see <a href="https://www.talos.dev/v1.8/kubernetes-guides/configuration/deploy-metrics-server/">https://www.talos.dev/v1.8/kubernetes-guides/configuration/deploy-metrics-server/</a>) then enable <code>rotate-server-certificates: true</code> on all nodes and add the extra manifests to automatically approve the CSRs and include metrics-server. This is OPTIONAL.
<ul>
<li>Create <code>./patches/kubelet-cert-rotation.patch</code></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">machine</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">kubelet</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">extraArgs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">rotate-server-certificates</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cluster</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">extraManifests</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">https://raw.githubusercontent.com/alex1989hu/kubelet-serving-cert-approver/main/deploy/standalone-install.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml</span><span class="w">
</span></span></span></code></pre></div><ul>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.161 --patch @patches/kubelet-cert-rotation.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.162 --patch @patches/kubelet-cert-rotation.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.163 --patch @patches/kubelet-cert-rotation.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.171 --patch @patches/kubelet-cert-rotation.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.172 --patch @patches/kubelet-cert-rotation.patch</code></li>
<li><code>talosctl patch mc --talosconfig _out/talosconfig -e 10.0.50.161 -n 10.0.50.173 --patch @patches/kubelet-cert-rotation.patch</code></li>
</ul>
</li>
<li>Configure talosctl by either copying talosconfig to $HOME/.talos/config or exporting the ENV variable:
<ul>
<li><code>mv _out/talosconfig ~/.talos/config</code></li>
<li>Or if you want to use ENV variables: <code>export TALOSCONFIG=&quot;_out/talosconfig&quot;</code></li>
</ul>
</li>
<li>Set endpoints list and nodes list if youi get tired of specifying them every time you run talosctl commands:
<ul>
<li><code>talosctl config endpoint 10.0.50.161 10.0.50.162 10.0.50.163</code></li>
<li><code>talosctl config node 10.0.50.161 10.0.50.162 10.0.50.163 10.0.50.171 10.0.50.172 10.0.50.173</code></li>
</ul>
</li>
<li>Bootstrap the cluster:
<ul>
<li><code>talosctl bootstrap -n 10.0.50.161</code></li>
</ul>
</li>
<li>Grab kubeconfig - download to current directory
<ul>
<li><code>talosctl kubeconfig -n 10.0.50.161 .</code></li>
</ul>
</li>
<li>Move kubeconfig if this will be used as your default cluster
<ul>
<li><code>mv kubeconfig ~/.kube/config</code></li>
</ul>
</li>
<li>Install kubectl
<ul>
<li><code>curl -LO &quot;https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl&quot;</code></li>
<li><code>install -m 755 /usr/local/bin/kubectl</code></li>
<li><code>kubectl version</code></li>
</ul>
</li>
<li>Similar to talosctl, configure kubectl by either copying kubectl to $HOME/.kube/config or exporting the ENV variable:
<ul>
<li><code>cp kubeconfig ~/.kube/config</code></li>
<li>OR</li>
<li><code>export KUBECONFIG=&quot;/root/whereami/kubeconfig&quot;</code></li>
</ul>
</li>
<li>Verify you can see the nodes. It can take a few minutes for Kubernetes to fully bootstrap, even though Talos shows Ready/Healthy in the dashboard.
<ul>
<li><code>kubectl get node -o wide</code></li>
</ul>
<pre tabindex="0"><code>NAME       STATUS   ROLES           AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION   CONTAINER-RUNTIME
taloscp1   Ready    control-plane   6m34s   v1.31.1   10.0.50.161   &lt;none&gt;        Talos (v1.8.1)   6.6.54-talos     containerd://2.0.0-rc.5
taloscp2   Ready    control-plane   6m34s   v1.31.1   10.0.50.162   &lt;none&gt;        Talos (v1.8.1)   6.6.54-talos     containerd://2.0.0-rc.5
taloscp3   Ready    control-plane   6m2s    v1.31.1   10.0.50.163   &lt;none&gt;        Talos (v1.8.1)   6.6.54-talos     containerd://2.0.0-rc.5
taloswk1   Ready    &lt;none&gt;          6m26s   v1.31.1   10.0.50.171   &lt;none&gt;        Talos (v1.8.1)   6.6.54-talos     containerd://2.0.0-rc.5
taloswk2   Ready    &lt;none&gt;          6m22s   v1.31.1   10.0.50.172   &lt;none&gt;        Talos (v1.8.1)   6.6.54-talos     containerd://2.0.0-rc.5
taloswk3   Ready    &lt;none&gt;          6m18s   v1.31.1   10.0.50.173   &lt;none&gt;        Talos (v1.8.1)   6.6.54-talos     containerd://2.0.0-rc.5
</code></pre></li>
<li>In testing I noticed some stuff that&rsquo;s supposed to run on all control plane nodes was only running on all control plane nodes. Give it some time and check again. You would be looking for <code>kube-apiserver-[node]</code>, <code>kube-controller-manager-[node]</code>, and <code>kube-scheduler-[node]</code>.
<ul>
<li><code>kubectl get po -n kube-system</code></li>
</ul>
</li>
</ul>
<h2 id="test-a-workload">Test A Workload</h2>
<ul>
<li>Create deployment: <code>kubectl create deploy nginx-test --image nginx --replicas 1</code></li>
<li>Expose via NodePort service: <code>kubectl expose deploy nginx-test --type NodePort --port 80</code></li>
<li>Get the node the pod is running on: <code>kubectl get po -o wide</code>
<ul>
<li>Note which worker node from the Node column</li>
</ul>
</li>
<li>Get the port on that node: <code>kubectl get svc</code>
<ul>
<li>Note the larger port number on the right side in the Ports column, likely in the 31000 range</li>
</ul>
</li>
<li>In testing, my pod was deployed to taloswk3 which has IP 10.0.50.173, and the port was 31458
<ul>
<li>Visit http://10.0.50.173:31458 in the browser to confirm you see the &ldquo;Welcome to nginx!&rdquo; page</li>
</ul>
</li>
<li>Clean up test resources:
<ul>
<li><code>kubectl delete svc nginx-test</code></li>
<li><code>kubectl delete deploy nginx-test</code></li>
</ul>
</li>
</ul>
<h1 id="ongoing-maintenance">Ongoing Maintenance</h1>
<h2 id="client-certificate-expiration---important">Client Certificate Expiration - IMPORTANT!!!</h2>
<p><a href="https://www.talos.dev/v1.8/talos-guides/howto/cert-management/">https://www.talos.dev/v1.8/talos-guides/howto/cert-management/</a></p>
<blockquote>
<p>Talos Linux automatically manages and rotates all server side certificates for etcd, Kubernetes, and the Talos API. Note however that the kubelet needs to be restarted at least once a year in order for the certificates to be rotated. Any upgrade/reboot of the node will suffice for this effect.</p>
</blockquote>
<p>TLDR; Your <code>talosconfig</code> and <code>kubeconfig</code> files are going to expire 1 year from when they are created. You need to regenerate these files, ideally <strong>before</strong> they expire to avoid issues connecting to the Talos API or the Kubernetes API.</p>
<p>Here&rsquo;s what you need to do. If you get lost, refer to the official Talos documentation linked above for curent instructions.</p>
<h3 id="talosconfig">talosconfig</h3>
<p>You will know if <code>talosconfig</code> is expired if you see this error message when attempting to run <code>talosctl</code> commands. Wow that&rsquo;s a lot of errors!!!</p>
<pre tabindex="0"><code>error reading file: rpc errror: code = Unavailable desc = last connection error: connection error: desc = &#34;error reading server preface: remote error: tls: expired certificate&#34;
</code></pre><ul>
<li>At least once a year, regenerate <code>talosconfig</code>. You could automate this.</li>
<li>Check config details with <code>talosctl config info</code>
<ul>
<li>If your current <code>talosconfig</code> is still valid: <code>talosctl -n CP1 config new talosconfig-reader --roles os:reader --crt-ttl 24h</code>
<ul>
<li>Here, <code>CP1</code> is the IP of one of your control plane nodes, e.g. <code>10.0.50.161</code></li>
</ul>
</li>
<li>If <code>talosconfig</code> has expired:
<ul>
<li>Generate from <code>secrets</code> bundle: <code>talosctl gen config --with-secrets secrets.yaml --output-types talosconfig -o talosconfig &lt;cluster-name&gt; https://&lt;cluster-endpoint&gt;</code>
<ul>
<li>Here, <code>&lt;cluster-name&gt;</code> should match what you named your Talos cluster earlier. <code>&lt;cluster-endpoint&gt;</code> should be the VIP used for your Talos cluster, e.g. 10.0.50.160. If you didn&rsquo;t elect to use VIP, just pick one of your control plane IPs.</li>
</ul>
</li>
</ul>
</li>
<li>There&rsquo;s a third option in the docs if you need it.</li>
</ul>
</li>
<li>If you store <code>talosconfig</code> in version control, re-encrypt with SOPS and update. This is totally optional and probably unnecessary since you can generate the config by other means if needed.</li>
<li><code>mv talosconfig ~/.talos/config</code></li>
<li>Configure your endpoints and nodes again since they are tied to the config:
<ul>
<li><code>talosctl config endpoint 10.0.50.161 10.0.50.162 10.0.50.163</code></li>
</ul>
</li>
</ul>
<h3 id="kubeconfig">kubeconfig</h3>
<p>You will know if <code>kubeconfig</code> is expired if you see this error message when attempting to run <code>kubectl</code> commands:</p>
<pre tabindex="0"><code>error: You must be logged in to the server (the server has asked for the client to provide credentials)
</code></pre><ul>
<li>At least once a year, regenerate <code>kubeconfig</code>. This requires you to have a valid <code>talosconfig</code>.
<ul>
<li>Follow the same steps as before to grab <code>kubeconfig</code>: <code>talosctl kubeconfig -n 10.0.50.161 .</code></li>
<li><code>mv kubeconfig ~/.kube/config</code></li>
</ul>
</li>
</ul>
<h2 id="backing-up-etcd---recommended">Backing Up <code>etcd</code> - Recommended!</h2>
<p>I&rsquo;ll be talking about other backups in more depth later on in part 7 with Velero.</p>
<p><code>etcd</code> is special as it&rsquo;s a real time representation of all Kubernetes cluster resources, and it&rsquo;s what the API queries when you run <code>kubectl</code> commands. It&rsquo;s the current running state of the cluser. Obviously backing this up is important, because if something goes wrong with it, and you don&rsquo;t have a backup, you will have to rebuild your entire cluster.</p>
<p>I strongly recommend backing up <code>etcd</code> separately. Since <code>etcd</code> doesn&rsquo;t run as part of the cluster, but rather at the Talos level, you can use <code>talosctl</code> to manage and backup the <code>etcd</code> database. This actually simplifies things from a Kubernetes administrator perspective, but it&rsquo;s certainly different than the approach you would take from the CKA certification training.</p>
<p>The basic command to snapshot etcd with Talos is this:</p>
<ul>
<li><code>talosctl -n 10.0.50.161 etcd snapshot &lt;path&gt;</code></li>
</ul>
<p>I created a small bash script and scheduled it in a cron job to automate this backup, and my bash script looks like this. The resulting file looks like <code>etcd.snapshot.20241023</code>:</p>
<pre tabindex="0"><code>#!/bin/bash

TALOSCONFIG=&#34;/root/.talos/config&#34;
PATH=&#34;/mnt/talos_backup&#34;

/usr/local/bin/talosctl --talosconfig $TALOSCONFIG -n 10.0.50.161 etcd snapshot $PATH/etcd.snapshot.$(/bin/date +%Y%m%d)

# Delete snapshots older than 30 days
/usr/bin/find $PATH -mtime +30 -type f -delete
</code></pre><h1 id="next-steps">Next Steps</h1>
<p>Now you should have a Talos Linux cluster running with each node having its own static IP, along with a VIP for the control plane cluster. You are ready to start installing what I would consider foundational components that will be used to automate tasks for you when deploying actual workloads later on. These include:</p>
<ul>
<li>Secret encryption - Sealed Secrets</li>
<li>LoadBalancer service - MetalLB</li>
<li>Certificate manager - cert-manager</li>
<li>Ingress provider - traefik</li>
<li>CSI driver - democratic-csi</li>
<li>Backups - Velero + etcd backup with talosctl</li>
<li>Grafana (<a href="https://grafana.com/docs/grafana/latest/">https://grafana.com/docs/grafana/latest/</a>) + Prometheus (<a href="https://prometheus.io/docs/introduction/overview/">https://prometheus.io/docs/introduction/overview/</a>)</li>
<li>Loki + Promtail - <a href="https://github.com/grafana/loki">https://github.com/grafana/loki</a></li>
<li>Metrics server (<a href="https://github.com/kubernetes-sigs/metrics-server">https://github.com/kubernetes-sigs/metrics-server</a>) - This is intended for autoscaling, not general monitoring</li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
