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