37
DOCKER, KUBERNETES, AND GCP How do you use these complementary tools to deploy containers in the Cloud?

Docker, Kubernetes, and Google Cloud

Embed Size (px)

Citation preview

Page 1: Docker, Kubernetes, and Google Cloud

DOCKER, KUBERNETES, AND GCP How do you use these complementary tools to deploy containers in the Cloud?

Page 2: Docker, Kubernetes, and Google Cloud

THE BASICS

Page 3: Docker, Kubernetes, and Google Cloud

CONTAINER TECH Nothing new… Existed for years

Linux has LXC and Libcontainer, BSD has Jails, Solaris has

Zones

Page 4: Docker, Kubernetes, and Google Cloud

Docker (the company) just figured a clever way to packaging it and adding a rich toolset around it.

Page 5: Docker, Kubernetes, and Google Cloud

DOCKER BASICS •  Docker runs on Linux x64 (only) •  Dependent on libcontainer, a Linux container platform

•  Container isolation (sandbox): filesystem, process, network •  Layered filesystem

•  Benefits •  Versioning •  Portability •  Lightweight •  Faster to launch

Page 6: Docker, Kubernetes, and Google Cloud

DOCKER WORKFLOW

Dockerfile

Docker Client

docker build

Image

Docker Client

docker run

Container

Docker Client

docker pulldocker push

Docker Registry

Infrastructure

Client

swarmkubernetes

meso

Page 7: Docker, Kubernetes, and Google Cloud

DOCKER ON MAC •  Let’s focus on running Docker on the Mac •  Remember Docker only runs on Linux x64 •  How do I run it on the Mac? •  Need Virtual Machine to emulate a Linux host

•  Virtual machine (VM) running Linux x64 •  Docker engine running on VM •  Mac client to communicate with Docker engine on Linux VM

Page 8: Docker, Kubernetes, and Google Cloud

DOCKER FOR MAC VS DOCKER TOOLBOX

Docker for Mac Docker Toolbox

# VMs 1 Multiple

Underlying VM Hypervisor.framework

(xhyve) VirtualBox

Base OS Alpine Boot2Docker

(VM) Management Tool Docker.app docker-machine

(VM) Management UI GUI CLI

Page 9: Docker, Kubernetes, and Google Cloud

MAC DOCKER ARCHITECTURE Mac OS X

Virtual Machine (VirtualBox)Docker client

docker (CLI)Kinematic (GUI)

Docker Machine

Linux (Boot2Docker)

Container 1

Container 2

Kernel

Docker Engine

Dock

erDa

emon

API

docker (CLI)

Page 10: Docker, Kubernetes, and Google Cloud

KUBERNETES ARCHITECTURE

Master

API Server

Replication Scheduler Config(etcd)

Client

kubectl

Node

Kubelet

Kube-proxy

Pod 1

Container

Container

Container Engine

Pod 2

Container

Page 11: Docker, Kubernetes, and Google Cloud

KUBERNETES BASICS •  Tool to orchestrate containers at scale and managing the application/service stack

•  Master •  API Server and kubectl (client) – communicate and define the desired state •  Scheduler – schedule workload on nodes •  Replication – correct number of pod replicas •  Config – distributed config store

•  Node (Slave) •  Kubelet – communicate with master and start workloads •  Kube-proxy – load balancer and direct traffic •  Pod – group of 1..n containers tied together for admin and networking

•  Cluster = masters + nodes

Page 12: Docker, Kubernetes, and Google Cloud

DEMO Tying together what we have learned so far and deploy Docker containers to Google Cloud

Page 13: Docker, Kubernetes, and Google Cloud

HELLO WORLD ON GOOGLE CLOUD (KUBERNETES)

http://kubernetes.io/docs/hellonode/

Page 14: Docker, Kubernetes, and Google Cloud

PRE-REQUISITES – SERVER SIDE 1.  Go to https://console.cloud.google.com/ 2.  Create a GCP Project 3.  Copy the GCP Project ID

Page 15: Docker, Kubernetes, and Google Cloud

PRE-REQUISITES – CLIENT (MAC) SIDE # Install node and nvm (node version manager)$ brew update$ brew install nvm$ # Add the following to ~/.bash_profile$ # export NVM_DIR=~/.nvm $ # source $(brew --prefix nvm)/nvm.sh $ nvm install 7.0.0

Page 16: Docker, Kubernetes, and Google Cloud

PRE-REQUISITES – CLIENT (MAC) SIDE II $ # Install docker$ brew install docker-compose # should also install docker and docker-machine

$ # Install google cloud sdk$ brew cask install google-cloud-sdk$ gcloud components install kubectl$ # You may want to add the following:$ EXPORT PATH=$PATH:/opt/homebrew-cask/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/

$ # Set up Google Cloud environment$ export PROJECT_ID="my-google-cloud-project-id"

Page 17: Docker, Kubernetes, and Google Cloud

AUTHENTICATION # Set up your account with google cloud sdk$ gcloud auth login my-registered-email$ gcloud config set project my-google-cloud-project-id$ gcloud auth list

# Optional: env var set for convenience $ export PROJECT_ID="my-google-cloud-project-id"

$ # Note: your project-id != project name

Page 18: Docker, Kubernetes, and Google Cloud

NODE.JS CODE // Filename: server.js

var http = require('http');var handleRequest = function(request, response) { console.log('Received request for URL: ' + request.url); response.writeHead(200); response.end('Hello World!');};var www = http.createServer(handleRequest);www.listen(8080);

Page 19: Docker, Kubernetes, and Google Cloud

RUN DOCKER-MACHINE ON LOCAL VM $ # Before running any docker commands, run docker-machine to create a VirtualBox instance$ docker-machine create --driver virtualbox default$ docker-machine env$ eval "$(docker-machine env default)"$ docker-machine lsNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORSdefault * virtualbox Running tcp://192.168.99.100:2376 v1.12.0

Page 20: Docker, Kubernetes, and Google Cloud

DOCKERFILE FROM node:7.0.0ADD server.js .EXPOSE 8080CMD node server.js

Page 21: Docker, Kubernetes, and Google Cloud

DOCKER BUILD $ # Build docker image$ docker images$ docker build -t gcr.io/$PROJECT_ID/helloworld:v1 .

$ # Please get your project id right.$ # project name != project id. For example$ # project name = helloworld-kubernetes$ # project id = helloworld-kubernetes-148321

Page 22: Docker, Kubernetes, and Google Cloud

RUN LOCALLY $ # Run docker locally$ docker run -d -p 8080:8080 --name helloworld gcr.io/helloworld-kubernetes/helloworld:v1

$ # Docker machine$ docker-machine lsNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORSdefault * virtualbox Running tcp://192.168.99.100:2376 v1.12.3

$ # Docker containers running$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3047947245fa gcr.io/helloworld-kubernetes/helloworld:v1 "/bin/sh -c 'node ser" 4 minutes ago Up 3 minutes 0.0.0.0:8080->8080/tcp helloworld

$ curl http://192.168.99.100:8080Hello World!

# Or just do curl $(docker-machine ip default):8080

Page 23: Docker, Kubernetes, and Google Cloud

PRIVATE DOCKER REGISTRY (EMPTY)

Page 24: Docker, Kubernetes, and Google Cloud

PUSH IMAGE TO PRIVATE GOOGLE REGISTRY $ docker images$ gcloud docker -- push gcr.io/$PROJECT_ID/helloworld:v1

$ # If gcloud docker -- push doesn’t work, you probably didn’t set your project id properly. $ # project name != project id. For example$ # project name = helloworld-kubernetes$ # project id = helloworld-kubernetes-148321

Page 25: Docker, Kubernetes, and Google Cloud

PRIVATE DOCKER REGISTRY

Page 26: Docker, Kubernetes, and Google Cloud

PUSH IMAGE TO PRIVATE GOOGLE REGISTRY $ docker images$ gcloud docker -- push gcr.io/$PROJECT_ID/helloworld:v1

$ # If gcloud docker -- push doesn’t work, you probably didn’t set your project id properly. $ # project name != project id. For example$ # project name = helloworld-kubernetes$ # project id = helloworld-kubernetes-148321

Page 27: Docker, Kubernetes, and Google Cloud

CREATE A CONTAINER CLUSTER

Page 28: Docker, Kubernetes, and Google Cloud

CONFIGURE A CONTAINER CLUSTER

Page 29: Docker, Kubernetes, and Google Cloud

CREATED CONTAINER CLUSTER

Page 30: Docker, Kubernetes, and Google Cloud

GET CREDENTIALS FOR KUBECTL •  API Manager > Create

Credentials > Service Account Key

•  JSON Key type •  Download the json file

Page 31: Docker, Kubernetes, and Google Cloud

AUTH FOR KUBECTL $ # If you run kubectl, you see an error message$ kubectl versionerror: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.

$ You need to authenticate with the crentials$ export GOOGLE_APPLICATION_CREDENTIALS=~/helloworld-kubernetes-abcde00000.json$ gcloud auth application-default login

$ kubectl version # Should work now

Page 32: Docker, Kubernetes, and Google Cloud

RUN KUBERNETES NODE $ # Create and run a Kubernetes pod$ kubectl run helloworld --image=gcr.io/$PROJECT_ID/helloworld:v1 --port=8080deployment "helloworld" created

$ # Print deployments$ kubectl get deploymentsNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEhelloworld 1 1 1 1 1m

$ # Print pods$ kubectl get podsNAME READY STATUS RESTARTS AGEhelloworld-2696007752-golst 1/1 Running 0 5m

Page 33: Docker, Kubernetes, and Google Cloud

TEST WEBSITE $ # Expose pod. By default a Kubernetes node is only accessible by its internal IP address$ kubectl expose deployment helloworld --type="LoadBalancer"

$ kubectl get services helloworldNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEhelloworld 10.3.247.187 104.198.6.146 8080/TCP 2m$ curl 104.198.6.146:8080Hello World!

Page 34: Docker, Kubernetes, and Google Cloud

SCALE WEBSITE $ # Scale the pod to 4 replicas$ kubectl scale deployment helloworld --replicas=4

$ # Get status $ kubectl get deployment$ kubectl get pods

Page 35: Docker, Kubernetes, and Google Cloud

CHANGE CODE AND UPDATE GCP $ # Edit server.js$ vi server.js

$ # Build and push changes$ docker build -t gcr.io/$PROJECT_ID/helloworld:v2 .$ gcloud docker -- push gcr.io/$PROJECT_ID/helloworld:v2

$ # Deploy changes$ kubectl set image deployment/helloworld helloworld=gcr.io/$PROJECT_ID/helloworld:v2$ deployment "helloworld" image updated$ kubectl get podsNAME READY STATUS RESTARTS AGEhelloworld-2696007752-bergs 1/1 Terminating 0 15mhelloworld-2696007752-c87rs 1/1 Terminating 0 15mhelloworld-2696007752-golst 1/1 Terminating 0 14hhelloworld-2696007752-zwpi4 1/1 Terminating 0 15mhelloworld-2777403465-e802v 1/1 Running 0 11shelloworld-2777403465-ksyxe 0/1 ContainerCreating 0 5shelloworld-2777403465-rgq7f 1/1 Running 0 11shelloworld-2777403465-six3e 1/1 Running 0 4s

$ kubectl get services helloworldNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEhelloworld 10.3.247.187 104.198.6.146 8080/TCP 14h$ curl 104.198.6.146:8080Hello World 2!

Page 36: Docker, Kubernetes, and Google Cloud

CLEAN UP $ # Delete pod$ kubectl delete service,deployment helloworld$ # Delete container cluster$ gcloud container clusters delete helloworld

Page 37: Docker, Kubernetes, and Google Cloud

Q + A

Any questions? You can find me at @cybersam