diff options
author | Monty Taylor <mordred@inaugust.com> | 2015-08-01 02:53:18 +1000 |
---|---|---|
committer | Monty Taylor <mordred@inaugust.com> | 2015-08-01 03:21:11 +1000 |
commit | 22ab0f1a87a61a84dc78721ecbdde43ec2b1c556 (patch) | |
tree | ec912b14a07cf7e1e046e4b9e957feb727e18800 /src/talks/now-what/index.html | |
parent | 71db6e4ca1962d708f2da6cf6e532ace38eabfba (diff) |
Add talks
Diffstat (limited to 'src/talks/now-what/index.html')
-rw-r--r-- | src/talks/now-what/index.html | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/src/talks/now-what/index.html b/src/talks/now-what/index.html new file mode 100644 index 0000000..ca21fa8 --- /dev/null +++ b/src/talks/now-what/index.html | |||
@@ -0,0 +1,436 @@ | |||
1 | <!doctype html> | ||
2 | <html lang="en"> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="utf-8"> | ||
6 | |||
7 | <title>OpenStack works ... so now what?</title> | ||
8 | |||
9 | <meta name="apple-mobile-web-app-capable" content="yes" /> | ||
10 | <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> | ||
11 | |||
12 | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> | ||
13 | |||
14 | <link rel="stylesheet" href="/css/reveal.css"> | ||
15 | <link rel="stylesheet" href="/css/theme/openstack.css" id="theme"> | ||
16 | |||
17 | <!-- For syntax highlighting --> | ||
18 | <link rel="stylesheet" href="/lib/css/zenburn.css"> | ||
19 | |||
20 | <!-- If the query includes 'print-pdf', include the PDF print sheet --> | ||
21 | <script> | ||
22 | if( window.location.search.match( /print-pdf/gi ) ) { | ||
23 | var link = document.createElement( 'link' ); | ||
24 | link.rel = 'stylesheet'; | ||
25 | link.type = 'text/css'; | ||
26 | link.href = '/css/print/pdf.css'; | ||
27 | document.getElementsByTagName( 'head' )[0].appendChild( link ); | ||
28 | } | ||
29 | </script> | ||
30 | |||
31 | </head> | ||
32 | <body> | ||
33 | |||
34 | <div class="reveal"><div class="slides"> | ||
35 | |||
36 | <section data-state="cover"> | ||
37 | |||
38 | <h1><span xmlns:dct="http://purl.org/dc/terms/" | ||
39 | href="http://purl.org/dc/dcmitype/InteractiveResource" | ||
40 | property="dct:title" | ||
41 | rel="dct:type"> | ||
42 | OpenStack works ... so now what? | ||
43 | </span></h1> | ||
44 | <h3 xmlns:cc="http://creativecommons.org/ns#" | ||
45 | property="cc:attributionName">Monty Taylor</h3> | ||
46 | <h4><a xmlns:cc="http://creativecommons.org/ns#" | ||
47 | rel="cc:attributionURL" | ||
48 | href='http://inaugust.com/talks/now-what.html'>http://inaugust.com/talks/now-what.html</a> </h4> | ||
49 | <h3> twitter: @e_monty </h3> | ||
50 | </section> | ||
51 | |||
52 | <section id="who-am-i-hp" class="slide level2"> | ||
53 | <h1>Who am I?</h1> | ||
54 | <img style="float:right; margin-right:24pt" src="/images/hp-logo.png"/> | ||
55 | <p> Distinguished Technologist </p> | ||
56 | <p> HP Cloud </p> | ||
57 | </section> | ||
58 | |||
59 | <section id="who-am-i-openstack" class="slide level2"> | ||
60 | <h1>Who am I?</h1> | ||
61 | <img style="float:right; margin-right:24pt" src="/images/openstack-cloud-software-vertical-large.png" /> | ||
62 | <p>Technical Committee</p> | ||
63 | <p>Foundation Board of Directors</p> | ||
64 | <p>Developer Infrastructure Core Team</p> | ||
65 | </section> | ||
66 | |||
67 | <section id="what-are-we-going-to-talk-about" class="slide level2"> | ||
68 | <h1>What are we going to talk about?</h1> | ||
69 | <ul> | ||
70 | <li>OpenStack</li> | ||
71 | <li>My application</li> | ||
72 | <li>Your applications</li> | ||
73 | </ul> | ||
74 | </section> | ||
75 | |||
76 | <section class="slide level2"> | ||
77 | <img src="/images/openstack-software-diagram.png" | ||
78 | alt="OpenStack" /> | ||
79 | </section> | ||
80 | |||
81 | <section class="slide level2"> | ||
82 | <p>As an application developer,<br /> | ||
83 | I want to deploy and run an application on the internet<br /> | ||
84 | so that my customers all over the world can consume it.</p> | ||
85 | </section> | ||
86 | |||
87 | <section class="slide level2"> | ||
88 | <p>As an application developer,<br /> | ||
89 | I want to deploy the application across multiple clouds<br /> | ||
90 | so that my service survives issues in any one of them.</p> | ||
91 | </section> | ||
92 | <section class="slide level2"> | ||
93 | <h1>THIS WORKS</h1> | ||
94 | <h3>I'm doing it myself as we speak</h3> | ||
95 | <img style="float:right; margin-right:24pt" src="/images/graphite.openstack.org.png"/> | ||
96 | |||
97 | |||
98 | <p class='fragment'>10-20k VMs per-day</p> | ||
99 | <p class='fragment'>3 (soon to be 6) clouds</p> | ||
100 | <p class='fragment'>Only using OpenStack APIs</p> | ||
101 | |||
102 | </section> | ||
103 | |||
104 | <section id="openstack-infra" data-transition='zoom'> | ||
105 | <h1>OpenStack Infra</h1> | ||
106 | </section> | ||
107 | |||
108 | <section id="tooling-automation-and-ci-for-openstack-project" class="slide level2" data-transition='zoom'> | ||
109 | <h1>Tooling, Automation and CI for OpenStack Project</h1> | ||
110 | </section> | ||
111 | |||
112 | <section id="developers" class="slide level2" data-transition='zoom'> | ||
113 | <h1>2000 Developers</h1> | ||
114 | </section> | ||
115 | |||
116 | <section id="gated-commits" class="slide level2" data-transition='zoom'> | ||
117 | <h1>Gated Commits</h1> | ||
118 | <p>Every commit is fully integration tested (twice) before landing</p> | ||
119 | </section> | ||
120 | |||
121 | <section id="each-test-runs-on-a-single-use-cloud-slave" class="slide level2" data-transition='zoom'> | ||
122 | <h1>Each Test Runs on a Single Use Cloud Slave</h1> | ||
123 | <p>This is that "cloud scale out" part</p> | ||
124 | </section> | ||
125 | |||
126 | <section id="million-test-jobs-in-the-last-6-months" class="slide level2" data-transition='zoom'> | ||
127 | <h1>1.7 Million Test Jobs in the last 6 Months</h1> | ||
128 | </section> | ||
129 | |||
130 | <section id="million-tests-in-a-month" class="slide level2" data-transition='zoom'> | ||
131 | <h1>15 Million Tests in a month</h1> | ||
132 | </section> | ||
133 | |||
134 | <section id="terabytes-of-log-data-in-six-months" class="slide level2" data-transition='zoom'> | ||
135 | <h1>18 Terabytes of Log Data in six months</h1> | ||
136 | </section> | ||
137 | |||
138 | <section id="we-have-no-servers" class="slide level2" data-transition='zoom'> | ||
139 | <h1>We have no servers</h1> | ||
140 | <p>It all runs across HP and Rackspace Public Clouds.</p> | ||
141 | </section> | ||
142 | |||
143 | <section id="architecture" class="slide level2"> | ||
144 | <h1>Architecture</h1> | ||
145 | <p><img src="/images/infra_architecture.jpg" alt="image" /></p> | ||
146 | </section> | ||
147 | |||
148 | <section class="slide level2"> | ||
149 | <h1>Gerrit</h1> | ||
150 | <ul> | ||
151 | <li class="fragment"> | ||
152 | Traditional 'Enterprise' Java Application</li> | ||
153 | <li class="fragment">Single Nova VM, Cinder Volume</li> | ||
154 | <li class="fragment">Scale out farm of git replicas</li> | ||
155 | </ul> | ||
156 | </section> | ||
157 | |||
158 | <section class="slide level2"> | ||
159 | <img src="/images/gerrit-graph.png" /> | ||
160 | </section> | ||
161 | |||
162 | <section class="slide level2"> | ||
163 | <h1>Fun Numbers</h1> | ||
164 | <ul> | ||
165 | <li>2500 changes every week</li> | ||
166 | <li>15000 change <em>revisions</em> every week</li> | ||
167 | <li>10,000 new changes every 42 days</li> | ||
168 | </ul> | ||
169 | </section> | ||
170 | |||
171 | <section class="slide level2"> | ||
172 | <img src="/images/what-happens.png" /> | ||
173 | </section> | ||
174 | |||
175 | <section class="slide level2"> | ||
176 | <h1>nodepool</h1> | ||
177 | <ul> | ||
178 | <li class="fragment">Cloud Native</li> | ||
179 | <li class="fragment"> | ||
180 | Purpose built in Python</li> | ||
181 | <li class="fragment">Keeps a pool of ready to go nodes</li> | ||
182 | <li class="fragment">Multi-cloud</li> | ||
183 | <li class="fragment">Fully elastic - responds to demand</li> | ||
184 | </ul> | ||
185 | </section> | ||
186 | |||
187 | <section class="slide level2"> | ||
188 | <img style="float:left; margin-left:24pt; width:35%;" src="/images/gerrit-graph.png" /> | ||
189 | <img style="float:right; margin-right:24pt; width: 50%;" src="/images/nodepool-graph.png" /> | ||
190 | </section> | ||
191 | |||
192 | <section class="slide level2"> | ||
193 | <h1>OpenStack Works!</h1> | ||
194 | <p class='fragment'>What next?</p> | ||
195 | <p class='fragment'>Make it easier</p> | ||
196 | </section> | ||
197 | |||
198 | <section class="slide level2"> | ||
199 | <h1>Basic things you want to do</h1> | ||
200 | |||
201 | <p class='fragment'>Get (make/fetch/find) a base image</p> | ||
202 | <p class='fragment'>Upload it to each cloud</p> | ||
203 | <p class='fragment'>Boot a VM on one or more of the clouds</p> | ||
204 | <p class='fragment'>Ensure it's on the Internet</p> | ||
205 | </section> | ||
206 | |||
207 | <section class="slide level2"> | ||
208 | <h1>We've made this harder than it should be</h1> | ||
209 | </section> | ||
210 | |||
211 | <section class="slide level2"> | ||
212 | <h1>Get a base image</h1> | ||
213 | <p class='fragment'>OpenStack diskimage-builder</p> | ||
214 | <p class='fragment'>packer</p> | ||
215 | <p class='fragment'>Download pre-built image from Ubuntu/RedHat/SuSE</p> | ||
216 | </section> | ||
217 | |||
218 | <section class="slide level2"> | ||
219 | <h1>Problem: hypervisor image file format</h1> | ||
220 | <ul> | ||
221 | <li class='fragment'> | ||
222 | Rackspace uses VHD | ||
223 | </li> | ||
224 | <li class='fragment'> | ||
225 | HP uses qcow2 | ||
226 | </li> | ||
227 | <li class='fragment'> | ||
228 | DreamHost uses RAW | ||
229 | </li> | ||
230 | </ul> | ||
231 | </section> | ||
232 | |||
233 | <section class="slide level2"> | ||
234 | <h1>Problem: image API version</h1> | ||
235 | <ul> | ||
236 | <li class='fragment'> | ||
237 | HP uses v1 | ||
238 | </li> | ||
239 | <li class='fragment'> | ||
240 | vexxhost uses v2 | ||
241 | </li> | ||
242 | </ul> | ||
243 | <p class="fragment">Good news! We made a plan for this at | ||
244 | the summit</p> | ||
245 | </section> | ||
246 | |||
247 | <section class="slide level2"> | ||
248 | <h1>Problem: image task vs. PUT</h1> | ||
249 | <pre> | ||
250 | swift upload --object-name local-image-filename images image-name | ||
251 | glance task-create | ||
252 | --type=import | ||
253 | --input='{"import_from": "images/image-name", | ||
254 | "image_properties" : {"name": "My Image Name"}}' | ||
255 | </pre> | ||
256 | <pre> | ||
257 | glance image-create --name=image-name --file=local-image-filename | ||
258 | </pre> | ||
259 | </section> | ||
260 | |||
261 | <section class="slide level2"> | ||
262 | <h1>Problem: Ensure it's on the Internet</h1> | ||
263 | <ul> | ||
264 | <li class='fragment'>Cloud has externally routable IP from neutron (RunAbove, OVH)</li> | ||
265 | <li class='fragment'>Cloud has externally routable IP neutron AND supports optional private tenant networks (vexxhost)</li> | ||
266 | <li class='fragment'>Cloud has private tenant network provided by neutron and requires floating IP (HP, Dreamhost)</li> | ||
267 | <li class='fragment'>Cloud only has private tenant network provided by nova-network and requires floating-ip for external routing (auro)</li> | ||
268 | <li class='fragment'>Cloud has externally routable IP from neutron but no neutron APIs (Rackspace)</li> | ||
269 | </ul> | ||
270 | </section> | ||
271 | |||
272 | <section class="slide level2"> | ||
273 | <h1>Maybe in code ...</h1> | ||
274 | <pre> | ||
275 | def get_server_external_ipv4(cloud, server): | ||
276 | if cloud.has_service('network'): | ||
277 | try: | ||
278 | server_ports = cloud.search_ports( | ||
279 | filters={'device_id': server.id}) | ||
280 | ext_nets = cloud.search_networks(filters={'router:external': True}) | ||
281 | except NeutronClientException as e: | ||
282 | pass # fall through | ||
283 | else: | ||
284 | for net in ext_nets: | ||
285 | for port in server_ports: | ||
286 | if net['id'] == port['network_id']: | ||
287 | for ip in port['fixed_ips']: | ||
288 | if _utils.is_ipv4(ip['ip_address']): | ||
289 | return ip['ip_address'] | ||
290 | ext_ip = get_server_ip(server, key_name='public') | ||
291 | if ext_ip is not None: | ||
292 | return ext_ip | ||
293 | for interfaces in server.addresses.values(): | ||
294 | for interface in interfaces: | ||
295 | if _utils.is_ipv4(interface['addr']) and \ | ||
296 | _utils.is_globally_routable_ipv4(interface['addr']): | ||
297 | return interface['addr'] | ||
298 | return None | ||
299 | </pre> | ||
300 | </section> | ||
301 | |||
302 | <section class="slide level2"> | ||
303 | <h1>I think we can do better than that</h1> | ||
304 | </section> | ||
305 | |||
306 | <section class="slide level2"> | ||
307 | <h1>What am I doing about it?</h1> | ||
308 | </section> | ||
309 | |||
310 | <section class="slide level2"> | ||
311 | <h1>os-client-config</h1> | ||
312 | <h3>http://git.openstack.org/cgit/openstack/os-client-config</h3> | ||
313 | <p>A library to handle config information for openstack clients</p> | ||
314 | <p>Tracks differences in vendors that can't be discovered</p> | ||
315 | <p>In use in python-openstackclient and ansible</p> | ||
316 | </section> | ||
317 | |||
318 | <section class="slide level2"> | ||
319 | <h1>os-client-config</h1> | ||
320 | <p>~/.config/openstack/clouds.yaml</p> | ||
321 | <pre> | ||
322 | clouds: | ||
323 | hp-mordred: | ||
324 | profile: hp | ||
325 | auth: | ||
326 | username: mordred@inaugust.com | ||
327 | password: XXXXXXXXXXXXX | ||
328 | project_name: mordred@inaugust.com | ||
329 | region_name: region-b.geo-1 | ||
330 | dreamhost: | ||
331 | profile: dreamhost | ||
332 | auth: | ||
333 | username: montay6 | ||
334 | project_name: dhc2111978 | ||
335 | password: XXXXXXXXXXXXX | ||
336 | region_name: RegionOne | ||
337 | </pre> | ||
338 | </section> | ||
339 | |||
340 | <section class="slide level2"> | ||
341 | <h1>shade</h1> | ||
342 | <h3>http://git.openstack.org/cgit/openstack-infra/shade</h3> | ||
343 | <p>A library to wrap business logic around client libraries</p> | ||
344 | <pre> | ||
345 | cloud.create_image('image-name', filename='image-filename.qcow2') | ||
346 | cloud.create_server('my-server', image='immage-name', auto_ip=True) | ||
347 | </pre> | ||
348 | <p>In use in Infra Nodepool and ansible</p> | ||
349 | </section> | ||
350 | |||
351 | <section class="slide level2"> | ||
352 | <h1>ansible</h1> | ||
353 | <p>Brand new modules, based on shade</p> | ||
354 | <p>Coming in 2.0 release</p> | ||
355 | <pre> | ||
356 | - os_keypair: | ||
357 | cloud: hp-mordred | ||
358 | name: mordred | ||
359 | public_key_file: ~/.ssh/id_rsa.pub | ||
360 | - os_image: | ||
361 | cloud: hp-mordred | ||
362 | name: Monty Ubuntu | ||
363 | file: ubuntu.vhd | ||
364 | - os_server: | ||
365 | cloud: hp-mordred | ||
366 | name: my-server | ||
367 | flavor_ram: 1024 | ||
368 | image: Monty Ubuntu | ||
369 | </pre> | ||
370 | </section> | ||
371 | |||
372 | <section class="slide level2"> | ||
373 | <h1>ansible</h1> | ||
374 | <p>multi-cloud support</p> | ||
375 | <pre> | ||
376 | - os_keypair: | ||
377 | cloud: "{{ item }" | ||
378 | name: mordred | ||
379 | public_key_file: ~/.ssh/id_rsa.pub | ||
380 | with-items: | ||
381 | - vexxhost | ||
382 | - rackspace | ||
383 | - mordred-hp | ||
384 | - ovh | ||
385 | </pre> | ||
386 | </section> | ||
387 | |||
388 | <section class="slide level2"> | ||
389 | <h1>What should we do about it?</h1> | ||
390 | <ul> | ||
391 | <li> | ||
392 | Get back to basics | ||
393 | </li><li> | ||
394 | shade existence is a bug | ||
395 | </li><li> | ||
396 | Make some decisions about divergences in the basic levels | ||
397 | </li><li> | ||
398 | Take a stand even if one of our product managers disagrees | ||
399 | </li><li> | ||
400 | Ensure that simple things are simple | ||
401 | </li> | ||
402 | </ul> | ||
403 | </section> | ||
404 | |||
405 | |||
406 | <section> | ||
407 | <h1> Thank you! </h1> | ||
408 | <h4> <a href='http://inaugust.com/talks/now-what.html'>http://inaugust.com/talks/now-what.html</a> </h4> | ||
409 | <h3> twitter: @e_monty </h3> | ||
410 | </section> | ||
411 | |||
412 | </div> | ||
413 | <div class="footer"> | ||
414 | <a rel="license" href="http://creativecommons.org/licenses/by/4.0/"> | ||
415 | <img alt="Creative Commons License" | ||
416 | style="border-width:0" | ||
417 | src="https://i.creativecommons.org/l/by/4.0/88x31.png" /> | ||
418 | </a><br /> | ||
419 | Licensed under a | ||
420 | <a rel="license" | ||
421 | href="http://creativecommons.org/licenses/by/4.0/"> | ||
422 | Creative Commons Attribution 4.0 International License | ||
423 | </a>. | ||
424 | <br /> | ||
425 | Source code available at <a href='http://git.inaugust.com/cgit/inaugust.com'>http://git.inaugust.com/cgit/inaugust.com</a> | ||
426 | </div> | ||
427 | |||
428 | </div> | ||
429 | |||
430 | <script src="/lib/js/head.min.js"></script> | ||
431 | <script src="/js/reveal.js"></script> | ||
432 | |||
433 | <script src="/js/this.js"></script> | ||
434 | |||
435 | </body> | ||
436 | </html> | ||