@rob_rich

Docker and
Kubernetes

by Rob Richardson

@rob_rich

https://robrich.org/

About Me

Rob Richardson is a software craftsman building web properties in ASP.NET and Node, Angular and React. He's a frequent speaker at conferences, user groups, and community events, and a diligent teacher and student of high quality software development. You can find this and other talks on https://robrich.org/presentations and follow him on twitter at @rob_rich.

"Docker: VM++"

Docker is

  • ephemeral
  • isomorphic
  • deterministic


Therefore Docker is

ideal platform for dev & ops

  • clearly delineates duties
  • clean communication strategy

Docker is

  • ephemeral (short-lived)
  • isomorphic (unchanging)
  • deterministic (same every time)


Therefore Docker is

ideal platform for dev & ops

  • clearly delineates duties
  • clean communication strategy

What is Docker?

Docker is an ecosystem around Container Virtualization

What are Containers?

Light-weight kernel virtualization

What is Docker?

A suite of command-line tools for
creating, running, and sharing containers

Containers vs VMs

vm vs container

Source: http://www.zdnet.com/article/what-is-docker-and-why-is-it-so-darn-popular/

Containers

virtualize and share the host kernel

must match host kernel:

  • Linux containers run on a Linux host
  • Windows Server containers run on a Windows Server host

Host Docker in a VM

docker nested in a vm

Docker Ecosystem

docker ecosystem

Download: https://robrich.org/slides/welcome-to-docker/docker-ecosystem.pdf

Dockerfile

FROM node

WORKDIR /app

COPY package.json .
RUN npm install

COPY . .

ENV NODE_ENV production
ENV PORT 3000
EXPOSE 3000

CMD ["npm", "start"]

Layered Filesystem

Reading from the filesystem

Source: https://docs.docker.com/engine/userguide/storagedriver/aufs-driver/

Layered Filesystem

source

  • read/write layer
  • demo
    • CMD ["node" "server"]
    • EXPOSE 3000/tcp
    • server.js
    • WORKDIR /app
  • Node
    • Install Yarn
    • Install Node
    • Install gpg
    • node user/group
  • buildpack-deps:jessie
    • ... steps ...
  • parent image
    • ... steps ...
  • parent image
    • ... steps ...

Layered Filesystem

Only downloads each layer to disk once

because layers don't change

docker ecosystem

Download: https://robrich.org/slides/welcome-to-docker/docker-ecosystem.pdf

DEMO: build image, run container

Docker Magic

Inside the Container:

  • A machine
  • Unique IP, hostname
  • Build your perfect snowflake
 

Outside the Container:

  • A process
  • Plug in power and internet
  • Restart quickly
  • Scale by launching more

Docker Magic

Want another?

"docker run" it again

Many containers in concert

Kubernetes

What is Kubernetes?

Industry standard container orchestration engine
by Google
best known for rolling updates and auto scaling

Kubernetes

Hosts containers

Either Docker containers or ...
are there any others really?

docker ecosystem

Download: https://robrich.org/slides/welcome-to-docker/docker-ecosystem.pdf

docker ecosystem changed

Docker -> Kubernetes

K8s: "Given a Docker image ..."

Keep

  • docker build
  • docker registry
  • docker push

Replace

  • docker-compose
  • docker swarm

Kubernetes Scenario

kubernetes ecosystem

source: https://vitalflux.com/quick-glance-at-kubernetes-architectural-building-blocks/

Kubernetes gets microservices

Installing Kubernetes

Kubernetes elements

Elements

Pod

work details

Deployment

scale / restart details

Service

inbound traffic
others ingress, replica set, stateful set,
job, cron job, secret, etc.

Pod

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80

source: https://kubernetes.io/docs/user-guide/walkthrough/

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

source: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

Deployment apiVersion

v1.9+ apiVersion: apps/v1
v1.8 apiVersion: apps/v1beta2
v1.7 & 1.6 apiVersion: apps/v1beta1
< 1.6 apiVersion: extensions/v1beta1

Service

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - port: 80
    protocol: TCP

source: https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/

Service Types

no service no traffic into pod

NodePort

specific port on each node

ClusterIP

free internal port on cluster

LoadBalancer

cloud's native load balancer

Mapping Service to Pod

Service.yaml

kind: Service
...
spec:
  selector:
    app: nginx
...

Pod.yaml (or template in Deployment.yaml)

kind: Pod
metadata:
  labels:
    app: nginx
...

DEMO: yaml config files

Kubernetes cli

DEMO: launch apps

DEMO: upgrade apps

kubectl UI

kubernetes dashboard

source: https://github.com/kubernetes/dashboard

kubectl UI

Warning

It's really easy to change things.

Next time you deploy
your changes will be lost.