Last active
May 17, 2018 03:21
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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…</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;'>&</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