{"id":4805,"date":"2025-04-16T21:15:44","date_gmt":"2025-04-17T01:15:44","guid":{"rendered":"https:\/\/dft.wiki\/?p=4805"},"modified":"2026-06-08T09:49:54","modified_gmt":"2026-06-08T13:49:54","slug":"talos-linux-a-kubernetes-appliance","status":"publish","type":"post","link":"https:\/\/dft.wiki\/?p=4805","title":{"rendered":"Talos Linux, a Kubernetes Appliance"},"content":{"rendered":"<p>Talos Linux is Linux designed to be secure, immutable, and minimal [<strong>Link<\/strong>]. Its only purpose is to be a Kubernetes appliance that can be installed on bare metal or virtual environments [<a href=\"https:\/\/www.talos.dev\/v1.9\/introduction\/getting-started\/\">Link<\/a>].<\/p>\n<p>Talos is production-ready, capable of running large clusters while simplifying deployment and management via an API with no shell or console access. It is completely locked down!<\/p>\n<p>The latest ISO is 100 MB, and upgrades are atomic since it is an immutable image-based distro.<\/p>\n<hr \/>\n<p><strong>PREREQUISITES<\/strong><\/p>\n<p>Easy install on Ubuntu:<\/p>\n<pre class=\" prettyprinted\">sudo snap install kubectl --classic\r\ncurl -sL https:\/\/talos.dev\/install | sh<\/pre>\n<p>Both <code>kubectl<\/code> and <code>talosctl<\/code> are binaries that can also be manually downloaded and executed directly.<\/p>\n<hr \/>\n<p><strong>INSTANCES DEPLOYMENT<\/strong><\/p>\n<p>Download the ISO, boot instances with it, and allocate a few IPs in the DHCP server to the cluster.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-4811\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-17-01.png\" alt=\"\" width=\"640\" height=\"357\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-17-01.png 881w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-17-01-300x167.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-17-01-768x428.png 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-4810\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-18-57.png\" alt=\"\" width=\"640\" height=\"357\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-18-57.png 881w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-18-57-300x167.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-18-57-768x428.png 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-4809\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-19-44.png\" alt=\"\" width=\"640\" height=\"357\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-19-44.png 881w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-19-44-300x167.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-19-44-768x428.png 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-4808\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-20-42.png\" alt=\"\" width=\"640\" height=\"357\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-20-42.png 881w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-20-42-300x167.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-20-42-768x428.png 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<hr \/>\n<p><strong>INSTALLATION<\/strong><\/p>\n<p>For simplicity, this post uses <strong>1 Control<\/strong> node (production environments require at least three) and <strong>3 Worker<\/strong> nodes.<\/p>\n<p>Set the environment variables.<\/p>\n<pre>export CLUSTER_NAME=<strong>k8s<\/strong>\r\nexport CONTROL=<strong>192.168.1.210\r\n<\/strong>export WORKER1=<strong>192.168.1.211\r\n<\/strong>export WORKER2=<strong>192.168.1.212\r\n<\/strong>export WORKER3=<strong>192.168.1.213<\/strong><\/pre>\n<p>Generate the machine configurations for the cluster (three files will be created locally).<\/p>\n<pre>talosctl gen config $CLUSTER_NAME https:\/\/$CONTROL:6443<\/pre>\n<p>Apply the configuration to the Control and Worker nodes.<\/p>\n<pre>talosctl apply-config --insecure -n $CONTROL --file controlplane.yaml\r\ntalosctl apply-config --insecure -n $WORKER1 --file worker.yaml \r\ntalosctl apply-config --insecure -n $WORKER2 --file worker.yaml \r\ntalosctl apply-config --insecure -n $WORKER3 --file worker.yaml<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4812\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-47-00.png\" alt=\"\" width=\"640\" height=\"357\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-47-00.png 881w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-47-00-300x167.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-19-47-00-768x428.png 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Set the local context for <code>talosctl<\/code> and bootstrap the cluster.<\/p>\n<pre>export TALOSCONFIG=\"talosconfig\"\r\ntalosctl config endpoint $CONTROL\r\ntalosctl config node $CONTROL\r\ntalosctl bootstrap<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4813\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-29-35.png\" alt=\"\" width=\"640\" height=\"354\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-29-35.png 885w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-29-35-300x166.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-29-35-768x425.png 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Wait a minute, then test and download <code>~\/.kube\/config<\/code>.<\/p>\n<pre>talosctl -e $CONTROL containers\r\ntalosctl -e $CONTROL kubeconfig\r\nchmod 600 ~\/.kube\/config<\/pre>\n<p>Test using <code>kubectl<\/code>.<\/p>\n<pre>kubectl get pods -A\r\nkubectl get nodes -A\r\nkubectl get services -A\r\nkubectl get ingress -A<\/pre>\n<p>Check health and real-time metrics.<\/p>\n<pre>talosctl health\r\ntalosctl dashboard<\/pre>\n<p>Use <strong>F2<\/strong> and <strong>F1<\/strong> to switch between Monitor and Summary.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4806\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-25-53-1024x825.png\" alt=\"\" width=\"800\" height=\"645\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-25-53-1024x825.png 1024w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-25-53-300x242.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-25-53-768x619.png 768w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-25-53-1536x1238.png 1536w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-25-53.png 1673w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4807\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-28-50-1024x825.png\" alt=\"\" width=\"800\" height=\"645\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-28-50-1024x825.png 1024w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-28-50-300x242.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-28-50-768x619.png 768w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-28-50-1536x1238.png 1536w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2025\/04\/Screenshot-From-2025-04-16-20-28-50.png 1673w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<hr \/>\n<p><strong>UPGRADING<\/strong><\/p>\n<p>Upgrade Talos.<\/p>\n<pre>talosctl upgrade -n 192.168.1.210 --preserve --wait --debug --image ghcr.io\/siderolabs\/installer:v1.x.x<\/pre>\n<p><strong>Note:<\/strong> the <code>--preserve<\/code> flag should be used with a single Control node cluster. It prevents wiping ephemeral data since there is no other Control node to retain the cluster state.<\/p>\n<p>Upgrade Kubernetes.<\/p>\n<pre>talosctl upgrade-k8s --to 1.y.y<\/pre>\n<p>Troubleshooting tools.<\/p>\n<pre>talosctl netstat\r\ntalosctl dmesg\r\ntalosctl pcap\r\ntalosctl memory\r\ntalosctl processes<\/pre>\n<hr \/>\n<p><strong>BONUS<\/strong><\/p>\n<p><strong>IncusOS<\/strong> is a similar purpose-built Linux appliance for running system containers (LXC) and virtual machines (KVM) on x64 or ARM hardware [<a href=\"https:\/\/linuxcontainers.org\/incus-os\/docs\/main\/\">Link<\/a>].<\/p>\n<p>It can be installed on local storage or run from a live USB stick [<a href=\"https:\/\/incusos-customizer.linuxcontainers.org\/ui\/\">Link<\/a>]. See installation options for physical or virtualized deployments [<a href=\"https:\/\/linuxcontainers.org\/incus-os\/docs\/main\/getting-started\/installation\/physical\/\">Link<\/a>].<\/p>\n<p>Getting started requires creating a TLS client certificate for the initial trusted client.<\/p>\n<pre>sudo apt install incus-client -y\r\nincus remote generate-certificate\r\ncd ~\/.config\/incus\/\r\ncat client.crt<\/pre>\n<p>Then insert it into the media download wizard to embed it in the image.<\/p>\n<hr \/>\n<p><strong>OTHER POSTS<\/strong><\/p>\n<p><strong>MicroK8S<\/strong> on Ubuntu [<a href=\"https:\/\/dft.wiki\/?p=3151\">Link<\/a>].<\/p>\n<p><strong>Minikube<\/strong> on Ubuntu [<a href=\"https:\/\/dft.wiki\/?p=3087\">Link<\/a>].<\/p>\n<p><strong>K3s<\/strong> on Ubuntu [<a href=\"https:\/\/dft.wiki\/?p=3105\">Link<\/a>].<\/p>\n<p><strong>K8s<\/strong> Persistent Volumes [<a href=\"https:\/\/dft.wiki\/?p=1435\">Link<\/a>].<\/p>\n<p><strong>K8s<\/strong> Cheat Sheet [<a href=\"https:\/\/dft.wiki\/?p=1372\">Link<\/a>].<\/p>\n<p><strong>K8s<\/strong> Dashboard [<a href=\"https:\/\/dft.wiki\/?p=4114\">Link<\/a>].<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Talos Linux is Linux designed to be secure, immutable, and minimal [Link]. Its only purpose [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-4805","post","type-post","status-publish","format-standard","hentry","category-linux"],"_links":{"self":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4805"}],"version-history":[{"count":7,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4805\/revisions"}],"predecessor-version":[{"id":5610,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4805\/revisions\/5610"}],"wp:attachment":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}