Docker en prod ? Oui, avec Kubernetes !

Pascal MARTIN, DevOps @ M6 Web

Docker en prod ? Oui, avec Kubernetes !

Pascal MARTIN, DevOps @ M6 Web

Appuyez sur [s] pour ouvrir les notes présentateur dans une nouvelle fenêtre.

Utilisez la touche [ESPACE]
pour passer au slide suivant.

Il y a deux ans…

Docker

En dev \o/

Docker

En prod /o\

Aujourd’hui : 6play

Notre projet ?

Migrer vers Le Cloud

Kubernetes

Une solution magique ?

Kubernetes 101

Les conteneurs

Docker : 2013

C’est une révolution ! Amazing!

LXC : 2008

Un conteneur

  • Virtualisation légére
  • Un processus
  • Isolation
  • Basé sur une image (immuable)

Gestion de conteneurs

Quelques questions

Comment avoir des conteneurs
nginx, php-fpm, varnish, MySQL et Elasticsearch ?
Et qu’ils se parlent ?
Comment avoir
5 conteneurs php-fpm ?
… quand j’ai beaucoup de visiteurs ?
Comment nginx sait
à quels conteneurs php-fpm
envoyer les requêtes ?
Comment avoir
un worker ?
… qui tourne en permanence ?
… et plusieurs ?
Et si un conteneur plante ?
Et comment mettre à jour mon application ?

Bref…

C’est pas facile !

Orchestration is the automated arrangement, coordination, and management of computer systems, middleware, and services.

Quelques orchestrateurs ?

logo ACS logo CoreOS Fleet logo Docker Swarm
logo ECS logo EKS logo GKE
logo Kubernetes logo Mesos Marathon

Kubernetes

  • 15 ans d’XP chez Google (Borg)
  • Open-source (2014), Go
  • Google, CoreOS, Redhat, Microsoft…
  • Le orchestrateur de conteneurs.

Primitives principales

Cluster

Regroupe l’ensemble des machines avec lesquelles Kubernetes travaille.

Node

Machine, souvent virtuelle, qui fait partie du cluster.

Master node

Pour les fonctionnalités internes de Kubernetes.

Worker node

Pour vos applications.

Pod

Une application tourne, sous forme d’un ou plusieurs containers, dans un pod.

Pod

Plein d’options !

  • Replicas
  • Sécurité
  • Liveness probe
  • Readiness probe
  • Volumes
  • Requests
  • Limits
  • Envvars
  • Stratégie de MAJ
  • Hooks start/stop

Service

Expose un (ou plusieurs) pod sur le réseau.

Scaling

  • Horizontal Pod Autoscaler : + de pods
  • Cluster autoscaler : + de nodes

C’est pas fini !

Plein d’autres primitives.
Pas besoin de les connaitre tout de suite…

Du YAML

apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: monapp-api
    spec:
      template:
        metadata:
          labels:
            app: "monapp"
            type: "api"
        spec:
          containers:
          - name: "php"
            image: "mon-registre.com/monapp-php:v42"
            env:
            - name: APP_ENV
              value: "prod"
    ...
apiVersion: v1
    kind: Service
    spec:
      type: LoadBalancer
      ports:
      - name: nginx-http
        protocol: TCP
        port: 80
        targetPort: 8080
      selector:
        app: "monapp"
        type: "api"
apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: "monapp-api"
      minReplicas: 2
      maxReplicas: 8
      metrics:
      - type: Resource
        resource:
          name: cpu
          targetAverageUtilization: 80

kubectl


    kubectl apply -f *.yaml
                            
$ kubectl get pods
    NAME                            READY  STATUS   RESTARTS  AGE
    service-…-api-764b8d9594-7m2n2  2/2    Running  0         3d
    service-…-api-764b8d9594-884sl  2/2    Running  0         3d

    $ kubectl get svc
    NAME           TYPE          CLUSTER-IP     EXTERNAL-IP   PORT(S)       AGE
    kubernetes     ClusterIP     100.64.0.1     <none>        443/TCP       72d
    service-…-api  LoadBalancer  100.64.14.251  aa4a30a359c…  80:30939/TCP  72d

    $ kubectl get hpa
    NAME           REFERENCE         TARGETS  MINPODS  MAXPODS  REPLICAS  AGE
    service-…-api  Deployment/…-api  12%/80%  2        4        2         18d

Récapitulons

Un cluster Kubernetes…

  • Nodes (masters + workers)
  • Pods, Services
  • Scaling : pods, nodes
  • kubectl

Le Cloud
@ M6 Web

Nos équipes

  • Sysadmins
  • Dév. front + back
  • DevOps
  • Product owners
  • Management

Nos applications

  • Web, API, Workers
  • Beaucoup de PHP + JS/node

Charge variable

Charge CPU sur cluster ESX

IaaS, Services managés

  • Plus de souplesse
  • Moins d’administration système ?
  • Sur AWS : S3, RDS, SQS, DynamoDB…

Infrastructure as Code

  • Base commune : ops
  • Spécifique projets : devs
  • Approche DevOps

Terraform

resource "aws_db_instance" "database" {
        identifier     = "${var.rds_database_identifier}"
        name           = "dbname"
        username       = "username"
        password       = "password"
        engine         = "postgres"
        engine_version = "10.3"
        instance_class = "${var.instance_type}"

        tags {
            project = "${var.project}"
            team    = "${var.team}"
            name    = "${var.rds_database_identifier}"
        }
    }

Dans les projets

  • Infrastructure de dev
  • Validation en staging
    Backups, performances, failover…
  • Déploiement en production

Dans les projets

.cloud/
        docker/
            nginx/Dockerfile
            php/Dockerfile
        jenkins/
            Jenkinsfile
        kubernetes/
            deployment.yaml
        terraform/
            vars/
            rds.tf

Une nouvelle app ?

  • Pas d’existant
  • Pas de migration
  • Facile !
  • Pas de fallback ;-(

Sécurité !

  • Appli existante
  • 1% dans Le Cloud
  • 99% on-premise

Monitoring

Système : Prometheus

Monitoring

Applicatif : on-prem

Logging

on-prem

1ère migration : bilan ?

1ère migration : bilan ?

Charge CPU

1ère migration : bilan ?

Horizontal Pod Autoscaler in action

Applications
cloud native

Récapitulons

  • Coder « cloud native »
  • Infrastructure : Terraform
  • Dockerfiles + build des images
  • Manifests Kubernetes
  • CD, Jenkins

C’est pas
fini !

Ecosystème
moyennement

mûr

CI/CD,
déploiement

CI/CD,
déploiement

CI/CD, déploiement

Pipeline Jenkins

jenkins pipeline, all green

Ça bouge.
Toujours.

Vite.

Ça bouge. Toujours. Vite.

Service mesh, monitoring, déploiement, logging, CRD, Serverless, Distroless…

Et les mises à jour…

Ça bouge. Toujours. Vite.

On a migré dans le cloud en 5 minutes, pour 5 dollars par mois !

Environnement
de dev ?

Environnement de dev ?

Quelques pistes à essayer

  • Telepresence
  • Skaffold

Le mot
de la fin…

Migrer vers Le Cloud

Ça prend beaucoup de temps !

Objectif atteint !

Mais la route n’est pas toute droite…

Kubernetes, super puissant

Outil mûr, qui marche très bien
et qui se répand.

Falaise d’apprentissage !

#noPanic

Pas encore
tout mûr autour…

C.D.D.

Conference Driven Devops

Pascal MARTIN

blog.pascal-martin.fr
@pascal_martin

M6 Web, Lyon

leanpub.com/6cloud

Le Plan Copenhague

Comment nous avons migré la plate-forme 6play vers Le Cloud, sur AWS et Kubernetes.