# Q8S: Emulation of Heterogeneous Kubernetes Clusters Using QEMU
## 3 Results
### Implementation
Q8S expects this to be an Ubuntu image. * name_of_initial_instance: The name of the starting instance in OpenStack. This is needed to update its security groups. * security_groups: The list of OpenStack security groups that should be added to each node. This list must at least contain q8s-cluster, which is the group configured for internal communication of the Kubernetes cluster. * required_tcp_ports: The list of TCP ports that should be opened in the q8s-cluster security group for inter-node communication. The list given in the example in Listing 1 should be kept, but further ports may be added. * required_udp_ports: The same as for TCP ports abovem but for UDP. * worker_port_range_min: This is the lower end of the port range that is to be opened in addition to the TCP ports specified above and used for Kubernetes container node ports. * worker_port_range_max: The high end of the port range as specified above. * master_node_flavor: The flavor to be used by additional control plane nodes. The flavor in OpenStack specifies the number of CPUs and amount of system memory OpenStack should allocate from a project quota to a specific VM. * number_additional_master_nodes: The number of control plane nodes that Q8S should deploy in addition to the starting instance. The control plane IP is always set to the IP of the node running Q8S and does not deploy failover mechanisms. Therefore, even if the created cluster includes multiple control plane nodes, it is not a high-availability (HA) deployment. * worker: The vm_types specified in the next section can be used here to indicate how many instances of a given type should be deployed by Q8S. The vm_types a user wishes to use should be each specified as a dictionary with the following fields:  
* architecture: System architecture of the emulated CPU. Our Q8S prototype supports x86_64 and ARM_64. * num_cpus: The number of emulated CPUs that should be available in the QEMU VM. * cpu_model: Specific CPU model that should be emulated by QEMU, which also determines the available CPU speed. The list of supported CPU models depends on QEMU and can be found in its documentation. * machine_model: Machine model requested through QEMU. This should be kept as virt. * ram: The amount of system memory to allocate for the QEMU VM in MB. * storage: Amount of storage to allocate for the QEMU VM in GB. * openstack_flavor: Flavor to use in OpenStack for the host. The flavor should include at least as many CPUs as the emulated node. ```
1!ClusterData
2 git_url:\"[[https://github.com/gwdg/pub-2025-Q8S.git](https://github.com/gwdg/pub-2025-Q8S.git)]([https://github.com/gwdg/pub-2025-Q8S.git](https://github.com/gwdg/pub-2025-Q8S.git))\"
3 private_network_id:\"cefe7c0a-network-ID-beh1-2d9d26b681b5\"
4 remote_ip_prefix:\"10.254.1.0/24\"
5 default_image_name:\"Ubuntu 22.04.4 Server x86_64 (ssd)\"
6 name_of_initial_instance:\"q8s-master\"
7 security_groups:
8-\"q8s-cluster\"
9 required_tcp_ports:
10-22
11-80
12-443
13-222
14-2379
15-2380
16-6443
17-8472
18-10250
19-10256
20-10257
21-10259
22 required_udp_ports:
23-8472
24 worker_port_range_min:30000
25 worker_port_range_max:32767
26 cluster_definition:!ClusterDefinition
27 master_node_flavor:\"c1.small\"
28 number_additional_master_nodes:1
29 worker:
30x86-small:2
31 arm-mid:1
32 vm_types:!VmTypes
33 types:
34x86-small:!VmType
35 architecture:\"x86_64\"
36 num_cpus:2
37 cpu_model:\"EPYC-IBPB\"
38 machine_model:\"virt\"
39 ram:2048
40 storage:10
41 openstack_flavor:\"c1.large\"
42 qemu_args:\"qemu-args\"
43 arm-mid:!VmType
44 architecture:\"arm_64\"
45 num_cpus:6
46 cpu_model:\"cortex-a57\"
47 machine_model:\"virt\"
48 ram:4096
49 storage:20
50 openstack_flavor:\"c1.large\"Deployment Process

Figure 2 gives a high-level overview of the Q8S workflow and the interactions between the components. To provide a more detailed insight to the involved steps for Q8S, the following presents the concrete operations that are executed in order:

1.