Pascal MARTIN, DevOps @ M6 Web
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.
En dev \o/
En prod /o\
Migrer vers Le Cloud
Une solution magique ?
Docker : 2013
C’est une révolution ! Amazing!
LXC : 2008
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 ?
C’est pas facile !
Orchestration is the automated arrangement, coordination, and management of computer systems, middleware, and services.
Regroupe l’ensemble des machines avec lesquelles Kubernetes travaille.
Machine, souvent virtuelle, qui fait partie du cluster.
Pour les fonctionnalités internes de Kubernetes.
Pour vos applications.
Une application tourne, sous forme d’un ou plusieurs containers, dans un pod.
Plein d’options !
|
|
Expose un (ou plusieurs) pod sur le réseau.
Plein d’autres primitives.
Pas besoin de les connaitre tout de suite…
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
Un cluster Kubernetes…
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}"
}
}
.cloud/
docker/
nginx/Dockerfile
php/Dockerfile
jenkins/
Jenkinsfile
kubernetes/
deployment.yaml
terraform/
vars/
rds.tf
Système : Prometheus
Applicatif : on-prem
on-prem
Pipeline Jenkins
Service mesh, monitoring, déploiement, logging, CRD, Serverless, Distroless…
Et les mises à jour…
On a migré dans le cloud en 5 minutes, pour 5 dollars par mois !
Quelques pistes à essayer
Ça prend beaucoup de temps !
Mais la route n’est pas toute droite…
Outil mûr, qui marche très bien
et qui se répand.
Conference Driven Devops
blog.pascal-martin.fr
@pascal_martin
M6 Web, Lyon
Comment nous avons migré la plate-forme 6play vers Le Cloud, sur AWS et Kubernetes.