Skip to main content
Enterprise Kubernetes at Home - A Guide to Installing Talos Omni

Enterprise Kubernetes at Home - A Guide to Installing Talos Omni

·6 mins·
Andrei Vasiliu
Author
Andrei Vasiliu
Romanian expat in Italy. Platform Engineer by trade, homelab builder by passion. Documenting every step of building enterprise-grade infrastructure at home.
Table of Contents

In the world of enterprise cloud, managing Kubernetes clusters with services like GKE, EKS, or AKS is standard practice. These platforms offer incredible power but come with a learning curve and, more importantly, a cost that’s hard to justify for a homelab. As a platform engineer, I’m used to building and managing production-grade infrastructure, but as I explained in my first post, Why not a homelab?, I wanted a solution for my homelab that offered a similar centralized management experience without the overhead.

This is where Talos Linux comes in. Created by Sidero Labs, Talos is a modern OS designed specifically for Kubernetes. It’s minimal, secure, and immutable, which means it’s built from the ground up to be a rock-solid foundation for your clusters. But a powerful OS is only half the story. How do you manage the clusters running on it?

Enter Talos Omni, the purpose-built management plane for Talos Linux clusters. Omni provides a clean, centralized GUI for cluster lifecycle management, secure bootstrapping, and observability. It’s the bridge between manually juggling kubeconfig files and a full-blown managed Kubernetes service. By self-hosting Omni, you get the same powerful workflows you’d find in the cloud, but with full control over your own infrastructure.

This post is a hands-on guide to installing Talos Omni on-premises using Docker. We’ll walk through the process step-by-step, applying enterprise security principles like secure certificate management, etcd encryption, and centralized authentication to our homelab setup.

Why Not Just Use Managed Kubernetes?
#

For production workloads, managed Kubernetes is often the right choice. It offloads the operational burden of the control plane, offers auto-scaling, and integrates deeply with cloud provider services. However, in a homelab, the goals are different: learning, experimentation, and cost control.

FeatureManaged KubernetesTalos Omni (Self-Hosted)
Control PlaneManaged by the cloud provider.Self-managed, running on your hardware.
CostPay-per-hour for the control plane, plus worker nodes.One-time hardware cost, minimal operational expense.
ComplexityAbstracted away, but provider-specific configurations can be complex.You control the entire stack, offering deeper learning opportunities.
CustomizationLimited to what the provider exposes.Fully customizable to your needs.

For a homelab, Talos Omni hits the sweet spot. It provides a clean, web-based UI to manage multiple clusters, making it feel like a private, mini-managed Kubernetes service. It’s the perfect tool for applying platform engineering principles at home.

Prerequisites
#

Before we begin, ensure you have the following:

  • A Docker host (I’m using an Ubuntu VM with a static IP, which I set up as part of my segmented homelab network).
  • A registered domain name managed via Cloudflare.
  • A Cloudflare account for DNS management.
  • An Auth0 account for setting up single sign-on (SSO).

Step 1: Generate TLS Certificates with Certbot
#

Just like in a production environment, we’ll start by securing our endpoint with TLS. We’ll use Certbot and the Cloudflare DNS plugin to generate a wildcard certificate.

  1. Install Certbot and the Cloudflare DNS plugin:

    sudo snap install --classic certbot
    sudo snap set certbot trust-plugin-with-root=ok
    sudo snap install certbot-dns-cloudflare
  2. Create a Cloudflare API Token: Log in to your Cloudflare dashboard, go to API Tokens, and create a token with Zone:DNS:Edit permissions for your domain.

  3. Generate the Certificate: Create a credentials file with your API token and then run Certbot.

    # Create a credentials file
    echo 'dns_cloudflare_api_token = <YOUR_CLOUDFLARE_API_TOKEN>' > cloudflare.ini
    chmod 600 cloudflare.ini
    
    # Request the certificate
    sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ./cloudflare.ini -d omni.yourdomain.com

    Certbot will handle the DNS challenge and store the certificates in /etc/letsencrypt/live/omni.yourdomain.com/.

    certbot_output

Step 2: Create an etcd Encryption Key with GPG
#

Encrypting sensitive data at rest is a cornerstone of enterprise security. Omni stores its state in etcd, and we’ll use a GPG key to encrypt it. It is critical that you do not use a passphrase for this key, as it would break the automated bootstrap process.

  1. Generate the GPG key:

    # Generate the primary key
    gpg --quick-generate-key "Omni (etcd encryption)" rsa4096 cert never

    gpg_1

  2. Add encription subkey:

    # Add an encryption subkey (replace <YOUR_KEY_ID> with the ID from the previous command)
    gpg --quick-add-key <YOUR_KEY_ID> rsa4096 encr never

    gpg_2

  3. Export the secret key:

    gpg --export-secret-keys --armor <YOUR_KEY_ID> > omni.asc

    This omni.asc file contains the key we’ll provide to Omni for etcd encryption.

    gpg_3

Step 3: Configure Auth0 for SSO
#

Instead of managing local users, we’ll integrate a proper identity provider, just as we would in a corporate environment.

  1. In your Auth0 dashboard, navigate to Applications and create a new Single-Page Application.

    auth0_app

  2. In the application’s settings, configure the following URLs, replacing omni.yourdomain.com with your domain:

    • Allowed Callback URLs: https://omni.yourdomain.com
    • Allowed Logout URLs: https://omni.yourdomain.com
    • Allowed Web Origins: https://omni.yourdomain.com

    auth0_uri

  3. To enforce SSO, navigate to Authentication > Database and disable the local username/password database for this application.

    auth0_database

    auth0_settings

Step 4: Bootstrap Omni with Docker Compose
#

With our security components in place, we can now deploy Omni.

  1. Download the configuration files from Sidero Labs:

    export OMNI_VERSION=1.3.4 # Use the latest stable version
    curl https://raw.githubusercontent.com/siderolabs/omni/v${OMNI_VERSION}/deploy/env.template > omni.env
    curl https://raw.githubusercontent.com/siderolabs/omni/v${OMNI_VERSION}/deploy/compose.yaml -o compose.yaml
  2. Edit the omni.env file: This file contains all the configuration variables for Omni. Carefully fill in the required values, including:

    • TLS_CERT and TLS_KEY: Paths to the certificates we generated.
    • ETCD_ENCRYPTION_KEY: Path to the omni.asc GPG key.
    • OMNI_DOMAIN_NAME: Your domain (omni.yourdomain.com).
    • INITIAL_USER_EMAILS: Your email address, which will be granted initial admin access.
    • Auth0 details: AUTH_AUTH0_DOMAIN and AUTH_AUTH0_CLIENT_ID from your Auth0 application.

    omni_env

  3. Launch Omni:

    docker compose --env-file omni.env up -d

    Docker will pull the images and start the Omni containers in the background.

Step 5: First Login and Final Configuration
#

To access the UI, you’ll need to resolve your Omni domain to the IP address of your Docker host.

  1. Configure DNS: Create a DNS A record in your local DNS resolver (e.g., Pi-hole) pointing omni.yourdomain.com to your Docker host’s IP address.

  2. Log In: Navigate to https://omni.yourdomain.com. You should be redirected to the Auth0 login page. Log in with the social provider you configured (e.g., Google), and you’ll be redirected back to the Omni dashboard.

    login_1

    login_2

    omni_portal

Conclusion
#

By following these steps, you’ve deployed a powerful, self-hosted Kubernetes management plane in your homelab, mirroring the security and operational patterns of an enterprise environment. We’ve secured our endpoint with TLS, encrypted sensitive data at rest, and integrated a centralized identity provider… all before deploying a single workload.

Talos Omni provides an excellent foundation for managing a multi-cluster homelab. In future posts, I’ll explore how to provision a new Talos cluster and connect it to our Omni instance.

Stay tuned. Andrei