Ucloud » History » Revision 6
Revision 5 (Ahmed Bilal, 07/02/2019 09:17 AM) → Revision 6/16 (Ahmed Bilal, 07/04/2019 10:28 AM)
h1. ucloud (To Be Continued)
h2. Requirements
1. Python 3.7, pip, pipenv
2. etcd
3. ceph
h2. Installation
**Note:** This installation guide assumes that the ~ is /root
* **Install QEMU**
<pre><code class="shell">
sudo apt install qemu qemu-kvm
</code></pre>
* **Create Directory Structure**
<pre><code class="shell">
mkdir /var/vm/
mkdir /var/www/
</code></pre>
* **Create User Directories**
<pre><code class="shell">
mkdir /var/www/ahmedbilal-admin
mkdir /var/www/nico
mkdir /var/www/kjg
cd ~
</code></pre>
* **Download and place Alpine Linux image in _/var/www/ahmedbilal-admin_**
<pre><code class="shell">
wget https://www.dropbox.com/s/5eyryhxun6847hx/alpine.zip?dl=1 -O alpine.zip
unzip alpine.zip
mv alpine.qcow2 /var/www/ahmedbilal-admin
</code></pre>
* **Clone repos**
<pre><code class="shell">
git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-api.git
git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-scheduler.git
git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-vm.git
git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-file-scan.git
git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-image-scanner.git
</code></pre>
h2. *+Put related .env inside all the above directories+*
* **Run "ucloud-api" as daemon**
<pre><code class="shell">
cd ucloud-api
pipenv install
pipenv run gunicorn --bind [::]:80 main:app --daemon
wget https://www.dropbox.com/s/lyu3atymxyw3846/setup.py?dl=1 -O setup.py
pipenv run python setup.py
cd ~
</code></pre>
* **Run "ucloud-scheduler" as daemon**
<pre><code class="shell">
cd ucloud-scheduler
pipenv install
pipenv run python main.py &>/dev/null &
cd ~
</code></pre>
* **Run "ucloud-vm" as daemon**
<pre><code class="shell">
cd ucloud-vm
pipenv install
pipenv run python main.py /v1/host/1 --vm True &>/dev/null &
cd ~
</code></pre>
* **Install ucloud-file-scan**
<pre><code class="shell">
cd ucloud-file-scan
pipenv install
cd ~
</code></pre>
* **Install ucloud-image-scanner**
<pre><code class="shell">
cd ucloud-image-scanner
pipenv install
cd ~
</code></pre>
* **Run @crontab -e@ and put these entries there and save by pressing @Ctrl+x@ then @y@ then @enter@**
<pre>
*/1 * * * * (cd /root/ucloud-file-scan && /usr/local/bin/pipenv run python main.py)
*/1 * * * * (cd /root/ucloud-image-scanner/ && /usr/local/bin/pipenv run python main.py)
</pre>
h2. ucloud-api
Outside world (indirect) communication with the internal systems.
Its responsibilities are
* Create VM *(Done)* POST _/vm/create_
<pre><code class="javascript">
{
"name": "username",
"realm": "user_realm",
"seed": "user_seed",
"specs": {
"cpu": 16,
"ram": 256,
"hdd": 2000,
"ssd": 256
}
}
</code></pre>
* Delete VM *(Done)* POST _/vm/delete_
<pre><code class="javascript">
{
"name": "username",
"realm": "user_realm",
"seed": "user_seed",
"vmid": "id_of_virtual_machine"
}
</code></pre>
* Status VM *(Done)* GET _/vm/status_
<pre><code class="javascript">
{
"id": "id_of_virtual_machine"
}
</code></pre>
* Create new network
* Attach network to VM
* Detach network from VM
* Delete network
h2. ucloud-scheduler
It schedules/reschedules VM that are created using ucloud-api. How does it schedules? It does by watching any changes under the _/v1/vm/_ prefix. Basically, it deals with two ETCD entries
1. Virtual Machines Entries that looks like
<pre><code class="javascript">
/v1/vm/1
{
"owner": "ahmedbilal-admin",
"specs": {
"cpu": 20,
"ram": 2,
"hdd": 10,
"ssd": 10
},
"hostname": "",
"status": "REQUESTED_NEW"
}
</code></pre>
2. Hosts Entries that look like
<pre><code class="javascript">
/v1/host/1
{
"cpu": 32,
"ram": 128,
"hdd": 1024,
"ssd": 0
"status": "UP"
}
</code></pre>
It loop through list of host entries found under _/v1/host/_ and check whether we can run the incoming VM on that host. if we can, then it (ucloud-scheduler) sets the hostname key of incoming VM to that host. Suppose, our scheduler decides that we can run the earlier shown VM _/v1/vm/1_ on _/v1/host/1_. Then, our updated entry would look like
<pre><code class="javascript">
/v1/vm/1
{
"owner": "ahmedbilal-admin",
"specs": {
"cpu": 20,
"ram": 2,
"hdd": 10,
"ssd": 10
},
"hostname": "/v1/host/1",
"status": "REQUESTED_NEW"
}
</code></pre>
*Note* the hostname key/value pair.
h2. ucloud-vm
It is responsible for creating (running) / deleting (stopping) / monitoring virtual machines
It watches the _/v1/vm/_ prefix for any changes like (Virtual Machines with status like *SCHEDULED_DEPLOY* or *REQUEST_DELETE*.
On, *SCHEDULED_DEPLOY* it creates the VM and run it. On, *REQUEST_DELETE* it stops the VM.
It is also responsible for monitoring VM statues i.e whether they are RUNNING or KILLED (in action). If a VM is killed we put that in log file, notify system administrator and restart it.