Kubernetes is
a platform for
______
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Five Dollar
Footlongs ™.
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Spring
Cloud
Kubernetes
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Building
Platforms.
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Building
Platforms.
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Building
Platforms.
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Automated
container
deployment,
scaling, and
management.
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Automated
operations.
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Automated
operations.
Cards Against Kubernetes
devops.
Cards Against Kubernetes
Site
ReliabilityEngineering.
Cards Against Kubernetes
@pczarkowski
“Every line of code is a piece of
Technical Debt”
Kubernetes is
a platform for
______
Cards Against Kubernetes
Reducing
Infrastructure
Code
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Reducing
Infrastructure
Code
Kards Against Humanity
Reducing
Toil
Cards Against Kubernetes
@pczarkowski
Kubernetes is
a platform for
______
Cards Against Kubernetes
Reducing
Infrastructure
Code
Kards Against Humanity
Reducing
Toil
Running
Applications
Cards Against Kubernetes
@pczarkowski
Cover w/ Image
Kubernetes is a platform for
■ Running Applications
■ Reducing [Infra] Code
■ Reducing Toil
@pczarkowski
APP
APP
APP
APP
Kubernetes is a platform for
■ Continuous Integration
■ Continuous Delivery
@pczarkowski
@pczarkowski
Pivotal Container Service
Embedded OS
(Windows & Linux)
NSX-T
CPI (15 methods)
v1
v2
v3
...
CVEs
Product Updates
Java | .NET | NodeJS
Pivotal Application
Service (PAS)
Application Code & Frameworks
Buildpacks | Spring Boot | Spring Cloud |
Steeltoe
Elastic | Packaged Software | Spark
Pivotal Container
Service (PKS)
>cf push >kubectl run
YOU build the containerWE build the container
vSphere
Azure &
Azure StackGoogle CloudAWSOpenstack
Pivotal
Network
“3Rs”
Github
Concourse
Concourse
Pivotal Services
Marketplace
Pivotal and
Partner Products
Continuous
delivery
Public Cloud
Services
Customer
Managed
Services
OpenServiceBrokerAPI
Repair
— CVEs
Repave Rotate
— Credhub
@pczarkowski
BOSH
Reliable and consistent operational experience for any cloud.
BOSH
GCP
Service
Broker
Harbor
NSX-T
Kubernetes
K8s Cluster
K8s Cluster
K8s Cluster
PKS Control Plane
Use the PKS CLI and API to
create, operate, and scale your
clusters.
VMware GCP Azure Openstack AWS
PKSControlPlane
GCP Service Broker
Bring Google Cloud Platform services to
your containers. Extend your workloads
with machine learning, AI, and data
services from Google.
Built with open-source
Kubernetes
Constant compatibility with the
latest stable release of Google
Kubernetes Engine—no
proprietary extensions.
Harbor
An enterprise-class container registry.
Includes vulnerability scanning, identity
management, and more.
NSX-T
Network management, security, and
load balancing out-of-the-box with
VMware NSX-T. Multi-cloud,
multi-hypervisor.
Enterprise-Grade Kubernetes
@pczarkowski
App / Container Deployment, Services & Routing
cf push
App
myapp.mydomain.net
Pivotal Cloud Foundry
Elastic Runtime
Pivotal Container
Service
kubectl run
????
????
cf push
App
myapp.mydomain.net
Pivotal Cloud Foundry
Elastic Runtime
Pivotal Container
Service
docker build
docker push
kubectl run
kubectl expose
????
????
App / Container Deployment, Services & Routing
Kubernetes
You use Kubernetes API objects to
describe your desired state.
Vs
@pczarkowski
Vs
@pczarkowski
API
Users
Storage Compute NetworkDatabase AccessArtifacts
@pczarkowski
API
Users
Systems
Admin
Network
Engineer
SecurityDBA QA
Storage
Admin
@pczarkowski
@pczarkowski
API
Users
Storage Compute NetworkDatabase AccessArtifacts
@pczarkowski
API Server
Users
Control Plane
Data Plane
@pczarkowski
API Server
Users
Control Plane
Data Plane
etcd
@pczarkowski
API
Server
Users
Control Plane
Data Plane
etcd
Cloud Ctrl
Manager
Kubelet
kube-proxy
docker
@pczarkowski
API
Server
Users
Control Plane
Data Plane
etcd
Cloud Ctrl
Manager
Kubelet
kube-proxy
docker
Scheduler
@pczarkowski
API
Server
Users
Control Plane
Data Plane
etcd
Cloud Ctrl
Manager
Kubelet
kube-proxy
docker
Scheduler
Controller
Manager
@pczarkowski
Worker
Master
API
Server
Users
Control Plane
Data Plane
etcd
Cloud Ctrl
Manager
Kubelet
kube-proxy
docker
Scheduler
Controller
Manager
@pczarkowski
Master
Master
Master
API
Server
Users
Control Plane
Data Plane
etcd
Cloud Ctrl
Manager
Worker
Kubelet
kube-proxy
docker
Scheduler
Controller
Manager
Worker
Kubelet
kube-proxy
docker
Worker
Kubelet
kube-proxy
docker
@pczarkowski
Master
Master
Master
API
Server
Users
Control Plane
Data Plane
etcd
Cloud Ctrl
Manager
Worker
Kubelet
kube-proxy
docker
Scheduler
Controller
Manager
Worker
Kubelet
kube-proxy
docker
Worker
Kubelet
kube-proxy
docker
Flannel Flannel Flannel
@pczarkowski
Desired State
Actual State
@pczarkowski
Unix Philosophy:
Do one thing. Do it well.
@pczarkowski
$ kubectl
Imperative
$ kubectl run hello 
--image=paulczar/go-hello
$ kubectl scale hello 
--replicas=3
$ kubectl create service clusterip 
hello --tcp=80:80
@pczarkowski
Declarative
$ kubectl apply -f hello.yaml
@pczarkowski
Declarative
Vs
Imperative
@pczarkowski
manifests
apiVersion: v1
kind: Pod
metadata:
name: hello
spec:
containers:
- image: paulczar/go-hello
imagePullPolicy: Always
name: hello
@pczarkowski
resources
● Pods
● Services
● Volumes
@pczarkowski
POD
one or more containers that share
a network and storage
the minimum scalable unit
of your application
MASTER
Node 1 Node 2 Node 3 Node 4
hello
kubelet kubelet kubelet kubelet
Scheduler
Pod
Name: hello
Image: hello1
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
hello
kubelet kubelet kubelet kubelet
Scheduler
hello
Pod
Name: hello
Image: hello1
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
hello
kubelet kubelet kubelet kubelet
Scheduler
Pod
Name: hello
Image: hello1
@pczarkowski
Replica Set
MASTER
Node 1 Node 2 Node 3 Node 4
hello-a
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
Replica Set
Name: hello
Image: hello1
Size: 3
hello-ghello-s
Pod
Name: hello-a
Image: hello1
Pod
Name: hello-b
Image: hello1
Pod
Name: hello-c
Image: hello1
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
hello-a
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
Replica Set
Name: hello
Image: hello1
Size: 3
hello-ghello-s hello-d
Pod
Name: hello-a
Image: hello1
Pod
Name: hello-b
Image: hello1
Pod
Name: hello-d
Image: hello1
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
hello-a
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
Replica Set
Name: hello
Image: hello1
Size: 5
hello-ghello-s hello-d
hello-t hello-z
Pod
Name: hello-a
Image: hello1
Pod
Name: hello-a
Image: hello1
Pod
Name: hello-a
Image: hello1
Pod
Name: hello-a
Image: hello1
Pod
Name: hello-a
Image: hello1
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
Replica Set
Name: hello
Image: hello1
Size: 0
@pczarkowski
Deployment
MASTER
Node 1 Node 2 Node 3 Node 4
hello-A-c
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
Deployment
Name: hello
Image: hello1
Size: 3
hello-A-ghello-A-s
Replica Set
Name: hello-A
Image: hello1
Size: 3
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
hello-A-c
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
Deployment
Name: hello
Image: hello2
Size: 3
hello-A-ghello-A-s
Replica Set
Name: hello-A
Image: hello1
Size: 3
Replica Set
Name: hello-B
Image: hello2
Size: 3
hello-B-g
hello-B-r hello-B-c
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
Deployment
Name: hello
Image: hello2
Size: 3
Replica Set
Name: hello-A
Image: hello1
Size: 0
Replica Set
Name: hello-B
Image: hello2
Size: 3
hello-B-g
hello-B-r hello-B-c
@pczarkowski
StatefulSet
MASTER
Node 1 Node 2 Node 3 Node 4
hello-1
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
StatefulSet
Name: db
Image: hello1
Size: 3
Pod
Name: hello-1
Image: hello1
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
hello-1
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
StatefulSet
Name: hello
Image: hello1
Size: 3
hello-2
Pod
Name: hello-1
Image: hello1
Pod
Name: hello-2
Image: hello1
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
hello-1
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
StatefulSet
Name: hello
Image: hello1
Size: 3
hello-3hello-2
Pod
Name: hello-1
Image: hello1
Pod
Name: hello-2
Image: hello1
Pod
Name: hello-3
Image: hello1
@pczarkowski
MASTER
Node 1 Node 2 Node 3 Node 4
db-1
kubelet kubelet kubelet kubelet
Scheduler
Controller
Manager
StatefulSet
Name: db
Image: cassandra
Size: 3
db-3db-2
Pod
Name: hello-a
Image:
Pod
Name: hello-b
Image:
Pod
Name: db-1
Image: ... vol vol vol
Pod
Name: hello-a
Image:
Pod
Name: hello-b
Image:
PVC
Name: db-1
Image: ...
@pczarkowski
$ kubectl
$ kubectl run hello 
--image=paulczar/go-hello
@pczarkowski
● kubectl run created a deployment “deployments.apps/hello”
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/hello 1 1 1 1 1m
● The deployment created a replicaset “replicaset.apps/hello-64f6bf9dd4”
NAME DESIRED CURRENT READY AGE
replicaset.apps/hello-64f6bf9dd4 1 1 1 1m
● Which created a pod “pod/hello-64f6bf9dd4-tq5dq”
NAME READY STATUS RESTARTS AGE
pod/hello-64f6bf9dd4-tq5dq 1/1 Running 0 2s
@pczarkowski
$ kubectl scale --replicas=3 
deployment/hello
@pczarkowski
$ kubectl scale --replicas=3 deployment/hello
deployment.extensions/hello scaled
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/hello-64f6bf9dd4-2bndq 1/1 Running 0 15m
pod/hello-64f6bf9dd4-4kq9l 0/1 ContainerCreating 0 2s
pod/hello-64f6bf9dd4-8lkcs 1/1 Running 0 5s
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/hello 3 3 2 3 16m
NAME DESIRED CURRENT READY AGE
replicaset.apps/hello-64f6bf9dd4 3 3 2 16m
@pczarkowski
$ kubectl edit deployment hello
...
spec:
containers:
- env:
- name: MESSAGE
value: HELLO I LOVE YOU!!!!
image: paulczar/go-hello
imagePullPolicy: Always
name: hello
@pczarkowski
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/hello-5c75b546c7-4lwnn 1/1 Running 0 1m
pod/hello-5c75b546c7-bwxxq 1/1 Running 0 1m
pod/hello-5c75b546c7-sl2pg 1/1 Running 0 1m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/hello 3 3 3 3 23m
NAME DESIRED CURRENT READY AGE
replicaset.apps/hello-5c75b546c7 3 3 3 1m
replicaset.apps/hello-64f6bf9dd4 0 0 0 23m
@pczarkowski
$ kubectl port-forward deployment/hello 8080
Forwarding from 127.0.0.1:8080 -> 8080
$ curl localhost:8080
<html><head><title>HELLO I LOVE YOU!!!!</title></head><body>HELLO I LOVE
YOU!!!!!</body></html>
@pczarkowski
Service
$ kubectl expose deployment 
hello --type=LoadBalancer 
--port 80 --target-port 8080
@pczarkowski
kubectl expose deployment hello
● creates a service with a ClusterIP that acts as an internal loadbalancer to all
pods in the “hello” deployment
--type=LoadBalancer
● Creates a NodePort
● Configures a LoadBalancer to access the pods via the NodePort
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello LoadBalancer 10.39.248.123 35.184.17.129 80:30468/TCP 5m
$ curl 35.184.17.129
<html><head><title>HELLO I LOVE YOU!!!!</title></head><body>HELLO I LOVE
YOU!!!!!</body></html>
@pczarkowski
Service
track Pods based on metadata and provides
connectivity and service discovery (DNS, Env
variables) for them.
Type
ClusterIP (default) exposes service on a
cluster-internal IP.
Container
Container
Pod
app=bacon
Container
Container
Pod
app=bacon
Service
app=bacon 10.3.55.7
@pczarkowski
Service
track Pods based on metadata and provides
connectivity and service discovery (DNS, Env
variables) for them.
Type
NodePort extends ClusterIP to expose services on
each node’s IP via a static port.
Container
Container
Pod
app=bacon
Container
Container
Pod
app=bacon
Service
app=bacon 10.3.55.7
192.168.0.5:4530
K8s Worker K8s Worker
192.168.0.6:4530
@pczarkowski
Service
track Pods based on metadata and provides
connectivity and service discovery (DNS, Env
variables) for them.
Type
LoadBalancer extends NodePort to configure a cloud
provider’s load balancer using the
cloud-controller-manager.
Container
Container
Pod
app=bacon
Container
Container
Pod
app=bacon
Service
app=bacon 10.3.55.7
192.168.0.5:4530
K8s Worker K8s Worker
192.168.0.6:4530
Load Balancer
33.6.5.22:80
@pczarkowski
Ingress
a controller that manages an external entity to provide
load balancing, SSL termination and name-based
virtual hosting to services based on a set of rules.
Ingress
Service
app=bacon
https://example.com
Service
app=eggs
/bacon /eggs
@pczarkowski
Volume
Container
Container
Pod
Volume
Is [effectively] a Directory, possibly with data in it,
available to all containers in a Pod.
Usually Shares lifecycle of a Pod (Created when Pod
is created, destroyed when Pod is destroyed).
Persistent Volumes outlive Pods.
Can be mounted from local disk, or from a network
storage device such as a EBS volume, iscsi, NFS, etc.
@pczarkowski
Config Map / Secret
$ kubectl create configmap hello 
--from-file=index.html
@pczarkowski
kubectl create configmap hello --from-file=index.html
● creates a configmap called “hello” containing the contents index.html
$ kubectl get configmap hello -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: hello
data:
index.html: "<html>n<head>nt<title>Hello to my
friends</title>n</head>n<body>ntHello
to my friendsn</body>n</html>nn"
@pczarkowski
kubectl create secret generic hello --from-file=index.html
● creates a secret called “hello” containing a base64 hash of contents index.html
$ kubectl get secret hello -o yaml
apiVersion: v1
kind: Secret
metadata:
name: hello
data:
index.html:
PGh0bWw+CjxoZWFkPgoJPHRpdGxlPkhlbGxvIHRvIG15IGZyaWVuZHM8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5
PgoJSGVsbG8gdG8gbXkgZnJpZW5kcwo8L2JvZHk+CjwvaHRtbD4KCg==
@pczarkowski
Provides key-value pairs to be injected into a pod much like user-data is injected into a Virtual
Machine in the cloud.
Allows you to do last minute configuration of applications running on Kubernetes such as
setting a database host, or a admin password.
ConfigMaps store values as strings, Secrets store them as byte arrays (serialized as base64
encoded strings).
Secrets are [currently] not encrypted by default. This is likely to change.
Can be injected as files in a Volume, or as Environment Variables.
ConfigMaps/Secrets (user-data)
@pczarkowski
Helm
Helm is the best way to
find, share, and use
software built for Kubernetes
@pczarkowski
custom
load balancer
Chart.yaml
Values.yaml
templates/
ci
services
db
Discover & launch great
Kubernetes-ready apps
Search charts
231 charts ready to deploy
Wordpress, Jenkins, Kubeless...
Secure | https://hub.kubeapps.com
@pczarkowski
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Chart.name }}-cm
data:
db: {{ .Value.db }}
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: {{ .Chart.name }}-app
labels:
app: {{ .Chart.name }}
...
...
spec:
containers:
- image: paulczar/hello
name: hello
volumeMounts:
- name: config
mountPath: /etc/hello
volumes:
- name: config
configMap:
name: {{ .Chart.name }}-cm
apiVersion: v1
kind: Service
metadata:
name: {{ .Chart.name }}-svc
labels:
app: {{ .Chart.name }}-world
spec:
ports:
- port: {{ .Value.port }}
protocol: TCP
targetPort: 8080
selector:
app: {{ .Chart.name }}-world
type: NodePort
@pczarkowski
$ helm install --name staging . 
--set db=’user:pass@staging.mysql/dbname’
$ helm install --name production . 
--set db=’user:pass@production.mysql/dbname’
@pczarkowski
Spinnaker
https://medium.com/netflix-techblog/announcing-ribbon-tying-the-netflix-mid
-tier-services-together-a89346910a62
https://giphy.com/gifs/frustrated-keyboard-g8GfH3i5F0hby
@pczarkowski
https://unsplash.com/photos/WHWYBmtn3_0
@pczarkowski
+
@pczarkowski
APP
APP
APP
APP
@pczarkowski
Cluster Management
● Server Group
● Cluster
● Applications
● Load Balancer
● Firewall
Pipelines
● Pipeline
● Stage
● Deployment Strategies
@pczarkowski
Multi-Cloud Inventory
● Server Group
● Cluster
● Applications
● Load Balancer
● Firewall
Actions and Reactions
● Pipeline
● Stage
● Deployment Strategies
@pczarkowski
@pczarkowski
Cluster Management
● Server Group
● Cluster
● Applications
● Load Balancer
● Firewall
Deployment Management
● Pipeline
● Stage
● Deployment Strategies
Deployment Strategies
Spinnaker
Cloud
API
App App App
@pczarkowski
@pczarkowski
Halyard
https://en.wikipedia.org/wiki/Halyard
@pczarkowski
Transforming How The World Builds Software
© Copyright 2018 Pivotal Software, Inc. All rights Reserved.@pczarkowski

Using Spinnaker to Create a Development Workflow on Kubernetes - Paul Czarkowski

  • 1.
    Kubernetes is a platformfor ______ Cards Against Kubernetes @pczarkowski
  • 2.
    Kubernetes is a platformfor ______ Cards Against Kubernetes @pczarkowski
  • 3.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Five Dollar Footlongs ™. Cards Against Kubernetes @pczarkowski
  • 4.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Cards Against Kubernetes @pczarkowski
  • 5.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Spring Cloud Kubernetes Cards Against Kubernetes @pczarkowski
  • 6.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Building Platforms. Cards Against Kubernetes @pczarkowski
  • 7.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Building Platforms. Cards Against Kubernetes @pczarkowski
  • 8.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Building Platforms. Cards Against Kubernetes @pczarkowski
  • 9.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Automated container deployment, scaling, and management. Cards Against Kubernetes @pczarkowski
  • 10.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Automated operations. Cards Against Kubernetes @pczarkowski
  • 11.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Automated operations. Cards Against Kubernetes devops. Cards Against Kubernetes Site ReliabilityEngineering. Cards Against Kubernetes @pczarkowski
  • 12.
    “Every line ofcode is a piece of Technical Debt”
  • 13.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Reducing Infrastructure Code Cards Against Kubernetes @pczarkowski
  • 14.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Reducing Infrastructure Code Kards Against Humanity Reducing Toil Cards Against Kubernetes @pczarkowski
  • 15.
    Kubernetes is a platformfor ______ Cards Against Kubernetes Reducing Infrastructure Code Kards Against Humanity Reducing Toil Running Applications Cards Against Kubernetes @pczarkowski
  • 16.
    Cover w/ Image Kubernetesis a platform for ■ Running Applications ■ Reducing [Infra] Code ■ Reducing Toil @pczarkowski
  • 17.
    APP APP APP APP Kubernetes is aplatform for ■ Continuous Integration ■ Continuous Delivery @pczarkowski
  • 18.
  • 20.
  • 21.
    Embedded OS (Windows &Linux) NSX-T CPI (15 methods) v1 v2 v3 ... CVEs Product Updates Java | .NET | NodeJS Pivotal Application Service (PAS) Application Code & Frameworks Buildpacks | Spring Boot | Spring Cloud | Steeltoe Elastic | Packaged Software | Spark Pivotal Container Service (PKS) >cf push >kubectl run YOU build the containerWE build the container vSphere Azure & Azure StackGoogle CloudAWSOpenstack Pivotal Network “3Rs” Github Concourse Concourse Pivotal Services Marketplace Pivotal and Partner Products Continuous delivery Public Cloud Services Customer Managed Services OpenServiceBrokerAPI Repair — CVEs Repave Rotate — Credhub @pczarkowski
  • 22.
    BOSH Reliable and consistentoperational experience for any cloud. BOSH GCP Service Broker Harbor NSX-T Kubernetes K8s Cluster K8s Cluster K8s Cluster PKS Control Plane Use the PKS CLI and API to create, operate, and scale your clusters. VMware GCP Azure Openstack AWS PKSControlPlane GCP Service Broker Bring Google Cloud Platform services to your containers. Extend your workloads with machine learning, AI, and data services from Google. Built with open-source Kubernetes Constant compatibility with the latest stable release of Google Kubernetes Engine—no proprietary extensions. Harbor An enterprise-class container registry. Includes vulnerability scanning, identity management, and more. NSX-T Network management, security, and load balancing out-of-the-box with VMware NSX-T. Multi-cloud, multi-hypervisor. Enterprise-Grade Kubernetes @pczarkowski
  • 24.
    App / ContainerDeployment, Services & Routing cf push App myapp.mydomain.net Pivotal Cloud Foundry Elastic Runtime Pivotal Container Service kubectl run ???? ????
  • 26.
    cf push App myapp.mydomain.net Pivotal CloudFoundry Elastic Runtime Pivotal Container Service docker build docker push kubectl run kubectl expose ???? ???? App / Container Deployment, Services & Routing
  • 28.
  • 29.
    You use KubernetesAPI objects to describe your desired state.
  • 31.
  • 32.
  • 33.
    API Users Storage Compute NetworkDatabaseAccessArtifacts @pczarkowski
  • 34.
  • 35.
  • 36.
    API Users Storage Compute NetworkDatabaseAccessArtifacts @pczarkowski
  • 37.
  • 38.
    API Server Users Control Plane DataPlane etcd @pczarkowski
  • 39.
    API Server Users Control Plane Data Plane etcd CloudCtrl Manager Kubelet kube-proxy docker @pczarkowski
  • 40.
    API Server Users Control Plane Data Plane etcd CloudCtrl Manager Kubelet kube-proxy docker Scheduler @pczarkowski
  • 41.
    API Server Users Control Plane Data Plane etcd CloudCtrl Manager Kubelet kube-proxy docker Scheduler Controller Manager @pczarkowski
  • 42.
    Worker Master API Server Users Control Plane Data Plane etcd CloudCtrl Manager Kubelet kube-proxy docker Scheduler Controller Manager @pczarkowski
  • 43.
    Master Master Master API Server Users Control Plane Data Plane etcd CloudCtrl Manager Worker Kubelet kube-proxy docker Scheduler Controller Manager Worker Kubelet kube-proxy docker Worker Kubelet kube-proxy docker @pczarkowski
  • 44.
    Master Master Master API Server Users Control Plane Data Plane etcd CloudCtrl Manager Worker Kubelet kube-proxy docker Scheduler Controller Manager Worker Kubelet kube-proxy docker Worker Kubelet kube-proxy docker Flannel Flannel Flannel @pczarkowski
  • 45.
  • 46.
    Unix Philosophy: Do onething. Do it well. @pczarkowski
  • 47.
  • 48.
    Imperative $ kubectl runhello --image=paulczar/go-hello $ kubectl scale hello --replicas=3 $ kubectl create service clusterip hello --tcp=80:80 @pczarkowski
  • 49.
    Declarative $ kubectl apply-f hello.yaml @pczarkowski
  • 50.
  • 51.
  • 52.
    apiVersion: v1 kind: Pod metadata: name:hello spec: containers: - image: paulczar/go-hello imagePullPolicy: Always name: hello @pczarkowski
  • 53.
  • 54.
    ● Pods ● Services ●Volumes @pczarkowski
  • 55.
  • 56.
    one or morecontainers that share a network and storage
  • 57.
    the minimum scalableunit of your application
  • 58.
    MASTER Node 1 Node2 Node 3 Node 4 hello kubelet kubelet kubelet kubelet Scheduler Pod Name: hello Image: hello1 @pczarkowski
  • 59.
    MASTER Node 1 Node2 Node 3 Node 4 hello kubelet kubelet kubelet kubelet Scheduler hello Pod Name: hello Image: hello1 @pczarkowski
  • 60.
    MASTER Node 1 Node2 Node 3 Node 4 hello kubelet kubelet kubelet kubelet Scheduler Pod Name: hello Image: hello1 @pczarkowski
  • 61.
  • 62.
    MASTER Node 1 Node2 Node 3 Node 4 hello-a kubelet kubelet kubelet kubelet Scheduler Controller Manager Replica Set Name: hello Image: hello1 Size: 3 hello-ghello-s Pod Name: hello-a Image: hello1 Pod Name: hello-b Image: hello1 Pod Name: hello-c Image: hello1 @pczarkowski
  • 63.
    MASTER Node 1 Node2 Node 3 Node 4 hello-a kubelet kubelet kubelet kubelet Scheduler Controller Manager Replica Set Name: hello Image: hello1 Size: 3 hello-ghello-s hello-d Pod Name: hello-a Image: hello1 Pod Name: hello-b Image: hello1 Pod Name: hello-d Image: hello1 @pczarkowski
  • 64.
    MASTER Node 1 Node2 Node 3 Node 4 hello-a kubelet kubelet kubelet kubelet Scheduler Controller Manager Replica Set Name: hello Image: hello1 Size: 5 hello-ghello-s hello-d hello-t hello-z Pod Name: hello-a Image: hello1 Pod Name: hello-a Image: hello1 Pod Name: hello-a Image: hello1 Pod Name: hello-a Image: hello1 Pod Name: hello-a Image: hello1 @pczarkowski
  • 65.
    MASTER Node 1 Node2 Node 3 Node 4 kubelet kubelet kubelet kubelet Scheduler Controller Manager Replica Set Name: hello Image: hello1 Size: 0 @pczarkowski
  • 66.
  • 67.
    MASTER Node 1 Node2 Node 3 Node 4 hello-A-c kubelet kubelet kubelet kubelet Scheduler Controller Manager Deployment Name: hello Image: hello1 Size: 3 hello-A-ghello-A-s Replica Set Name: hello-A Image: hello1 Size: 3 @pczarkowski
  • 68.
    MASTER Node 1 Node2 Node 3 Node 4 hello-A-c kubelet kubelet kubelet kubelet Scheduler Controller Manager Deployment Name: hello Image: hello2 Size: 3 hello-A-ghello-A-s Replica Set Name: hello-A Image: hello1 Size: 3 Replica Set Name: hello-B Image: hello2 Size: 3 hello-B-g hello-B-r hello-B-c @pczarkowski
  • 69.
    MASTER Node 1 Node2 Node 3 Node 4 kubelet kubelet kubelet kubelet Scheduler Controller Manager Deployment Name: hello Image: hello2 Size: 3 Replica Set Name: hello-A Image: hello1 Size: 0 Replica Set Name: hello-B Image: hello2 Size: 3 hello-B-g hello-B-r hello-B-c @pczarkowski
  • 70.
  • 71.
    MASTER Node 1 Node2 Node 3 Node 4 hello-1 kubelet kubelet kubelet kubelet Scheduler Controller Manager StatefulSet Name: db Image: hello1 Size: 3 Pod Name: hello-1 Image: hello1 @pczarkowski
  • 72.
    MASTER Node 1 Node2 Node 3 Node 4 hello-1 kubelet kubelet kubelet kubelet Scheduler Controller Manager StatefulSet Name: hello Image: hello1 Size: 3 hello-2 Pod Name: hello-1 Image: hello1 Pod Name: hello-2 Image: hello1 @pczarkowski
  • 73.
    MASTER Node 1 Node2 Node 3 Node 4 hello-1 kubelet kubelet kubelet kubelet Scheduler Controller Manager StatefulSet Name: hello Image: hello1 Size: 3 hello-3hello-2 Pod Name: hello-1 Image: hello1 Pod Name: hello-2 Image: hello1 Pod Name: hello-3 Image: hello1 @pczarkowski
  • 74.
    MASTER Node 1 Node2 Node 3 Node 4 db-1 kubelet kubelet kubelet kubelet Scheduler Controller Manager StatefulSet Name: db Image: cassandra Size: 3 db-3db-2 Pod Name: hello-a Image: Pod Name: hello-b Image: Pod Name: db-1 Image: ... vol vol vol Pod Name: hello-a Image: Pod Name: hello-b Image: PVC Name: db-1 Image: ... @pczarkowski
  • 75.
  • 76.
    $ kubectl runhello --image=paulczar/go-hello @pczarkowski
  • 77.
    ● kubectl runcreated a deployment “deployments.apps/hello” NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/hello 1 1 1 1 1m ● The deployment created a replicaset “replicaset.apps/hello-64f6bf9dd4” NAME DESIRED CURRENT READY AGE replicaset.apps/hello-64f6bf9dd4 1 1 1 1m ● Which created a pod “pod/hello-64f6bf9dd4-tq5dq” NAME READY STATUS RESTARTS AGE pod/hello-64f6bf9dd4-tq5dq 1/1 Running 0 2s @pczarkowski
  • 78.
    $ kubectl scale--replicas=3 deployment/hello @pczarkowski
  • 79.
    $ kubectl scale--replicas=3 deployment/hello deployment.extensions/hello scaled $ kubectl get all NAME READY STATUS RESTARTS AGE pod/hello-64f6bf9dd4-2bndq 1/1 Running 0 15m pod/hello-64f6bf9dd4-4kq9l 0/1 ContainerCreating 0 2s pod/hello-64f6bf9dd4-8lkcs 1/1 Running 0 5s NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/hello 3 3 2 3 16m NAME DESIRED CURRENT READY AGE replicaset.apps/hello-64f6bf9dd4 3 3 2 16m @pczarkowski
  • 80.
    $ kubectl editdeployment hello ... spec: containers: - env: - name: MESSAGE value: HELLO I LOVE YOU!!!! image: paulczar/go-hello imagePullPolicy: Always name: hello @pczarkowski
  • 81.
    $ kubectl getall NAME READY STATUS RESTARTS AGE pod/hello-5c75b546c7-4lwnn 1/1 Running 0 1m pod/hello-5c75b546c7-bwxxq 1/1 Running 0 1m pod/hello-5c75b546c7-sl2pg 1/1 Running 0 1m NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.apps/hello 3 3 3 3 23m NAME DESIRED CURRENT READY AGE replicaset.apps/hello-5c75b546c7 3 3 3 1m replicaset.apps/hello-64f6bf9dd4 0 0 0 23m @pczarkowski
  • 82.
    $ kubectl port-forwarddeployment/hello 8080 Forwarding from 127.0.0.1:8080 -> 8080 $ curl localhost:8080 <html><head><title>HELLO I LOVE YOU!!!!</title></head><body>HELLO I LOVE YOU!!!!!</body></html> @pczarkowski
  • 83.
  • 84.
    $ kubectl exposedeployment hello --type=LoadBalancer --port 80 --target-port 8080 @pczarkowski
  • 85.
    kubectl expose deploymenthello ● creates a service with a ClusterIP that acts as an internal loadbalancer to all pods in the “hello” deployment --type=LoadBalancer ● Creates a NodePort ● Configures a LoadBalancer to access the pods via the NodePort $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello LoadBalancer 10.39.248.123 35.184.17.129 80:30468/TCP 5m $ curl 35.184.17.129 <html><head><title>HELLO I LOVE YOU!!!!</title></head><body>HELLO I LOVE YOU!!!!!</body></html> @pczarkowski
  • 86.
    Service track Pods basedon metadata and provides connectivity and service discovery (DNS, Env variables) for them. Type ClusterIP (default) exposes service on a cluster-internal IP. Container Container Pod app=bacon Container Container Pod app=bacon Service app=bacon 10.3.55.7 @pczarkowski
  • 87.
    Service track Pods basedon metadata and provides connectivity and service discovery (DNS, Env variables) for them. Type NodePort extends ClusterIP to expose services on each node’s IP via a static port. Container Container Pod app=bacon Container Container Pod app=bacon Service app=bacon 10.3.55.7 192.168.0.5:4530 K8s Worker K8s Worker 192.168.0.6:4530 @pczarkowski
  • 88.
    Service track Pods basedon metadata and provides connectivity and service discovery (DNS, Env variables) for them. Type LoadBalancer extends NodePort to configure a cloud provider’s load balancer using the cloud-controller-manager. Container Container Pod app=bacon Container Container Pod app=bacon Service app=bacon 10.3.55.7 192.168.0.5:4530 K8s Worker K8s Worker 192.168.0.6:4530 Load Balancer 33.6.5.22:80 @pczarkowski
  • 89.
    Ingress a controller thatmanages an external entity to provide load balancing, SSL termination and name-based virtual hosting to services based on a set of rules. Ingress Service app=bacon https://example.com Service app=eggs /bacon /eggs @pczarkowski
  • 90.
  • 91.
    Container Container Pod Volume Is [effectively] aDirectory, possibly with data in it, available to all containers in a Pod. Usually Shares lifecycle of a Pod (Created when Pod is created, destroyed when Pod is destroyed). Persistent Volumes outlive Pods. Can be mounted from local disk, or from a network storage device such as a EBS volume, iscsi, NFS, etc. @pczarkowski
  • 92.
  • 93.
    $ kubectl createconfigmap hello --from-file=index.html @pczarkowski
  • 94.
    kubectl create configmaphello --from-file=index.html ● creates a configmap called “hello” containing the contents index.html $ kubectl get configmap hello -o yaml apiVersion: v1 kind: ConfigMap metadata: name: hello data: index.html: "<html>n<head>nt<title>Hello to my friends</title>n</head>n<body>ntHello to my friendsn</body>n</html>nn" @pczarkowski
  • 95.
    kubectl create secretgeneric hello --from-file=index.html ● creates a secret called “hello” containing a base64 hash of contents index.html $ kubectl get secret hello -o yaml apiVersion: v1 kind: Secret metadata: name: hello data: index.html: PGh0bWw+CjxoZWFkPgoJPHRpdGxlPkhlbGxvIHRvIG15IGZyaWVuZHM8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5 PgoJSGVsbG8gdG8gbXkgZnJpZW5kcwo8L2JvZHk+CjwvaHRtbD4KCg== @pczarkowski
  • 96.
    Provides key-value pairsto be injected into a pod much like user-data is injected into a Virtual Machine in the cloud. Allows you to do last minute configuration of applications running on Kubernetes such as setting a database host, or a admin password. ConfigMaps store values as strings, Secrets store them as byte arrays (serialized as base64 encoded strings). Secrets are [currently] not encrypted by default. This is likely to change. Can be injected as files in a Volume, or as Environment Variables. ConfigMaps/Secrets (user-data) @pczarkowski
  • 97.
  • 98.
    Helm is thebest way to find, share, and use software built for Kubernetes @pczarkowski
  • 99.
  • 100.
    Discover & launchgreat Kubernetes-ready apps Search charts 231 charts ready to deploy Wordpress, Jenkins, Kubeless... Secure | https://hub.kubeapps.com @pczarkowski
  • 101.
    apiVersion: v1 kind: ConfigMap metadata: name:{{ .Chart.name }}-cm data: db: {{ .Value.db }} apiVersion: apps/v1beta1 kind: Deployment metadata: name: {{ .Chart.name }}-app labels: app: {{ .Chart.name }} ... ... spec: containers: - image: paulczar/hello name: hello volumeMounts: - name: config mountPath: /etc/hello volumes: - name: config configMap: name: {{ .Chart.name }}-cm apiVersion: v1 kind: Service metadata: name: {{ .Chart.name }}-svc labels: app: {{ .Chart.name }}-world spec: ports: - port: {{ .Value.port }} protocol: TCP targetPort: 8080 selector: app: {{ .Chart.name }}-world type: NodePort @pczarkowski
  • 102.
    $ helm install--name staging . --set db=’user:pass@staging.mysql/dbname’ $ helm install --name production . --set db=’user:pass@production.mysql/dbname’ @pczarkowski
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
    Cluster Management ● ServerGroup ● Cluster ● Applications ● Load Balancer ● Firewall Pipelines ● Pipeline ● Stage ● Deployment Strategies @pczarkowski
  • 110.
    Multi-Cloud Inventory ● ServerGroup ● Cluster ● Applications ● Load Balancer ● Firewall Actions and Reactions ● Pipeline ● Stage ● Deployment Strategies @pczarkowski
  • 111.
  • 112.
    Cluster Management ● ServerGroup ● Cluster ● Applications ● Load Balancer ● Firewall Deployment Management ● Pipeline ● Stage ● Deployment Strategies Deployment Strategies
  • 113.
  • 114.
  • 115.
  • 116.
  • 118.
    Transforming How TheWorld Builds Software © Copyright 2018 Pivotal Software, Inc. All rights Reserved.@pczarkowski