web-dev-qa-db-fra.com

Comment augmenter la taille du disque dans un ensemble d'état

Je gère un déploiement d'élasticsearch à Kubettes. Je vois que le stockage de disque se rapproche pleinement. Je voudrais donc augmenter la taille des volumes persistants.

Je veux changer cette valeur dans l'ensemble de l'état:

spec.
volumeClaimTemplates[0].spec.resources.requests.storage : "10Gi"

Mais lorsque je fais cela en utilisant le tableau de bord Kubettes, je reçois le message suivant:

Erreur Interne du Serveur

Stipulerset.apps "ES-CLUSTER" n'est pas valide: Spécification: Interdit: Mises à jour de StateFeCset> Spécifications des champs autres que 'Replicas', "Modèle" et "UpdateStrategy" sont interdites.

Cela me fait penser que je devrai supprimer mon ensemble d'état existant et déployer un nouveau.

Est-il possible d'augmenter le stockage de disque PER-POD sans interruption de service ni perte de données?

Détail supplémentaire

J'ai plusieurs pods de données élastiques de recherche et utilisez-le des répliques Count = 1, donc si je suis capable de les descendre et de mettre à niveau le stockage de disque une gousse à la fois, il ne devrait pas y avoir de problème. Je ne vois tout simplement pas comment procéder cela compte tenu de la restriction indiquée ci-dessus.

7
nobar

Même Tho redimensionner des volumes persistants à l'aide de Kubettes de Kubettes 1.11 , il semble y avoir des problèmes avec cela.

Comme indiqué dans GitHub: StateFeSet: Soutien Redimensionner le stockage en PVC dans les K8s V1.11 # 68737

En raison de cette limitation, de nombreux opérateurs de base de données pour Kubettes ne prennent pas en charge le redimensionnement en PVC. C'est un problème critique car lorsque votre base de données devient plus grande que prévu - vous n'avez pas le choix et il est nécessaire de sauvegarder dB et de recréer la nouvelle DB à partir de la sauvegarde.

Vous devez le redimensionner en supprimant l'état d'état, cela signifierait que vous supprimerez tous les gousses et cela causera des temps d'arrêt.

Un travail autour a été publié par DaveWHArevey

J'ai rencontré cette limitation sur Elasticsearch en raison du travail que je devais faire pour éviter que les volumes EBS ne puissent être affectés car ils sont dans la mauvaise zone de disponibilité, c'est-à-dire que j'avais créé une étate au-pouvoir par az. Si je veux modifier certaines caractéristiques de stockage, je crée une nouvelle "AZ" à l'aide de la même classe de stockage, puis migrez toutes les données sur des pods dans ce nouveau AZ, puis détruisez l'ancien AZ.

J'espère que ça vous aide un peu.

4
Crou

Pour appliquer ce directeur à un tableau de barre, j'ai pu effectuer ce qui suit, en fonction de la saisie ci-dessus, ainsi que des indications sur ce thread: https://github.com/kubettes/kubernet/kubernet //kubernet # Issuecomment-469647348

L'exemple ci-dessous utilise les valeurs suivantes:

  • StorageClass Nom: Standard
  • Nom de l'état: Rabbitmq-Server
  • PersistanceVolumeclameclam (PVC) Nom: Data-rabbbitmq-server-0
  • nom de la version Helm: Rabbitmq-Server
  • nom du diagramme Helm: Stable/Rabbitmq

Ces valeurs peuvent être trouvées dans votre environnement en utilisant les commandes suivantes:

  • Nom du PVC et nom de stockageClass: kubectl get pvc
  • Nom de l'état: kubectl get sts
  • nom de la sortie Helm: helm list
  • nom du diagramme Helm: Vous devez savoir quel tableau Helm vous essayez de mettre à jour: D

Et voici les étapes de mise à jour de la taille de PV dans l'état d'état d'une carte de barre:

  1. kubectl edit storageClass standard et définir/assurer allowvolumeExpansion: vrai (il était déjà dans mon cas)
  2. kubectl delete sts --cascade=false rabbitmq-server
  3. kubectl edit pvc data-rabbitmq-server-0 et changement SPEC taille à 50gi
  4. Changez la taille dans mon tableau Helm (Rabbitmq-valeurs.yaml) à 50gi
  5. helm upgrade --recreate-pods --reuse-values -f rabbit-values.yaml rabbitmq-server stable/rabbitmq

Remarque: la dernière étape utilise --recreate-pods Drapeau afin de forcer un redémarrage des gousses, ce qui déclenche le redimensionnement du système de fichiers réel. Il provoque également des temps d'arrêt de ces pod. Si vous voulez essayer de le faire sans temps d'arrêt, vous pouvez essayer de supprimer cet indicateur et de tuer/redémarrer manuellement une gousse à la fois, ou quelque chose.

3
mltsy

A reconstitué cette procédure ensemble basée sur d'autres commentaires sur https://github.com/kubettes/kubettes/kubettes/issues/68737 . J'ai testé cela sur Kubettes 1.14:

  1. kubectl edit pvc <name> Pour chaque PVC dans l'état d'état, augmenter sa capacité.
  2. kubectl delete sts --cascade=false <name> Pour supprimer l'état d'état et laisser ses gousses.
  3. kubectl apply -f <name> Pour recréer l'état d'état.
  4. kubectl rollout restart sts <name> Pour redémarrer les pods, une à la fois. Pendant le redémarrage, le PVC de la POD sera redimensionné.

Si vous souhaitez surveiller ce qui se passe, exécutez deux autres fenêtres shell avec ces commandes, avant l'une des commandes ci-dessus:

  • kubectl get pod -w
  • kubectl get pvc -w
1
Chris Jones

Voici un script complet pour redimensionner les volumes STS en fonction d'autres réponses. Je n'avais pas à --cascade=false Lors de la suppression des ST car il aurait été mis à l'échelle à 0 avant cette étape.

  1. Assurez-vous que le stockageClass prend en charge l'expansion du volume, si nécessaire, éditez-la:
kubectl get -o jsonpath='{.allowVolumeExpansion}' sc <SC-NAME>
# should return true, otherwise, patch it:
kubectl patch -p '{"allowVolumeExpansion": true}' sc <SC-NAME>
# then run the first command again
  1. Échelle l'état sur 0 pour permettre une expansion du volume
# we need the original replica count, so let's save it before scaling down
REPLICAS=`kubectl get -o jsonpath='{.spec.replicas}' sts/<STS-NAME>`
kubectl scale sts/<STS-NAME> --replicas 0
  1. Patch le persistanceVolumeclaim avec la nouvelle taille, cela redimensionnera immédiatement le persistancevolume et son disque de support. Vous pouvez vérifier en décrivant le PV et en cochant le portail du fournisseur de cloud pour le disque. Cependant, décrivant que le PVC ne reflétera pas la nouvelle taille jusqu'à ce qu'une pod ne soit démarrée après laquelle il redimensionne automatiquement le système de fichiers:
NEW_SIZE=128Gi
for i in `seq 0 $[REPLICAS-1]`; do
  PVC=<PVC-NAME-PREFIX>-$i
  echo "Updating PVC $PVC"
  # Print the current size:
  kubectl get -o jsonpath='{.spec.resources.requests.storage} ' pvc/$PVC
  # Set the new size:
  kubectl patch -p '{"spec": {"resources": {"requests": {"storage": "'$NEW_SIZE'"}}}}' pvc/$PVC
  # Verify the PV:
  echo "Waiting for 10 seconds so that the PV picks up the change..."
  echo "If you still see the same size, do not worry, to see the new size just run this script again"
  sleep 10
  PV=`kubectl get -o jsonpath='{.spec.volumeName}' pvc/$PVC`
  kubectl get -o jsonpath='{.spec.capacity.storage} ' pv/$PV
  echo "Done"
done
  1. Supprimer les STS pour permettre la nouvelle mise à jour avec la nouvelle taille.
kubectl delete sts <STS-NAME> 
  1. Recréez la STS (mise à niveau de la barre ou kubecl Appliquer) après avoir modifié la taille demandée qui doit correspondre à la nouvelle taille appliquée sur les PVC. Une fois démarré, chaque pod dans les répliques déclenchera une redimensionnement du système de fichiers et elle réfléchira immédiatement à son PVC.
for i in `seq 0 $[REPLICAS-1]`; do
  PVC=<PVC-NAME-PREFIX>-$i
  echo "Verifying the size of PVC $PVC"
  # Verify the current size:
  kubectl get -o jsonpath='{.status.capacity.storage} ' pvc/$PVC
done
1
hammady