Before deploying AAP or spinning up K3s, you need a solid foundation. This phase walks through the exact hardware, network layout, and control node setup required to reproduce this lab from scratch.
Architecture Overview
┌─────────────────────────────────────────────────┐
│ Your Lab Network │
│ 192.168.5.0/24 │
│ │
│ ┌──────────────┐ ┌───────────────────────┐ │
│ │ AAP Host │ │ K3s Cluster │ │
│ │ RHEL 10 │ │ Ubuntu 24.04 │ │
│ │ .49 │ │ │ │
│ │ │ │ Master: .40 │ │
│ │ Runs AAP ─┼────▶│ Worker 1: .41 │ │
│ │ + Ansible │ │ Worker 2: .42 │ │
│ └──────────────┘ │ Worker 3: .43 │ │
│ └───────────────────────┘ │
└─────────────────────────────────────────────────┘
You need 5 machines total: 1 RHEL 10 host for AAP and 4 Ubuntu nodes for the K3s cluster.
1. Hardware Requirements
AAP Host (RHEL 10)
| Component | Minimum | Recommended | Notes |
|---|---|---|---|
| vCPU | 2 | 4 | Containerized AAP is CPU-intensive |
| RAM | 4 GB | 8 GB | AAP requires 16GB officially; we bypass this (see Phase 1) |
| Storage | 20 GB | 40 GB | Docker images and database |
| Network | Static IP | — | 192.168.5.49 in this lab |
K3s Nodes (Ubuntu 24.04) x4
| Component | Minimum | Recommended | Notes |
|---|---|---|---|
| vCPU | 1 | 2 | K3s is lightweight |
| RAM | 1 GB | 2 GB | Per node |
| Storage | 10 GB | 20 GB | Root partition |
| Network | Static IP | — | See IP plan below |
Hypervisor: VMware Workstation (or any hypervisor — VirtualBox, Proxmox, etc.)
2. Network IP Plan
Assign static IPs before installing anything. Consistency here is critical — every script and inventory file references these addresses.
| Hostname | Role | OS | IP Address |
|---|---|---|---|
ansible-host | AAP Control Node | RHEL 10 | 192.168.5.49 |
k3s-master-01 | K3s Server | Ubuntu 24.04 | 192.168.5.40 |
k3s-worker-01 | K3s Agent | Ubuntu 24.04 | 192.168.5.41 |
k3s-worker-02 | K3s Agent | Ubuntu 24.04 | 192.168.5.42 |
k3s-worker-03 | K3s Agent | Ubuntu 24.04 | 192.168.5.43 |
Setting Static IPs on Ubuntu (Netplan)
On each Ubuntu node, edit the netplan config:
sudo nano /etc/netplan/00-installer-config.yamlnetwork:
ethernets:
ens33:
addresses:
- 192.168.5.40/24 # Change per node
routes:
- to: default
via: 192.168.5.1 # Your gateway
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
version: 2sudo netplan applySetting Static IP on RHEL 10
sudo nmcli con mod ens192 ipv4.addresses 192.168.5.49/24
sudo nmcli con mod ens192 ipv4.gateway 192.168.5.1
sudo nmcli con mod ens192 ipv4.dns "8.8.8.8"
sudo nmcli con mod ens192 ipv4.method manual
sudo nmcli con up ens1923. Hostname Configuration
Set hostnames on each machine to match the IP plan. The AAP installer requires a proper FQDN.
On each Ubuntu node:
# k3s-master-01
sudo hostnamectl set-hostname k3s-master-01
# k3s-worker-01
sudo hostnamectl set-hostname k3s-worker-01
# (repeat for worker-02, worker-03)On the AAP host (RHEL):
sudo hostnamectl set-hostname ansible-host
echo "192.168.5.49 ansible-host.local" | sudo tee -a /etc/hosts4. SSH Key Setup
Ansible connects to remote hosts via SSH. Set up key-based auth so you never need to type passwords during playbook runs.
Generate a Key Pair (on the AAP host)
ssh-keygen -t ed25519 -C "ansible-lab" -f ~/.ssh/id_ansibleCopy the Key to All Nodes
for ip in 192.168.5.40 192.168.5.41 192.168.5.42 192.168.5.43; do
ssh-copy-id -i ~/.ssh/id_ansible.pub jmartinez@$ip
doneVerify Connectivity
for ip in 192.168.5.40 192.168.5.41 192.168.5.42 192.168.5.43; do
ssh -i ~/.ssh/id_ansible jmartinez@$ip "hostname && echo 'OK'"
done5. Validate the Setup
Before moving to Phase 1, confirm SSH connectivity works to all nodes.
Ping All Nodes via SSH
for ip in 192.168.5.40 192.168.5.41 192.168.5.42 192.168.5.43; do
ssh -i ~/.ssh/id_ansible jmartinez@$ip "hostname && echo 'OK'" || echo "FAILED: $ip"
doneExpected output:
k3s-master-01
OK
k3s-worker-01
OK
k3s-worker-02
OK
k3s-worker-03
OK
Check Sudo Access
ssh -i ~/.ssh/id_ansible jmartinez@192.168.5.40 "sudo whoami"Should return root.
What’s Next
With the foundation in place, you now have:
- 5 VMs with static IPs and proper hostnames
- SSH key-based access from the control node to all hosts
Two paths from here:
- With AAP: Continue to Phase 1 to deploy AAP 2.6, then Phase 2 to orchestrate K3s from the web UI.
- Without AAP: Skip to Phase 2 and use the Vanilla Ansible commands to deploy the cluster from the CLI.