Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
A guide to keeping your clusters up to date with Omni.
Omni makes keeping your cluster up-to-date easy - which is good, as it is important to stay current with Talos Linux and Kubernetes releases, to ensure you are not exposed to already fixed security issues and bugs. Keeping your clusters up-to-date involves updating both the underlying operating system (Talos Linux) and Kubernetes.
In order to update the Talos Linux version of all nodes in a cluster, navigate to the overview of the cluster you wish to update. (For example, click the cluster name in the Clusters panel.) If newer Talos Linux versions are available, there will be an indication in the far right, where the current cluster Talos version is listed. Clicking that icon, or the "Update Talos" button in the lower right, will allow you to select the new version of Talos Linux that should be deployed across all nodes of the cluster.
Select the new version, and then "Upgrade" (or "Downgrade", if you are selecting an older version than currently deployed.) (Omni will ensure that the Kubernetes version running in the cluster is compatible with the selected version of Talos Linux.)
Note: You may upgrade to any Talos version shown. Omni will only allow supported upgrade paths. In some cases this may require an intermediate upgrade before upgrading to the most recent version.
Omni will then cycle through all nodes in the cluster, safely updating them to the selected version of Talos Linux. Omni will update the control plane nodes first. (Omni ensures the etcd cluster is healthy and will remain healthy after the node being updated leaves the etcd cluster, before allowing a control plane node to be upgraded.)
Omni will drain and cordon each node, update the OS, and then un-cordon the node. Omni always updates nodes with the Talos Linux flag --preserve=true
, keeping ephemeral data.
NOTE: If any of your workloads are sensitive to being shut down ungracefully, be sure to use the lifecycle.preStop Pod spec.
As with the Talos Linux version, Omni will notify you on the right hand side of the cluster overview if there is a new version of Kubernetes available. You may click either the Upgrade icon next to the Kubernetes version, or the Update Kubernetes
button on the lower right of the cluster overview. Kubernetes upgrades are done non-disruptively to workloads and are run in several phases:
Images for new Kubernetes components are pre-pulled to the nodes to minimize downtime and test for image availability.
New static pod definitions are rendered on the configuration update which is picked up by the kubelet. The command waits for the change to propagate to the API server state.
The command updates the kube-proxy daemonset with the new image version.
On every node in the cluster, the kubelet version is updated.
Note: The upgrade operation never deletes any resources from the cluster: obsolete resources should be deleted manually.
Unlike the Talos Linux command talosctl upgrade-k8s
, Omni does not automatically apply updates to Kubernetes bootstrap manifests on a Kubernetes upgrade. This is to prevent Omni overwriting changes to the bootstrap manifests that you applied manually. (Talos Linux has a --dry-run
feature on the upgrade command that shows you changes before the upgrade - Omni shows you the changes after the upgrade, but before they are applied.) Thus after each Kubernetes upgrade, it is recommended to examine the BootStrap Manifests
of the cluster (as shown in the left hand navigation) and apply the changes, if they are appropriate.
Omni allows you to control which nodes are upgraded during Talos or Kubernetes upgrade operations. You can lock nodes, which prevents them from receiving configuration updates, upgrades and downgrades. This allows you to ensure that new versions of Talos Linux or Kubernetes, or new config patches, are rolled out in a safe and controlled manner. If you cannot do a blue/green deployment with different clusters, you can roll out a new Kubernetes or Talos Linux release, or config patch, to just some of the nodes in your cluster. Once you have validated your applications perform correctly on the new versions, you can unlock all the nodes, and allow them to be updated also.
Note: you cannot lock control plane nodes, as it is not supported to have the Kubernetes version of a worker higher than that of the control plane nodes in a cluster - this may result in API version incompatibility.
To lock a node, simply select the Lock icon to the right of the node on the Cluster Overview screen, or use the omnictl cluster machine lock
command. Upgrade and config patch operations will apply to all other nodes in the cluster, but locked nodes will retain their configuration at the time of locking. Unlock the nodes to allow pending cluster updates to complete.
A tutorial on installing Omni in an airgapped environment.
DNS server NTP server TLS certificates Installed on machine running Omni
genuuid
Used to generate a unique account ID for Omni.
Docker
Used for running the suite of applications
Wireguard
Used by Siderolink
In this package, we will be installing:
Gitea
Keycloak
Omni
To keep everything organized, I am using the following directory structure to store all the dependencies and I will move them to the airgapped network all at once.
NOTE: The empty directories will be used for the persistent data volumes when we deploy these apps in Docker.
TLS Certificates
Omni Certificate
Omni uses etcd to store the data for our installation and we need to give it a private key to use for encryption of the etcd database.
First, Generate a GPG key.
This will generate a new GPG key pair with the specified properties.
What's going on here?
quick-generate-key
allows us to quickly generate a new GPG key pair. -"Omni (Used for etcd data encryption) how-to-guide@siderolabs.com"
is the user ID associated with the key which generally consists of the real name, a comment, and an email address for the user.
rsa4096
specifies the algorithm type and key size.
cert
means this key can be used to certify other keys.
never
specifies that this key will never expire.
Add an encryption subkey
We will use the fingerprint of this key to create an encryption subkey.
To find the fingerprint of the key we just created, run:
Next, run the following command to create the encryption subkey, replacing $FPR
with your own keys fingerprint.
In this command:
$FPR
is the fingerprint of the key we are adding the subkey to.
rsa4096
and encr
specify that the new subkey will be an RSA encryption key with a size of 4096 bits.
never
means this subkey will never expire.
Export the secret key
Lastly we'll export this key into an ASCII formatted file so Omni can use it.
--armor
is an option which creates the output in ASCII format. Without it, the output would be binary.
Save this file to the certs directory in our package.
Gitea uses a configuration file named app.ini which we can use to pre-configure with the necessary information to run Gitea and bypass the intitial startup page. When we start the container, we will mount this file as a volume using Docker.
Create the app.ini file
Replace the DOMAIN
, SSH_DOMAIN
, and ROOT_URL
values with your own hostname:
NOTE: If running this in a production environment, you will also want to configure the database settings for a production database. This configuration will use an internal sqlite database in the container.
Next we will gather all the images needed installing Gitea, Keycloak, Omni, and the images Omni will need for creating and installing Talos.
I'll be using the following images for the tutorial:
Gitea
docker.io/gitea/gitea:1.19.3
Keycloak
quay.io/keycloak/keycloak:21.1.1
Omni
ghcr.io/siderolabs/omni:v0.31.0
ghcr.io/siderolabs/imager:v1.4.5
pull this image to match the version of Talos you would like to use. Talos
ghcr.io/siderolabs/flannel:v0.21.4
ghcr.io/siderolabs/install-cni:v1.4.0-1-g9b07505
docker.io/coredns/coredns:1.10.1
gcr.io/etcd-development/etcd:v3.5.9
registry.k8s.io/kube-apiserver:v1.27.2
registry.k8s.io/kube-controller-manager:v1.27.2
registry.k8s.io/kube-scheduler:v1.27.2
registry.k8s.io/kube-proxy:v1.27.2
ghcr.io/siderolabs/kubelet:v1.27.2
ghcr.io/siderolabs/installer:v1.4.5
registry.k8s.io/pause:3.6
Package the images
Pull the images to load them locally into Docker.
Run the following command for each of the images listed above except for the Omni image which will be provided to you as an archive file already.
Verify all of the images have been downloaded
Save all of the images into an archive file.
All of the images can be saved as a single archive file which can be used to load all at once on our airgapped machine with the following command.
Here is an an example of the command used for the images in this tutorial:
Now that we have all the packages necessary for the airgapped deployment of Omni, we'll create a compressed archive file and move it to our airgapped network.
The directory structure should look like this now:
Create a compressed archive file to move to our airgap machine.
Now I will use scp to move this file to my machine which does not have internet access. Use whatever method you prefer to move this file.
Lastly, I will log in to my airgapped machine and extract the compressed archive file in the home directory
From here on out, the rest of the tutorial will take place from the airgapped machine we will be installing Omni, Keycloak, and Gitea on.
Load the images we moved over. This will load all the images into Docker on the airgapped machine.
Run Gitea using Docker:
The app.ini file is already configured and mounted below with the - v
argument.
You may now log in at the https://${GITEA_HOSTNAME}:3000
to begin configuring Gitea to store all the images needed for Omni and Talos.
Create a user
Click the Register button at the top right corner. The first user created will be created as an administrator - permissions can be adjusted afterwards if you like.
Create organizations
After registering an admin user, the organizations can be created which will act as the package repositories for storing images. Create the following organizations:
siderolabs
keycloak
coredns
etcd-development
registry-k8s-io-proxy
Now that all of our organizations have been created, we can push the images we loaded into our Gitea for deploying Keycloak, Omni, and storing images used by Talos.
For all of the images loaded, we first need to tag them for our Gitea.
For example, if I am tagging the kube-proxy image it will look like this:
NOTE: Don't forget to tag all of the images from registry.k8s.io to go to the registry-k8s-io-proxy organization created in Gitea.
Finally, push all the images into Gitea.
The image used for keycloak is already loaded into Gitea and there are no files to stage before starting it so I'll run the following command to start it. Replace KEYCLOAK_HOSTNAME and GITEA_HOSTNAME with your own hostnames.
Once Keycloak is installed, you can reach it in your browser at `https://${KEYCLOAK_HOSTNAME}:3000
With Keycloak and Gitea installed and configured, we're ready to start up Omni and start creating and managing clusters.
To install Omni, first generate a UUID to pass to Omni when we start it.
Next run the following command, replacing hostnames for Omni, Gitea, or Keycloak with your own.
What's going on here:
--auth-auth0-enabled=false
tells Omni not to use Auth0.
--auth-saml-enabled
enables SAML authentication.
--talos-installer-registry
, --talos-imager-image
and --kubernetes-registry
allow you to set the default images used by Omni to point to your local repository.
--auth-saml-url
is the URL we saved earlier in the configuration of Keycloak.
--auth-saml-metadata
may also be used if you would like to pass it as a file instead of a URL and can be used if using self-signed certificates for Keycloak.
Guides on creating a cluster on Omni can be found here:
Specifics on patching machines can be found here:
With Omni, Gitea, and Keycloak set up, you are ready to start managing and installing Talos clusters on your network! The suite of applications installed in this tutorial is an example of how an airgapped environment can be set up to make the most out of the Kubernetes clusters on your network. Other container registries or authentication providers may also be used with a similar setup, but this suite was chosen to give you starting point and an example of what your environment could look like.
Welcome to the Omni user guide! This guide shows you everything from getting started to more advanced deployments with Omni.
Omni is a Kubernetes management platform that simplifies the creation and management of Kubernetes clusters on any environment to provide a simple, secure, and resilient platform. It automates cluster creation, management and upgrades, and integrates Kubernetes and Omni access into enterprise identity providers. While Omni does provide a powerful UI, tight integration with Talos Linux means the platform is 100% API-driven from Linux to Kubernetes to Omni.
Omni automatically creates a highly available Kubernetes API endpoint, transparently provides secure encryption, and automates Kubernetes and OS upgrades. Omni is perfectly suited for managing edge clusters or single node clusters, and in large data centers.
Omni is available as a SaaS operated by Sidero Labs, and for licensing for on-premises installations.
Enterprise support and fully managed and operated plans are available.
Omni creates clusters with both Kubernetes and the OS configured for best-practices security. All traffic to Omni is wireguard-encrypted. Optionally, traffic between the cluster nodes can be encrypted, allowing clusters to span insecure networks. Integration with enterprise identity providers ensures that even admin-level kubeconfig is validated against current user access-lists.
Omni is excellent for managing clusters in just about any environment you have. Machines in the cloud, on-premise, edge, home - they all can be managed with Omni. With Omni you can even create hybrid clusters consisting of machines in disparate locations around the world.
Some common use cases are:
On-premise bare metal clusters that can be scaled up with machines in the cloud
Edge clusters that are supported by machines in the data center and/or cloud
Mixed cloud
Single node edge clusters
You can subscribe to updates by clicking the Bell icon in the top right corner.
Setting up a Talos Linux cluster with Omni.
If you would like to watch a quick video of the process you can follow along here.
If your machines have outgoing internet access, you are all set. Machines should have access to the Wireguard Endpoint shown on the Omni Home panel, which lists the IP address and port (e.g. 199.99.99.100:10001) that machines will connect to. Machines need to be able to reach that address both on the UDP port specified, and on TCP port 443.
The simplest way to experience Omni is to create some virtual machines. We suggest any virtualization platform that can boot off an ISO (UTM, ProxMox, VMware Fusion, etc) although any cloud platform can also be used with minor adjustments. Bare metal can boot from a physical CD, USB drive, virtual media, or PXE.
talosctl
talosctl
is the command line tool for managing Talos Linux via the management API, but when machines connect to Omni it is not required. Instead cluster management is done via the Omni UI or omnictl
. We still recommend installing talosctl
to investigate the state of the nodes and explore functionality.
Download talosctl
, kubectl
, kubectl-oidc_login
, and omnictl
(macOS and Linux):
Make sure you download the talosconfig and omniconfig files from the Omni web interface and place them in the default locations ~/.talos/config
and ~/.config/omni/config/
respectively.
Omni is a BYO Machine platform - all you need to do is boot your machines (virtual or physical) off an Omni image. To download the installation media, go to the Home Screen in Omni, and select "Download Installation Media" from the right hand side. Select the appropriate media and platform type.
Images exist for many platforms, but you will have to follow the specific installation instructions for that platform (which often involve copying the image to S3 type storage, creating a machine image from it, etc.)
Create at least 1 virtual machine with 2GB of memory (4GB or more is recommended) using your Hypervisor. Have each virtual machine boot off the ISO image you just downloaded.
After a few seconds, the machines should show in the Machines panel of Omni, with the available
tag. They will also have tags showing their architecture, memory, cores and other information.
Click "Clusters" on the left navigation panel, then "Create Cluster" in the top right. You can give your cluster a name, select the version of Talos Linux to install, and the version of Kubernetes. You can also specify any patches that should be applied to your cluster, but in most cases these are not needed to get started.
In the section headed "Available Machines", select at least one machine to be the control plane, by clicking CP
. You will want an odd number of control plane nodes (e.g. 1, 3, 5). Select one machine to be a worker, by clicking W0
next to the machine.
Then click Create Cluster
. Your cluster is now being created, and you will be taken to the Cluster Overview page. From this page you can download the kubeconfig
and talosconfig
files for your cluster, by clicking the buttons on the right hand side.
Please note that because Omni manages the state of the Talos nodes, and protects the security of the Kubernetes and Talos credentials. Because of this, some
talosctl
commands (such astalosctl reset
) will returnPermissionDenied
on Omni managed clusters - such operations must be done through the Omni UI or API calls.
You can query your Kubernetes cluster using normal Kubernetes operations:
Note: you will have to change the referenced kubeconfig file depending on the name of the cluster you created.
The first time you use the kubectl
command to query a cluster, a browser window will open requiring you to authenticate with your identity provider (Google or GitHub most commonly.) If you get a message error: unknown command "oidc-login" for "kubectl" Unable to connect to the server:
then you need to install the oidc-login plugin as noted above.
You can explore Talos API commands. The first time you access the Talos API, a browser window will start to authenticate your request. The downloaded talosconfig
file for the cluster includes the Omni endpoint, so you do not need to specify endpoints, just nodes.
You will need to change the name of the
talosconfig
file, if you changed the cluster name from the default; and also use the actual IP or name of the nodes you created (which are shown in Omni) in place of thenode
IP.
Note that because Omni manages the state of the Talos nodes, and protects the security of the Kubernetes and Talos credentials, some
talosctl
commands (such astalosctl reset
) will returnPermissionDenied
on Omni managed clusters - such operations must be done through the Omni UI or API calls.
Now you have a complete cluster, with a high-availability Kubernetes API endpoint running on the Omni infrastructure, where all authentication is tied in to your enterprise identity provider. It's a good time to explore all that Omni can offer, including other areas of the UI such as:
etcd backup and restores
simple cluster upgrades of Kubernetes and Operating System
proxying of workload HTTP access
simple scaling up and down of clusters
the concept of Machine Sets, that let you manage your infrastructure by classes
When you are all done, you can remove the cluster by clicking "Destroy Cluster", in the bottom right of the Cluster Overview panel. This will wipe the machines and return them to the Available state.
The contrib example includes:
With these changes made you should commit the new values and push them to the git repo.
Once machines are registered you can create the cluster using the cluster template in the infra
directory.
This tutorial will involve configuring all of the applications to be accessed via https with signed .pem
certificates generated with . There are many methods of configuring TLS certificates and this guide will not cover how to generate your own TLS certificates, but there are many resources available online to help with this subject if you do not have certificates already.
NOTE: The Talos images needed may be found using the command talosctl images
. If you do not have talosctl
installed, you may find the instructions on how to install it .
Gitea will be used as a container registry for storing our images, but also many other functionalities including Git, Large File Storage, and the ability to store packages for many different package types. For more information on what you can use Gitea for, visit their .
This is just the bare minimum setup to run Omni. Gitea has many additional configuration options and security measures to use in accordance with your industry's security standards. More information on the configuration of Gitea can be found .
NOTE: If you are using self-signed certs and would like to push images to your local Gitea using Docker, you will also need to configure your certs.d directory as described .
For details on configuring Keycloak as a SAML Identity Provider to be used with Omni, follow this guide:
Because we're working in an airgapped environment we will need the following values added to our cluster configs so they know where to pull images from. More information on the Talos MachineConfig.registries can be found .
NOTE: In this example, cluster discovery is also disabled. You may also configure cluster discovery on your network. More information on the Discovery Service can be found
Omni is released under the BUSL. Using Omni for production use requires a commercial license. Contact for more information. Non-production use, such as using Omni for a home lab, does not require a license.
to start your free 2 week trial and start exploring today!
We suggest you join the #omni channel in our community
For real-time status of Omni and other Sidero Labs services, see
For recent updates, bug fixes and changes, subscribe to the GitHub
If you have a security question, concern or issue with Omni, please email
In this Getting Started guide we will create a high availability Kubernetes cluster with managed by Omni. This guide will use UTM/QEMU, but the same process will work with bare metal machines, cloud instances, and edge devices.
For manual and Windows installation please refer to the in the Talos documentation.
If you want to declaratively manage your clusters and infrastructure declaratively, as code, check out .
We have an example of a managed cluster complete with a monitoring stack and application management. It can be found in our .
for cluster networking
for network observability
for application management
for persistent storage
for metrics collection and alerting
for metrics visualization
You will need to copy the contents of the omni
directory to a git repository that can be accessed by the cluster you create. Update the template to reference your new git repo, and regenerate the ArgoCD bootstrap patch.
Next you should register your machines with Omni (see guides for , , , , and ) and create to match your hardware. By default, the example is configured to use 3 instances of machine classes named omni-contrib-controlplane
, and all instances that match a machine class called omni-contrib-workers
. You can modify these settings in the , but keep in mind that for Rook/Ceph to work you will need to use at least 3 instances with additional block devices for storage.
This should create the cluster as described, bootstrap ArgoCD, and begin installing applications from your repo. Depending on your infrastructure, it should take 5-10 mins for the cluster to come fully online with all applications working and healthy. Monitoring can be viewed directly from Omni using the feature, with links to Grafana and Hubble found on the left-hand side of the Omni UI.
A tutorial on using SAML and ACLs in Omni.
In this tutorial we will use SAML and ACLs to control fine-grained access to Kubernetes clusters.
Let's assume that at our organization:
We run a Keycloak instance as the SAML identity provider.
Have our Omni instance already configured to use Keycloak as the SAML identity provider.
Our Omni instance has 2 types of clusters:
Staging clusters with the name prefix staging-
: staging-1
, staging-2
, etc.
Production clusters with the name prefix prod-
: prod-1
, prod-2
, etc.
We want the users with the SAML role omni-cluster-admin
to have full access to all clusters.
We want the users with the SAML role omni-cluster-support
to have full access to staging clusters and read-only access to production clusters.
If our Omni instance has no users yet, the initial user who signs in via SAML will be automatically assigned to the Omni Admin
role.
We sign in as the user admin@example.org
and get the Omni Admin
role.
We need to configure the ACL to assign the omni-cluster-support
role to the users with the SAML role omni-cluster-support
and the omni-cluster-admin
role to the users with the SAML role omni-cluster-admin
.
Create the following YAML file acl.yaml
:
As the admin user admin@example.org
, apply this ACL using omnictl:
Now, in an incognito window, log in as a support engineer, cluster-support-1@example.org
. Since the user is not assigned to any Omni role yet, they cannot use Omni Web.
Download omnictl
and omniconfig
from the UI, and try to list the clusters by using it:
You won't be able to list the clusters because the user is not assigned to any Omni role.
Now try to get the cluster staging-1
:
You can get the cluster staging-1
because the ACL allows the user to access the cluster.
Finally, try to delete the cluster staging-1
:
The operation will succeed, because the ACL allows Operator
-level access to the cluster for the user.
Try to do the same operations with the cluster prod-1
:
The user will be able to get the cluster but not delete it, because the ACL allows only Reader
-level access to the cluster for the user.
If you do the same operations as the admin user, you'll notice that you are able to both get and delete staging and production clusters.
If you want to allow SAML users to use Omni Web, you need to assign them at least the Reader
role. As the admin, sign in to Omni Web and assign the role Reader
to both cluster-support-1@example.org
and cluster-admin-1@example.org
.
Now, as the support engineer, you can sign out & sign in again to Omni Web and see the clusters staging-1
and prod-1
in the UI.
Log in to Otka
Create a new App Integration
Select “SAML 2.0”
Give the Application a recognizable name (we suggest simply “Omni”)
Set the SAML Settings and Attribute Statements as shown below:
Click “Next” and optionally fill out the Feedback, then click “Finish”
Once that is complete, you should now be able to open the “Assignments” tab for the application you just created and manage your users and access as usual.
Learn to set up the Bare-Metal Infrastructure Provider for Omni
An Omni instance (either on the Sidero Labs SaaS or self-hosted) with Admin access
Some bare-metal machines with:
BMC (baseboard management controller) power management capabilities via one of the following:
IPMI
Redfish
Outbound access to the Omni instance and the Image Factory
A machine/container/cluster etc. in the same subnet as the bare-metal machines, in order to run the infrastructure provider service
In this tutorial, we will assume:
Our managed Omni instance is running at my-instance.omni.siderolabs.io
We will use the public Image Factory at factory.talos.dev
Bare-Metal machines with IPMI support
An additional server with Docker installed to run the infrastructure provider service, with the IP address 172.16.0.42
within the subnet 172.16.0.0/24
, reachable by the bare-metal machines
Two bare-metal servers within the subnet 172.16.0.0/24
with access to the infrastructure provider, our Omni instance, and to the Image Factory
We start by creating an Omni service account for the infrastructure provider to authenticate/authorize to Omni.
Navigate to the Settings - Service Accounts tab on the Omni web UI, and create a service account with ID bare-metal
Store the displayed service account key securely for later use.
Using omnictl
pointing to your instance my-instance
, run the following command:
It will output the Omni endpoint and service account key:
Store them safely for later use.
We will run the provider in a Docker container in our server with IP 172.16.0.42
.
The provider requires its following ports to be accessible:
50042
: HTTP and GRPC API port, customizable via --api-port
)
69
: TFTP port used to provide iPXE binaries to PXE-booted machines
At the time of writing, it is ghcr.io/siderolabs/omni-infra-provider-bare-metal:v0.1.0
, and this is what we shall use in this tutorial.
Set the required environment variables, using the service account key from the previous step:
Run the following command to start the provider service:
Make sure it is running by checking its status:
Sample output:
Start tailing its logs in a separate shell:
Sample output:
At this point, the provider has started and established a connection to our Omni instance.
At this point, we can boot our bare-metal machines. Before we start, make sure that they are configured to boot over the network via PXE on the next boot, so that they can be booted by the provider.
Power cycle the machines, and when they attempt to boot via PXE, you can see in the provider logs that they have been PXE booted by the provider. Log messages should be similar to the lines below:
At this point, the machines should be booted into the Agent Mode, and have established a SideroLink
connection to our Omni instance.
Let's verify our machines:
Navigate to Machines - Pending tab on Omni web UI. You should see the machines pending acceptance:
Run the following commands:
The output should look like the following:
Our machines have the following IDs:
33313750-3538-5a43-4a44-315430304c46
33313750-3538-5a43-4a44-315430304c47
For security reasons, the machines cannot be provisioned in Omni before they are "Accepted". We will accept these machines using the Omni API.
Normally, when we accept a machine in Omni, the provider will auto-configure the BMC configuration, such as the IPMI IP, username and password automatically by asking the agent service running on the Talos machine.
Sometimes we do not want this behavior - instead, we already have this information at hand, and want to provide it manually, skipping this step.
To do this, before accepting these machines, we need to create a resource with these credentials in Omni.
Create a bmc-config.yaml
file with the following contents:
Fill it in with the information of your machine ID and IPMI configuration.
As an Omni admin, create this resource using omnictl
:
As the final step, we need to accept these machines in Omni.
The following step will wipe the disks of these machines, so proceed with caution!
Simply click the "Accept" button on each machine under the Machines - Pending tab on the Omni web UI, and confirm the action:
Prepare an accept.yaml
file with the following contents, setting .metadata.id
field to the id of the first machine:
Apply this resource to your Omni instance using omnictl
:
Then replace the .metadata.id
field with the ID of the second machine and repeat the same step.
Accepting the machine will wipe ALL disks. This is to ensure that the machine is in a clear state, and will be fully managed by Omni from that moment on.
When you do this, the provider will do the following under the hood:
Ask the Talos Agent service on the machines to configure their IPMI credentials
Retrieve these credentials and store them
Wipes the disks of these machines
Power off these machines over IPMI
Additionally, Omni will create a Machine
, and an InfraMachineStatus
resource for each machine. You can verify this by:
Output will be similar to:
When you add these machines to a cluster, the following will happen under the hood.
The provider will:
Power these machines on, marking their next boot to be a PXE boot
PXE boot them into Talos maintenance mode
Then Omni will proceed with the regular flow of:
Applying a configuration to the machine, causing Talos to be installed to the disk
Reboot (possibly using kexec
)
The cluster will be provisioned as normal, and will get to the Ready
status.
When you delete a cluster and/or remove some bare-metal machines from a cluster, the following will happen:
Omni does the regular de-allocation flow:
Remove the nodes from the cluster (leave etcd
membership for control planes)
Reset the machines
Afterwards, the provider will follow with these additional steps:
PXE boot the machine into Agent Mode (to be able to wipe its disks)
Wipe its disks
Power off the machine
At this point, these machines will again be ready to be allocated to a different cluster.
A guide on how to assign Omni roles to SAML users automatically.
This guide shows you how to configure your Omni instance so that new users logging in with SAML authentication are automatically assigned to a role based on their SAML role attributes.
Create the file assign-operator-to-engineers-label.yaml
for the SAMLLabelRule
resource, with the following content:
Copy
As an admin, create it on your Omni instance using omnictl
:
Copy
This will create a resource that assigns the Operator
role to any user that logs in with SAML and has the SAML attribute Role
with the value engineers
.
Log in to Omni as a new SAML user with the SAML attribute with name Role
and value engineers
.
This will cause the user created on the Omni side to be labeled as saml.omni.sidero.dev/role/engineers
.
This label will match the SAMLLabelRule
resource we created above, and the user will automatically be assigned the Operator
role.
Note
When there are multiple matches from different SAMLLabelRule
resources, the matched role with the highest access level will be assigned to the user.
Warning
This role assignment will only work for the new users logging in with SAML.
The SAML users who have already logged in to Omni at least once will not be matched by the SAMLLabelRule
resource and their roles will not be updated.
Warning
If the logged in SAML user is the very first user logging in to an Omni instance, it will not be matched by the SAMLLabelRule
resource and always be assigned the Admin
role.
A guide on how to add a user to Omni with SAML authentication enabled.
This guide shows you how to create a user in an Omni instance with SAML authentication enabled.
Grant the new user access to Omni in your SAML identity provider. The new user should login to the new user account, in order for Omni to have the account synchronized with the SAML provider.
Log into Omni using another account with Admin
permissions, navigate to Settings, then find the newly added user in the list of users. Now, select “Edit User” from the menu under the ellipsis:
Change the role to Reader
, Operator
or Admin
as appropriate:
And click “Update User”. The user will now have the appropriate role within Omni, and be associated with the SAML user.
In this tutorial, we will set up a service for our Omni instance to be able to provision bare metal machines.
Access to the (either the public one hosted by Sidero Labs, or self-hosted)
Here, we need to create the service account with the same ID as the ID of the provider service we are going to run. It defaults to bare-metal, hence we use it as the name, but if you plan to use a different ID () or run multiple provider instances, set the name accordingly for the service account.
Start by getting the image reference of the latest version of the .
establishes a secure connection to the Omni instance
runs the extension which establishes a connection to the provider
We can now create a cluster using these machines. For this, simply follow the guide for .
In the Azure portal, click "Enterprise Applications".
Click "New Application" and search for "Entra SAML Toolkit".
Name this application something more meaningful if desired and click "Create".
Under the "Manage" section of the application, select "Single sign-on", then "SAML" as the single sign-on method.
In section 1 of this form, enter identifier, reply, and sign on URLs that match the following and save:
Identifier (Entity ID): https://<domain name for omni>/saml/metadata
Reply URL (Assertion Consumer Service URL): https://<domain name for omni>/saml/acs
Sign on URL: https://<domain name for omni>/login
From section 3, copy the "App Federation Metadata Url" for later use.
Again, under the "Manage" section of the application, select "Users and groups".
Add any users or groups you wish to give access to your Omni environment here.
The first step to creating and managing Kubernetes clusters in Omni is registering the machines you wish to use. The machines can run anywhere Talos Linux runs. The guides in this section walk you through the specifics of different platforms.
In general, the process to register a machine with Omni consists of downloading the installation media from your Omni account, and booting the machine off that media.
To start the process, from the Home screen, click "Download Installation Media" on the right hand side:
The Download Installation Media form will open:
This allows you to select media specific to various platforms (AWS, Azure, bare metal, etc), and also to specify options, such as:
the versions of Talos Linux to initially boot with (note that it is recommended to have all machines that will form a cluster be at the same Talos Linux version.)
optional extensions to be bundled into the image (providing support for additional features, such as GPUs, driver microcode, etc.)
specific machine labels to be applied to the machines booted off this image (useful for identifying machines by racks, or location, etc)
optional capabilities such as:
Generating iPXE boot URLs: if your machines can boot via iPXE, you can configure them to boot directly off Omni via the Image Factory integration. Simply click to generate the PXE Boot URL, and pass that in to your systems to boot from.
Note that some platforms have other specific requirements, which can be seen in the articles within this section.
A guide on how to register a bare metal machines with Omni using PXE/iPXE.
This guide shows you how to register a bare metal machine with Omni by PXE/iPXE booting.
Upon logging in you will be presented with the Omni dashboard. Click the “Copy Kernel Parameters” button on the right hand side, and save the value for later.
The following example assumes the use of Matchbox server.
Place the following in /var/lib/matchbox/profiles/default.json
:
Update siderolink.api
, talos.events.sink
, and talos.logging.kernel
with the kernel parameters copied from the dashboard.
Place the following in /var/lib/matchbox/groups/default.json
:
Once your machine is configured to PXE boot using your tool of choice, power the machine on.
Navigate to the “Machines” menu in the sidebar of Omni. You should now see a machine listed.
You now have a bare metal machine registered with Omni and ready to provision.
How to configure Unifi Identity Enterprise for Omni using SAML.
This section describes how to use Unifi Identity Enterprise (here forward UIIE) SSO with Omni via SAML
First, login to the UIIE Manager portal and navigate to the SSO Apps section in the left menu.
Next, Add a new app. Choose “Add Custom App”
Next, click Add on the “SAML 2.0” option for Sign-on Method
You’ll now be in the Add SAML 2.0 App screen where we’ll define the app.
After entering the above values and clicking the “Add” button, you’ll be taken to another screen with some details. We don’t need anything from here, we’ll get info we need later after further configuration, so just click “Done” to proceed.
You’ll now be on the screen to manage the app, here you’ll want to assign users/groups according to who you would like to have the ability to login to Omni. To start with, you probably only want to assign the person who will be the primary admin, as the first user to login will be granted that role in Omni. Therefore, best practice would be to assign your primary admin, have them login to Omni, then come back into the app here and assign any other users who should have access.
Once you’ve assigned the user(s) accordingly, click the “Settings” bubble at the top of the screen as some final configuration is needed here.
Expand the “Sign On” section at the bottom of the settings page via the “Show More” down arrow.
At the bottom of this section, you’ll see an “Attibute Statements” block, here the mappings from UIIE to Omni fields needs to be entered as below. Use the “Add Another” button to create new ones.
Lastly, you’ll need the IDP Metadata file which can be obtained via the View Setup Instructions link or downloaded as an xml file via the Identity Provider metadata link; both of which are slightly further up the page.
A copy of this file needs to be on the host which will run the Omni container as we’ll feed it in to the container at runtime. You can copy paste contents or download/upload the file whichever is easiest. For the remainder of this guide, we’ll assume this file ends up at the following location on your container host: ~/uiieIDPmetadata.xml
This completes the configurations required in UIIE
To get Omni to use UIIE as a SAML provider, the following flags should be passed to Docker & the Omni container on launch.
For example;
Copy
Unfortunately UIIE does not expose group attributes, so you will have to manually assign Omni groups/roles to the users as they are created on first login.
SecureBoot (which verifies the signatures of the operating system, ensuring only trusted code is executed). For more information see the page.
Tunneling Omni management WireGuard traffic over HTTP2, via the SideroLink gRPC connection. Normally Omni management traffic runs over UDP. In some environments, that may not be possible. Running the Omni management traffic over HTTP (via gRPC) may allow operation in such restricted environments, but at a cost of substantial overhead. See the page for more information.
Download vmlinuz
and initramfs.xz
from the of your choice (Talos Linux 1.4 or greater is required), and place them in /var/lib/matchbox/assets
.
Omni can integrate with your enterprise SAML provider for authentication and identity management. See also information about Please contact support@siderolabs.com or your account manager to enable SAML on the SaaS version of Omni.
Name
Omni
A descriptive name for the Web App
Icon
<your choice>
Upload an icon of your choosing
Single Sign-On URL
https://<fqdn for omni>/saml/acs
The fully-qualified domain name at which your omni instance will reside
Audience URI (SP Entity ID)
https://<fqdn for omni>/saml/metadata
The fully-qualified domain name for metadata retrieval
Default Relay State
Leave this blank
Name ID Format
Unspecified
Unspecified works, you can probably also choose emailAddress
App Username
Works best with emails as usernames however prefixes might work too
SCIM Connection
Off
Not used
Unspecified
The user’s email address
firstName
Unspecified
First Name
The user’s first name
lastName
Unspecified
Last Name
The user’s last name
Docker
-v $PWD/uiieIDPmetadata.xml:/uiieIDPmetadata.xml
Make available the IDP metadata file in container
Omni
--auth-saml-enabled=true
Enable SAML authentication.
Omni
--auth-saml-metadata-/uiieIDPmetadata.xml
The path to the IDP metadata file.
A guide on how to register AWS EC2 instances with Omni.
First, we need to know what VPC to create the subnet on, so let’s describe the VPCs in the region where we want to create the Omni machines.
Output:
Note the VpcId
(vpc-04ea926270c55d724
).
Now, create a subnet on that VPC with a CIDR block that is within the CIDR block of the VPC. In the above example, as the VPC has a CIDR block of 172.31.0.0/16, we can use 172.31.128.0/20.
Output:
Note the SubnetID
(subnet-04f4d6708a2c2fb0d
).
Output
Note the GroupId
(sg-0b2073b72a3ca4b03
).
Allow all internal traffic within the same security group, so that Kubernetes applications can talk to each other on different machines:
To do so, log in to your Omni account, and, from the Omni overview page, select “Download Installation Media”. Select “AWS AMI (amd64)” or “AWS AMI (arm64)”, as appropriate for your desired EC2 instances. (Most are amd64.) Click “Download”, and the AMI will be downloaded to you local machine.
Extract the downloaded aws-amd64.tar.gz
Then copy the disk.raw
file to S3. We need to create a bucket, copy the image file to it, import it as a snapshot, then register an AMI image from it.
Output:
Check the status of the import with:
Output:
Once the Status
is completed
note the SnapshotId
(snap-056a7e086ecf7b452).
Output:
Note the ImageId
(ami-07961b424e87e827f
).
Now, using the AMI we created, along with the security group created above, provision EC2 instances:
A guide on how to register a Hetzner server with Omni.
Upon logging in you will be presented with the Omni dashboard.
First, download the Hetzner image from the Omni portal by clicking on the “Download Installation Media” button. Now, click on the “Options” dropdown menu and search for the “Hetzner” option. Notice there are two options: one for amd64
and another for arm64
. Select the appropriate option for the machine you are registering. Now, click the “Download” button.
Place the following in the same directory as the downloaded installation media and name the file hcloud.pkr.hcl
:
Copy
Now, run the following:
Take note of the image ID produced by running this command.
Warning
Machines must be able to egress to your account’s WireGuard port and port 443.
Navigate to the “Machines” menu in the sidebar. You should now see a machine listed.
You now have a Hetzner server registered with Omni and ready to provision.
A guide on how to create a cluster.
This guide shows you how to create a cluster from registered machines.
A guide on installing and configuring omnictl for Omni.
Pick one of the installation methods below.
To install omnictl
and the kubectl oidc-login
plugin automatically on macOS and Linux you can use the provided Hombrew formula.
This will install talosctl
, omnictl
, and kube-oidc_login
and keep them updated.
Download omnictl
from the Omni dashboard.
Download omniconfig
from the Omni dashboard.
Omni configuration is stored under $XDG_CONFIG_HOME/omni/config
. This means, the correct configuration file locations for omniconfig
are the following:
Linux
~/.config/omni/config
MacOS
~/Library/Application Support/omni/config
Windows
%LOCALAPPDATA%\omni\config
, e.g., C:\Users\<USER>\AppData\Local\omni\config
Add the downloaded omniconfig.yaml
to the default location for your OS to use it with omnictl
:
If you would like to merge the omniconfig.yaml
with an existing configuration, use the following command:
List the contexts to verify that the omniconfig
was added:
Run omnictl
for the first time to perform initial authentication using a web browser:
If the browser window does not open automatically, it can be opened manually by copying and pasting the URL into a web browser:
First, click the "Clusters" section button in the sidebar. Next, click the "Create Cluster" button on the right.
You may name the cluster, as well as specify the version of Talos Linux and Kubernetes that the cluster should be created with. You may also enable optional cluster features, such as or .
From the Available Machines list, select the role (CP for control plane, WX (where X is a number) for workers) for each machine you would like to be a member of the cluster. Optionally, choose the install disk for the OS from the dropdown menu for each machine.
Finally, click “Create Cluster”
Create a file called cluster.yaml
with the following content:
If enabling optional features such as disk encryption, add them to the Cluster document e.g.:
Now, validate the document:
Create the cluster:
Finally, wait for the cluster to be up:
Create a file called cluster.yaml
with the following content:
Now, validate the document:
Create the cluster:
Finally, wait for the cluster to be up:
Omnictl follows the for its configuration files location.
Be sure to create machine classes control-planes
, workers
and secondary-workers
beforehand. See .
A guide on how to install talosctl.
This will also keep your version of talosctl
up to date with new releases. This homebrew tap also has formulae for omnictl
if you need to install that package.
You now have talosctl
installed.
Please note that because Omni manages the state of the Talos nodes, and protects the security of the Kubernetes and Talos credentials, some
talosctl
commands (such astalosctl reset
) will returnPermissionDenied
on Omni managed clusters - such operations must be done through the Omni UI or API calls.
Windows binaries can be downloaded from GitHub releases for Talos and Omni.
The client can be installed and updated via the for macOS and Linux. You will need to install brew
and then you can install talosctl
from the Sidero Labs tap.
You can use a convenience script to install the current, latest version of `talosctl`. This will not install omnictl
or needed for Omni management.
There is also a community managed available.
A guide on how to create a config patch for a machine in an Omni cluster.
Omni allows you to create patches and target the patches to all members of a cluster; all control plane nodes; all worker nodes; or specific machines. Upon logging in, click the “Clusters” menu item on the left. Now, select “Config Patches” from the menu under the ellipsis:
(You can also navigate to the specific cluster, and then select Config Patches in the right hand menu.)
Next, click “Create Patch”:
Pick the specific machine or class of machines from the “Patch Target” dropdown:
Type in the desired config patch:
Click “Save” to create the config patch.
Omni is available as a hosted version operated by Sidero Labs, but can also be self-hosted. This is appropriate for:
air-gapped deployments
industries with strict security and compliance concerns
home use.
For an example of a patch to enable node-to-node network encryption - the KubeSpan feature of Talos Linux - see .
Note that using Omni for production use requires a commercial license. Contact for more information. Non-production use, such as using Omni for a home lab, does not require a license.
If you are running a self-hosted version of Omni licensed under the BSL, please regularly update to the latest release - we suggest at least monthly. Bug fixes will not be backported to older versions of Omni, so support that involves a bug fix will require an update.
Each version of Omni will support versions of Talos Linux where the first stable release of the minor version of Talos Linux was within 18 months of the Omni release date. For example, because Talos Linux 1.3.0 was released on 2022-12-15, the Omni version released on Jun 30th, 2024 will not support any version of 1.3.x, even though patch releases of 1.3 were made within the prior 18 months. However, all versions of Talos Linux Talos 1.4 and later (which was released on 2023-04-18) are supported.
Talos Linux 1.4
If you neglect to update Talos Linux to a version where the initial minor version was released within the prior 18 months, your cluster will be out of support, and you must upgrade in order to receive support.
Clusters running unsupported versions of Talos Linux or Kubernetes may have limited ability to manage their clusters within Omni - clusters may not be able to have new nodes provisioned to scale up the cluster, for example.
We encourage all users to take advantage of how easy Omni makes Talos Linux and Kubernetes upgrades, to ensure they are always running the latest security and bug fixes.
The Sidero Labs managed version of Omni SaaS is updated regularly by our Operations team. For a list of the most recent updates, bug fixes and changes, please subscribe to the GitHub
Note that each version of Talos Linux generally supports up to five prior versions of Kubernetes at the time it was released. See for details.
A guide on how to manage Omni ACLs.
This guide will show how to give the user support@example.com
full access to the staging
cluster but limited access to the production
cluster.
The default without RBAC is to grant Kubernetes admin-level access for users with write permissions on the Omni side.
Create a local file acl.yaml
:
As an Omni admin, apply this ACL using omnictl:
When users interact with Omni API or UI, they will be assigned to the role specified in the ACL.
When users access the Kubernetes cluster through Omni, they will have the groups specified in the ACL.
Kubernetes RBAC then can be used to grant permissions to these groups.
Locally, create rbac.yaml
with a Namespace
called my-app
, and a Role
& RoleBinding
to give access to the my-app-read-only
group:
As the cluster admin, apply the manifests to the Kubernetes cluster production
:
Try to access the cluster with a kubeconfig
generated by the user support@example.com
:
The user should be able to list pods in the my-app
namespace because of the Role
and RoleBinding
created above.
Try to list pods in another namespace:
The user should not be able to list pods in namespace default
.
If the user support@example.com
has the Omni role Operator
or above assigned, they will have system:masters
role in Kubernetes as well as the my-app-read-only
role.
Therefore, they will still be able to list pods in all namespaces.
How to configure VMware Workspace ONE Access for Omni using SAML.
Workspace ONE Access
This section describes how to create a Web App inside Workspace ONE Acces (WSOA).
First, login to the WSOA user interface and browse to Resources -> Web Apps -> New
Next, enter values for the following options before clicking on Next.
Name
Omni
A descriptive name for the Web App
Description
Sidero Omni
A description for the Web App
Icon
Image
An icon to be displayed on the dashboard
On the Single Sign-On page, enter the following values:
Authentication Type
SAML 2.0
The Authentication type. Options are SAML or OIDC
Configuration
Manual
We will use manual to specify the fields
Single Sign-On URL
https://{omni-host}/saml/acs
The SSO URL for Omni
Recipient URL
https://{omni-host}/saml/acs
The Recipient URL for Omni
Application ID
https://{omni-host}/saml/metadata
The Omni metadata URL
Username format
Unspecified
The username format is unspecified
Username value
${user.userName}
The username sent in the SAML assertion
Relay State URL
Blank
Leave this empty
Still on the Single Sign-On page, in the Advanced Properties section, set the following toggle buttons;
Sign Response
False
Sign the SAML response.
Sign Assertion
True
Sign the SAML assertion.
Encrypt Assertion
False
Encrypt the SAML assertion.
Include Assertion Signature
False
Include the assertion signature.
Device SSO Response
False
Enable Device SSO response.
Enable Force Authn Request
False
Enable Force Authn Request.
Signature Algorithm
SHA-256 with RSA
The signature algorithm.
Digest Algorithm
SHA-256
The digest algorithm.
Assertion Lifetime
200
The assertion lifetime.
At the bottom of the Single Sign-On page, in the Custom Attribute Mapping section, add the following attributes:
Unspecified
${user.email}
The user’s email address
firstName
Unspecified
${user.firstName}
The user’s first name
lastName
Unspecified
${user.lastName}
The user’s last name
groups
Unspecified
${groupNames}
The user’s groups
Click Next to continue and select the access policy as required by your organization.
Now it’s time to click the Save & Assign button and permit the Users and Groups allowed to login to Omni.
On the Assign screen, enter the following:
Select the permitted group from your backing Active Directory or LDAP server.
Set the Deployment Type to Automatic.
Finally, obtain the IdP Metadata URL by clicking on Settings and then the Copy URL link.
Provide the following flags to the Omni container on launch.
--auth-saml-enabled
Enable SAML authentication.
--auth-saml-url
The URL to the IdP metadata file.
--auth-saml-label-rules='{"groups": "groups"}'
This extracts the groups
attribute from the SAML assertion into the label saml.omni.sidero.dev/groups/<value>
For example;
Copy
Note that when using groups, the group name is prefixed with saml.omni.sidero.dev/groups/
instead of role. For example;
Copy
With an Omni managed cluster, you use kubectl
as with any other Kubernetes cluster, with the caveat that you must use the kubeconfig
file that you download from Omni, and have the OIDC plug-in installed for your kubectl
.
All Kubernetes kubectl
commands are routed through the API endpoint created by Omni, and Omni validates access through the configured OIDC provider or other user authorization mechanism. This ensures your Kubernetes cluster is safe - unlike other systems, mere possession of a kubeconfig
grants no access - the user also has be valid in the configured authentication system of Omni.
Navigate to the clusters page by clicking on the “Clusters” button in the sidebar.
Click on the cluster and then click "Download kubeconfig" from the cluster dashboard on the right. The downloaded file will reflect the name of the cluster.
Be sure you use the name of the downloaded kubeconfig file, which will vary with the name of the cluster.
The first time you use the kubectl
command to query a cluster, a browser window will open requiring you to authenticate with your identity provider.
If you get a message
error: unknown command "oidc-login" for "kubectl" Unable to connect to the server
then you need to install the oidc-login plugin as noted above, and ensure it is in your $PATH.
To work around that, when you want to switch to another user, you need to clear the authentication cache first. To do this, run one of the following:
After doing this, the next kubectl
command you run should trigger the OIDC login flow again, where you can authenticate as the user you need via Switch User
option.
If you need to use kubectl
, talosctl
, or omnictl
on a remote host over SSH you may need a way to forward your local client traffic to the remote host where kubectl-oidc_login
is installed.
To do that you can tunnel the ports over SSH when you connect to the host. This command will open a tunnel using the default ports oidc-login
attempts to use.
You can run this in a separate terminal temporarily while you authenticate your CLI tools.
If you want to have the port forwarding happen automatically every time you connect to the host you should update your ~/.ssh/config file to contain the following lines for the host.
You will also need to disable automatic browser opening because it will likely try to open a browser on the SSH host or fail to open if one is not installed. Do that by adding --skip-open-browser
in your $KUBECONFIG file.
A guide on how to register bare metal machines with Omni using an ISO.
Upon logging in you will be presented with the Omni dashboard.
First, download the ISO from the Omni portal by clicking on the “Download Installation Media” button on the right.
Select the version of Talos for the cluster, then click on the “Options” dropdown menu and search for, or scroll down to, the “ISO” option.
Notice there are two options: one for amd64
and another for arm64
. Select the appropriate architecture for the machine you are registering. Now that you have selected the ISO option for the appropriate architecture, click the “Download” button.
First, plug the USB drive into your local machine. Now, find the device path for your USB drive and write the ISO to the USB drive.
In this example disk2
is the USB drive.
In this example sdb
is the USB drive.
Now that we have our bootable USB drive, plug it into the machine you are registering. Once the machine is booting you will notice logs from Talos Linux on the console stating that it is reachable over an IP address.
Machines must be able to egress to your account’s WireGuard port and TCP port 443.
Navigate to the “Machines” menu in the sidebar of Omni. You should now see a machine listed.
You now have a bare metal machine registered with Omni and ready to provision.
A guide on how to register an Azure instance with Omni.
Upon logging in you will be presented with the Omni dashboard.
Download the Azure image from the Omni portal by clicking on the “Download Installation Media” button. Click on the “Options” dropdown menu and search for the “Azure” option. Notice there are two options: one for amd64
and another for arm64
. Select the appropriate architecture for the machine you are registering, then click the “Download” button.
Once downloaded to your local machine, untar with tar -xvf /path/to/image
In the Omni UI, navigate to the “Machines” menu in the sidebar. You should now see the Azure machine that was created listed as an available machine, registered with Omni and ready to provision.
Now that you have started Omni with the correct flags, refer to the guide for information on how to automatically assign roles to users based on their SAML attributes.
Install the oidc-login
plugin per the official documentation:
If you have multiple contexts in your kubeconfig(s) authenticating to the same cluster (in the same Omni instance), switching between these contexts does not switch the authenticated user. This is a of the OIDC-based login we use - it uses the existing logged-in user, as their auth token is the already cached for that cluster.
In the Azure console, navigate to Storage accounts
, and create a new storage account. Once the account is provisioned, navigate to the resource and click Upload
. In the Upload Blob
form, select Create New
container, and name your container (e.g. omni-may-2023
). Now click Browse for Files
, and select the disk.vhd
file that you uncompressed above, then select Upload
.
We’ll make use of the following environment variables throughout the setup. Edit the variables below with your correct information.
You can upload the image you uncompressed to blob storage with:
In the Azure console select Images
, and then Create
. Select a Resource Group, Name your image (e.g. omni-may), and set the OS type to Linux. Now Browse
to the storage blob created above, navigating to the container with the uploaded disk.vhd
. Select “Standard HDD” for account type, then click Review and Create
, then Create
.
Now that the image is present in our blob storage, we’ll register it.
Creating an instance requires setting the os-disk-size property, which is easiest to achieve via the CLI:
A guide on how to create cluster etcd backups using Omni.
First of all, check the current overall status of the cluster backup subsystem:
If you have freshly created Omni instance, the output will be similar to this:
The combination of the CONFIGURATION NAME
and CONFIGURATION ERROR
fields display the current backup store configuration status. Currently, Omni supports two backup stores: local
and s3
. These are configured during Omni initialization. The output above indicates that the backup store is set to use the s3
store. However, the s3 configuration itself has not yet been added, so the CONFIGURATION ERROR
field shows not initialized
. The rest of the fields show as empty because no backups have been created yet.
To use S3 as the backup storage, you will first need to configure the S3 credentials for Omni to use. This can be done by creating an EtcdBackupS3Configs.omni.sidero.dev
resource in Omni. Below is an example for Minio S3:
Let's go through the fields:
bucket
- the name of the S3 bucket for storing backups. This is the only field required in all cases.
region
- the region of the S3 bucket. If not provided, Omni will use the default region.
endpoint
- the S3 endpoint. If not provided, Omni will use the default AWS S3 endpoint.
accesskeyid
and secretaccesskey
- the credentials to access the S3 bucket. If not provided, Omni will assume it runs in an EC2 instance with an IAM role that has access to the specified S3 bucket.
sessiontoken
- the session token (if any) for accessing the S3 bucket.
Save it as <file-name>.yaml
and apply using omnictl apply -f <file-name>.yaml
. During resource creation, Omni will validate the provided credentials by attempting to list the objects in the bucket. It will return an error if the validation fails and will not update the resource.
Let's get our overall status again and check the output:
Note that the CONFIGURATION ERROR
field is now empty, indicating that the provided configuration is valid.
Now, let's create a manual backup. To do that, we need to create a resource:
The <unix-timestamp>
should be no more than one minute in the future or in the past. The easiest way to get the current timestamp is to simply invoke date +%s
in your shell. The nanos
field should always be 0
.
After you save the resource as <file-name>.yaml
, apply it using omnictl apply -f <file-name>.yaml
. In a few seconds, you can check the status of the backup:
This command print per-cluster backup status. The output will be similar to this:
You can also get the overall status of the backup subsystem:
Omni also supports automatic backups. You can enable this feature by directly editing the cluster resource Clusters.omni.sidero.dev
or by using cluster templates. Let's explore how we can do this in both ways.
Enabling automatic backups using cluster templates is quite straightforward. First, you'll need a template that resembles the following:
This is the minimal example of a cluster template for a cluster with a single-node control plane and two worker nodes. Your machine UUIDs will be different, and the Kubernetes and Talos versions will probably also differ. You will need both of these, as well as the cluster name, in your cluster template. To obtain these, refer to the clustermachinestatus
and cluster
resources.
In this example, we are going to set the backup interval for the cluster to one hour. Save this template as <file-name>.yaml
. Before applying this change, we want to ensure that no automatic backup is enabled for this cluster. To do that, let's run the following command:
The Omni response will resemble the following:
Now that we have verified that Omni does not already have an automatic backup enabled, we will apply the change:
If you didn't have any backups previously, Omni will not wait for an hour and will immediately create a fresh backup. You can verify this by running the following command:
Keep in mind that to obtain the backup status, you will need to use the label selector omni.sidero.dev/cluster
along with your cluster name. In this example it is talos-default
.
Another way to enable automatic backups is by directly editing the cluster resource. To do this, first, you'll need to retrieve the cluster resource from the Omni:
Add fields related to the backup configuration while preserving the existing fields:
Save it to the file and apply using omnictl apply -f <file-name>.yaml
. You will get the output similar to the one above for the cluster template.
A guide on how to register a GCP instance with Omni.
Upon logging in you will be presented with the Omni dashboard.
First, download the GCP image from the Omni portal by clicking on the “Download Installation Media” button. Now, click on the “Options” dropdown menu and search for the “GCP” option. Notice there are two options: one for amd64
and another for arm64
. Select the appropriate option for the machine you are registering. Now that you have selected the GCP option for the appropriate architecture, click the “Download” button.
In the Google Cloud console, navigate to Buckets
under the Cloud Storage
menu, and create a new bucket with the default. Click on the bucket in the Google Cloud console, click Upload Files
, and select the image download from the Omni console.
In the Google Cloud console select Images
under the Compute Engine
menu, and then Create Image
. Name your image (e.g. Omni-talos-1.7.6), then select the Source as Cloud Storage File
. Click Browse
in the Cloud Storage File field and navigate to the bucket you created. Select the image you uploaded. Leave the rest of the options at their default and click Create
at the bottom.
In Google Cloud console select VM instances
under the Compute Engine
menu. Now select Create Instance
. Name your instance, and select a region and zone. Under “Machine Configuration”, ensure your instance has at least 4GB of memory. In the Boot Disk
section, select Change
and then select Custom Images
. Select the image created in the previous steps. Now, click Create
at the bottom to create your instance.
Navigate to the “Machines” menu in the sidebar. You should now see a machine listed.
You now have a GCP machine registered with Omni and ready to provision.
This guide will show you how to expose a self-hosted Omni with Nginx and secure it with TLS
You can use acme or certbot to generate certificates for your domain. In the following nginx config, the are stored in /var/lib/acme/omni/
and /var/lib/acme/omni_api/
and /var/lib/acme/omni_kube/
. Make sure to change the paths to your own or to output the certificates to those paths.
Use the following configuration to expose omni with nginx. Make sure to change the domain name ($OMNI_DOMAIN) to your own domain and to update the certificate paths if applicable.
The omni instance will be available at https://$OMNI_DOMAIN/
, the API at https://api.$OMNI_DOMAIN/
and the kubernetes proxy at https://kube.$OMNI_DOMAIN/
.
This guide shows you how to back up the database of an on-prem Omni instance.
Omni uses etcd as its database.
There are 2 operating modes for etcd: embedded and external.
When Omni is run with --etcd-embedded=true
flag, it will configure the embedded etcd server to listen the addresses specified by the --etcd-endpoints
flag (http://localhost:2379
by default).
The command will save the snapshot of the database to the snapshot.db
file.
It is recommended to periodically (e.g. with a cron job) take snapshots and store them in a safe location, like an S3 bucket.
This guide shows you how to deploy Omni on-prem. This guide assumes that Omni will be deployed on an Ubuntu machine. Small differences should be expected when using a different OS.
For SAML integration sections, this guide assumes Azure AD will be the provider for SAML.
There are several prerequisites for deploying Omni on-prem. We will assume you have an Ubuntu machine available. Any distribution with Docker should work.
On the account level, configure "Authentication - Social" to allow GitHub and Google login.
Create an Auth0 application of the type "single page web application".
Configure the Auth0 application with the following:
Allowed callback URLs: https://<domain name for onprem omni>
Allowed web origins: https://<domain name for onprem omni>
Allowed logout URLs: https://<domain name for onprem omni>
Disable username/password auth on "Authentication - Database - Applications" tab.
Enable GitHub and Google login on the "Authentication - Social" tab.
Enable email access in the GitHub settings.
Take note of the following information from the Auth0 application:
Domain
Client ID
Other identity providers also work with Omni. Configuring these should be similar to Auth0.
Generate a GPG key:
Find the fingerprint of the generated key:
Using the fingerprint, add an encryption subkey and export:
Note: Do not add passphrases to keys during creation.
There are two easy ways to run Omni: docker-compose and a simple docker run
. We recommend using docker-compose, but both are detailed in separate tabs below.
Export variables
You will need to specify some customizations for your installation. Export these variables with your information to use in the provided templates
Download Assets
To pull down the Omni deployment assets for Docker Compose, simply grab them with curl as follows.
Verify settings
Open the omni.env file to check that all of your variables have been set to your environment requirements.
Run It!
With your environment file in hand, it's now time to run Omni. This can be done with a simple docker compose command:
Deploying with a docker run
is quite straight forward, with only some slight differences depending on the auth mechanism in use.
Auth0
Note: The siderolink-wireguard-advertised-addr
must point to an IP, not the domain name.
Note: you can omit the --cert
, --key
, --siderolink-api-cert
, and --siderolink-api-key
flags to run Omni insecurely.
Configuration options are available in the help menu (--help
).
SAML
Note
In a default setup, the first user that logs in via SAML will be the “admin”. All subsequent users will receive a read-only role and may need to be granted additional access by the admin user from the “Users” tab in Omni.
Note
The siderolink-wireguard-advertised-addr
must point to an IP, not the domain name.
Note
Note that you can omit the --cert
, --key
, --siderolink-api-cert
, and --siderolink-api-key
flags to run Omni insecurely.
Configuration options are available in the help menu (--help
).
A guide on how to install Talos system extensions.
A guide on how to create a kubeconfig for a Kubernetes service account in Omni.
To create a service account kubeconfig, run the following command:
This command will create a service account token with the given username and obtain a kubeconfig file for the given cluster and username.
You can now use kubectl
with the generated kubeconfig.
A guide on how to create a hybrid cluster.
This guide shows you how to create a cluster consisting of any combination of bare metal, cloud virtual machines, on-premise virtual machines, or SBCs, using KubeSpan. KubeSpan is a feature of Talos Linux that provides full node-to-node network encryption with WireGuard, and enables Kubernetes to operate securely even when machines in the cluster are on different networks.
Refer to the general guide on creating a cluster to get started. To create a hybrid cluster, navigate to the cluster, then apply the following cluster patch by clicking on "Config Patches", and create a new patch with the target of "Cluster":
All machines in this cluster will have this patch applied to them, and use WireGuard encryption for all node-to-node traffic.
A guide on how to create an Omni service account.
To create an Omni service account, use the following command:
The output of this command will print OMNI_ENDPOINT
and OMNI_SERVICE_ACCOUNT_KEY
.
Store the OMNI_SERVICE_ACCOUNT_KEY
securely as it will not be displayed again.
Export these variables with the printed values:
You can now use omnictl
with the generated service account.
You need to deploy an omni instance the , with the following flags set:
In the same host where Omni is running (in Docker, --network=host
needs to be used), you can use the command to back up the database:
NOTE: When --etcd-embedded
is set to false
, the database is external and not managed by Omni. However, it still needs to be regularly backed up. For more info, see .
Omni is available via a which allows free installations in non-production environments. If you would like to deploy Omni for production use please contact . If you would like to subscribe to the hosted version of Omni please see the .
Install Docker according to the Ubuntu installation guide . You will also need the docker compose plugin package if you want to use the example docker compose template.
On-prem Omni will require valid SSL certificates. This means that self-signed certs will not work. Generating certificates is left as an exercise to the user, but here is a rough example that was tested using with certbot to generate certificates. The process should be very similar for other providers like Route53.
Create an .
On the overview page click “Download Installation Media” button on the right.
Select the list of extensions you want to be installed on the machine, Talos version and installation media type:
Click “Download”
Boot the machine with that installation media. It will have all extensions installed.
You can also add, remove or modify the extensions on an existing machine in a cluster by navigating to the Nodes view in a cluster, clicking on a machine, selecting the Extensions panel, then select Update Extensions to add or remove extensions.
Create a file called cluster.yaml
with the following content:
Now, validate the document:
Create the cluster:
Finally, wait for the cluster to be up:
The cluster will have hello-world-service
extension installed on the control plane and all nvidia drivers on the worker.
To follow this guide, you will need omnictl
installed and configured. (If you haven't done so already, follow the .) You will also need also need a cluster created withing Omni.
Note that Omni also supports , which provide authentication to Omni itself. Kubernetes Service Accounts are used to authenticate to a Kubernetes cluster, not Omni.
You will need omnictl
installed and configured to follow this guide. If you haven't done so already, follow the .
And Omni service account will create token based authentication for access to Omni. This is separate from access to the clusters managed by Omni. For Kubernetes access, see .
By default, the created service account will have a lifetime of 1 year, and uses the role of the creating user. These options can be adjusted by passing in the --ttl
and --role
parameters to the command. .
This guide shows you how to use the Omni audit log.
By default, the audit log is disabled. To enable it, you need to specify the --audit-log-dir <dir>
when starting the Omni server.
For example:
Starting the server without the --audit-log-dir
or with empty value will disable the audit log.
The audit log is stored in the directory specified by --audit-log-dir <dir>
flag. The log files are named <year>-<month>-<day>.jsonlog
. The retention period is 30 days (including the current day), after which the log files are deleted.
There are two ways of getting a concatenated audit log using Omni:
Using UI. Simply click "Download audit log" in the main menu from the home panel on the lower right.
Using omnictl audit-log
command. This command will stream the audit log from the Omni to the local machine stdout.
The second way is preferable if you have a huge audit log, as it will not consume a lot of memory on the client if you look for something specific.
The audit log is stored in JSON format. Each line in the log file is a JSON object representing an audit event.
Below is an example of log entry along with explanations.
we can expand it to something readable:
And go field by field:
"event_type"
is event (resource access, k8s or Talos access). Currently, there are seven event-type
s:
"create"
— resource was created.
"update"
— resource was updated using Update mechanism.
"update_with_conflicts"
— resource was updated using UpdateWithConflicts mechanism.
"destroy"
— resource was destroyed.
"teardown"
— resource is being torn down. Usually, it means that a resource will be destroyed soon.
"k8s_access"
— k8s access event. Some user accessed Kubernetes cluster.
"talos_access"
— talos access event. Some user accessed talos cluster.
"resource_type"
is the type of resource.
"event_ts"
is the timestamp of the event in milliseconds.
"event_data"
is the data of the event. It is a JSON object with at least one of the following fields:
"session"
is the session data. It describes the session of the user who performed the action. It is a JSON object with the following fields:
"user_agent"
is the user agent. For actions that are performed by Omni itself, the user agent will be "Omni-Internal-Agent" and the rest of the fields will be empty.
"ip_address"
is the IP address. For k8s_access this will be empty.
"user_id"
is the user ID.
"role"
is the role of the user.
"email"
is the email of the user.
"fingerprint"
is the fingerprint of the user.
"new_user"
describes the newly created/edited or deleted user. It is a JSON object.
"machine"
describes the machine. Currently it logs when a machine is created or destroyed. It is a JSON object.
"machine_labels"
describes the machine labels. It is a JSON object.
"access_policy"
describes the access policy. It is a JSON object.
"cluster"
describes the cluster. It is a JSON object.
"machine_set"
describes the cluster machine set. It is a JSON object.
"machine_set_node"
describes the cluster machine set node. It is a JSON object.
"config_patch"
describes the config patch. It is a JSON object.
"talos_access"
describes the Talos access event. It is a JSON object with those fields:
"full_method_name"
is the full method name that is being called on Talos side.
"cluster_name"
is the name of the cluster.
"machine_ip"
is the IP of the node.
"k8s_access"
describes the Kubernetes access event. It is a JSON object with those fields:
"full_method_name"
is the full HTTP/2 method name that is being called on Kubernetes side.
"command"
is the command that is being called.
"body"
is the body of the request if any.
"kube_session"
is the session of the Kubernetes user.
"cluster_name"
is the name of the cluster.
"cluster_uuid"
is the UUID of the cluster.
Supported resources.
Currently, we support the following resources:
PublicKeys.omni.sidero.dev
— public keys.
Users.omni.sidero.dev
— users.
Identities.omni.sidero.dev
— identities.
Machines.omni.sidero.dev
— machines.
MachineLabels.omni.sidero.dev
— machine labels.
AccessPolicies.omni.sidero.dev
— access policies.
Clusters.omni.sidero.dev
— clusters.
MachineSets.omni.sidero.dev
— machine sets.
MachineSetNodes.omni.sidero.dev
— machine set nodes.
ConfigPatches.omni.sidero.dev
— config patches.
We also support logging access to k8s cluster using kubectl, and accessing Talos nodes directly.
A guide on how to export a cluster template from a cluster created in the UI.
This guide shows you how to export a cluster template from a cluster created in the UI. This is useful when you want to switch a cluster from being manually managed to being managed by cluster templates (i.e. via the CLI, to be used in CI automation).
To export a cluster, run the following command:
It will export the template for the cluster with name my-cluster
into the file my-cluster-exported-template.yaml
.
If you inspect the exported template, you will see an output like the following:
You can now use this template to manage the cluster - edit the template as needed and sync it using the CLI:
Check the sync status:
Starting from 1.5.0, Talos supports KMS (Key Management Server) disk encryption key types. KMS keys are randomly generated on the Talos node and then sealed using the KMS server. A sealed key is stored in the luks2
metadata. To decrypt a disk, Talos node needs to communicate with the KMS server and decrypt the sealed key. The KMS server endpoint is defined in the key configuration.
If the Cluster
resource has diskencryption
enabled, Omni creates a config patch for each cluster machine and sets key's KMS endpoint to the Omni gRPC API. Each disk encryption key is sealed using an AES256 key managed by Omni:
Omni generates a random AES256 key for a machine when it is allocated.
When the machine is wiped the encryption key is deleted.
KMS encryption makes cluster more sensitive to Omni downtime. A node must be able to reach Omni when it is restarted in order to unseal the disk encryption key.
Machine registration is built on top of the extremely fast WireGuard® technology built in to Linux. A technology dubbed SideroLink builds upon WireGuard in order to provide a fully automated way of setting up and maintaining a WireGuard tunnel between Omni and each registered machine. Once the secure tunnel is established between a machine it is possible to manage a machine from nearly anywhere in the world.
The SideroLink network is an overlay network used within the data and management planes within Omni. The sole requirements are that your machine has egress to port 443 and the WireGuard port assigned to your account.
There are some NAT configurations that are not compatible with WireGuard.
Log in to Keycloak.
Create a realm.
In the upper left corner of the page, select the dropdown where it says master
Fill in the realm name and select create
Find the realm metadata.
In the realm settings, there is a link to the metadata needed for SAML under Endpoints.
Copy the link or save the data to a file. It will be needed for the installation of Omni.
Create a client
Select the Clients tab on the left
Fill in the General Settings as shown in the example below. Replace the hostname in the example with your own Omni hostname or IP.
Client type
Client ID
Name
Fill in the Login settings as shown in the example below. Replace the hostname in the example with your own Omni hostname or IP.
Root URL
Valid redirect URIs
Master SAML Processing URL
Modify the Signature and Encryption settings.
Sign documents: off
Sign assertions: on
Set the Client signature required value to off.
Modify Client Scopes
Select Add predefined mapper.
The following mappers need to be added because they will be used by Omni will use these attributes for assigning permissions.
X500 email
X500 givenName
X500 surname
Add a new user (optional)
If Keycloak is being used as an Identity Provider, users can be created here.
Enter the user information and set the Email verified to Yes
Set a password for the user.
A guide on how to add or remove nodes to a cluster with Omni.
To delete machines in a cluster, click the “Clusters” menu item on the left, then the name of the cluster you wish to delete nodes from. Click the “Nodes” menu item on the left. Now, select “Destroy” from the menu under the elipsis:
The cluster will now scale down.
To add machines to a cluster, click the “Cluster” menu item on the left, then the name of the cluster you wish to add nodes to. From the “Cluster Overview” tab, click the “Cluster Scaling” button in the sidebar on the right.
From the list of available machines that is shown, identify the machine or machines you wish to add, and then click “ControlPlane” or “Worker”, to add the machine(s) with that role. You may add multiple machines in one operation. Click “Add Machines” when all machines have been selected to be added.
The cluster will now scale up.
A guide on how to create a machine class.
This guide shows you how to create and a machine class.
This guide shows you how to restore a cluster's etcd to an earlier snapshot. This is useful when you need to revert a cluster to an earlier state.
This tutorial has the following requirements:
The CLI tool omnictl
must be installed and configured.
The cluster which you want to restore must still exist (not be deleted from Omni) and have past backups available.
The cluster must be managed using cluster templates (not via the UI).
To find the cluster's UUID, run the following command, replacing my-cluster
with the name of your cluster:
The output will look like this:
Note the UUID
column, which contains the cluster's UUID.
List the available snapshots for the cluster:
The output will look like this:
The SNAPSHOT
column contains the snapshot name which you will need to restore the cluster. Let's assume you want to restore the cluster to the snapshot FFFFFFFF9A99FBFD.snapshot
.
To restore the cluster, we need to first delete the existing control plane of the cluster. This will take the cluster into the non-bootstrapped state. Only then we can create the new control plane with the restored etcd.
Use the following command to delete the control plane, replacing my-cluster
with the name of your cluster:
Edit your cluster template manifest template-manifest.yaml
, edit the list of control plane machines for your needs, and add the bootstrapSpec
section to the control plane, with cluster UUID and the snapshot name we found above:
To sync the template, run the following command:
After the sync, your cluster will be restored to the snapshot you specified.
To ensure a healthy cluster operation, the kubelet needs to be restarted on all worker nodes.
Get the IDs of the worker nodes:
The output will look like this:
Gather the IDs in this output, and issue a kubelet restart on them using talosctl
:
A guide on how to expose an HTTP service from a cluster for external access.
You first need to enable the workload service proxying feature on the cluster you want to expose Services from.
If you are creating a new cluster, you can enable the feature by checking the checkbox in the “Cluster Features” section:
For an existing cluster, simply check the checkbox in the features section of the cluster overview page.
If you are using cluster templates, you can enable the feature by adding the following to the cluster template YAML:
You will notice that the “Exposed Services” section will appear on the left menu for the cluster the feature is enabled on.
Let’s install a simple Nginx deployment and service to expose it.
Create the following nginx.yaml
file:
Apply it to the cluster:
Note the following annotations on the cluster:
To expose a service, only the omni-kube-service-exposer.sidero.dev/port
annotation is required.
Its value must be a port that is unused on the nodes, such as by other exposed Services.
The annotation omni-kube-service-exposer.sidero.dev/label
can be set to a human-friendly name to be displayed on the Omni Web left menu.
If not set, the default name of <service-name>.<service-namespace>
will be used.
The annotation omni-kube-service-exposer.sidero.dev/prefix
can be set to use a user-defined prefix instead of a randomly-generated alphanumeric string as a prefix in the URL.
The annotation omni-kube-service-exposer.sidero.dev/icon
can be set to render an icon for this service on the Omni Web left menu.
If set, valid values are:
Either a base64-encoded SVG
Or a base64-encoded GZIP of an SVG
To encode an SVG file icon.svg
to be used for the annotation, you can use the following command:
You will notice that the Service you annotated will appear under the “Exposed Services” section in Omni Web, on the left menu when the cluster is selected.
Clicking it will open the exposed service in Omni.
The URL will either contain a randomly-generated alphanumeric prefix, or the user-defined prefix if the omni-kube-service-exposer.sidero.dev/prefix
annotation was set.
The services are only accessible to users authenticated to Omni and that have at leastReader
level access to the cluster containing the Service.
You can get more info and troubleshoot the exposed services by running the following command:
You will get an output like:
Inspect the output to get information about the status of your exposed service.
In order to login with GitHub you must use your primary verified email.
Security Assertion Markup Language (SAML) is an open standard that allows identity providers (IdP) to pass authorization credentials to service providers (SP). Omni plays the role of service provider.
SAML alters Omni user management:
Users are automatically created on the first login into Omni:
the first user gets Admin
role;
any subsequently created user gets None
role.
Admin
can change other users' roles.
Creating or deleting a user is not possible from within Omni - only within the IdP.
Omni gets the user attributes from the SAML assertion and adds them as labels to Identity
resource with saml.omni.sidero.dev/
prefix.
ACL can be used to adjust fine grained permissions instead of changing the user roles.
Information about what infrastructure providers are and how they work.
Infrastructure providers are a way to connect compute resources to your Omni instance for automatic management. Providers manage the lifecycle of the machines under their management.
This can replace the traditional "manual" management of machines where an engineer is responsible for downloading installation media and booting a machine to connect to Omni.
There are two types of infrastructure providers: providers that manage static resources, and providers that manage dynamic resources. Static resources are machines you own that are re-used for different clusters. Dynamic resources are VMs that are created and deleted as needed.
Multiple infrastructure providers can be connected to a single Omni instance and be responsible for different sets of machines.
The current infrastructure providers are:
Each Omni account (or instance) can have multiple providers connected to it. Each infrastructure provider deployment is intended to manage static or dynamic machines (e.g. bare metal, AWS EC2 instances) in a single location (e.g. dc1, us-east-2). Clusters can be created with a mix of infrastructure from manually provisioned, dynamic, or static machines.
For example, if you have multiple data centers you would run one Bare Metal Infrastructure Provider in each data center with network access to the servers it manages. This would also apply if you have multiple network segments in the same data center.
If you want to run multiple providers connected to on-prem VM providers (e.g. VMware, KubeVirt) you would run one provider per VM management API. So even if all providers can reach all platforms they are segmented per provider credential.
If you want to run machines in multiple regions or accounts in a public cloud provider you would run one provider to create machines in each region/account. It does not matter where you run the public cloud providers, so long as they can reach the public cloud APIs and your Omni instance.
Static resource providers manage existing bare metal servers in an environment. Static providers differ from dynamic providers in that they do not create machines, but they manage power management, PXE booting, and OS provisioning.
Dynamic providers delete machines when they are not being used in a cluster instead of returning them to a pool of static resources.
Create a file called machine-class.yaml
with the following content:
Create the machine class:
First, click the “Machine Classes” section in the sidebar on the left
Next, click the “Create Machine Class” button on the right.
Add machine query conditions by typing them manually in the input box.
Clicking the label in the machine list will add them to the input box.
Clicking on “+” will add blocks to match the machines using boolean OR
operator.
Name the machine class, then click “Create Machine Class”.
For this step, you need to be installed and talosconfig to be configured for this cluster. You can download talosconfig using the Web UI or by
To enable SAML on your account please submit a ticket in . Or reach out to us in the #omni channel in .
If you would like to build your own provider or request a provider to be created please or open an .
When a static machine is not actively being used in a cluster it is turned off to reduce power consumption and heat in a data center. For more information please see the documentation on .
Dynamic providers create and destroy machines as needed. These are created using other VM platforms such as AWS, VMware and OpenStack. They can also use other infrastructure management solutions such as or which have their own APIs and can provision machines out of a pool of resources.
Dynamic providers make a request to a resource API and expect machines to be created dynamically and connected to Omni. A is automatically created for the request which keeps the machines organized and automatically provisioned to a cluster.
A guide on how to set initial labels on the machines connecting to Omni.
Both methods allow you to programmatically label your machines, which can be useful for various automation scenarios, such as integrating with your CI pipeline.
Machine labels can be useful for organizing and selecting machines in your Omni environment. For example, you might use them to distinguish between different environments (production, staging, development) or geographical locations (regions, zones).
omnictl
When generating Talos installation media or a PXE boot URL using omnictl
, you can set initial machine labels using the --initial-labels
flag. This allows you to assign key-value pairs as labels to the machines that will boot from that media or the PXE boot URL.
Here's the basic syntax for adding initial labels:
Let's say you want to download an amd64
ISO image and set two labels: environment=production
and region=us-west
. Here's how you would do that:
Running this command will prepare a schematic under the hood and submit it in a request to the Image Factory. The generated schematic will look like the following:
The schematic will also get a unique ID, such as d2f4229b6157ba7e1dba8c3b4de42263e4baa35111e960b6a18841332d0f2035
.
Instead of using your Omni instance to generate labeled boot media or PXE URLs, you can use the image factory directly.
To do this, you need to craft an HTTP POST request with the schematic YAML in its body.
First, you need to find the Kernel arguments for your Omni instance.
You can do it:
Either by clicking "Copy Kernel Parameters" on your Omni overview page, which will copy them to your clipboard
Or by running omnictl get connectionparams -oyaml
, which will print them under .spec.args
field.
Note that this is a one-time operation - these kernel arguments will stay the same for all the machines you would boot.
After getting the Kernel arguments, split them by white spaces, and put them into your request body. Your CURL command should look like the following:
This command will produce output similar to:
Then you can use this ID in your PXE boot URL or download an installation media, for example:
The version of the Image Factory UI built into Omni does support specifying initial machine labels.
After a machine boots from the labeled media/PXE URL and registers with Omni, you can verify the labels using the Omni web interface or the omnictl
CLI tool.
To check labels using omnictl
, you can use either of these commands (replace <machine-id>
with the actual machine ID):
or
These commands will display information about the labels on the machine.
This guide demonstrates how to set initial machine labels when generating an boot media / URL using the omnictl
CLI tool or using directly.
Here, you can see that the custom image contains the extra Kernel arguments for Talos to connect to your Omni instance on boot using . It also contains the machine labels you have specified in a nested yaml in the meta section with key 12
. Here, the key 12
is a Talos META key reserved for Omni for the initial machine labels.
For more options, see the reference.
Although Image Factory has a , it is currently not possible to specify META values on the UI. Therefore, the initial machine labels cannot be specified on the UI at the moment.
Reference documentation for cluster templates.
Cluster templates are parsed, validated, and converted to Omni resources, which are then created or updated via the Omni API. Omni guarantees backward compatibility for cluster templates, so the same template can be used with any future version of Omni.
All referenced files in machine configuration patches should be stored relative to the current working directory.
The Cluster Template is a YAML file consisting of multiple documents, with each document having a kind
field that specifies the type of the document. Some documents might also have a name
field that specifies the name (ID) of the document.
Each cluster template should have exactly one document of kind: Cluster
, kind: ControlPlane
, and any number of kind: Workers
with different name
s.
Every Machine
document must be referenced by either a ControlPlane
or Workers
document.
Cluster
The Cluster
document specifies the cluster configuration, labels, defines the cluster name and base component versions.
kind
string
Cluster
name
string
Cluster name: only letters, digits and -
and _
are allowed. The cluster name is used as a key by all other documents, so if the cluster name changes, a new cluster will be created.
labels
map[string]string
Labels to be applied to the cluster.
annotations
map[string]string
Annotations to be applied to the cluster.
kubernetes.version
string
Kubernetes version to use, vA.B.C
.
talos.version
string
Talos version to use, vA.B.C
.
features.enableWorkloadProxy
boolean
Whether to enable the workload proxy feature. Defaults to false
.
features.useEmbeddedDiscoveryService
boolean
Whether to use the embedded discovery service that runs inside the Omni instance instead of the public one (discovery.talos.dev
). Defaults to false
. It is only valid if the Omni instance has the feature enabled.
features.diskEncryption
boolean
Whether to enable disk encryption. Defaults to false
.
features.backupConfiguration.interval
string
patches
array
systemExtensions
array
The list of system extensions to be installed on every machine in the cluster.
ControlPlane
The ControlPlane
document specifies the control plane configuration, defines the number of control plane nodes, and the list of machines to use.
As control plane machines run an etcd
cluster, it is recommended to use a number of machines for the control plane that can achieve a stable quorum (e.g., 1, 3, 5, etc.). Changing the set of machines in the control plane will trigger a rolling scale-up/scale-down of the control plane.
The control plane should have at least a single machine, but it is recommended to use at least 3 machines for the control plane for high-availability.
kind
string
ControlPlane
labels
map[string]string
Labels to be applied to the control plane machine set.
annotations
map[string]string
Annotations to be applied to the control plane machine set.
machines
array
List of machine IDs to use for control plane nodes (mutually exclusive with machineClass
).
patches
array
machineClass
Machine Class configuration (mutually exclusive with machines
).
systemExtensions
array
The list of system extensions to be installed on every machine in the machine set.
Workers
The Workers
document specifies the worker configuration, defines the number of worker nodes, and the list of machines to use.
kind
string
Workers
name
string
Worker machine set name: only letters, digits and -
and _
are allowed. Defaults to workers
when omitted. Must be unique and not be control-planes
.
labels
map[string]string
Labels to be applied to the worker machine set.
annotations
map[string]string
Annotations to be applied to the worker machine set.
machines
array
List of machine IDs to use as worker nodes in the machine set (mutually exclusive with machineClass
).
patches
array
machineClass
Machine Class configuration (mutually exclusive with machines
).
updateStrategy
Update strategy for the machine set. Defaults to type: Rolling
with maxParallelism: 1
.
deleteStrategy
Delete strategy for the machine set. Defaults to type: Unset
.
systemExtensions
array
The list of system extensions to be installed on every machine in the machine set.
MachineClass
name
string
Name of the machine class to use.
size
number
Number of machines to pick from the matching machine class.
UpdateStrategy
type
string
Strategy type. Can be Rolling
or Unset
. Defaults to Rolling
for updateStrategy
and Unset
for the deleteStrategy
. When Unset
, all updates and/or deletes will be applied at once.
rolling.maxParallelism
number
Maximum number of machines to update and/or delete in parallel. Only used when the type
is Rolling
. Defaults to 1
.
Machine
The Machine
document specifies the install disk and machine-specific configuration patches. They are optional, but every Machine
document must be referenced by either a ControlPlane
or Workers
document.
kind
string
Machine
name
string
Machine ID.
labels
map[string]string
Labels to be applied to the machine set node.
annotations
map[string]string
Annotations to be applied to the machine set node.
locked
string
Whether the machine should be marked as locked. Can be true
only if the machine is used as a worker.
install.disk
string
Disk to install Talos on. Matters only for Talos running from ISO or iPXE.
patches
array
systemExtensions
array
The list of system extensions to be installed on the machine.
When Talos is not installed and the install disk is not specified, Omni will try to pick the install disk automatically. It will find the smallest disk which is larger than 5GB. {}
patches
file
string
Path to the patch file. Path is relative to the current working directory when executing omnictl
. File should contain Talos machine configuration strategic patch.
name
string
Name of the patch. Required for inline
patches when idOverride
is not set, optional for file
patches (default name will be based on the file path).
idOverride
string
Override the config patch ID, so it won't be generated from the name
or file
.
labels
map[string]string
Labels to be applied to the config patch.
annotations
map[string]string
Annotations to be applied to the config patch.
inline
object
Inline patch containing Talos machine configuration strategic patch.
A configuration patch may be either inline
or file
based. Inline patches are useful for small changes, file-based patches are useful for more complex changes, or changes shared across multiple clusters.
Cluster etcd backup interval. Must be a valid . Zero 0
disables automatic backups.
List of to apply to the cluster.
List of to apply to the machine set.
List of to apply to the machine set.
The MachineClass
section of the or the defines the rule for picking the machines in the machine set.
The UpdateStrategy
section of the defines the update and/or the delete strategy for the machine set.
List of to apply to the machine.
The patches
field is a list of to apply to a cluster, a machine set, or an individual machine. Config patches modify the configuration before it is applied to each machine in the cluster. Changing configuration patches modifies the machine configuration which gets automatically applied to the machine.
Reference documentation for ACLs.
ACLs are used to control fine-grained access policies of users to resources; and are validated, stored, and evaluated as an AccessPolicy
resource in Omni.
At the moment, only Kubernetes cluster access (group impersonation) is supported.
AccessPolicy
The AccessPolicy
is a single resource containing a set of user groups, a set of cluster groups, a list of matching rules and a list of tests.
metadata.namespace
string
Always set to default
.
metadata.type
string
AccessPolicies.omni.sidero.dev
.
metadata.id
string
Always set to access-policy
.
spec.usergroups
Map of user group names to user group definitions.
spec.clustergroups
Map of cluster group names to cluster group definitions.
spec.rules
array
spec.tests
array
UserGroup
A UserGroup
is a group of users.
users
array
User
A User
is a single user.
name
string
User identity used to authenticate to Omni.
match
string
labelselectors
array
List of label selector strings.
Note: name
, match
and labelselectors
are mutually exclusive. Only one of them can be set to a non-zero value.
ClusterGroup
A ClusterGroup
is a group of clusters.
clusters
array
Cluster
A Cluster
is a single cluster.
name
string
Cluster name (ID).
match
Note: name
and match
are mutually exclusive. Only one of them can be set to a non-zero value.
Rule
A Rule
is a set of users, clusters and Kubernetes impersonation groups.
The reserved prefix group/
is used to reference a user group in users
or a cluster group in clusters
.
users
array
clusters
array
role
enum
kubernetes.impersonate.groups
array
List of string
s representing Kubernetes impersonation groups.
Role
A Role
is the role to grant to the user.
Possible values: None
, Reader
, Operator
, Admin
.
Test
A Test
is a single test case.
Test cases are run when the resource is created or updated, and if any of them fail, the operation is rejected.
name
string
Human-friendly test case name.
user
User identity to use in the test.
cluster
Cluster to use in the test.
expected
Expected result.
TestUser
A TestUser
is the user identity to use in a test case.
name
string
User identity to use in the test.
labels
map[string]string
Map of label names to label values.
TestCluster
A TestCluster
is the cluster to use in a test case.
name
string
Cluster name (ID).
Expected
An Expected
is the expected results of a test case.
role
enum
kubernetes.impersonate.groups
array
List of string
s representing Kubernetes impersonation groups.
omnictl CLI tool reference.
Create or update resource using YAML file as an input
Delete all cluster resources.
Delete all resources related to the cluster. The command waits for the cluster to be fully destroyed.
Sync Kubernetes bootstrap manifests from Talos controlplane nodes to Kubernetes API.
Sync Kubernetes bootstrap manifests from Talos controlplane nodes to Kubernetes API. Bootstrap manifests might be updated with Talos version update, Kubernetes upgrade, and config patching. Talos never updates or deletes Kubernetes manifests, so this command fills the gap to keep manifests up-to-date.
Run Kubernetes upgrade pre-checks for the cluster.
Verify that upgrading Kubernetes version is available for the cluster: version compatibility, deprecated APIs, etc.
Cluster Kubernetes management subcommands.
Commands to render, validate, manage cluster templates.
Lock the machine
When locked, no config updates, upgrades and downgrades will be performed on the machine.
Unlock the machine
Removes locked annotation from the machine.
Machine related commands.
Commands to manage cluster machines.
Show cluster status, wait for the cluster to be ready.
Shows current cluster status, if the terminal supports it, watch the status as it updates. The command waits for the cluster to be ready by default.
Delete all cluster template resources from Omni.
Delete all resources related to the cluster template. This command requires API access.
Show diff in resources if the template is synced.
Query existing resources for the cluster and compare them with the resources generated from the template. This command requires API access.
Export a cluster template from an existing cluster on Omni.
Export a cluster template from an existing cluster on Omni. This command requires API access.
Render a cluster template to a set of resources.
Validate template contents, convert to resources and output resources to stdout as YAML. This command is offline (doesn't access API).
Show template cluster status, wait for the cluster to be ready.
Shows current cluster status, if the terminal supports it, watch the status as it updates. The command waits for the cluster to be ready by default.
Apply template to the Omni.
Query existing resources for the cluster and compare them with the resources generated from the template, create/update/delete resources as needed. This command requires API access.
Validate a cluster template.
Validate that template contains valid structures, and there are no other warnings. This command is offline (doesn't access API).
Cluster template management subcommands.
Commands to render, validate, manage cluster templates.
Cluster-related subcommands.
Commands to destroy clusters and manage cluster templates.
Generate the autocompletion script for bash
Generate the autocompletion script for the bash shell.
This script depends on the 'bash-completion' package. If it is not installed already, you can install it via your OS's package manager.
To load completions in your current shell session:
To load completions for every new session, execute once:
Linux:
macOS:
You will need to start a new shell for this setup to take effect.
Generate the autocompletion script for fish
Generate the autocompletion script for the fish shell.
To load completions in your current shell session:
To load completions for every new session, execute once:
You will need to start a new shell for this setup to take effect.
Generate the autocompletion script for powershell
Generate the autocompletion script for powershell.
To load completions in your current shell session:
To load completions for every new session, add the output of the above command to your powershell profile.
Generate the autocompletion script for zsh
Generate the autocompletion script for the zsh shell.
If shell completion is not already enabled in your environment you will need to enable it. You can execute the following once:
To load completions in your current shell session:
To load completions for every new session, execute once:
Linux:
macOS:
You will need to start a new shell for this setup to take effect.
Generate the autocompletion script for the specified shell
Generate the autocompletion script for omnictl for the specified shell. See each sub-command's help for details on how to use the generated script.
Add a new context
Set the current context
List defined contexts
Set the auth identity for the current context
Show information about the current context
Merge additional contexts from another client configuration file
Contexts with the same name are renamed while merging configs.
Generate a new client configuration file
Set the URL for the current context
Manage the client configuration file (omniconfig)
Delete a specific resource by ID or all resources of the type.
Similar to 'kubectl delete', 'omnictl delete' initiates resource deletion and waits for the operation to complete.
Download installer media
This command downloads installer media from the server
It accepts one argument, which is the name of the image to download. Name can be one of the following:
To get the full list of available images, look at the output of the following command: omnictl get installationmedia -o yaml
The download command tries to match the passed string in this order:
By default it will download amd64 image if there are multiple images available for the same name.
For example, to download the latest ISO image for arm64, run:
To download the latest Vultr image, run:
To download the latest Radxa ROCK PI 4 image, run:
Get a specific resource or list of resources.
Similar to 'kubectl get', 'omnictl get' returns a set of resources from the OS. To get a list of all available resource definitions, issue 'omnictl get rd'
Download the admin kubeconfig of a cluster
Download the admin kubeconfig of a cluster. If merge flag is defined, config will be merged with ~/.kube/config or [local-path] if specified. Otherwise kubeconfig will be written to PWD or [local-path] if specified.
Get logs for a machine
Get logs for a provided machine id
Create a service account
Destroy a service account
List service accounts
Renew a service account by registering a new public key to it
Manage service accounts
Download the support bundle for a cluster
The command collects all non-sensitive information for the cluster from the Omni state.
Download the admin talosconfig of a cluster
Download the admin talosconfig of a cluster. If merge flag is defined, config will be merged with ~/.talos/config or [local-path] if specified. Otherwise talosconfig will be written to PWD or [local-path] if specified.
A CLI for accessing Omni API.
map[string]
map[string]
List of to match.
List of to run when the resource is created or updated.
List of s.
expression to match user identities.
List of s.
expression to match cluster names (IDs).
List of s or s.
List of s or s.
to grant to the user.
to grant to the user.
- A CLI for accessing Omni API.
- Cluster-related subcommands.
- Cluster Kubernetes management subcommands.
- Cluster Kubernetes management subcommands.
- Cluster-related subcommands.
- Sync Kubernetes bootstrap manifests from Talos controlplane nodes to Kubernetes API.
- Run Kubernetes upgrade pre-checks for the cluster.
- Machine related commands.
- Machine related commands.
- Cluster-related subcommands.
- Lock the machine
- Unlock the machine
- Cluster-related subcommands.
- Cluster template management subcommands.
- Cluster template management subcommands.
- Cluster template management subcommands.
- Cluster template management subcommands.
- Cluster template management subcommands.
- Cluster template management subcommands.
- Cluster template management subcommands.
- Cluster-related subcommands.
- Delete all cluster template resources from Omni.
- Show diff in resources if the template is synced.
- Export a cluster template from an existing cluster on Omni.
- Render a cluster template to a set of resources.
- Show template cluster status, wait for the cluster to be ready.
- Apply template to the Omni.
- Validate a cluster template.
- A CLI for accessing Omni API.
- Delete all cluster resources.
- Cluster Kubernetes management subcommands.
- Machine related commands.
- Show cluster status, wait for the cluster to be ready.
- Cluster template management subcommands.
- Generate the autocompletion script for the specified shell
- Generate the autocompletion script for the specified shell
- Generate the autocompletion script for the specified shell
- Generate the autocompletion script for the specified shell
- A CLI for accessing Omni API.
- Generate the autocompletion script for bash
- Generate the autocompletion script for fish
- Generate the autocompletion script for powershell
- Generate the autocompletion script for zsh
- Manage the client configuration file (omniconfig)
- Manage the client configuration file (omniconfig)
- Manage the client configuration file (omniconfig)
- Manage the client configuration file (omniconfig)
- Manage the client configuration file (omniconfig)
- Manage the client configuration file (omniconfig)
- Manage the client configuration file (omniconfig)
- Manage the client configuration file (omniconfig)
- A CLI for accessing Omni API.
- Add a new context
- Set the current context
- List defined contexts
- Set the auth identity for the current context
- Show information about the current context
- Merge additional contexts from another client configuration file
- Generate a new client configuration file
- Set the URL for the current context
- A CLI for accessing Omni API.
- A CLI for accessing Omni API.
- A CLI for accessing Omni API.
- A CLI for accessing Omni API.
- A CLI for accessing Omni API.
- Manage service accounts
- Manage service accounts
- Manage service accounts
- Manage service accounts
- A CLI for accessing Omni API.
- Create a service account
- Destroy a service account
- List service accounts
- Renew a service account by registering a new public key to it
- A CLI for accessing Omni API.
- A CLI for accessing Omni API.
- Create or update resource using YAML file as an input
- Cluster-related subcommands.
- Generate the autocompletion script for the specified shell
- Manage the client configuration file (omniconfig)
- Delete a specific resource by ID or all resources of the type.
- Download installer media
- Get a specific resource or list of resources.
- Download the admin kubeconfig of a cluster
- Get logs for a machine
- Manage service accounts
- Download the support bundle for a cluster
- Download the admin talosconfig of a cluster