Redimensionner des Persistent Volumes
Découvrez comment redimensionner des Persistent Volumes sur OVHcloud Managed Kubernetes
Ce tutoriel vous guide dans le redimensionnement de Persistent Volumes (PV) sur votre OVHcloud Managed Kubernetes Service.
Le sous-système PersistentVolume de Kubernetes fournit une API destinée aux utilisateurs et aux administrateurs qui abstrait la manière dont le stockage est fourni de la manière dont il est consommé. Pour cela, Kubernetes fournit deux ressources d'API : PersistentVolume (PV) et PersistentVolumeClaim (PVC).
Depuis Kubernetes 1.11, l'extension des PersistentVolumeClaims (PVC) est activée par défaut, et ce tutoriel vous explique comment procéder.
Warning
Le redimensionnement des PVC Kubernetes permet uniquement d'agrandir les volumes, pas de les réduire.
Info
Le redimensionnement des volumes fonctionne avec toutes les classes de stockage, y compris les volumes chiffrés LUKS (csi-cinder-high-speed-luks, csi-cinder-classic-luks, csi-cinder-high-speed-gen2-luks). Le chiffrement est maintenu de manière transparente pendant l'opération de redimensionnement.
Avant de commencer
Ce tutoriel présuppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes opérationnel, ainsi que de connaissances de base sur son fonctionnement. Pour en savoir plus sur ces sujets, consultez la documentation Déployer une application Hello World.
Vous devez également savoir comment les PV sont gérés sur OVHcloud Managed Kubernetes Service ; consultez pour cela le guide Persistent Volumes sur OVHcloud Managed Kubernetes.
Warning
Lorsqu'une ressource Persistent Volumes est créée au sein d'un cluster Managed Kubernetes, un volume Block Storage Public Cloud associé est automatiquement créé avec elle.
Ce volume est facturé à l'heure et apparaîtra dans votre projet Public Cloud. Pour plus d'informations, consultez la documentation suivante : Tarifs Volume Block Storage
Créer un Persistent Volume Claim
Pour tester le redimensionnement des PV, nous avons besoin d'un PV associé au cluster, c'est-à-dire qu'il faut déployer un service créant un PVC. Pour simplifier, nous choisissons de déployer une instance unique de MySQL.
Commencez par créer un fichier mysql-pvc.yaml définissant un PVC initial de 2 Go d'espace alloué :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
Puis appliquez-le au cluster :
kubectl apply -f mysql/mysql-pvc.yaml
Vous pouvez ensuite vérifier que le PVC est correctement créé et associé à un PV :
kubectl describe pvc mysql-pv-claim
Créez maintenant un fichier mysql-deployment.yaml pour déployer MySQL en utilisant ce PVC :
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
Déployez-le puis vérifiez-le :
kubectl apply -f mysql-deployment.yaml
kubectl describe deployment mysql
Sur notre exemple de cluster, les commandes précédentes donnent :
$ kubectl apply -f mysql/mysql-pvc.yaml
persistentvolumeclaim/mysql-pv-claim created
$ kubectl describe pvc mysql-pv-claim
Name: mysql-pv-claim
Namespace: default
StorageClass: csi-cinder-high-speed
Status: Bound
Volume: ovh-managed-kubernetes-btw8lc-pvc-ab896768-b995-453b-85ab-4bcb378de01d
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"mysql-pv-claim","namespace":"default"},"spec":{"acc...
pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: cinder.csi.openstack.org
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 2Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: mysql-c85f7f79c-wz4w7
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ExternalProvisioning 72s (x2 over 72s) persistentvolume-controller waiting for a volume to be created, either by external provisioner "cinder.csi.openstack.org" or manually created by system administrator
Normal Provisioning 72s cinder.csi.openstack.org_csi-cinder-controllerplugin-0_4da74c15-1973-486d-9dde-2ccf2f19811b External provisioner is provisioning volume for claim "default/mysql-pv-claim"
Normal ProvisioningSucceeded 70s cinder.csi.openstack.org_csi-cinder-controllerplugin-0_4da74c15-1973-486d-9dde-2ccf2f19811b Successfully provisioned volume ovh-managed-kubernetes-btw8lc-pvc-ab896768-b995-453b-85ab-4bcb378de01d
$ kubectl apply -f mysql/mysql-deployment.yaml
service/mysql created
deployment.apps/mysql created
$ kubectl describe deployment mysql
Name: mysql
Namespace: default
CreationTimestamp: Mon, 06 Jan 2020 11:45:03 +0100
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"mysql","namespace":"default"},"spec":{"replicas":1,"selec...
Selector: app=mysql
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: Recreate
MinReadySeconds: 0
Pod Template:
Labels: app=mysql
Containers:
mysql:
Image: mysql:5.6
Port: 3306/TCP
Host Port: 0/TCP
Environment:
MYSQL_ROOT_PASSWORD: password
Mounts:
/var/lib/mysql from mysql-persistent-storage (rw)
Volumes:
mysql-persistent-storage:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: mysql-pv-claim
ReadOnly: false
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: mysql-c85f7f79c (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 27s deployment-controller Scaled up replica set mysql-c85f7f79c to 1
Accéder à l'instance MySQL et initialiser une base de données
Le fichier YAML précédent crée un service qui permet à d'autres pods du cluster d'accéder à la base de données. L'option de service clusterIP: None permet au nom DNS du service de se résoudre directement vers l'adresse IP du pod. C'est optimal lorsque vous n'avez qu'un seul pod derrière un service et que vous ne prévoyez pas d'augmenter le nombre de pods.
Utilisez maintenant kubectl pour créer un client mysql à la volée et vous connecter à la base de données :
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
Puis créez simplement une base de données avec une table :
CREATE DATABASE testingResize;
USE testingResize;
CREATE TABLE anEmptyTable (k VARCHAR(256), v TEXT);
SHOW TABLES;
Sur notre exemple de cluster :
$ kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
If you don't see a command prompt, try pressing enter.
mysql> CREATE DATABASE testingResize;
Query OK, 1 row affected (0.01 sec)
mysql> USE testingResize;
Database changed
mysql> CREATE TABLE anEmptyTable (k VARCHAR(256), v TEXT);
Query OK, 0 rows affected (0.04 sec)
mysql> SHOW TABLES;
+-------------------------+
| Tables_in_testingResize |
+-------------------------+
| anEmptyTable |
+-------------------------+
1 row in set (0.00 sec)
Agrandir les PV
Pour agrandir le persistent volume, la première étape consiste à dissocier le PVC des déploiements qui l'utilisent.
Pour cela, mettez les replicas du deployment à 0 :
Warning
N'oubliez pas de réduire le nombre de réplicas de votre déploiement avant de redimensionner votre volume
kubectl patch deployment mysql -p '{ "spec": { "replicas": 0 }}'
Modifiez ensuite la définition du PVC pour agrandir le volume à 6 Go :
kubectl patch pvc mysql-pv-claim -p '{ "spec": { "resources": { "requests": { "storage": "6Gi" }}}}'
Warning
Le redimensionnement des PVC Kubernetes permet uniquement d'agrandir les volumes, pas de les réduire.
Si vous essayez de réduire la taille du stockage, vous obtiendrez un message semblable à celui-ci :
The PersistentVolumeClaim "mysql-pv-claim" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value
Vérifiez que le volume a bien été agrandi :
kubectl describe pvc mysql-pv-claim
Dans le champ « conditions » affiché par la sortie de la commande précédente, vous pouvez voir que le PVC attend qu'un utilisateur démarre un pod pour terminer le redimensionnement du système de fichiers du volume.
Remettez replicas à 1 dans mysql-deployment.yaml, puis redéployez-le pour démarrer un pod :
kubectl patch deployment mysql -p '{ "spec": { "replicas": 1 }}'
Une fois le pod démarré, vous pouvez de nouveau utiliser kubectl describe pvc mysql-pv-claim et constater que la taille du PV est de 6 Go.
Sur notre exemple de cluster :
$ kubectl patch deployment mysql -p '{ "spec": { "replicas": 0 }}'
deployment.extensions/mysql patched
$ kubectl get deployment mysql
NAME READY UP-TO-DATE AVAILABLE AGE
mysql 0/0 0 0 4h0m
$ kubectl patch pvc mysql-pv-claim -p '{ "spec": { "resources": { "requests": { "storage": "6Gi" }}}}'
persistentvolumeclaim/mysql-pv-claim patched
$ kubectl describe pvc mysql-pv-claim
Name: mysql-pv-claim
Namespace: default
StorageClass: csi-cinder-high-speed
Status: Bound
Volume: ovh-managed-kubernetes-btw8lc-pvc-ab896768-b995-453b-85ab-4bcb378de01d
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"mysql-pv-claim","namespace":"default"},"spec":{"acc...
pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: cinder.csi.openstack.org
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 2Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: <none>
Conditions:
Type Status LastProbeTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
FileSystemResizePending True Mon, 01 Jan 0001 00:00:00 +0000 Mon, 06 Jan 2020 11:47:22 +0100 Waiting for user to (re-)start a pod to finish file system resize of volume on node.
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ExternalProvisioning 2m27s (x2 over 2m27s) persistentvolume-controller waiting for a volume to be created, either by external provisioner "cinder.csi.openstack.org" or manually created by system administrator
Normal Provisioning 2m27s cinder.csi.openstack.org_csi-cinder-controllerplugin-0_4da74c15-1973-486d-9dde-2ccf2f19811b External provisioner is provisioning volume for claim "default/mysql-pv-claim"
Normal ProvisioningSucceeded 2m25s cinder.csi.openstack.org_csi-cinder-controllerplugin-0_4da74c15-1973-486d-9dde-2ccf2f19811b Successfully provisioned volume ovh-managed-kubernetes-btw8lc-pvc-ab896768-b995-453b-85ab-4bcb378de01d
Normal Resizing 9s (x9 over 13s) external-resizer cinder.csi.openstack.org External resizer is resizing volume ovh-managed-kubernetes-btw8lc-pvc-ab896768-b995-453b-85ab-4bcb378de01d
Normal FileSystemResizeRequired 8s external-resizer cinder.csi.openstack.org Require file system resize of volume on node
$ kubectl patch deployment mysql -p '{ "spec": { "replicas": 1 }}'
deployment.extensions/mysql patched
$ kubectl get deployment mysql
NAME READY UP-TO-DATE AVAILABLE AGE
mysql 0/1 1 0 4h2m
$ kubectl get deployment mysql
NAME READY UP-TO-DATE AVAILABLE AGE
mysql 1/1 1 1 4h4m
$ kubectl describe pvc mysql-pv-claim
Name: mysql-pv-claim
Namespace: default
StorageClass: csi-cinder-high-speed
Status: Bound
Volume: ovh-managed-kubernetes-btw8lc-pvc-ab896768-b995-453b-85ab-4bcb378de01d
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"mysql-pv-claim","namespace":"default"},"spec":{"acc...
pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: cinder.csi.openstack.org
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 6Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: mysql-c85f7f79c-9nn8q
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ExternalProvisioning 8m8s (x2 over 8m8s) persistentvolume-controller waiting for a volume to be created, either by external provisioner "cinder.csi.openstack.org" or manually created by system administrator
Normal Provisioning 8m8s cinder.csi.openstack.org_csi-cinder-controllerplugin-0_4da74c15-1973-486d-9dde-2ccf2f19811b External provisioner is provisioning volume for claim "default/mysql-pv-claim"
Normal ProvisioningSucceeded 8m6s cinder.csi.openstack.org_csi-cinder-controllerplugin-0_4da74c15-1973-486d-9dde-2ccf2f19811b Successfully provisioned volume ovh-managed-kubernetes-btw8lc-pvc-ab896768-b995-453b-85ab-4bcb378de01d
Normal Resizing 5m50s (x9 over 5m54s) external-resizer cinder.csi.openstack.org External resizer is resizing volume ovh-managed-kubernetes-btw8lc-pvc-ab896768-b995-453b-85ab-4bcb378de01d
Normal FileSystemResizeRequired 5m49s external-resizer cinder.csi.openstack.org Require file system resize of volume on node
Vérification de l'intégrité des données
Lancez à nouveau un client MySQL pour vérifier que vous pouvez toujours lire votre base de données :
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
Un SHOW DATABASES; doit vous permettre de voir votre base de données testingResize ; vous pouvez la sélectionner et retrouver votre table anEmptyTable.
Sur notre exemple de cluster :
$ kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
If you don't see a command prompt, try pressing enter.
mysql> SHOW DATABASES;
+---------------------+
| Database |
+---------------------+
| information_schema |
| #mysql50#lost+found |
| mysql |
| performance_schema |
| testingResize |
+---------------------+
5 rows in set (0.01 sec)
mysql> USE testingResize;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLES;
+-------------------------+
| Tables_in_testingResize |
+-------------------------+
| anEmptyTable |
+-------------------------+
1 row in set (0.00 sec)
Aller plus loin
Vous pouvez désormais agrandir les Persistent Volumes de votre cluster OVHcloud Managed Kubernetes, et les adapter à la vie de vos données.
Pour en savoir plus sur l'utilisation pratique de votre cluster Kubernetes, nous vous invitons à consulter notre site de documentation OVHcloud Managed Kubernetes.
-
Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.
-
Échangez avec notre communauté d'utilisateurs.