Я управляю развертыванием 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:
kubectl edit pvc <name>
для каждого PVC в StatefulSet, чтобы увеличить его емкость.kubectl delete sts --cascade=false <name>
чтобы удалить StatefulSet и оставить его поды.kubectl apply -f <name>
чтобы воссоздать StatefulSet.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
В приведенном ниже примере используются следующие значения:
Эти значения можно найти в вашей среде с помощью следующих команд:
kubectl get pvc
kubectl get sts
helm list
И вот шаги для обновления размера PV в StatefulSet диаграммы управления:
kubectl edit storageClass standard
и установите / убедитесь, что allowVolumeExpansion: true (это уже было в моем случае)kubectl delete sts --cascade=false rabbitmq-server
kubectl edit pvc data-rabbitmq-server-0
и изменить спецификация размер до 50Gihelm upgrade --recreate-pods --reuse-values -f rabbit-values.yaml rabbitmq-server stable/rabbitmq
ПРИМЕЧАНИЕ: последний шаг использует --recreate-pods
флаг для принудительного перезапуска модулей, который запускает фактическое изменение размера файловой системы. Это также приводит к простою этих модулей. Если вы хотите попытаться сделать это без простоев, вы можете попробовать удалить этот флаг и вручную убить / перезапустить один модуль за раз или что-то в этом роде.
Вот полный сценарий для изменения размеров томов STS на основе других ответов. Мне не пришлось --cascade=false
при удалении STS, потому что перед этим шагом он был бы масштабирован до 0.
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
# 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
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
kubectl delete sts <STS-NAME>
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
Вот шаги, которые сработали для меня: