Ucloud » History » Version 8
Nico Schottelius, 07/21/2019 09:26 AM
1 | 1 | Ahmed Bilal | h1. ucloud (To Be Continued) |
---|---|---|---|
2 | |||
3 | 7 | Nico Schottelius | {{toc}} |
4 | |||
5 | 5 | Ahmed Bilal | |
6 | 6 | Ahmed Bilal | h2. Installation |
7 | |||
8 | **Note:** This installation guide assumes that the ~ is /root |
||
9 | |||
10 | * **Install QEMU** |
||
11 | <pre><code class="shell"> |
||
12 | sudo apt install qemu qemu-kvm |
||
13 | </code></pre> |
||
14 | |||
15 | |||
16 | * **Create Directory Structure** |
||
17 | <pre><code class="shell"> |
||
18 | mkdir /var/vm/ |
||
19 | mkdir /var/www/ |
||
20 | </code></pre> |
||
21 | |||
22 | |||
23 | * **Create User Directories** |
||
24 | <pre><code class="shell"> |
||
25 | mkdir /var/www/ahmedbilal-admin |
||
26 | mkdir /var/www/nico |
||
27 | mkdir /var/www/kjg |
||
28 | cd ~ |
||
29 | </code></pre> |
||
30 | |||
31 | * **Download and place Alpine Linux image in _/var/www/ahmedbilal-admin_** |
||
32 | <pre><code class="shell"> |
||
33 | wget https://www.dropbox.com/s/5eyryhxun6847hx/alpine.zip?dl=1 -O alpine.zip |
||
34 | unzip alpine.zip |
||
35 | mv alpine.qcow2 /var/www/ahmedbilal-admin |
||
36 | </code></pre> |
||
37 | |||
38 | * **Clone repos** |
||
39 | <pre><code class="shell"> |
||
40 | git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-api.git |
||
41 | git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-scheduler.git |
||
42 | git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-vm.git |
||
43 | git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-file-scan.git |
||
44 | git clone --recurse-submodules git@code.ungleich.ch:ungleich-public/ucloud-image-scanner.git |
||
45 | </code></pre> |
||
46 | |||
47 | |||
48 | h2. *+Put related .env inside all the above directories+* |
||
49 | |||
50 | * **Run "ucloud-api" as daemon** |
||
51 | <pre><code class="shell"> |
||
52 | cd ucloud-api |
||
53 | pipenv install |
||
54 | pipenv run gunicorn --bind [::]:80 main:app --daemon |
||
55 | wget https://www.dropbox.com/s/lyu3atymxyw3846/setup.py?dl=1 -O setup.py |
||
56 | pipenv run python setup.py |
||
57 | cd ~ |
||
58 | </code></pre> |
||
59 | |||
60 | * **Run "ucloud-scheduler" as daemon** |
||
61 | <pre><code class="shell"> |
||
62 | cd ucloud-scheduler |
||
63 | pipenv install |
||
64 | pipenv run python main.py &>/dev/null & |
||
65 | cd ~ |
||
66 | </code></pre> |
||
67 | |||
68 | * **Run "ucloud-vm" as daemon** |
||
69 | <pre><code class="shell"> |
||
70 | cd ucloud-vm |
||
71 | pipenv install |
||
72 | pipenv run python main.py /v1/host/1 --vm True &>/dev/null & |
||
73 | cd ~ |
||
74 | </code></pre> |
||
75 | |||
76 | * **Install ucloud-file-scan** |
||
77 | <pre><code class="shell"> |
||
78 | cd ucloud-file-scan |
||
79 | pipenv install |
||
80 | cd ~ |
||
81 | </code></pre> |
||
82 | |||
83 | * **Install ucloud-image-scanner** |
||
84 | <pre><code class="shell"> |
||
85 | cd ucloud-image-scanner |
||
86 | pipenv install |
||
87 | cd ~ |
||
88 | </code></pre> |
||
89 | |||
90 | * **Run @crontab -e@ and put these entries there and save by pressing @Ctrl+x@ then @y@ then @enter@** |
||
91 | <pre> |
||
92 | */1 * * * * (cd /root/ucloud-file-scan && /usr/local/bin/pipenv run python main.py) |
||
93 | */1 * * * * (cd /root/ucloud-image-scanner/ && /usr/local/bin/pipenv run python main.py) |
||
94 | </pre> |
||
95 | |||
96 | 1 | Ahmed Bilal | h2. ucloud-api |
97 | |||
98 | Outside world (indirect) communication with the internal systems. |
||
99 | |||
100 | Its responsibilities are |
||
101 | * Create VM *(Done)* POST _/vm/create_ |
||
102 | <pre><code class="javascript"> |
||
103 | { |
||
104 | "name": "username", |
||
105 | "realm": "user_realm", |
||
106 | "seed": "user_seed", |
||
107 | "specs": { |
||
108 | "cpu": 16, |
||
109 | "ram": 256, |
||
110 | 2 | Ahmed Bilal | "hdd": 2000, |
111 | "ssd": 256 |
||
112 | 1 | Ahmed Bilal | } |
113 | } |
||
114 | </code></pre> |
||
115 | |||
116 | * Delete VM *(Done)* POST _/vm/delete_ |
||
117 | <pre><code class="javascript"> |
||
118 | { |
||
119 | "name": "username", |
||
120 | "realm": "user_realm", |
||
121 | "seed": "user_seed", |
||
122 | "vmid": "id_of_virtual_machine" |
||
123 | } |
||
124 | </code></pre> |
||
125 | |||
126 | * Status VM *(Done)* GET _/vm/status_ |
||
127 | <pre><code class="javascript"> |
||
128 | { |
||
129 | "id": "id_of_virtual_machine" |
||
130 | } |
||
131 | </code></pre> |
||
132 | |||
133 | * Create new network |
||
134 | * Attach network to VM |
||
135 | * Detach network from VM |
||
136 | * Delete network |
||
137 | |||
138 | h2. ucloud-scheduler |
||
139 | |||
140 | 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 |
||
141 | |||
142 | 1. Virtual Machines Entries that looks like |
||
143 | <pre><code class="javascript"> |
||
144 | /v1/vm/1 |
||
145 | { |
||
146 | "owner": "ahmedbilal-admin", |
||
147 | "specs": { |
||
148 | "cpu": 20, |
||
149 | "ram": 2, |
||
150 | "hdd": 10, |
||
151 | 3 | Ahmed Bilal | "ssd": 10 |
152 | 1 | Ahmed Bilal | }, |
153 | "hostname": "", |
||
154 | "status": "REQUESTED_NEW" |
||
155 | } |
||
156 | </code></pre> |
||
157 | 2. Hosts Entries that look like |
||
158 | <pre><code class="javascript"> |
||
159 | /v1/host/1 |
||
160 | { |
||
161 | "cpu": 32, |
||
162 | "ram": 128, |
||
163 | "hdd": 1024, |
||
164 | 3 | Ahmed Bilal | "ssd": 0 |
165 | 1 | Ahmed Bilal | "status": "UP" |
166 | } |
||
167 | </code></pre> |
||
168 | |||
169 | 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 |
||
170 | |||
171 | <pre><code class="javascript"> |
||
172 | /v1/vm/1 |
||
173 | { |
||
174 | "owner": "ahmedbilal-admin", |
||
175 | "specs": { |
||
176 | "cpu": 20, |
||
177 | "ram": 2, |
||
178 | "hdd": 10, |
||
179 | 3 | Ahmed Bilal | "ssd": 10 |
180 | 1 | Ahmed Bilal | }, |
181 | "hostname": "/v1/host/1", |
||
182 | "status": "REQUESTED_NEW" |
||
183 | } |
||
184 | </code></pre> |
||
185 | |||
186 | *Note* the hostname key/value pair. |
||
187 | |||
188 | h2. ucloud-vm |
||
189 | It is responsible for creating (running) / deleting (stopping) / monitoring virtual machines |
||
190 | |||
191 | It watches the _/v1/vm/_ prefix for any changes like (Virtual Machines with status like *SCHEDULED_DEPLOY* or *REQUEST_DELETE*. |
||
192 | |||
193 | On, *SCHEDULED_DEPLOY* it creates the VM and run it. On, *REQUEST_DELETE* it stops the VM. |
||
194 | |||
195 | 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. |
||
196 | 8 | Nico Schottelius | |
197 | h2. Administrator Manual |
||
198 | |||
199 | (being written: how to setup the ucloud infrastructure) |
||
200 | |||
201 | h3. Requirements |
||
202 | |||
203 | ucloud is an opinionated cloud management framework. It is made to solve the problem of "virtual machine hosting" including migrations, scale out, etc. While there are many different ways on how to run, store and distribute VMs, there are not that many ways that work reliable and scale out. For this reason ucloud is based on existing software that has proven to be working for virtual machine hosting. |
||
204 | |||
205 | The following components are required for running ucloud: |
||
206 | |||
207 | 1. Python 3.7, pip, pipenv |
||
208 | 2. etcd |
||
209 | 3. ceph |
||
210 | |||
211 | Setting up these components is out of scope of this manual. |
||
212 | |||
213 | h2. User Manual |
||
214 | |||
215 | (being written: how to use ucloud as a user) |
||
216 | |||
217 | h3. Creating a VM |
||
218 | |||
219 | (to be filled in by ahmed) |
||
220 | |||
221 | |||
222 | h3. Deleting a VM |
||
223 | |||
224 | |||
225 | h2. API reference |
||
226 | |||
227 | (to be moved here by Ahmed) |