# Simulation
- This document mainly describe the simulation and experiment setup in IEEE1935 edge computing testbed system.
## Prerequisites:
1. Several static public IP(depends on how many clusters you want to have).
2. Several server(At least 1 physical machines for each cluster. That is, you may build a cluster using VMs on a physical machine) used as control and compute nodes(depends on how many clusters and how complex these clusters you want).
## Orchestrator level:
### How to prepare a virtual node:
- Create and modify the VM setting with the following command:
- You may find the image k8s_base.ova in the misc diretory.
```
vboxmanage import k8s_base.ova --vsys 0 --vmname {vmname} --cpus {#CPU} --memory {#memory}
vboxmanage modifyvm {vmname} --nic1 bridged --bridgeadapter1 {nic_name}
vboxmanage startvm {vmname} --type headless
```
- Check the IP address of the node:
```
vboxmanage showvminfo {vmname} | grep MAC
arp-scan -l | grep {MAC-address}
```
### Control Node settings:
- Init the cluster with the following command (run as a root user):
```
kubeadm init --apiserver-advertise-address={ip} --pod-network-cidr=172.16.0.0/16 --node-name={node_name}
```
- Cluster setting after init command (run as normal user):
```
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```
- Install calico pods:
```
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/calico.yaml
```
- Git Clone the microservice repo:
```
git clone https://github.com/Bhoopesh123/OpenTelemetry
cd opentelemetry-app
```
- Modify the yaml files at cluster 1:
- Remove service deployment yaml file for currencyservice.
```
rm deploy-currencyservice.yml
```
- Add endpointslice for the service at currencyservice microservice.
```
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: opentelemetry-demo-currencyservice-endpoint
labels:
kubernetes.io/service-name: opentelemetry-demo-currencyservice
addressType: IPv4
ports:
- name: tcp-service
port: {port}
endpoints:
- addresses:
- "{ip-addr}"
```
- Create yaml files at cluster 2:
- Create service-currencyservice.yml.
```
apiVersion: v1
kind: Service
metadata:
name: opentelemetry-demo-currencyservice
labels:
opentelemetry.io/name: opentelemetry-demo-currencyservice
app.kubernetes.io/instance: opentelemetry-demo
app.kubernetes.io/component: currencyservice
app.kubernetes.io/name: opentelemetry-demo-currencyservice
app.kubernetes.io/version: "1.5.0"
app.kubernetes.io/part-of: opentelemetry-demo
spec:
type: NodePort
ports:
- port: 8080
name: tcp-service
targetPort: 8080
selector:
opentelemetry.io/name: opentelemetry-demo-currencyservice
```
- Create deploy-currencyservice.yml.
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: opentelemetry-demo-currencyservice
labels:
opentelemetry.io/name: opentelemetry-demo-currencyservice
app.kubernetes.io/instance: opentelemetry-demo
app.kubernetes.io/component: currencyservice
app.kubernetes.io/name: opentelemetry-demo-currencyservice
app.kubernetes.io/version: "1.5.0"
app.kubernetes.io/part-of: opentelemetry-demo
spec:
selector:
matchLabels:
opentelemetry.io/name: opentelemetry-demo-currencyservice
template:
metadata:
labels:
opentelemetry.io/name: opentelemetry-demo-currencyservice
app.kubernetes.io/instance: opentelemetry-demo
app.kubernetes.io/component: currencyservice
app.kubernetes.io/name: opentelemetry-demo-currencyservice
spec:
serviceAccountName: opentelemetry-demo
containers:
- name: currencyservice
image: 'ghcr.io/open-telemetry/demo:1.5.0-currencyservice'
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: service
env:
- name: OTEL_SERVICE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.labels['app.kubernetes.io/component']
- name: OTEL_COLLECTOR_NAME
value: 'opentelemetry-demo-otelcol'
- name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE
value: cumulative
- name: CURRENCY_SERVICE_PORT
value: "8080"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://$(OTEL_COLLECTOR_NAME):4317
- name: OTEL_RESOURCE_ATTRIBUTES
value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo
resources:
limits:
memory: 20Mi
```
- Expose the local nodeport service to the public ip through GUI.
- Some useful debugging tools: grpcurl.
### Compute node settings:
- Use the following command to join the cluster(run as root user).
- The join_command could be found after the initialization of the cluster on the control node.
```
{join_command} --ignore-preflight-errors=all --node-name={node_name}
```
## Control Node level: