19
DevOps Workflow From 0 to kube in 60 min Christian Kniep, v2018-02-20 Technical Account Manager, Docker Inc. http://qnib.org/devops-workflow

DevOps Workflow - HPC Advisory Council Workflow From 0 to kube in 60 min Christian Kniep, v2018-02-20 Technical Account Manager, Docker Inc

  • Upload
    tranthu

  • View
    223

  • Download
    2

Embed Size (px)

Citation preview

DevOps WorkflowFrom 0 to kube in 60 min

Christian Kniep, v2018-02-20Technical Account Manager, Docker Inc.http://qnib.org/devops-workflow

MotivationIteration barriers

ClusterLaptop

Works on my Laptop!Why is DevOps not enough.

ProdDevelopment

DevArtifact: code

Env: interactive

OpsArtifact: pkg/imgEnv: automated

DevOps

Release/Integration

ReleaseArtifact: pkg/imgEnv: automated

DevRelOps

Prod

OpsArtifact: pkg/imgEnv: automated

Development

DevArtifact: code

Env: interactive

DevRel*Ops

Prod

OpsArtifact: pkg/imgEnv: automated

Development

DevArtifact: codeEnv: interactive

Q&

A

Perform

ance

Release/Integration

ReleaseArtifact: pkg/imgEnv: automated

Experiment

Experiment

Experiment

● Ship the image using a (private) Docker Registry

● Orchestrate the Image: docker-compose.yml

Build, Ship & RunWhere ‘Run’ == ‘Orchestrate’

● Build the image: Dockerfile + context -> Docker Image

For the developer the orchestration should be transparent and out of scope.Artifacts are: 1. Dockerfile + context (git repository)2. docker-compose.yml (git repository)

Application ContainerizationPortability, Reproducibility

As a developer I want to work on a

webapp for DockerCon EU, which

represents a simple three tier stack.

● web: JS app I am working on

● words: API serving business logic

● db: Database backend

web

api

db

api

Prerequisite for Workshophttp://qnib.org/devops-workflow

Docker Desktop

- Docker4Mac / Docker4Win edge-channel (provides kubernetes)

- DockerCE for Linux

Git Repository

git clone [email protected]:ChristianKniep/k8s-wordsmith-demo.git

cd k8s-wordsmith-demo.git

git checkout -b update/container_to_kube

docker-compose pull

cd swarmprom ; docker-compose pull

#1 Building the Image(s)First Step as a Developer

docker-compose build

$ export TAG=$(date +%s)$ docker-compose buildWARNING: Some services (api) use the 'deploy' key, which will be ignored.Building webStep 1/12 : FROM golang:1.9.1-alpine3.6 as builder*snip*Successfully tagged qnib/k8s-wordsmith-web:1518955537Building api*snip*Successfully tagged qnib/k8s-wordsmith-api:1518955537Building db*snip*Successfully tagged qnib/k8s-wordsmith-db:1518955537

#2 Simple ContainerOne-shot Orchestration

docker-compose build

$ docker-compose upWARNING: Some services (api) use the 'deploy' key, which will be ignored. Creating network "k8swordsmithdemo_default" with the default driverCreating k8swordsmithdemo_web_1 ... doneCreating k8swordsmithdemo_api_1 ... doneCreating k8swordsmithdemo_db_1 ... doneAttaching to k8swordsmithdemo_db_1, k8swordsmithdemo_api_1, k8swordsmithdemo_web_1db_1 | The files belonging to this database system will be owned by user "postgres".db_1 | This user must also own the server process.

#3 Deploying Stack in SWARMSimple yet Powerful Orchestration

SWARM at a GlanceEasy to understand and reason about

$ cd swarmprom$ docker stack deploy -c docker-compose.yml promCreating network prom_netCreating config prom_service_rulesCreating config prom_node_nameCreating config prom_caddy_configCreating config prom_dockerd_configCreating config prom_node_rulesCreating config prom_task_rulesCreating service prom_caddyCreating service prom_dockerd-exporterCreating service prom_cadvisorCreating service prom_grafanaCreating service prom_node-exporterCreating service prom_prometheus

Deploy Auxiliary Stack to Monitor SWARMFork of: https://github.com/stefanprodan/swarmprom

Docker stack deployUsing the Docker SWARM API

$ docker stack deploy -c docker-compose.yml wordsIgnoring unsupported options: build

Creating network words_defaultCreating service words_webCreating service words_dbCreating service words_api$ docker service ls --format="{{.Name}}\t{{.Replicas}}\t{{.Image}}\t{{.Ports}}"words_api 5/5 qnib/k8s-wordsmith-api:1518955537words_db 1/1 qnib/k8s-wordsmith-db:1518955537words_web 1/1 qnib/k8s-wordsmith-web:1518955537 *:8080->80/tcp$

$ docker stack deploy -c docker-compose.yml words #2>dev/nullUpdating service words_web (id: fv7z1lryqmysxhzobdjrbgecl)image qnib/k8s-wordsmith-web:1518955537 could not be accessed on a registry to record its digest. Each node will access qnib/k8s-wordsmith-web:1518955537 independently, possibly leading to different nodes running different versions of the image.

#4 Deploying Stack in KubernetesUsing CustomResourceDefinitions

Docker stack deploy #2Using the docker-CRD within Kube

$ docker stack rm wordsRemoving service words_apiRemoving service words_dbRemoving service words_webRemoving network words_default$ export DOCKER_ORCHESTRATOR=kubernetes$ docker stack deploy -c docker-compose.yml wordsStack words was createdWaiting for the stack to be stable and running... - Service api has one container running - Service db has one container running - Service web has one container runningStack words is stable and running$

#5 Deploying Stack in KubernetesUsing Kubernetes Object Files

Kubectl deploy #2Using the kubectl CLI

$ export DOCKER_ORCHESTRATOR=kubernetes$ kubectl apply -f .deployment "kube-api" createdservice "kube-api" createddeployment "kube-db" createdservice "kube-db" createddeployment "kube-web" createdservice "kube-web" created$

THANK YOU :)[email protected]