Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare une entreprise Scribd logo
Checklist pour concevoir
une application dans le
cloud
10 conseils à l'attention des concepteurs
Alexandre Touret / @touret_alex
Alexandre Touret
Architecte / Développeur
#Java #API #CI
#Software_Craftsmanship
2
@touret_alex https://blog.touret.info
Un peu de
contexte ...
1.
4
Technologies
utilisées
5
En avez vous
VRAIMENT
besoin ?
Application gestion
Périmètre maîtrisé
Déploiement déjà automatisé
7
Quelles sont les
contraintes techniques?
Avez-vous des SLOs contraignantes?
(ex. disponibilité supérieure à 99%)
Avez vous vraiment besoin de scaler dynamiquement votre
application ?
8
Mise à disposition
d’environnements
9
Avez vous besoin de délivrer des environnements à la
demande (et très rapidement)?
Les bases de
Docker & Cie
11
Il vous faudra
connaître
12
13
Le contexte
« les organisations qui conçoivent
des systèmes [...] tendent
inévitablement à produire des
designs qui sont des copies de la
structure de communication de
leur organisation. »
— M. Conway
15
Quel est le RACI ?
Est-ce que votre organisation est compatible ?
16
RACI &
Responsabilités
Les
applications
stateless et les
autres ...
18
Codebase
One codebase tracked in revision
control, many deploys
Dependencies
Explicitly declare and isolate
dependencies
Config
Store config in the environment
Backing Services
Treat backing services as attached
resources
Build, release, run
Strictly separate build and run
stages
Backing Services
Treat backing services as attached
resources
Processes
Execute the app as one or more
stateless processes
Port Binding
Export services via port binding
Disposability
Maximize robustness with fast
startup and graceful shutdown
Dev/prod parity
Keep development, staging, and
production as similar as possible
Logs
Treat logs as event streams
Admin processes
Run admin/management tasks as
one-off processes
Source: https://12factors.net
19
Pour une API
Démarrage
(rapide) de
l’application
21
Bien choisir ses
frameworks et
environnements
d’exécution
23
24
Items à identifier
✓ Rapidité du démarrage
✓ Gestion des arrêts
✓ Capacité à s’intégrer dans Docker et K8S
✓ Observabilité
✓ Mémoire et CPU utilisées
✓ Gestion des dépendances et du patch management
TOMCAT vs FAT JARS
→ Un compromis Production - Équipes de développement
25
L’ observabilité
Adresser sur ce sujet
dès la conception !
Ne pas attendre la mise en production :)
Exposer via des endpoints REST l’état de votre système
Faire attention aux FRAMEWORKS utilisés
27
liveness &
readiness probes
livenessProbe:
failureThreshold: 3
httpGet:
path: /actuator/health/liveness
port: http
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
28
readinessProbe:
failureThreshold: 3
httpGet:
path: /actuator/health/readiness
port: http
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 1
Spring Actuator
management.health.probes.enabled=true
LivenessStateHealthIndicator & ReadinessStateHealthIndicator
29
30
@Component
public class MongoDBActuatorHealthIndicator implements HealthIndicator {
[...]
@Override
public Health health() {
// ping database
}
@Override
public Health getHealth(boolean includeDetails) {
if (!includeDetails) {
return health();
} else {
var statuses = mongoDBHealthService.findStatusForAllConfigurations();
return Health.status(checkStatus(statuses)).withDetails(statuses).build();
}
}
[...]
}
Monitoring
▪ Prometheus
▪ Grafana
31
La CI/CD
Étapes à intégrer
dans votre chaîne
✓ Tests unitaires + intégration
✓ Création d’image Docker automatique
✓ “Smoke tests” de l’image crée
✓ Déploiement continu de la branche develop
✓ Déploiement de vos charts HELM (linter?)
✓ Déploiement d’une release
✓ ... 33
Exemple
Migration Spring Boot, Tomcat, JDK
Testé en local → Dev → Recette
⇒ En 1 jour
34
La
configuration
36
▪ Variables d’environnement
▪ Config Maps
▪ Secrets
Les variables
d’environnement
spec:
containers:
- env:
- name: JAVA_OPTS
value: >-
-XX:+UseContainerSupport -XX:MaxRAMPercentage=70.0
-Dfile.encoding=UTF-8 -
Djava.security.egd=file:/dev/./urandom
37
Les config maps
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2021-03-11T18:38:34Z
name: my-config-map
[...]
data:
JAVA_OPTS: >-
-XX:+UseContainerSupport -XX:MaxRAMPercentage=70.0
-Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom
38
Quid des fichiers
de configuration ?
On peut les spécifier “comme des variables” directement
dans les config maps
On peut les externaliser
39
Les fichiers dans
les config maps
volumeMounts:
- mountPath: /config
name: configuration-volume
readOnly: true
[...]
volumes:
- configMap:
defaultMode: 420
name: configuration
name: configuration-volume
40
apiVersion: v1
kind: ConfigMap
[...]
data:
my.conf: {{- (.Files.Glob
"conf/*").AsConfig | nindent 2 }}
Externaliser les
valeurs
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
labels:
[...]
spec:
maxReplicas: {{ .Values.myapp.maxReplicaCount }}
minReplicas: {{ .Values.myapp.minReplicaCount }}
[...]
targetCPUUtilizationPercentage: {{ .Values.myapp.replicationThreesold }} 41
Le fichier
values.yml
myapp:
minReplicaCount: "2"
maxReplicaCount: "6"
replicationThreesold: 80
42
Les templates de
fichier
apiVersion: v1
kind: ConfigMap
metadata:
name: configuration
labels:
[...]
data:
application.properties:
|-
{{ tpl (.Files.Get "conf/application.properties") . | nindent 4}}
43
Les templates
Le fichier application.properties
logging.level.org.hibernate.stat={{
.Values.configmap.application.org_hib
ernate_stat }}
logging.level.org.springframework.sec
urity={{
.Values.configmap.application.org_spr
ingframework_security }}
44
Le fichier values.yml
configmap:
application:
org_hibernate_stat: ERROR
org_springframework_security:
ERROR
Les fichiers
binaires
apiVersion: v1
# Definition of secrets
kind: Secret
[...]
type: Opaque
# Inclusion of binary configuration files
data:
my_keystore.jks: {{ .Files.Get "secrets/my_keystore.jks" | b64enc }}
45
Logger
efficacement
L’utilisation des
logs
Dans la console:
kubectl logs --tail
Agrégateur de logs (ex. ELK)
47
Flux de sortie des
containers Docker
stdout & stderr
Inutile de configurer la sortie vers des fichiers
48
Bonnes pratiques
Indiquer dans vos LOGS:
Les éléments de votre conteneur (Image, containerID,...)
Les éléments de contexte K8S (IP POD, ID POD,
namespace,...)
Log4j Docker Support – Log4j Kubernetes Support
49
Pour aller plus loin
Vous pouvez logger et tracer les appels à vos APIS:
Requête, ID de l’appelant, ID de corrélation,...
zalando/logbook: An extensible Java library for HTTP request and response
logging
50
Merci!
Des questions?
@touret_alex
51
11 mars 2021
Sharing is caring!
Tweettez @TheCloudFirstIO #TCF21
et tentez de gagnez vos stickers collector !
10 gagnants seront tirés
au sort dans la journée
Cette session vous a plu ?
Faites-nous votre retour,
et gagnez peut-être l’un des
30 packs stickers collector!
https://feedback.thecloudfirst.io

Contenu connexe

Checklist pour concevoir une application dans le cloud.10 conseils à l'attention des développeurs