Post on 18-Feb-2017
#DevoxxFR
Kubernetes UniversityCap sur l’orchestration !
Cédric Hauber @cedbossGérôme Egron @geromeegronJean-Baptiste Claramonte @jbclaramonte
1
#DevoxxFR
Product Backlog Tâches du sprint
Planification de sprint
Revue de sprint
Sprint2 à 4
semaines
Produit enrichi
Les équipes sont devenues agiles
11
#DevoxxFR
Backend
DB
Frontend
Gateway
DB
Frontend
Module 1 Module 2 Module 3
Les architectures micro-services se sont répandues
13
#DevoxxFR
Agilité Augmentation du nombre de livraisons
Micro-service
Augmentation du nombre de modules à livrer
14
#DevoxxFR
VM vs conteneurs
Guest OS
Bins /Libs
App#1
Hyperviseur
Host OS
Server
Guest OS
Bins /Libs
App#1
Guest OS
Bins /Libs
App#1
Bins /Libs
App#1
Host OS
Server
Bins /Libs
App#1
Bins /Libs
App#1
Docker engine
VM Container
18
#DevoxxFR
Livraison
● Lorsque je livre mon application, je la livre avec son contexte d’exécution
● Je peux placer mon conteneur sur n’importe quelle machine où Docker est installé
20
#DevoxxFR
En local
● Partage du réseau hôte
● Utilisation de l’option Link de Docker
● Utilisation de l’API X-Networking
24
#DevoxxFR
Sur un cluster ?
Nouvelles problématiques :
- Comment savoir où se trouvent les conteneurs- Que faire si un noeud tombe- Comment correctement allouer les ressources
26
#DevoxxFR
Fleet
+
- Partie intégrante de CoreOS- Repose sur Etcd- Permet de maintenir des services systemd dans le cluster
-
- Orchestrateur bas niveau → Fonctions limitées
30
#DevoxxFR
Swarm
+
- Créé par Docker pour Docker- Repose sur Consul- Très simple d’utilisation
-
- Forte adhérence à l’API Docker- Pas de Health-Check, pas de LoadBalancing...
31
#DevoxxFR
Rancher
+
- Image minimaliste- OS orienté tout-conteneur- Interface de management- Kubernetes / Swarm / Cattle out of the box
-
- Installation parfois compliquée- Supporte uniquement Docker
32
#DevoxxFR
Kubernetes
+
- Profite du savoir-faire de Google en matière de Conteneurs- Repose sur Etcd- Compatible avec Docker & Rocket- Une communauté très établie- Regorge de fonctionnalités
-
- Mise en place parfois ardue
33
#DevoxxFR
Mesos - Marathon
+
- Déploiement rapide sur AWS / GCP / Azure- A fait ses preuves- Supporte plusieurs frameworks
-
- Une couche supplémentaire qui n’est pas nécessaire dans 90% des cas
34
#DevoxxFR
Pourquoi Kubernetes
● La solution la plus aboutie● Preuve d’une expérience de plus de 10 ans● Grosse communauté● Opinionated● Cloud-Provider Aware :)● Production-Ready !● C’est super cool !
36
#DevoxxFR
node
(physical or virtual machine)
cluster
node
(physical or virtual machine)
node
(physical or virtual machine)
node
(physical or virtual machine)
node
(physical or virtual machine)
node
(physical or virtual machine)
40
#DevoxxFR
node
(physical or virtual machine)
cluster
Masternode
(physical or virtual machine)
Workernode
(physical or virtual machine)
Worker
node
(physical or virtual machine)
Workernode
(physical or virtual machine)
Workernode
(physical or virtual machine)
Worker
41
#DevoxxFR
Etcd
● Développé par CoreOs● BDD Clé/Valeur distribuée ● Stocke l’état du cluster Kubernetes
45
#DevoxxFR
API-Server
● Point d’interface avec le cluster○ CLI: kubectl○ REST API
● Stateless○ Utilise etcd comme stockage
46
#DevoxxFR
API-Server
API-Server
SchedulerController-Manager
kubectl / http client
node (Master) node (Worker)
47
#DevoxxFR
Scheduler
● Vision globale des ressources du cluster
● Distribue les conteneursd’applications dans le cluster
48
#DevoxxFR
Controller-Manager
● C’est la boucle de contrôle pour toutes les ressources Kubernetes
● Assure l’état du cluster
50
#DevoxxFR
Kubelet
● Agent principal sur chaque Node● Reçoit les demandes de création
de Pod● Monte les Volumes des Pods● Lance les conteneurs● Rapporte l’état des
pods/conteneurs à l’API-Server
52
#DevoxxFR
Kube-Proxy
● Observe l’ajout/suppression de Services et Endpoints
● Met à jour iptables
54
#DevoxxFR
Pod
● Plus petite unité logique
● Encapsule un ou plusieurs conteneurs
○ Partage de contexte
● Unité pouvant être répliquée
● Lié à un node
● Existence temporaire
58
#DevoxxFR
Labels
• Pairs clé/valeur
• Attachable à tous les éléments de kubernetes
• Donner du sens aux objets de kubernetes
62
#DevoxxFR
node node node
node node node
disk: ssddisk: ssd
disk: ssd
gpu: true
disk: ssd
gpu: true
disk: ssd
63
#DevoxxFR
kubectl get pods -l release=stable, tier=frontend
kubectl get pods -l release in stable, tier in (frontend)’
kubectl get pods -l release in (stable, canary)’
kubectl get pods -l ‘release notin (stable)
Requêtage évolué
65
#DevoxxFR
node Worker
Pod
role: database
selector
Replication controller
templatereplicas: 2
Pod
role: database
67
#DevoxxFR
node Worker
Pod
role: database
selector
Replication controller
templatereplicas: 2
Pod
role: database
68
#DevoxxFR
node Worker
Pod
role: database
selector
Replication controller
templatereplicas: 2
Pod
role: database
70
#DevoxxFR
node Worker
Pod
role: database
selector
Replication controller
templatereplicas: 2
Pod
role: database
71
#DevoxxFR
node Worker
Pod
Load balancing Service
role: database
Pod
role: database
75
node Worker node Worker
Pod
role: application
#DevoxxFR 77
node Worker
PodService
rethinkdbdb: rethinkdbrole: replica
node Worker
Servicetodo-app
Pod
app: todo
#DevoxxFR
Plusieurs solutions
79
- Google Compute Advanced Routing- Flannel- OpenVSwitch- Weave- Calico- Romana
#DevoxxFR
node
(physical or virtual machine)
Masternode
(physical or virtual machine)
Workernode
(physical or virtual machine)
Worker
node
(physical or virtual machine)
Workernode
(physical or virtual machine)
Workernode
(physical or virtual machine)
Worker
80
#DevoxxFR
node
(physical or virtual machine)
Flannel
Masternode
(physical or virtual machine)
Workernode
(physical or virtual machine)
Worker
node
(physical or virtual machine)
Workernode
(physical or virtual machine)
Workernode
(physical or virtual machine)
Worker
81
#DevoxxFR
Pod
rethinkdb1
Pod
app2
Pod
rethinkdb2
Pod
app1
10.2.1.2
10.2.1.5
10.2.2.3
10.2.2.2
Doc
ker
10.2
.1.1
/24
Flan
nel
10.2
.1.0
/16
Doc
ker
10.2
.2.1
/24
Flan
nel
10.2
.2.0
/16
Eth
erne
t19
2.16
8.0.
100
Eth
erne
t19
2.16
8.0.
100
85
#DevoxxFR
Pod
rethinkdb1
Pod
app2
Pod
rethinkdb2
Pod
app1
10.2.1.2
10.2.1.5
10.2.2.3
10.2.2.2
Doc
ker
10.2
.1.1
/24
Flan
nel
10.2
.1.0
/16
Doc
ker
10.2
.2.1
/24
Flan
nel
10.2
.2.0
/16
Eth
erne
t19
2.16
8.0.
100
Eth
erne
t19
2.16
8.0.
100
86
#DevoxxFR
Pod
rethinkdb1
Pod
app2
Pod
rethinkdb2
Pod
app1
10.2.1.2
10.2.1.5
10.2.2.3
10.2.2.2
Doc
ker
10.2
.1.1
/24
Flan
nel
10.2
.1.0
/16
Doc
ker
10.2
.2.1
/24
Flan
nel
10.2
.2.0
/16
Eth
erne
t19
2.16
8.0.
100
Eth
erne
t19
2.16
8.0.
100
MAC
Node IP
Container / Pod IP
Packet
Packet Flannel
87
#DevoxxFR
Pod
rethinkdb1
Pod
app2
Pod
rethinkdb2
Pod
app1
10.2.1.2
10.2.1.5
10.2.2.3
10.2.2.2
Doc
ker
10.2
.1.1
/24
Flan
nel
10.2
.1.0
/16
Doc
ker
10.2
.2.1
/24
Flan
nel
10.2
.2.0
/16
Eth
erne
t19
2.16
8.0.
100
Eth
erne
t19
2.16
8.0.
100
MAC
Node IP
Container / Pod IP
Packet
Packet Flannel
88
#DevoxxFR
Pod
rethinkdb1
Pod
app2
Pod
rethinkdb2
Pod
app1
10.2.1.2
10.2.1.5
10.2.2.3
10.2.2.2
Doc
ker
10.2
.1.1
/24
Flan
nel
10.2
.1.0
/16
Doc
ker
10.2
.2.1
/24
Flan
nel
10.2
.2.0
/16
Eth
erne
t19
2.16
8.0.
100
Eth
erne
t19
2.16
8.0.
100
MAC
Node IP
Container / Pod IP
Packet
Packet Flannel
89
#DevoxxFR
Pod
rethinkdb1
Pod
app2
Pod
rethinkdb2
Pod
app1
10.2.1.2
10.2.1.5
10.2.2.3
10.2.2.2
Doc
ker
10.2
.1.1
/24
Flan
nel
10.2
.1.0
/16
Doc
ker
10.2
.2.1
/24
Flan
nel
10.2
.2.0
/16
Eth
erne
t19
2.16
8.0.
100
Eth
erne
t19
2.16
8.0.
100
90
#DevoxxFR
Pod
rethinkdb1
Pod
app2
Pod
rethinkdb2
Pod
app1
10.2.1.2
10.2.1.5
10.2.2.3
10.2.2.2
Doc
ker
10.2
.1.1
/24
Flan
nel
10.2
.1.0
/16
Doc
ker
10.2
.2.1
/24
Flan
nel
10.2
.2.0
/16
Eth
erne
t19
2.16
8.0.
100
Eth
erne
t19
2.16
8.0.
100
91
#DevoxxFR
ServiceProblème :
un Pod est éphémèreson adresse IP également
Solution : le service joue le rôle d’ambassadeur en fournissant une adresse ip durable Il joue également le rôle de load balancer
94
#DevoxxFR
HOME=/rootHOSTNAME=another-app-a6nvu-ws5i4KUBERNETES_PORT_443_TCP_PORT=443KUBERNETES_PORT=tcp://10.0.0.1:443KUBERNETES_SERVICE_PORT=443KUBERNETES_SERVICE_HOST=10.0.0.1KUBERNETES_PORT_443_TCP_PROTO=tcpKUBERNETES_SERVICE_PORT_HTTPS=443KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443MY_APP_PORT_80_TCP=tcp://10.0.0.242:80MY_APP_SERVICE_PORT=80MY_APP_SERVICE_HOST=10.0.0.242MY_APP_PORT_80_TCP_PORT=80MY_APP_PORT=tcp://10.0.0.242:80MY_APP_PORT_80_TCP_PROTO=tcpMY_APP_PORT_80_TCP_ADDR=10.0.0.242NGINX_VERSION=1.9.14-1~jessiePATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binPWD=/SHLVL=1
Dans le pod another-app
103
#DevoxxFR
Accès via DNS
• Utilise le addon Kubernetes “SkyDNS”
<service-name>.<namespace>.svc.cluster.local
Ou tout simplement
<service-name>
104
#DevoxxFR
NodePort
• Kubernetes alloue un port :• [30 000 - 32 767]
• Tous les Nodes du cluster vont exposer ce port
• Kubernetes expose alors le service :• <Node IP>:<NodePort>
106
#DevoxxFR
node Worker
Pod my-app
Service my-app
node Worker
IP:<NodePort>IP:<NodePort>
Label selector
108
#DevoxxFR
node Worker
Pod my-app
Service my-app
node Worker
IP:<NodePort>IP:<NodePort>
Label selector
109
#DevoxxFR
node Worker
Pod my-app
Service my-app
node Worker
IP:<NodePort>IP:<NodePort>
Label selector
110
#DevoxxFR
node Worker
Pod my-app
Service my-app
node Worker
IP:<NodePort>IP:<NodePort>
Label selector
111
#DevoxxFR
node Worker
Pod my-app
Service my-app
node Worker
IP:<NodePort>IP:<NodePort>
Label selector
112
#DevoxxFR
Différences ClusterIP / NodePort
# type=NodePort
Name: my-app-node-portNamespace: defaultLabels: run=my-appSelector: run=my-appType: NodePortIP: 10.0.0.246Port: <unset> 80/TCPNodePort: <unset> 30084/TCPEndpoints: 172.17.0.2:80Session Affinity: None
# type=ClusterIP
Name: my-appNamespace: defaultLabels: run=my-appSelector: run=my-appType: ClusterIPIP: 10.0.0.242Port: <unset> 80/TCP
Endpoints: 172.17.0.2:80Session Affinity: None
113
#DevoxxFR
Service load balancer
• Fonctionne uniquement pour certains Cloud Providers• GCP• AWS• RackSpace• OpenStack
114
#DevoxxFR
node W
orker
Pod my-app
Cluster kubernetes
Cloud provider
node W
orkerPod my-app
node W
orker
Pod my-app
Load balancer
115
#DevoxxFR
Deployments
- Permet de déployer facilement des applications- Supporte plusieurs types de mises à jour :
- Rolling Update- Replace- A/B Deployment
- Il n’a pas vocation à remplacer le ReplicationController
117
#DevoxxFR
Rolling Update
● Une application sera mise à jour de multiples fois au cours de son existence
● Cette procédure de mise à jour doit donc être simple et automatisée
● C’est d’autant plus vrai dans un cluster● Kubernetes a pensé à vous
118
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
ReplicaSet
node Worker
Pod v.1
node Worker
Pod v.1 Pod v.2
120
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
ReplicaSet
node Worker
Pod v.1 Pod v.2
node Worker
Pod v.2
122
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
Pod v.2
ReplicaSet
node Worker
Pod v.2
node Worker
Pod v.2
124
#DevoxxFR
A/B Deployment
● Nous déployons une nouvelle version de l’application● Une fois testée, nous redirigons le trafic sur celle-ci
128
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
ReplicaSet
node Worker
Pod v.1
node Worker
Pod v.1
Service
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
129
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
ReplicaSet
node Worker
Pod v.1
node Worker
Pod v.1 Pod v.2
Service
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v2
130
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
ReplicaSet
node Worker
Pod v.1
node Worker
Pod v.1 Pod v.2Pod v.2
Service
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v2
app: todoversion: v2
131
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
ReplicaSet
node Worker
Pod v.1
node Worker
Pod v.1 Pod v.2Pod v.2Pod v.2
Service
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v2
app: todoversion: v2
app: todoversion: v2
132
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
ReplicaSet
node Worker
Pod v.1
node Worker
Pod v.1 Pod v.2Pod v.2Pod v.2
Service
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v2
app: todoversion: v2
app: todoversion: v2
app: todoversion: v2
133
#DevoxxFR
node Worker
ReplicaSet
node Worker node Worker
Pod v.2Pod v.2Pod v.2
Service
app: todoversion: v2
app: todoversion: v2
app: todoversion: v2
app: todoversion: v2
134
#DevoxxFR
Replace
● L’ancienne version de l’application est supprimée● La nouvelle version nest déployée
136
#DevoxxFR
node Worker
Pod v.1
ReplicaSet
ReplicaSet
node Worker
Pod v.1
node Worker
Pod v.1
Service
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
app: todoversion: v1
137
#DevoxxFR
node Worker
ReplicaSet
node Worker node Worker
Pod v.2
Service
app: todoversion: v2
app: todoversion: v2
138
#DevoxxFR
node Worker
ReplicaSet
node Worker node Worker
Pod v.2Pod v.2
Service
app: todoversion: v2
app: todoversion: v2
app: todoversion: v2
139
#DevoxxFR
node Worker
ReplicaSet
node Worker node Worker
Pod v.2Pod v.2Pod v.2
Service
app: todoversion: v2
app: todoversion: v2
app: todoversion: v2
app: todoversion: v2
140
#DevoxxFR
Connaître l’état d’un conteneur
Rôle de l’agent Kubelet qui est présent sur chacun des nodes.
Est-ce que mon conteneur est prêt ?
→ Readiness probe
Est-ce que mon conteneur est vivant ?
→ Liveness probe
147
#DevoxxFR
Et la réaction ?
Readiness échoue → le pod garde son état mais n’est plus accessible
Liveness échoue → dépend de la politique de redémarrage
150
#DevoxxFR
node (Worker)
Kube-ProxyKubelet
Docker
Pod
155
running
Conteneur
Restart policy : Always ou onFailure
#DevoxxFR
node (Worker)
Kube-ProxyKubelet
Docker
Pod
156
running
Conteneur
Restart policy : Always ou onFailure
#DevoxxFR
node (Worker)
Kube-ProxyKubelet
Docker
Pod
157
running
Conteneur
Restart policy : Always ou onFailure
#DevoxxFR
Le problème
Les Pods sont éphémères
Quand ils disparaissent leurs données disparaissent également
159
#DevoxxFR
La Solution
Les Volumes
Un Volume permet de créer un point de montage dans le conteneur d’un pod
160
#DevoxxFR
Plusieurs types de Volumes
● emptyDir● hostPath● gitRepo● Secret
● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)
● gcePersistentDisk● awsElasticBlockStore● azureFileVolume
● persistentVolumeClaim
Sur le NodeNon persistent
161
#DevoxxFR
Plusieurs types de Volumes
● emptyDir● hostPath● gitRepo● Secret
● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)
● gcePersistentDisk● awsElasticBlockStore● azureFileVolume
● persistentVolumeClaim
Sur le NodeNon persistant
Partage RéseauPersistant
162
#DevoxxFR
Plusieurs types de Volumes
● emptyDir● hostPath● gitRepo● Secret
● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)
● gcePersistentDisk● awsElasticBlockStore● azureFileVolume
● persistentVolumeClaim
Sur le NodeNon persistant
Partage RéseauPersistant
Accès stockage Cloud ProviderPersistant
163
#DevoxxFR
Plusieurs types de Volumes
● emptyDir● hostPath● gitRepo● Secret
● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)
● gcePersistentDisk● awsElasticBlockStore● azureFileVolume
● persistentVolumeClaim
Sur le NodeNon persistant
Partage RéseauPersistant
Accès stockage Cloud ProviderPersistant
Représente une demande d’espace de stockage
164
#DevoxxFR
emptyDir
Répertoire créé sur le host et alloué au conteneur
Survit au crash du conteneur
Peut être associé à de la RAM
Supprimé lors de l’arrêt/déplacement du Pod
A utiliser typiquement comme espace de travail temporaire
165
#DevoxxFR
emptyDirapiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: redis-storage mountPath: /data/redis volumes: - name: redis-storage emptyDir: {}
La déclaration du volume
166
#DevoxxFR
emptyDirapiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: redis-storage mountPath: /data/redis volumes: - name: redis-storage emptyDir: {}
La déclaration du volume
Montage du volume dans le conteneur
167
#DevoxxFR
hostPath
Accès à un répertoire spécifique du Node
Suppose que tous les Nodes ont la même arborescence
En général utilisation déconseillée sauf si vous savez ce que vous faites
168
#DevoxxFR
Secret
- Permettent de stocker des informations sensibles:- Mot de passe- Clés SSH- Information d’authentification- …
- Stockés en clair dans Etcd- Ne sont pas cryptés- Ne sont pas stockés sur les noeuds
169
#DevoxxFR
Secret$ echo "1f2d1e2e67df" | base64MWYyZDFlMmU2N2RmCg==
$ echo "admin" | base64YWRtaW4K
170
apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: password: MWYyZDFlMmU2N2RmCg== username: YWRtaW4K
#DevoxxFR
Secret
171
apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: password: MWYyZDFlMmU2N2RmCg== username: YWRtaW4K
apiVersion: v1kind: Podmetadata: name: mysql labels: name: mysqlspec: containers: - image: mysql:5.6 name: mysql volumeMounts: - name: mysql-secret mountPath: /etc/mysql reaOnly: true volumes: - name: mysql-secret secret: secretName: mysecret
Récupération comme un Volume
#DevoxxFR
Secret
172
apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: password: MWYyZDFlMmU2N2RmCg== username: YWRtaW4K
apiVersion: v1kind: Podmetadata: name: mysql labels: name: mysqlspec: containers: - image: mysql:5.6 name: mysql env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password
Récupération dans des variables d’environnement
#DevoxxFR
nfs
Permet de monter un partage NFS
Pour pré-charger des données utilisées par le Pod
Pour persister les données au delà de la vie du Pod
173
#DevoxxFR
nfsapiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: nfs-redis-storage mountPath: /data/redis volumes: - name: nfs-redis-storage nfs: 192.168.10.3 path: /export/redis
La déclaration du volume nfs
174
#DevoxxFR
nfsapiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: nfs-redis-storage mountPath: /data/redis volumes: - name: nfs-redis-storage nfs: 192.168.10.3 path: /exports/redis
La déclaration du volume
Montage du volume dans le conteneur
175
#DevoxxFR
Plusieurs types de Volumes
● emptyDir● hostPath● gitRepo● Secret
● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)
● gcePersistentDisk● awsElasticBlockStore● azureFileVolume
● persistentVolumeClaim
Celui-ci est particulier !
176
#DevoxxFR
persistentVolumeClaim
Permet une abstraction du type de volume utilisé
Sépare l’offre et la demande d’utilisation d’espace de stockage
177
#DevoxxFR
nfs-pv.yaml
apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"
Provisioningpar l’admin du cluster de 1 Go
179
#DevoxxFR
nfs-pv.yaml
apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"
Le PV autorise ici la lecture et l’écriture par un seul container
180
#DevoxxFR
nfs-pv.yaml
apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"
Possible aussi:● ReadOnlyMany● ReadWriteMany
181
#DevoxxFR
my-redis-persistence-volume-claim2. Le Dev “claims” des PV
nfs-pv
NFSStockage Réseau:
Persistent Volume:
Binding
182
#DevoxxFR
apiVersion: v1kind: PersistentVolumeClaimapiVersion: v1metadata: name: my-redis-persistence-volume-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
my-redis-persistence-volume-claim.yamlapiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"
Bindingpar un développeur
ReadWriteOnceReadOnlyManyReadWriteMany
183
#DevoxxFR
my-redis-persistence-volume-claim
3. Le Dev utilise le claim dans un pod
nfs-pv
NFSStockage Réseau:
Persistent Volume:
Poddb
node (Worker) Using
184
#DevoxxFR
apiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: my-redis-persistence-volume mountPath: "/data/redis volumes: - name: my-redis-persistence-volume persistentVolumeClaim: claimName: my-redis-persistence-volume-claim
apiVersion: v1kind: PersistentVolumeClaimapiVersion: v1metadata: name: my-redis-persistence-volume-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
my-redis-pod.yamlapiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"
185
#DevoxxFR
apiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: my-redis-persistence-volume mountPath: "/data/redis volumes: - name: my-redis-persistence-volume persistentVolumeClaim: claimName: my-redis-persistence-volume-claim
apiVersion: v1kind: PersistentVolumeClaimapiVersion: v1metadata: name: my-redis-persistence-volume-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
my-redis-pod.yamlapiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"
Montage
186
#DevoxxFR
my-redis-persistence-volume-claim4. Le Dev supprime le Pod et le PVC
nfs-pv
NFSStockage Réseau:
Persistent Volume:
Releasing
Poddb
node (Worker)
187
#DevoxxFR
Le Persistent Volume passe à l’état “released”
nfs-pv
NFSStockage Réseau:
Persistent Volume:
node (Worker) Releasing
188
#DevoxxFR
La “reclaim policy” utilisée lors de la création du PV indique la strategie de remise dans le pool:
Retain : opération manuelleRecycle : nettoyage auto (rm -rf /thevolume/*)
nfs-pv
NFSStockage Réseau:
Persistent Volume:
node (Worker) Reclaiming
189
#DevoxxFR
PV concernés
● GCEPersistentDisk● AWSElasticBlockStore● NFS● iSCSI● RBD (Ceph Block Device)● Glusterfs● HostPath
190
#DevoxxFR
resourcesapiVersion: v1kind: Podmetadata: labels: run: my-nginx name: my-nginx namespace: default spec: containers: - image: nginx name: my-nginx resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 80 protocol: TCP
201
#DevoxxFR
Horizontal scaling
Ajuste automatiquement le nombre de réplicas pour satisfaire la demande
Utilise l’utilisation de CPU comme mesure pour déterminer le nombre de réplicas nécessaires
203
#DevoxxFR
• Par défaut : “n’importe où dans le cluster”• Il est possible d’orienter le scheduler avec
l’attribut• nodeSelector + l’utilisation des labels
206
#DevoxxFR
apiVersion: v1kind: Podmetadata: labels: run: my-nginx name: my-nginx namespace: default spec: containers: - image: nginx name: my-nginx ports: - containerPort: 80 protocol: TCP nodeSelector: disktype: ssd
nodeSelector
207
#DevoxxFR
Daemon Sets
- S’assure que tous les nodes exécute un Pod définit en tant que template
- Très utile pour des services de supervision
209
#DevoxxFR
Jobs
- Lance un ou plusieurs Pods et renvoie le résultat (success, fail) d’exécution de ceux-ci
- Il nettoie ensuite les Pods et garde en mémoire une trace des exécutions
211
#DevoxxFR 215
nodeMaster
Zone A
nodeWorker
nodeMaster
Zone B
nodeWorker
nodeMaster
Zone C
nodeWorker
podmaster podmaster podmaster
#DevoxxFR
Bi-Sam
- Solution BI à destination des fonds d’investissements- Hébergée chez RackSpace (Openstack)- Base de données Oracle → Cloud hybride- Besoin
- Haute disponibilité- Cloisonnement entre les clients- Scaling rapide
217