summaryrefslogtreecommitdiff
path: root/src/talks/now-what
diff options
context:
space:
mode:
Diffstat (limited to 'src/talks/now-what')
-rw-r--r--src/talks/now-what/index.html436
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>
250swift upload --object-name local-image-filename images image-name
251glance task-create
252 --type=import
253 --input='{"import_from": "images/image-name",
254 "image_properties" : {"name": "My Image Name"}}'
255 </pre>
256 <pre>
257glance 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>
275def 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>
322clouds:
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>
345cloud.create_image('image-name', filename='image-filename.qcow2')
346cloud.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>