Назад | Перейти на главную страницу

Как увеличить размер диска в наборе с отслеживанием состояния

Я управляю развертыванием Elasticsearch в Kubernetes. Я вижу, что дисковое хранилище почти заполнено, поэтому я хотел бы увеличить размер постоянных томов.

Я хочу изменить это значение в Stateful Set:

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

Но когда я делаю это с помощью панели управления Kubernetes, я получаю следующее сообщение:

Внутренняя ошибка сервера

StatefulSet.apps "es-cluster" недействителен: spec: Forbidden: обновление набора состояний> spec для полей, отличных от 'replicas', 'template' и 'updateStrategy', запрещено.

Это заставляет меня думать, что мне придется удалить существующий набор с отслеживанием состояния и развернуть новый.

Можно ли увеличить дисковое хранилище для каждого модуля без прерывания обслуживания или потери данных?

Дополнительная деталь

У меня есть несколько модулей данных Elasticsearch, и я использую количество реплик = 1, поэтому, если я смогу отключить их и обновить дисковое хранилище по одному модулю за раз, проблем быть не должно. Я просто не понимаю, как это сделать с учетом указанного выше ограничения.

Собрал эту процедуру вместе на основе других комментариев к https://github.com/kubernetes/kubernetes/issues/68737. Я тестировал это на Kubernetes 1.14:

  1. kubectl edit pvc <name> для каждого PVC в StatefulSet, чтобы увеличить его емкость.
  2. kubectl delete sts --cascade=false <name> чтобы удалить StatefulSet и оставить его поды.
  3. kubectl apply -f <name> чтобы воссоздать StatefulSet.
  4. kubectl rollout restart sts <name> для перезапуска модулей по одному. Во время перезапуска размер PVC модуля будет изменен.

Если вы хотите отслеживать, что происходит, запустите еще два окна оболочки с этими командами перед любой из приведенных выше команд:

  • kubectl get pod -w
  • kubectl get pvc -w

Даже то Изменение размера постоянных томов с помощью Kubernetes из Kubernetes 1.11, похоже, с этим возникли проблемы.

Как обсуждалось в GitHub: StatefulSet: поддержка изменения размера хранилища ПВХ в K8s v1.11 # 68737

Из-за этого ограничения многие операторы баз данных для Kubernetes не поддерживают изменение размера PVC. Это критическая проблема, потому что, когда ваша база данных становится больше, чем вы ожидали, у вас нет выбора, и необходимо создать резервную копию БД и воссоздать новую БД из резервной копии.

Вы должны изменить его размер, удалив Statefulset, это будет означать, что вы удалите все модули, и это вызовет время простоя.

Обход был опубликован Дэйв У. Харви

Я обошел это ограничение на elasticsearch из-за работы, которую мне пришлось проделать, чтобы избежать возможности назначения томов EBS из-за того, что они находятся в неправильной зоне доступности, то есть я создал набор состояний для каждой зоны доступности. Если я хочу изменить какую-то характеристику хранилища, я создаю новую зону доступности, используя тот же класс хранилища, а затем переношу все данные в модули в этой новой зоне доступности, а затем уничтожаю старую зону доступности.

Надеюсь, это вам немного поможет.

Чтобы применить этот принцип к диаграмме руля, я смог сделать следующее, основываясь на вводе выше, а также на некоторых рекомендациях по этой теме: https://github.com/kubernetes/kubernetes/issues/68737#issuecomment-469647348

В приведенном ниже примере используются следующие значения:

  • Имя StorageClass: стандартный
  • Имя StatefulSet: rabbitmq-server
  • Имя PersistentVolumeClaim (PVC): data-rabbitmq-server-0
  • название выпуска helm: rabbitmq-server
  • имя диаграммы управления: стабильный / rabbitmq

Эти значения можно найти в вашей среде с помощью следующих команд:

  • Имя PVC и имя StorageClass: kubectl get pvc
  • Имя StatefulSet: kubectl get sts
  • название выпуска руля: helm list
  • Имя диаграммы управления: вы должны знать, какую диаграмму управления вы пытаетесь обновить: D

И вот шаги для обновления размера PV в StatefulSet диаграммы управления:

  1. kubectl edit storageClass standard и установите / убедитесь, что allowVolumeExpansion: true (это уже было в моем случае)
  2. kubectl delete sts --cascade=false rabbitmq-server
  3. kubectl edit pvc data-rabbitmq-server-0 и изменить спецификация размер до 50Gi
  4. Измените размер в моей диаграмме управления (rabbitmq-values.yaml) на 50Gi
  5. helm upgrade --recreate-pods --reuse-values -f rabbit-values.yaml rabbitmq-server stable/rabbitmq

ПРИМЕЧАНИЕ: последний шаг использует --recreate-pods флаг для принудительного перезапуска модулей, который запускает фактическое изменение размера файловой системы. Это также приводит к простою этих модулей. Если вы хотите попытаться сделать это без простоев, вы можете попробовать удалить этот флаг и вручную убить / перезапустить один модуль за раз или что-то в этом роде.

Вот полный сценарий для изменения размеров томов STS на основе других ответов. Мне не пришлось --cascade=false при удалении STS, потому что перед этим шагом он был бы масштабирован до 0.

  1. Убедитесь, что StorageClass поддерживает расширение тома, при необходимости отредактируйте его:
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. Уменьшите StatefulSet до 0, чтобы учесть расширение объема
# 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. Установите новый размер для PersistentVolumeClaim, это немедленно изменит размер PersistentVolume и его резервного диска. Вы можете проверить это, описав PV и проверив портал облачного поставщика для диска. Однако описание PVC не будет отражать новый размер до тех пор, пока модуль не будет запущен, после чего он автоматически изменит размер файловой системы:
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. Удалите STS, чтобы разрешить новое обновление с новым размером.
kubectl delete sts <STS-NAME> 
  1. Восстановите STS (обновление helm или применение kubectl) после редактирования запрошенного размера, который должен соответствовать новому размеру, примененному к PVC. После запуска каждый модуль в репликах инициирует изменение размера файловой системы, и это немедленно отразится на своем 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. Убедитесь, что расширение объема включено для класса хранения, используемого в ПВХ.
  2. Kubectl отредактирует PVC, который вы хотите обновить. (Скажем, обновление тома до 50 ГБ)
  3. Kubectl удалить набор с отслеживанием состояния cascade = false
  4. Отредактируйте Statefulset в файле манифеста.
  5. Оформить заказ на версию / выпуск, развернутую в кластере.
  6. Снова стек обновления Kubectl / Helm, чтобы снова создать Statefuloset.
  7. К настоящему времени у вас должны быть обновлены Statefulset и PVC. (Объем обновления 50 ГБ)
  8. Развертывание Kubectl перезапустите Statefulset.