Skip to content

Instantly share code, notes, and snippets.

@ryanj
Last active May 17, 2018 03:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save ryanj/ca183fadb1f1d1cf4b00330e089ba8bd to your computer and use it in GitHub Desktop.
Save ryanj/ca183fadb1f1d1cf4b00330e089ba8bd to your computer and use it in GitHub Desktop.
"Introducing: Kubernetes - Three Steps to Achieving Scalable Cloud Native Apps" by @ryanj and @_AskCarter http://bit.ly/3steps2k8s
<section>
<section id="introducing-kubernetes">
<h1>Introducing: Kubernetes</h1>
<br/>
<h3>Three Steps to Achieving<br/>
Scalable Cloud Native Apps</h3>
<br/>
<p>BrightTALK: <a href="https://www.brighttalk.com/webcast/14601/258883">An Intro to Kubernetes Concepts - May 11, 2017</a></p>
<p class='fragment grow'>Slides: <a href="http://bit.ly/3steps2k8s">bit.ly/3steps2k8s</a></p>
</section>
<section data-state='blackout' data-background-color="#000000" id='presented-by'>
<p>presented by&hellip;</p>
<div class='fragment fade-right' style='width:45%; float:left;'>
<p><a href="http://twitter.com/ryanj/"><img alt="ryanj" src="http://ryanjarvinen.com/images/ryanj-mestrefungo-com.gif" style="width:70%" /></p>
<p><a href="http://twitter.com/ryanj/">Ryan Jarvinen</a><br/>Developer Advocate at CoreOS</p>
</div>
<div class='fragment fade-up' style='width:10%;float:left;margin-top: 13%;font-size: 250%;font-weight: bold;'>&amp;</div>
<div class='fragment fade-left' style='width:45%; float:left;'>
<p><a href="http://twitter.com/_askcarter/"><img alt="AskCarter" src="https://pbs.twimg.com/profile_images/849506708930138113/ZKoBd67m.jpg" style="width:70%"/></p>
<p><a href="http://twitter.com/_askcarter/">Carter Morgan</a><br/>Developer Advocate at Google</p>
</div>
</section>
<section id='coreos' data-markdown>
brought to you by
![CoreOS Logo](http://i.imgur.com/DRm4KEq.png "")
Helping *Secure the Internet* with automated security updates
</section>
</section>
<section data-transition='convex'>
<section data-transition='concave' id='overview'>
<h2>Three Steps</h2>
<h4>to Achieving Scalable Cloud Native Apps:</h4>
<br/>
<ol style="list-style-type:none;">
<li class='fragment fade-up'><h3><a href="#/packaging-and-distribution">Step1: Packaging your Applications</a></h3>
<!-- <ul style="list-style-type:none;">
<li style='padding-left:99px;'><a href="#/build">Build and Deploy</a></li><br/>
</ul> -->
</li>
<li class='fragment fade-up'><h3><a href="#/high-availability">Step2: Scaling your Applications</a></h3>
<!-- <ul style="list-style-type:none;">
<li style='padding-left:99px;'><a href="#/deployment">Scale and Automate</a></li><br/>
</ul> -->
</li>
<li class='fragment fade-up'><h3><a href="#/management">Step3: Maintaining your Applications</a></h3>
<!-- <ul style="list-style-type:none;">
<li style='padding-left:99px;'><a href="#/rolling-deployments">Management and Upgrades</a></li>
</ul> -->
</li>
</ol>
</section>
</section>
<section data-transition='concave'>
<section data-transition='concave-in slide-out' id='packaging-and-distribution' data-markdown>
# Step1: Packaging Applications
</section>
<section data-transition='concave' id="q1" data-markdown>
> "Q: How do I package and distrubte apps for mutliple cloud environments?"
</section>
<section data-transition='fade' id='containers' data-markdown>
# Containers!
</section>
<section data-transition='zoom' id='microservices' data-markdown>
### from monoliths to microservices
![monoliths vs microservices](http://i.imgur.com/KFkNQi2.png)
</section>
<section id='package-demo'>
<a href="https://lh3.googleusercontent.com/RUhHFtLmAAfe88h67RyhJPSdF_1-ZshltnE382DMDttH5FY3PSl77JHY4ooWMGvNtkPItN7J4wFY0bUzbf3bMUHKzVt-_qiIMK3mwJrKwpcKbY1cQ442GiL3kIyTz1OfTxO3IcZPYGqNWvSKsWgo1EvtiBgUNLw-28nOVP3sLOwEsKNWRN1HIcNx3cAgj4hQ1j9nyy0rDzzxKtRlgQAg4LgJ3a4bCaWjQguiGesh7ZZ_P9vxt5lp7KV62Ila5ui8iknewnIZCw8La4FfVpTt7NhdTKzUIiiltJiqd5uP-rVYMa-EuhmBTnPUnse9Tm0_kfCS2jwd4Q6AY3jebAnUOlDD9TaMETDOg_ENaN7RwxEWmRqNwJm2e8VemE5PKguFO5dBN1Gf9N5o4n3vnTrDtNBP--AAlTL200ghHWqZJbP9i7M6qMyBht1zO-kb4NAMsMxIR_FJulzkOIfy8kp2pAZISNoMAmwJZwQzX0YWWfx9T1jqGCqqX1YKL8D4KUR-ZoDexRx5L01lFwvVBTvc90UPF16o8DcYY6Vx8zvJPFXmMDhC_22JorHl1e7h4uRw5hseHiLr=w2468-h1108"><img alt="demo: Packaging Applications" src="https://lh3.googleusercontent.com/RUhHFtLmAAfe88h67RyhJPSdF_1-ZshltnE382DMDttH5FY3PSl77JHY4ooWMGvNtkPItN7J4wFY0bUzbf3bMUHKzVt-_qiIMK3mwJrKwpcKbY1cQ442GiL3kIyTz1OfTxO3IcZPYGqNWvSKsWgo1EvtiBgUNLw-28nOVP3sLOwEsKNWRN1HIcNx3cAgj4hQ1j9nyy0rDzzxKtRlgQAg4LgJ3a4bCaWjQguiGesh7ZZ_P9vxt5lp7KV62Ila5ui8iknewnIZCw8La4FfVpTt7NhdTKzUIiiltJiqd5uP-rVYMa-EuhmBTnPUnse9Tm0_kfCS2jwd4Q6AY3jebAnUOlDD9TaMETDOg_ENaN7RwxEWmRqNwJm2e8VemE5PKguFO5dBN1Gf9N5o4n3vnTrDtNBP--AAlTL200ghHWqZJbP9i7M6qMyBht1zO-kb4NAMsMxIR_FJulzkOIfy8kp2pAZISNoMAmwJZwQzX0YWWfx9T1jqGCqqX1YKL8D4KUR-ZoDexRx5L01lFwvVBTvc90UPF16o8DcYY6Vx8zvJPFXmMDhC_22JorHl1e7h4uRw5hseHiLr=w2468-h1108"/></a>
</section>
</section>
<section data-transition='concave-in slide-out' >
<section data-transition='concave-in slide-out' id='high-availability' data-markdown>
# Step2: Scaling Applications
</section>
<section data-transition='convex-in zoom-out' id="q2" data-markdown>
> "Q: How do I manage containers on multiple machines?"
</section>
<section data-transition='fade' id='ha-problems'>
<h4>Needs:</h4>
<ul style="list-style-type:checkmark;">
<li class='fragment'>scheduling</li>
<li class='fragment'>monitoring</li>
<li class='fragment'>scaling</li>
<li class='fragment'>configuration</li>
<li class='fragment'>service discovery</li>
<li class='fragment'>security</li>
<li class='fragment'>health</li>
<li class='fragment'>upgrades</li>
</ul>
</section>
<section data-transition='concave-in convex-out' id='kubernetes'>
<h1>Kubernetes!</h1>
<p><img src="https://pbs.twimg.com/profile_images/511909265720614913/21_d3cvM.png" alt="kubernetes" style='width:30%;'></p>
</section>
<section data-transition="slide-in slide-out" id='k8s-is'>
<h3>Kubernetes is...</h3>
<ol>
<li class='fragment fade-left'>Open Source, with a huge community following</li>
<li class='fragment fade-left'>A container automation framework</li>
<li class='fragment fade-left'>Representing years of Google-scale industry experience</li>
<li class='fragment fade-left'>A distributed-solutions modeling language</li>
</ol>
</section>
<section data-transition="fade-in slide-out" id='deploy-and-scale-demo'>
<a href="https://lh3.googleusercontent.com/CsUmf8KdMXiOrz1NCSx9tcvHeSdqD3QcKI7x94uoFD17IMs10YxA3WMrWLiQquaFNcgLOqtpW-g7qF75zzrZA-BsY2CJBPiVDw2ae8JTyVSoN8gxv1Vmt_my664c8nAncN_ZLComcRQ4d9JoxKoC9_vqGTRhQ87dniHoY5-h2o_jMqoAPBVhLBLz4Mhfh348ZK8xV4XzfVkbCZB6A17N0q7TRfewVShYrLfNXoEGyi93dOWbkCeAFvH_9_-TEUyyp24fev6o_aws6sJ3QSAyQTbaeuTZPAIojjEvni2oiqfgo09cmdXWHQwdyjcfzMr2tcKBuwlQoIJHrBOPJon_KlkAv-H703J-f6URUB_KsYnk_SBC7m1OiHctABscGUk8qX5_-p7boi0rcl56tY63VlQQsQ2AVJJ1p107Ufb3Q9OYxIRB2-15QRpF3EQECTUzNl920gNPSKyL5frRc86nBsnYLcypsFi9nC3tz2vctjLFKJED0QGKIwlUfhQSY93wGAEcNvPYgvNdYe7on0JzejPGn59u23zYvW1KgcMKGIz2fuLRvVRnCooyx-U5sTxfA2e3u36c=w2468-h1108"><img alt="demo: Deploy and Scale Applications" src="https://lh3.googleusercontent.com/CsUmf8KdMXiOrz1NCSx9tcvHeSdqD3QcKI7x94uoFD17IMs10YxA3WMrWLiQquaFNcgLOqtpW-g7qF75zzrZA-BsY2CJBPiVDw2ae8JTyVSoN8gxv1Vmt_my664c8nAncN_ZLComcRQ4d9JoxKoC9_vqGTRhQ87dniHoY5-h2o_jMqoAPBVhLBLz4Mhfh348ZK8xV4XzfVkbCZB6A17N0q7TRfewVShYrLfNXoEGyi93dOWbkCeAFvH_9_-TEUyyp24fev6o_aws6sJ3QSAyQTbaeuTZPAIojjEvni2oiqfgo09cmdXWHQwdyjcfzMr2tcKBuwlQoIJHrBOPJon_KlkAv-H703J-f6URUB_KsYnk_SBC7m1OiHctABscGUk8qX5_-p7boi0rcl56tY63VlQQsQ2AVJJ1p107Ufb3Q9OYxIRB2-15QRpF3EQECTUzNl920gNPSKyL5frRc86nBsnYLcypsFi9nC3tz2vctjLFKJED0QGKIwlUfhQSY93wGAEcNvPYgvNdYe7on0JzejPGn59u23zYvW1KgcMKGIz2fuLRvVRnCooyx-U5sTxfA2e3u36c=w2468-h1108"/></a>
</section>
</section>
<section data-transition='concave'>
<section id='kubernetes-basics' data-markdown>
# Kuberenetes Basics
</section>
<section data-transition="concave" id='pods'>
<h2>Pods</h2>
<div style='width:50%;float:left;margin-top:7%'>
<ul>
<li>One or more physically co-located containers</li>
<li>Shared namespaces, volumes</li>
<li>One IP address per Pod</li>
<li>Your minimum increment of scale</li>
</ul>
</div>
<div style='width:50%;float:right;'><img src="http://i.imgur.com/DK6sAne.png" alt="pod diagram"/></div>
</section>
<section data-transition="convex-in fade-out" id='labels-1'>
<h2>Labels</h2>
<div>
<div style='float:right;width:50%;'><img src="http://i.imgur.com/9VRtgxW.png" alt="label diagram"/></div>
<div style='width:50%;float:left;margin-top:2%'>
<p>Arbitrary metadata attached to any API object</p>
<ul>
<li>Queryable by Selectors</li>
<li>How Kubernetes does grouping</li>
</ul>
</div>
</div>
</section>
<section data-transition="fade" id='labels-2'>
<h2>Labels</h2>
<div>
<div style='float:right;width:50%;'><img src="http://i.imgur.com/c9S5jxV.png" alt="label selector 1"/></div>
<div style='width:50%;float:left;margin-top:2%'>
<p>Arbitrary metadata attached to any API object</p>
<ul>
<li>Queryable by Selectors</li>
<li>How Kubernetes does grouping</li>
</ul>
<p>selector: version=v1</p>
</div>
</div>
</section>
<section data-transition="fade-in slide-out" id='labels-3'>
<h2>Labels</h2>
<div>
<div style='float:right;width:50%;'><img src="http://i.imgur.com/lVZtzJU.png" alt="label selector 2"/></div>
<div style='width:50%;float:left;margin-top:2%'>
<p>Arbitrary metadata attached to any API object</p>
<ul>
<li>Queryable by Selectors</li>
<li>How Kubernetes does grouping</li>
</ul>
<p>selector: track=stable</p>
</div>
</div>
</section>
<section id='services-1'>
<h2>Services</h2>
<div style='width:50%;float:left;'>
<p>Persistent IPs for Pods</p>
<ul>
<li>Uses Labels to target Pods</li>
<li><span class='fragment highlight-red'>Internal</span> or <span class='fragment highlight-blue'>External</span> IPs</li>
</ul>
</div>
<div style='width:50%;float:left;'><img src="http://i.imgur.com/sMhH2g4.png" alt="service diagram"/></div>
</section>
<!--
<section id='thermostat'>
</section>
-->
<section data-transition='slide-in fade-out' id='declarative'>
<h2>Deployments</h2>
<p>Drive current state toward desired state</p>
<img class='fragment' src="http://i.imgur.com/nwDyBar.png" alt='spec-and-status' />
</section>
<section data-transition='fade' id='status-spec-1'>
<h2>Deployments</h2>
<p>Drive current state toward desired state</p>
<img src="http://i.imgur.com/RsLKxl7.png" alt='spec-and-status' />
</section>
<section data-transition='fade' id='status-spec-2'>
<h2>Deployments</h2>
<p>Drive current state toward desired state</p>
<img src="http://i.imgur.com/ymringQ.png" alt='spec-and-status' />
</section>
<section data-transition='fade' id='status-spec-3'>
<h2>Deployments</h2>
<p>Drive current state toward desired state</p>
<img src="http://i.imgur.com/krWSeXU.png" alt='spec-and-status' />
</section>
<section data-transition='fade-in slide-out' id='status-spec-4'>
<h2>Deployments</h2>
<p>Drive current state toward desired state</p>
<img src="http://i.imgur.com/NJt7SFt.png" alt='spec-and-status' />
</section>
<!--
<section id='an-api' data-markdown>
## Kubernetes provides an API
API object primitives include the following attributes:
1. kind
2. apiVersion
3. metadata
4. spec
5. status
*mostly true
</section>
<section data-transition="linear" id='terminology' data-markdown>
### Basic K8s Terminology
1. [node](#/node)
2. [pod](#/po)
3. [service](#/svc)
4. [deployment](#/deploy)
5. [replicaSet](#/rs)
</section>
</section>
<section>
<section data-transition="linear" id='node' data-markdown>
### Node
A node is a host machine (physical or virtual) where containerized processes run.
Node activity is managed via one or more Master instances.
</section>
<section>
<p>Try using <code>kubectl</code> to list resources by type:</p>
<pre><code contenteditable>kubectl get nodes</code></pre>
<p>Request the same info, but output the results as structured yaml:</p>
<pre><code contenteditable>kubectl get nodes -o yaml</code></pre>
<p>Fetch an individual resource by <code>type/id</code>, output as <code>json</code>:</p>
<pre><code contenteditable>kubectl get node/minikube -o json</code></pre>
<p>View human-readable API output:</p>
<pre><code contenteditable>kubectl describe node/minikube</code></pre>
</section>
<section data-markdown>
### Observations:
* Designed to exist on multiple machines (distributed system)
* high availability of nodes
* platform scale out
* The API ambidextriously supports both json and yaml
</section>
</section>
<section>
<section data-transition="linear" id='po' data-markdown>
### Pod
A group of one or more co-located containers. Pods represent your minimum increment of scale.
> "Pods Scale together, and they Fail together" @theSteve0
</section>
<section>
<p>List resources by type:</p>
<pre><code contenteditable>kubectl get pods</code></pre>
<p>Create a new resource based on a json object specification:</p>
<pre><code contenteditable>curl https://raw.githubusercontent.com/ryanj/metrics-k8s/master/pod.json</code></pre>
<pre><code contenteditable>kubectl create -f https://raw.githubusercontent.com/ryanj/metrics-k8s/master/pod.json</code></pre>
<p>List resources by type:</p>
<pre><code contenteditable>kubectl get pods</code></pre>
<p>Fetch a resource by type and id, output the results as <code>yaml</code>:</p>
<pre><code contenteditable>kubectl get pod metrics-k8s -o yaml</code></pre>
<p>Notice any changes?</p>
</section>
<section data-markdown>
### Observations:
* pods are scheduled to be run on nodes
* asyncronous fulfilment of requests
* declarative specifications
* automatic health checks, lifecycle management for containers (processes)
</section>
</section>
<section>
<section data-transition="linear" id='svc' data-markdown>
### Service
Services (svc) establish a single endpoint for a collection of replicated pods, distributing inbound traffic based on label selectors
In our K8s modeling language they represent a load balancer. Their implementation often varies per cloud provider
</section>
<section id='services'>
<h3>Contacting your App</h3>
<p>Expose the pod by creating a new <code>service</code> (or "loadbalancer"):</p>
<pre><code contenteditable>kubectl expose pod/metrics-k8s --port 2015 --type=NodePort</code></pre>
<p>Contact your newly-exposed pod using the associated service id:</p>
<pre><code contenteditable>minikube service metrics-k8s</code></pre>
<p>Schedule a pod to be deleted:</p>
<pre><code contenteditable>kubectl delete pod metrics-k8s</code></pre>
<p>Contact the related service. What happens?:</p>
<pre><code contenteditable>minikube service metrics-k8s</code></pre>
<p>Delete the service:</p>
<pre><code contenteditable>kubectl delete service metrics-k8s</code></pre>
</section>
<section data-markdown>
### Observations:
* *"service"* basically means *"loadbalancer"*
* Pods and Services exist independently, have disjoint lifecycles
</section>
</section>
<section>
<section data-transition="linear" id='deploy' data-markdown>
### Deployment
A `deployment` helps you specify container runtime requirements (in terms of pods)
</section>
<section>
<p>Create a specification for your <code>deployment</code>:</p>
<pre><code contenteditable>kubectl run metrics-k8s --image=quay.io/ryanj/metrics-k8s \
--expose --port=2015 --service-overrides='{ "spec": { "type": "NodePort" } }' \
--dry-run -o yaml > deployment.yaml</code></pre>
<p>View the generated deployment spec file:</p>
<pre><code contenteditable>cat deployment.yaml</code></pre>
<p><i><b>Bug!:</b></i> Edit the file, adding "<code>---</code>" (on it's own line) between resource 1 and resource 2 for a workaround.</p>
<p>Can you think of another way to fix this issue? json compatible?</p>
</section>
<section>
<p>Create a new resource based on your yaml specification:</p>
<pre><code contenteditable>kubectl create -f deployment.yaml</code></pre>
<p>List resources by type:</p>
<pre><code contenteditable>kubectl get po,svc</code></pre>
<p>Connect to your new deployment via the associated service id:</p>
<pre><code contenteditable>minikube service metrics-k8s</code></pre>
</section>
<section id='replication'>
<h2>Replication</h2>
<p>Scale up the <code>metrics-k8s</code> deployment to 3 replicas:</p>
<pre><code contenteditable>kubectl scale deploy/metrics-k8s --replicas=3</code></pre>
<p>List pods:</p>
<pre><code contenteditable>kubectl get po</code></pre>
</section>
<section>
<p>Edit <code>deploy/metrics-k8s</code>, setting <code>spec.replicas</code> to <code>5</code>:</p>
<pre><code contenteditable>kubectl edit deploy/metrics-k8s -o json</code></pre>
<p>Save and quit. What happens?</p>
<pre><code contenteditable>kubectl get pods</code></pre>
</section>
<section id='autorecovery'>
<h2>AutoRecovery</h2>
<p>Watch for changes to <code>pod</code> resources:</p>
<pre><code contenteditable>kubectl get pods --watch</code></pre>
<p>In another terminal, delete several pods by id:</p>
<pre><code contenteditable>kubectl delete pod $(kubectl get pods | grep ^metrics-k8s | cut -f1 -s -d' ' | head -n 3 | tr '\n' ' ')</code></pre>
<p>What happend? How many pods remain?</p>
<pre><code contenteditable>kubectl get pods</code></pre>
</section>
<section data-markdown>
### Observations:
* Use the `--dry-run` flag to generate new resource specifications
* A deployment spec contains a pod spec
</section>
</section>
<section>
<section data-transition="linear" id='rs' data-markdown>
### ReplicaSet
A `replicaset` provides replication and lifecycle management for a specific image release
</section>
<section>
<p>Watch deployments (leave this running until the 'cleanup' section):</p>
<pre><code contenteditable>kubectl get deploy --watch</code></pre>
<p>View the current state of your deployment:</p>
<pre><code contenteditable>minikube service metrics-k8s</code></pre>
</section>
<section>
<h3>Rollouts</h3>
<p>Update your deployment's image spec to rollout a new release:</p>
<pre><code contenteditable>kubectl set image deploy/metrics-k8s metrics-k8s=quay.io/ryanj/metrics-k8s:v1</code></pre>
<p>Reload your browser to view the state of your deployment</p>
<pre><code contenteditable>kubectl get rs,deploy</code></pre>
</section>
<section>
<h3>Rollbacks</h3>
<p>View the list of previous rollouts:</p>
<pre><code contenteditable>kubectl rollout history deploy/metrics-k8s</code></pre>
<p>Rollback to the previous state:</p>
<pre><code contenteditable>kubectl rollout undo deployment metrics-k8s</code></pre>
<p>Reload your browser to view the state of your deployment</p>
</section>
<section>
<h3>Cleanup</h3>
<p>Cleanup old resources if you don't plan to use them:</p>
<pre><code contenteditable>kubectl delete service,deployment metrics-k8s</code></pre>
<p>Close any remaining <code>--watch</code> listeners</p>
</section>
<section data-markdown>
### Observations:
* The API allows for watch operations (in addition to get, set, list)
* ReplicaSets provide lifecycle management for pod resources
* Deployments create ReplicaSets to manage pod replication per rollout (per change in podspec: image:tag, environment vars)
</section>
</section>
<section id='' data-markdown>
###
</section>
<section id='' data-markdown>
###
</section>
-->
<section id='config-demo'>
<a href="https://lh3.googleusercontent.com/ebk9kBcralLgs2dmMDAP7QBtA172zz-v9Xcbzm5CKvvwm6LDSgb8Q9BFmjAbLWnUgW43eJjPE0ebawkZBEicqawqZRoLyNdHx_B6S7zfY7UOuJqMfs2XQBtMZrefNyiB5Xt2j3kx0RKLlugUtN6suwB8a0VNqa4OhLiUlg2CwZJY37RhCZYMIXrRqGgBntmt0nNrgvjPanUDvdwvmkGAaB7KlYAK6HGnZxIkMxyEbH2DJ3N--5iBZ5J0MaEN44kKJ-Kh5SB1HabCb5NbCbYGE5NFtinGsXJVOkNJHvSGc8r8yob9EBnoNyp2P6n27r8oYSXVnafdHIHDvdfyCvC59SRyLbGYwh_A8prUwO0omGN40NJVERzUtNi-hYWAw7hraCGTDrHib23Co_kOP5waZDmXr8FNe2_vBXqPLfO7ijvMDlv1VYmcJoTSc4yker7kWb_1R5iS3lsNyZbAaX9m3mCIML7CFeopk564ZgLiK5vWnhrs3MfigIl2rmktQagzeJxsoSaGsiIPQkbAi_fOQFus03qxL9RXt69QyyVs97WWBgYJtkKkKhtI0AmWnaINwbsWYQCv=w2468-h1108"><img alt="demo: Configuring Applications" src="https://lh3.googleusercontent.com/ebk9kBcralLgs2dmMDAP7QBtA172zz-v9Xcbzm5CKvvwm6LDSgb8Q9BFmjAbLWnUgW43eJjPE0ebawkZBEicqawqZRoLyNdHx_B6S7zfY7UOuJqMfs2XQBtMZrefNyiB5Xt2j3kx0RKLlugUtN6suwB8a0VNqa4OhLiUlg2CwZJY37RhCZYMIXrRqGgBntmt0nNrgvjPanUDvdwvmkGAaB7KlYAK6HGnZxIkMxyEbH2DJ3N--5iBZ5J0MaEN44kKJ-Kh5SB1HabCb5NbCbYGE5NFtinGsXJVOkNJHvSGc8r8yob9EBnoNyp2P6n27r8oYSXVnafdHIHDvdfyCvC59SRyLbGYwh_A8prUwO0omGN40NJVERzUtNi-hYWAw7hraCGTDrHib23Co_kOP5waZDmXr8FNe2_vBXqPLfO7ijvMDlv1VYmcJoTSc4yker7kWb_1R5iS3lsNyZbAaX9m3mCIML7CFeopk564ZgLiK5vWnhrs3MfigIl2rmktQagzeJxsoSaGsiIPQkbAi_fOQFus03qxL9RXt69QyyVs97WWBgYJtkKkKhtI0AmWnaINwbsWYQCv=w2468-h1108"/></a>
</section>
</section>
<section data-transition='convex'>
<section id='management' data-markdown>
# Step3: Managing Applications
</section>
<section data-transition='concave-in slide-out' id="q3" data-markdown>
> "Q: How are application updates safely delivered?"
</section>
<section id="rolling-releases" data-markdown>
### Deployment strategy: `RollingUpdate`
</section>
<section data-transition='slide-in fade-out' id='rolling-updates'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/6OlCRkj.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-1'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/4RjEUvq.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-2'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/j1txSCv.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-3'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/jLNFKeA.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-4'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/JL2PDPo.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-5'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/02hpX9q.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-6'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/scdn977.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-7'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/RUC7fAU.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-8'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/X8FGCCG.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-9'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/q5DOUTn.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade' id='rolling-updates-10'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/qtZ7etm.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='fade-in slide-out' id='rolling-updates-11'>
<h2>Rolling Updates</h2>
<img src="http://i.imgur.com/RgrM0F1.png" alt='rolling-updates' />
<p>gradually scale workloads in production</p>
</section>
<section data-transition='convex' id='update-demo'>
<a href="https://lh3.googleusercontent.com/7wNZaqQgTITH22VLVBNqjF8nRwDlPyOZ7va13-QwTT5MjSHopDAfCbG3hJgVjzVp7yO9ojAApoMUDpD3KcZpfx_f694BADDcKdlhpaEBJ-U74GJztjpMOcI3NQdnhVLiPUNxxjzDcBTJ139qOh5bwIOYcUwItf8s4PxMBIs8CdZuJcPXhdDJcVCrf2IXf6lyUFnIinN4RR_3gmwix-BvpBrHHdiUeZbq2aXoJdFNZ4GxnDHm0Z1gh6Ny5t_J46WXXYqe3CXFeezvmIpFgI4CrdihYH7oSrPkH1LzDYHhIqSC7bpr6jo_xR4M80bdLWc5EK7v3RsK6BGqsoIbX3t7hDR6hIQRPLQ18Kreqq0iXHKu4bNcS8HCdlYFhxgZT5NLy0tsTDnj0pl5aps3DnGnuOw8I3GCowOHOZ9vI2EgheEddtWMrDSarlF-JCw8j74JS_BfbB1oQCnOI9_lPbnei6iyzQNrWDelzT8jlgmHJaxot7e6mSIm4VwxMRZOG_M8-c-8acYosiQjrYGQzycw7JEbyeF1hqAPZZZNumLb1k3-ctDZMKenBikNVRfP61G5W1LM6A8v=w2468-h1108"><img alt="demo: Rolling Deployments" src="https://lh3.googleusercontent.com/7wNZaqQgTITH22VLVBNqjF8nRwDlPyOZ7va13-QwTT5MjSHopDAfCbG3hJgVjzVp7yO9ojAApoMUDpD3KcZpfx_f694BADDcKdlhpaEBJ-U74GJztjpMOcI3NQdnhVLiPUNxxjzDcBTJ139qOh5bwIOYcUwItf8s4PxMBIs8CdZuJcPXhdDJcVCrf2IXf6lyUFnIinN4RR_3gmwix-BvpBrHHdiUeZbq2aXoJdFNZ4GxnDHm0Z1gh6Ny5t_J46WXXYqe3CXFeezvmIpFgI4CrdihYH7oSrPkH1LzDYHhIqSC7bpr6jo_xR4M80bdLWc5EK7v3RsK6BGqsoIbX3t7hDR6hIQRPLQ18Kreqq0iXHKu4bNcS8HCdlYFhxgZT5NLy0tsTDnj0pl5aps3DnGnuOw8I3GCowOHOZ9vI2EgheEddtWMrDSarlF-JCw8j74JS_BfbB1oQCnOI9_lPbnei6iyzQNrWDelzT8jlgmHJaxot7e6mSIm4VwxMRZOG_M8-c-8acYosiQjrYGQzycw7JEbyeF1hqAPZZZNumLb1k3-ctDZMKenBikNVRfP61G5W1LM6A8v=w2468-h1108"/></a>
</section>
</section>
<!--
</section>
<section id='follow-up' data-markdown>
### follow-up topics and links
1. [BrandonPhilips' TPR list](https://gist.github.com/philips/a97a143546c87b86b870a82a753db14c)
2. [Eric's "custom go controllers" presentation](https://github.com/ericchiang/go-1.8-release-party)
3. [Eric's rollback controller example](https://github.com/ericchiang/kube-rollback-controller)
4. [Josh's Operator talk from FOSDEM](https://docs.google.com/presentation/d/1MV029sDifRV2c33JW_83k1tjWDczCfVkFpKvIWuxT6E/edit#slide=id.g1c65fcd8a9_0_54 )
5. [Video of Josh's talk from KubeCon EU](https://www.youtube.com/watch?v=cj5uk1uje_Y)
6. [etcd autorecovery demo from brandon](https://www.youtube.com/watch?v=9sD3mYCPSjc)
7. [Brandon Philips' "Admin Fire Drills" from OSCON 2016](https://github.com/philips/2016-OSCON-containers-at-scale-with-Kubernetes#fire-drills)
8. [helm support added to quay.io](https://coreos.com/blog/quay-application-registry-for-kubernetes.html)
9. [Sign up to receive the CoreOS Community Newsletter](http://coreos.com/newsletter)
</section>
</section>
-->
<section data-transition='concave'>
<section id='recap'>
<h3>Lessons Learned:</h3>
<ol>
<li class='fragment fade-left'>A reliable way to package and distrubute workloads?<br/>
<span style="float:right;font-weight: bold;font-style: italic;font-size: larger;" class='fragment fade-right'>Containers</span></li>
<li style='clear:both;' class='fragment fade-left'>A reliable way to host and scale your solutions?<br/>
<span style="float:right;font-weight: bold;font-style: italic;font-size: larger;" class='fragment fade-right'>Kubernetes</span></li>
<li style='clear:both;' class='fragment fade-left'>A reliable way to manage and update your solutions?</li>
<span style="float:right;font-weight: bold;font-style: italic;font-size: larger;" class='fragment fade-right'>the k8s <code>deployment</code> model</span></li>
</ol>
</section>
<section id='try-k8s' data-markdown>
## Ready to Give Kubernetes a Try?
</section>
<section id='gke-cloud' data-markdown>
## Google Container Engine (GKE)
Upstream Kubernetes environments are available on-demand via Google Container Engine
[cloud.google.com/container-engine/](https://cloud.google.com/container-engine/)
</section>
<section id='tectonic'>
<a href="http://coreos.com/tectonic"><img src="https://coreos.com/assets/images/brand/tectonic-horizontal-white.svg" alt="Tectonic by CoreOS" /></a>
<p>Upstream Kubernetes, delivered by CoreOS</p>
<ul>
<li class="fragment fade-left">
Easily deploy and manage your own Kubernetes environments
</li>
<li class="fragment fade-left">
Available on bare metal, or BYO cloud provider
</li>
<li class="fragment fade-left">
Support available from CoreOS
</li>
<li class="fragment fade-left">
Your first ten Enterprise-grade Kubernetes nodes are Free!
</li>
</ul>
<a class='fragment fade-up' href="http://coreos.com/tectonic">coreos.com/tectonic</a>
</section>
</section>
<section data-transition='convex'>
<section id='thank-you'>
<h1>Thank You!</h1>
<p>from <a href="https://twitter.com/ryanj">@ryanj</a> and <a href="https://twitter.com/_askcarter">@_askcarter</a></p>
<div>
<a href="http://twitter.com/ryanj/"><img class='fragment fade-right' alt="ryanj" src="https://raw.githubusercontent.com/ryanjarvinen/ryanjarvinen.github.io/master/images/Ryan-Jarvinen-headshot-square-small.jpg" style="width:17%" />
<a href="http://twitter.com/_askcarter/"><img class='fragment fade-left' alt="AskCarter" src="https://pbs.twimg.com/profile_images/849506708930138113/ZKoBd67m.jpg" style="padding-left:10%;width:17%"/>
</div>
<br/>
<div class='fragment fade-up'>
<h3>Next Steps:</h3>
<ol>
<li>Learn more: <a href="http://www.kubetalk.com/welcome-coreos-3hurdles/">Slides, links and other materials</a></li>
<li>Run your own K8s with Tectonic: <a href="http://coreos.com/tectonic/">coreos.com/tectonic</a></li>
</ol>
</div>
</section>
</section>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment