Skip to content

Prerequisites

1. PrerequisitesΒΆ

1.1. Infrastructure RequirementsΒΆ

  • Operating System:

    • Ubuntu 24.04
    • RHEL 8
    • RHEL 9
  • Instance Requirements:

    • Single Node Controller: 1 node
    • High Availability Controller: 3 master nodes
  • System Size (Minimum):

    • 'S': 32 CPU , 64G memory
    • 'M': 48 CPU , 96G memory
    • 'L': 64 CPU , 96G memory (Only HA)

Note: All node types (VM or bare-metal) must conform to these minimum specifications based on the deployment size.

  • Root Disk: Minimum 500 GB
  • Temp Directory (/tmp): Minimum 50GB (if not part of root disk)
  • Data Disk: 1 TB (mounted as /data volume, size varies based on storage requirements)
  • RHEL installations need connectivity to default repository servers
  • Inbound port 443/tcp must be allowed to all instances
  • All localhost ports must be reachable
  • Port 30053/UDP must be reachable in non-DNS environments
  • SELinux/firewall must be disabled on all nodes

Ensure that all nodes can communicate over internal network interfaces without firewall restrictions for proper operation of the controller cluster.


1.2. DNS ConfigurationΒΆ

DNS records are required for the controller to function properly. Replace rafay.example.com with your desired domain.

*.rafay.example.com

If wildcard DNS is not available, create these individual records:

api.<rafay.example.com>
console.<rafay.example.com>
fluentd-aggr.<rafay.example.com>
grafana.<rafay.example.com>
kibana.<rafay.example.com>
ops-console.<rafay.example.com>
repo.<rafay.example.com>
*.cdrelay.<rafay.example.com>
*.core-connector.<rafay.example.com>
*.core.<rafay.example.com>
*.connector.infrarelay.<rafay.example.com>
*.user.infrarelay.<rafay.example.com>
*.kubeapi-proxy.<rafay.example.com>
*.user.<rafay.example.com>

Note

DNS records should point to the controller nodes' IP addresses. For external SSL offloading, refer to the SSL Offloading section.


1.2.1. Hosted DNS Support (Optional)ΒΆ

In environments where DNS servers are not available or cannot be configured, the Rafay Controller can host its own DNS server and propagate DNS records to managed clusters.

Enable Hosted DNSΒΆ

To enable hosted DNS functionality, add the following configuration to your config.yaml:

override-config:
  global.enable_hosted_dns_server: true
Local Machine AccessΒΆ

For accessing the controller UI from your local machine, add an entry to /etc/hosts pointing the console FQDN to your controller IP:

<Controller-IP>  console.<rafay.example.com>

Cluster Provisioning with Hosted DNS

When provisioning clusters in a hosted DNS environment, include the -dns-server parameter in the conjurer command:

$ tar -xjf conjurer-linux-amd64.tar.bz2 && sudo ./conjurer -edge-name="test" \
  -passphrase-file="passphrase.txt" -creds-file="credentials.pem" \
  -dns-server <Controller-IP>
RHEL 9 Node ConfigurationΒΆ

On RHEL 9 nodes, configure DNS non-conf to preserve resolv.conf entries during node reboots:

  1. Create the DNS configuration file:

    $ sudo vi /etc/NetworkManager/conf.d/90-dns-none-conf
    

  2. Add the following content:

    [main]
    dns=none
    

  3. Reload NetworkManager:

    $ sudo systemctl reload NetworkManager
    

Note

  • These steps need to be executed on both cluster nodes as well as controller nodes.

  • This configuration should be applied before running the radm init process on RHEL 9 nodes for the new controller setup.

  • For existing controller, if you want to set this up, just manually execute these commands and proceed.


1.3. Additional RequirementsΒΆ

  • Company logo in PNG format
  • Size: Less than 600 KB
  • Used for white labeling and branding

Note

This step is optional.

X509 CertificatesΒΆ

  • X509 certificates are used to secure communication between services in the controller as well as between end users and the controller.

  • Trusted CA signed wildcard certificate (2048 bit) are recommended for secure communication between the end user's browser and the air gapped controller.

  • Acquire a signed wild card certificate for the end user facing domain "*.rafay.example.com".

  • All other domains will use auto generated, self-signed certificates. These are not end user facing and are used for mTLS based inter service communication.

Note

For non-prod environments, self-signed certificates can be auto-generated. Set generate-self-signed-certs: true in config.yaml for auto-generation.


1.4. SSL Offloading Configuration (Optional)ΒΆ

  • Rafay controller supports SSL offload at load balancer level using ACM/certificates. This would need two load balancers, one for UI FQDNs which requires SSL offload and another for backed FQDNs which requires SSL passthrough.

  • To enable external SSL offloading, the below override-config has to be enabled in config.yaml.

    override-config.global.external_lb: true


1.5. DNS Settings for Using External SSL Offload (Optional)ΒΆ

For extended security, all Rafay backend endpoints use mTLS and do not support SSL offloading, except for the frontend UI endpoints.

Frontend FQDNs (Point to Classic Load Balancer for SSL Offloading)ΒΆ

  • api.<rafay.example.com>
  • console.<rafay.example.com>
  • fluentd-aggr.<rafay.example.com>
  • ops-console.<rafay.example.com>
  • grafana.<rafay.example.com>
  • repo.<rafay.example.com>

Backend FQDNs (Point to NLB for mTLS)ΒΆ

  • registry.<rafay.example.com>
  • *.core-connector.<rafay.example.com>
  • *.core.<rafay.example.com>
  • *.kubeapi-proxy.<rafay.example.com>
  • *.user.<rafay.example.com>
  • *.cdrelay.<rafay.example.com>
  • *.infrarelay.<rafay.example.com>
  • *.connector.infrarelay.<rafay.example.com>
  • *.user.infrarelay.<rafay.example.com>

1.6. Load Balancer Setup (Optional)ΒΆ

  • Requires two load balancers:
    1. Load balancer with certificate for SSL offloading in UI traffic.
    2. Load balancer with SSL passthrough for mTLS traffic
  • Enable with: override-config.global.external_lb: true in config.yaml

Certificate Requirements:

  • CA signed wildcard certificate
  • Ports: 80/TCP and 443/TCP inbound
  • Redirecting Connections as per the below table

Port Configuration:

Frontend Port Frontend Protocol Backend Port Backend Protocol
80 HTTP 30426 HTTP
443 SECURE TCP(SSL) 30726 TCP

SSL Passthrough Configuration:

Frontend Port Frontend Protocol Backend Port Backend Protocol
443 TCP 30526 TCP
Ping Protocol: HTTP
Ping Port: 30326
Ping Path: /healthz/ready

Preflight Checks During Controller InitializationΒΆ

When the radm init or radm join command is executed, a series of preflight checks are performed to validate the system environment. These checks ensure that the host meets the minimum requirements before proceeding with the controller installation.

./radm init --config config.yaml

(or)

./radm join --config config.yaml

Example Output

╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
β•‘                                                       Rafay Controller PreFlight Check                                                       β•‘
β•‘                                                             Radm Version: v3.3,x                                                             β•‘
β•‘                                                              Date: May 26, 2025                                                              β•‘
╠═══════════════════════╦════════╦════════╦════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ CHECK                 β•‘ RESULT β•‘ STATUS β•‘                                               DETAILS                                              β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Operating System      β•‘ Passed β•‘ βœ”      β•‘                OS: Ubuntu 24.04.2 LTS. Supported OS: [Ubuntu 24.04, RHEL 8, RHEL 9]                β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ CPU                   β•‘ Passed β•‘ βœ”      β•‘                                 Required: 32 CPU, Available: 64 CPU                                β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Memory                β•‘ Passed β•‘ βœ”      β•‘                               Required: 63488 MB, Available: 64275 MB                              β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Root Disk             β•‘ Passed β•‘ βœ”      β•‘                                 Required: 500 GB, Available: 600 GB                                β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Data Disk Check       β•‘ Passed β•‘ βœ”      β•‘       Mount point /data not found. Assuming external mount is acceptable (Expected: 1024 GB)       β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ /tmp                  β•‘ Passed β•‘ βœ”      β•‘                               Found 501 GB available at /tmp                                       β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Internet Port 80      β•‘ Passed β•‘ βœ”      β•‘                   Warning: Port 80 is open to internet (should ideally be closed)                  β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Internet Port 443     β•‘ Passed β•‘ βœ”      β•‘                  Warning: Port 443 is open to internet (should ideally be closed)                  β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ DNS Resolution        β•‘ Passed β•‘ βœ”      β•‘                     Successfully resolved ops-console.rafay.dev.rafay-edge.net                     β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Free Space            β•‘ Passed β•‘ βœ”      β•‘            Working directory has enough space: /home/ubuntu/controller, 501 GB available           β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Firewall Status       β•‘ Passed β•‘ βœ”      β•‘                                     No active firewall detected                                    β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ AppArmor Status       β•‘ Passed β•‘ βœ”      β•‘                       AppArmor is enabled (ensure proper profiles are loaded)                      β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ iptables Rules        β•‘ Passed β•‘ βœ”      β•‘                                  Only default ACCEPT rules present                                 β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Local Ports Check     β•‘ Passed β•‘ βœ”      β•‘   All required local ports are available and not in use (checked ports: [80 443 5000 5006 5005])   β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Var Mount Point Check β•‘ Passed β•‘ βœ”      β•‘ /var is part of the root filesystem (acceptable, but separate mount is recommended for production) β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ DNS Server            β•‘ Passed β•‘ βœ”      β•‘                                 No conflicting DNS server detected                                 β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ iscsid Service        β•‘ Passed β•‘ βœ”      β•‘                                iscsid service is not in failed state                               β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Container Runtimes    β•‘ Passed β•‘ βœ”      β•‘                             No conflicting container runtimes detected                             β•‘
╠═══════════════════════╬════════╬════════╬════════════════════════════════════════════════════════════════════════════════════════════════════╣
β•‘ Files                 β•‘ Passed β•‘ βœ”      β•‘                                       All Files are present!!                                      β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

To bypass preflight checks during initialization or joining, use the --skip-preflight flag.

radm init --config config.yaml --skip-preflight

(or)

./radm join --config config.yaml --skip-preflight

Command-Specific Preflight ChecksΒΆ

Some preflight checks are not included in the output of init or join commands because they depend on configuration steps that happen after those commands are run.

  • Kubeconfig Check: Checks if the provided Kubernetes kubeconfig file is accessible and correctly configured.
./radm dependency --config config.yaml --kubeconfig <kubeconfig file>
./radm application --config config.yaml --kubeconfig <kubeconfig file>

Example Output

╔══════════════════════════════════════════════════════════════════════════════════╗
β•‘                         Rafay Controller PreFlight Check                         β•‘
β•‘                               Radm Version: 3.3.x                                β•‘
β•‘                                Date: May 21, 2025                                β•‘
╠═════════════════════════╦════════╦════════╦══════════════════════════════════════╣
β•‘ CHECK                   β•‘ RESULT β•‘ STATUS β•‘                DETAILS               β•‘
╠═════════════════════════╬════════╬════════╬══════════════════════════════════════╣
β•‘ Kubeconfig Reachability β•‘ Passed β•‘ βœ”      β•‘ Able to reach Kubernetes API server. β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

To skip this preflight check, use the following commands:

radm dependency --config <config file path> --kubeconfig <kubeconfig path> --skip-preflight
(&

radm application --config <config file path> --kubeconfig <kubeconfig path> --skip-preflight
  • DNS Resolution Check: Validates that required DNS endpoints can be resolved.
./radm cluster --config config.yaml

Example Output

╔═══════════════════════════════════════════════════════════════════════════════════════════════════╗
β•‘                                  Rafay Controller PreFlight Check                                 β•‘
β•‘                                       Radm Version: 3.3.x                                         β•‘
β•‘                                         Date: May 21, 2025                                        β•‘
╠════════════════╦════════════╦════════╦════════════════════════════════════════════════════════════╣
β•‘ CHECK          β•‘ RESULT     β•‘ STATUS β•‘                           DETAILS                          β•‘
╠════════════════╬════════════╬════════╬════════════════════════════════════════════════════════════╣
β•‘ DNS Resolution β•‘ Successful β•‘ βœ”      β•‘ Successfully resolved ops-console.rafay.rafay-edge.net     β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

To skip this preflight check, use the following command:

radm cluster --config <config file path> --skip-preflight

These checks are automatically triggered during the relevant phases and do not require manual execution of any preflight command.


Next StepsΒΆ

➑️ Continue to Installation Guide