From 4cd6235ab7658c31a10330ce4be398c72c9e24ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Mon, 17 Apr 2017 13:27:24 -0500 Subject: [PATCH] add blackbelt speakers, toggle slides --- docs/blackbelt.png | Bin 0 -> 16634 bytes docs/index.html | 333 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 299 insertions(+), 34 deletions(-) create mode 100644 docs/blackbelt.png diff --git a/docs/blackbelt.png b/docs/blackbelt.png new file mode 100644 index 0000000000000000000000000000000000000000..d478fd8308e8411907515ccb8229851839809467 GIT binary patch literal 16634 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 -- @@ -130,15 +140,14 @@ at e.g. 9am, and start at 9:30. --> .small[ -- 09:00-09:15 hello -- 09:15-10:45 part 1 -- 10:45-11:00 coffee break -- 11:00-12:30 part 2 -- 12:30-13:30 lunch break -- 13:30-15:00 part 3 -- 15:00-15:15 coffee break -- 15:15-16:45 part 4 -- 16:45-17:00 Q&A +- 14:00-14:05 hello +- 14:05-14:50 part 1 +- 14:50-15:00 tea/coffee break + Q&A +- 15:00-15:50 part 2 +- 15:50-16:00 more tea/coffee + Q&A +- 16:00-16:50 part 3 +- 16:50-17:00 no tea/coffee, still Q&A +- 17:00-23:59 kombucha, beers, and more ] @@ -267,25 +288,25 @@ class: in-person class: in-person -## Chapter 3: operating the Swarm +## Chapter 3: operating the Swarm (advanced material) -- Breaking into an overlay network +- (Breaking into an overlay network) -- Securing overlay networks +- (Securing overlay networks) -- Rolling updates +- (Rolling updates) - (Secrets management and encryption at rest) -- [Centralized logging](#logging) +- ([Centralized logging](#logging)) -- Metrics collection +- (Metrics collection) --- class: in-person -## Chapter 4: bonus material +## Chapter 4: exploring Swarm - Dealing with stateful services @@ -543,8 +564,8 @@ You are welcome to use the method that you feel the most comfortable with. ## Brand new versions! -- Engine 17.03 -- Compose 1.11 +- Engine 17.05 +- Compose 1.12 - Machine 0.10 .exercise[ @@ -560,7 +581,7 @@ You are welcome to use the method that you feel the most comfortable with. --- -## Wait, what, 17.03 ?!? +## Wait, what, 17.05 ?!? -- @@ -670,9 +691,9 @@ class: extra-details - Containers can have network aliases (resolvable through DNS) -- Compose file version 2 makes each container reachable through its service name +- Compose file version 2+ makes each container reachable through its service name -- Compose file version 1 requires "links" sections +- Compose file version 1 required "links" sections - Our code can connect to services using their short name @@ -990,6 +1011,20 @@ killall docker-compose --- +## .blackbelt[Wednesday 13:30] + +Do you want to know exactly what your code is doing? + +Down to the microsecond? + +.small[(I want to say nanosecond but I don't want to be too presomptuous)] + +Flame graphs! Performance counters! Kernel tracing! + +Brendan Gregg will share with us the secrets of container peformance analysis. + +--- + ## Accessing internal services - `rng` and `hasher` are exposed on ports 8001 and 8002 @@ -1755,6 +1790,20 @@ Some presentations from the Docker Distributed Systems Summit in Berlin: --- +## .blackbelt[Tuesday 14:55] + +What is this "quorum" thing exactly? + +How does raft *actually* work? + +Can I blow up a Swarm cluster to bits and rebuild it from scratch? + +Docker Captain Laura Frank will answer all these questions! + +*"I dyed my hair red with the blood of offline manager nodes."* + +--- + ## Adding more manager nodes - Right now, we have only one manager (node1) @@ -3484,7 +3533,7 @@ You should now be able to connect to port 8000 and see the DockerCoins web UI. --- -# Breaking into an overlay network +# (Breaking into an overlay network) - We will create a dummy placeholder service on our network @@ -3908,7 +3957,7 @@ class: in-person --- -# Securing overlay networks +# (Securing overlay networks) - By default, overlay networks are using plain VXLAN encapsulation @@ -4037,7 +4086,31 @@ However, when you run the second one, only `#` will show up. --- -# Rolling updates +## .blackbelt[Tuesday 11:45] + +In a galaxy far far away ... + +-- + +The Death Star has a REST API, and the Empire protects it with L7 security policies ... + +-- + +Wait, what? + +-- + +Thomas Graf will present BPF and XDP, which are some *really cool* kernel tech. + +Then he'll show how Cilium leverages them to implement L7 security policies. + +Also he might or might not blow up Death Stars. + +.small[(In other news, BPF and XDP are also used by Facebook to achieve 10x performance improvements over IPVS LB.)] + +--- + +# (Rolling updates) - We want to release a new version of the worker @@ -4217,8 +4290,6 @@ Note: if you updated the roll-out parallelism, *rollback* will not rollback to t --- -class: swarmctl - ## Getting task information for a given node - You can see all the tasks assigned to a node with `docker node ps` @@ -4235,7 +4306,7 @@ class: swarmctl class: swarmtools -## SwarmKit debugging tools +# SwarmKit debugging tools - The SwarmKit repository comes with debugging tools @@ -4459,6 +4530,26 @@ Reminder: this is a very low-level tool, requiring a knowledge of SwarmKit's int --- +## .blackbelt[Wednesday 11:15] + +*"Docker takes security seriously."* + +-- + +Well, *everybody* takes security seriously, don't they? + +-- + +*"We don't give a 💩 about security!"* (Said no company ever) + +-- + +Come see how we reaccommodate security bugs, *one patch at a time*. + +With Michael Crosby, maintainer of the Engine, libcontainer, runc, containerd ... + +--- + class: secrets ## Secret management @@ -5242,6 +5333,24 @@ http://jpetazzo.github.io/2017/01/20/docker-logging-gelf/). --- +## .blackbelt[Tuesday 17:10] + +You want to implement surveillance? + +I mean – metrics collection? + +Gather CPU, RAM, I/O, etc. for all your nodes and containers? + +But also applications and business metrics? + +Julius Volz will show you what Prometheus can do for you! + +(Spoiler alert: a lot!) + +--- + +class: metrics + # Metrics collection - We want to gather metrics in a central place @@ -5252,6 +5361,8 @@ http://jpetazzo.github.io/2017/01/20/docker-logging-gelf/). --- +class: metrics + ## Node metrics - CPU, RAM, disk usage on the whole node @@ -5268,6 +5379,8 @@ http://jpetazzo.github.io/2017/01/20/docker-logging-gelf/). --- +class: metrics + ## Container metrics - Similar to node metrics, but not totally identical @@ -5288,6 +5401,8 @@ http://jpetazzo.github.io/2013/10/08/docker-containers-metrics/ --- +class: metrics + ## Tools We will build *two* different metrics pipelines: @@ -5302,6 +5417,8 @@ and PWD doesn't have that yet). --- +class: metrics + ## First metrics pipeline We will use three open source Go projects for our first metrics pipeline: @@ -5320,6 +5437,8 @@ We will use three open source Go projects for our first metrics pipeline: --- +class: metrics + ## Snap - [github.com/intelsdi-x/snap](https://github.com/intelsdi-x/snap) @@ -5338,6 +5457,8 @@ We will use three open source Go projects for our first metrics pipeline: --- +class: metrics + ## InfluxDB - Snap doesn't store metrics data @@ -5354,6 +5475,8 @@ We will use three open source Go projects for our first metrics pipeline: --- +class: metrics + ## Grafana - Snap cannot show graphs @@ -5366,6 +5489,8 @@ We will use three open source Go projects for our first metrics pipeline: --- +class: metrics + ## Getting and setting up Snap - We will install Snap directly on the nodes @@ -5383,6 +5508,8 @@ We will use three open source Go projects for our first metrics pipeline: --- +class: metrics + ## The Snap installer service - This will get Snap on all nodes @@ -5408,6 +5535,8 @@ for BIN in snapd snapctl; do ln -s /opt/snap/bin/$BIN /usr/local/bin/$BIN; done --- +class: metrics + ## First contact with `snapd` - The core of Snap is `snapd`, the Snap daemon @@ -5430,6 +5559,8 @@ for BIN in snapd snapctl; do ln -s /opt/snap/bin/$BIN /usr/local/bin/$BIN; done --- +class: metrics + ## Using `snapctl` to interact with `snapd` - Let's load a *collector* and a *publisher* plugins @@ -5452,6 +5583,8 @@ for BIN in snapd snapctl; do ln -s /opt/snap/bin/$BIN /usr/local/bin/$BIN; done --- +class: metrics + ## Checking what we've done - Good to know: Docker CLI uses `ls`, Snap CLI uses `list` @@ -5472,6 +5605,8 @@ for BIN in snapd snapctl; do ln -s /opt/snap/bin/$BIN /usr/local/bin/$BIN; done --- +class: metrics + ## Actually collecting metrics: introducing *tasks* - To start collecting/processing/publishing metric data, you need to create a *task* @@ -5493,6 +5628,8 @@ for BIN in snapd snapctl; do ln -s /opt/snap/bin/$BIN /usr/local/bin/$BIN; done --- +class: metrics + ## Our first task manifest ```yaml @@ -5515,6 +5652,8 @@ for BIN in snapd snapctl; do ln -s /opt/snap/bin/$BIN /usr/local/bin/$BIN; done --- +class: metrics + ## Creating our first task - The task manifest shown on the previous slide is stored in `snap/psutil-file.yml`. @@ -5541,6 +5680,8 @@ for BIN in snapd snapctl; do ln -s /opt/snap/bin/$BIN /usr/local/bin/$BIN; done --- +class: metrics + ## Checking existing tasks .exercise[ @@ -5560,6 +5701,8 @@ The output should look like the following: ``` --- +class: metrics + ## Viewing our task dollars at work - The task is using a very simple publisher, `mock-file` @@ -5579,6 +5722,8 @@ To exit, hit `^C` --- +class: metrics + ## Debugging tasks - When a task is not directly writing to a local file, use `snapctl task watch` @@ -5597,6 +5742,8 @@ To exit, hit `^C` --- +class: metrics + ## Stopping snap - Our Snap deployment has a few flaws: @@ -5609,16 +5756,22 @@ To exit, hit `^C` -- +class: metrics + - We want to change that! -- +class: metrics + - But first, go back to the terminal where `snapd` is running, and hit `^C` - All tasks will be stopped; all plugins will be unloaded; Snap will exit --- +class: metrics + ## Snap Tribe Mode - Tribe is Snap's clustering mechanism @@ -5638,6 +5791,8 @@ To exit, hit `^C` --- +class: metrics + ## Running Snap itself on every node - Snap runs in the foreground, so you need to use `&` or start it in tmux @@ -5655,6 +5810,8 @@ If you're *not* using Play-With-Docker, there is another way to start Snap! --- +class: metrics + ## Starting a daemon through SSH .warning[Hackety hack ahead!] @@ -5670,6 +5827,8 @@ If you're *not* using Play-With-Docker, there is another way to start Snap! --- +class: metrics + ## Running Snap itself on every node - I might go to hell for showing you this, but here it goes ... @@ -5693,6 +5852,8 @@ Remember: this *does not work* with Play-With-Docker (which doesn't have SSH). --- +class: metrics + ## Viewing the members of our tribe - If everything went fine, Snap is now running in tribe mode @@ -5710,6 +5871,8 @@ This should show the 5 nodes with their hostnames. --- +class: metrics + ## Create an agreement - We can now create an *agreement* for our plugins and tasks @@ -5732,6 +5895,8 @@ The output should look like the following: --- +class: metrics + ## Instruct all nodes to join the agreement - We dont need another fancy global service! @@ -5756,6 +5921,8 @@ The last bit of output should look like the following: --- +class: metrics + ## Start a container on every node - The Docker plugin requires at least one container to be started @@ -5775,6 +5942,8 @@ The last bit of output should look like the following: --- +class: metrics + ## Running InfluxDB - We will create a service for InfluxDB @@ -5795,6 +5964,8 @@ The last bit of output should look like the following: --- +class: metrics + ## Creating the InfluxDB service .exercise[ @@ -5819,6 +5990,8 @@ this breaks a few things.] --- +class: metrics + ## Setting up InfluxDB - We need to create the "snap" database @@ -5859,6 +6032,8 @@ Note: the InfluxDB query language *looks like* SQL but it's not. --- +class: metrics + ## Load Docker collector and InfluxDB publisher - We will load plugins on the local node @@ -5884,6 +6059,8 @@ Note: the InfluxDB query language *looks like* SQL but it's not. --- +class: metrics + ## Start a simple collection task - Again, we will create a task on the local node @@ -5907,6 +6084,8 @@ container. --- +class: metrics + ## If things go wrong... Note: if a task runs into a problem (e.g. it's trying to publish @@ -5925,6 +6104,8 @@ the task (it will delete+re-create on all nodes). --- +class: metrics + ## Check that metric data shows up in InfluxDB - Let's check existing data with a few manual queries in the InfluxDB admin interface @@ -5947,6 +6128,8 @@ the task (it will delete+re-create on all nodes). --- +class: metrics + ## Deploy Grafana - We will use an almost-official image, `grafana/grafana` @@ -5964,6 +6147,8 @@ the task (it will delete+re-create on all nodes). --- +class: metrics + ## Set up Grafana .exercise[ @@ -5982,6 +6167,8 @@ the task (it will delete+re-create on all nodes). --- +class: metrics + ## Add InfluxDB as a data source for Grafana .small[ @@ -6006,10 +6193,14 @@ If you see an orange box (sometimes without a message), it means that you got so --- +class: metrics + ![Screenshot showing how to fill the form](grafana-add-source.png) --- +class: metrics + ## Create a dashboard in Grafana .exercise[ @@ -6032,6 +6223,8 @@ At this point, you should see a sample graph showing up. --- +class: metrics + ## Setting up a graph in Grafana .exercise[ @@ -6053,10 +6246,14 @@ Congratulations, you are viewing the CPU usage of a single container! --- +class: metrics + ![Screenshot showing the end result](grafana-add-graph.png) --- +class: metrics + ## Before moving on ... - Leave that tab open! @@ -6067,6 +6264,8 @@ Congratulations, you are viewing the CPU usage of a single container! --- +class: metrics + ## Prometheus - Prometheus is another metrics collection system @@ -6084,6 +6283,8 @@ Congratulations, you are viewing the CPU usage of a single container! --- +class: metrics + ## It's all about the `/metrics` - This is was the *node exporter* looks like: @@ -6100,6 +6301,8 @@ Congratulations, you are viewing the CPU usage of a single container! --- +class: metrics + ## Collecting metrics with Prometheus on Swarm - We will run two *global services* (i.e. scheduled on all our nodes): @@ -6118,6 +6321,8 @@ Congratulations, you are viewing the CPU usage of a single container! --- +class: metrics + ## Creating an overlay network for Prometheus - This is the easiest step ☺ @@ -6133,6 +6338,8 @@ Congratulations, you are viewing the CPU usage of a single container! --- +class: metrics + ## Running the node exporter - The node exporter *should* run directly on the hosts @@ -6158,6 +6365,8 @@ Congratulations, you are viewing the CPU usage of a single container! --- +class: metrics + ## Running cAdvisor - Likewise, cAdvisor *should* run directly on the hosts @@ -6180,6 +6389,8 @@ Congratulations, you are viewing the CPU usage of a single container! --- +class: metrics + ## Configuring the Prometheus server This will be our configuration file for Prometheus: @@ -6205,6 +6416,8 @@ scrape_configs: --- +class: metrics + ## Passing the configuration to the Prometheus server - We need to provide our custom configuration to the Prometheus server @@ -6225,6 +6438,8 @@ scrape_configs: --- +class: metrics + ## Building our custom Prometheus image - We will use the local registry started previously on 127.0.0.1:5000 @@ -6245,6 +6460,8 @@ scrape_configs: --- +class: metrics + ## Running our custom Prometheus image - That's the only service that needs to be published @@ -6263,6 +6480,8 @@ scrape_configs: --- +class: metrics + ## Checking our Prometheus server - First, let's make sure that Prometheus is correctly scraping all metrics @@ -6281,6 +6500,8 @@ Their state should be "UP". --- +class: metrics + ## Displaying metrics directly from Prometheus - This is easy ... if you are familiar with PromQL @@ -6304,6 +6525,8 @@ Their state should be "UP". --- +class: metrics + ## Building the query from scratch - We are going to build the same query from scratch @@ -6318,6 +6541,8 @@ Their state should be "UP". --- +class: metrics + ## Displaying a raw metric for *all* containers - Click on the "Graph" tab on top @@ -6338,6 +6563,8 @@ Their state should be "UP". --- +class: metrics + ## Selecting metrics for a specific service - Hover over the lines in the graph @@ -6358,6 +6585,8 @@ Their state should be "UP". --- +class: metrics + ## Turn counters into rates - What we see is the total amount of CPU used (in seconds) @@ -6381,6 +6610,8 @@ Their state should be "UP". --- +class: metrics + ## Aggregate multiple data series - We have one graph per CPU; we want to sum them @@ -6408,6 +6639,8 @@ Their state should be "UP". --- +class: metrics + ## Comparing Snap and Prometheus data - If you haven't setup Snap, InfluxDB, and Grafana, skip this section @@ -6420,6 +6653,8 @@ Their state should be "UP". --- +class: metrics + ## Add Prometheus as a data source in Grafana .exercise[ @@ -6438,6 +6673,8 @@ We see the same input form that we filled earlier to connect to InfluxDB. --- +class: metrics + ## Connecting to Prometheus from Grafana .exercise[ @@ -6460,6 +6697,8 @@ Otherwise, double-check every field and try again! --- +class: metrics + ## Adding the Prometheus data to our dashboard .exercise[ @@ -6476,6 +6715,8 @@ This takes us to the graph editor that we used earlier. --- +class: metrics + ## Querying Prometheus data from Grafana The editor is a bit less friendly than the one we used for InfluxDB. @@ -6499,6 +6740,8 @@ The editor is a bit less friendly than the one we used for InfluxDB. --- +class: metrics + ## Interpreting results - The two graphs *should* be similar @@ -6521,6 +6764,8 @@ The editor is a bit less friendly than the one we used for InfluxDB. --- +class: metrics + ## More resources on container metrics - [Docker Swarm & Container Overview](https://grafana.net/dashboards/609), @@ -7071,11 +7316,31 @@ class: title --- +## .blackbelt[Wednesday 14:25] + +Don't get hacked! + +.small[(Especially by sketchy Russian groups, since it leads to privilege escalation and compromises Democracy. Just saying.)] + +Sign images! + +Require multiple keys for signature! + +Revoke compromised keys and reissue new ones easily! + +Prevent replay attacks and use of obsolete vulnerable software! + +Justin Cappos will tell you all about *securing the software supply chain!* + +.small[(This is Infosec! It's Very Important! Therefore I Am Allowed To Use Lots Of Exclamation Marks!)] + +--- + ## Work in progress -- Stabilize Compose/Swarm integration - + - Healthchecks @@ -7110,7 +7375,7 @@ class: title var slideshow = remark.create({ ratio: '16:9', highlightSpans: true, - excludedClasses: ["in-person"] + excludedClasses: ["self-paced", "extra-details", "metrics", "swarmtools", "secrets", "encryption-at-rest"] });