如何增加有状态集中的磁盘大小

如何增加有状态集中的磁盘大小

我正在 Kubernetes 中管理 Elasticsearch 部署。我发现磁盘存储快要满了,所以我想增加持久卷的大小。

我想在 Stateful Set 中更改此值:

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

但是当我使用 Kubernetes 仪表板执行此操作时,我收到以下消息:

内部服务器错误

StatefulSet.apps“es-cluster”无效:spec:禁止:禁止对 statefulset > spec 中除“replicas”、“template”和“updateStrategy”之外的字段进行更新。

这让我认为我必须删除现有的 Stateful Set 并部署一个新的。

是否有可能在不中断服务或丢失数据的情况下增加每个 pod 的磁盘存储空间?

更多详细信息

我有多个 Elasticsearch 数据 pod,并且使用副本数 = 1,因此如果我能够将它们关闭并一次升级一个 pod 的磁盘存储,应该不会有问题。我只是不知道如何根据上述限制做到这一点。

答案1

根据其他评论拼凑了这个过程https://github.com/kubernetes/kubernetes/issues/68737。我在 kubernetes 1.14 上测试了这个:

  1. kubectl edit pvc <name>对于 StatefulSet 中的每个 PVC,增加其容量。
  2. kubectl delete sts --cascade=orphan <name>删除 StatefulSet 并保留其 pod。
  3. kubectl apply -f <name>重新创建 StatefulSet。
  4. kubectl rollout restart sts <name>一次重启一个 Pod。重启期间,Pod 的 PVC 大小将调整。

如果您想要监视正在发生的事情,请在运行上述任何命令之前,使用以下命令运行另外两个 shell 窗口:

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

答案2

为了将此原理应用到舵图,我能够根据上述输入以及此线程上的一些指导执行以下操作:https://github.com/kubernetes/kubernetes/issues/68737#issuecomment-469647348

下面的示例使用以下值:

  • StorageClass 名称:standard
  • StatefulSet 名称:rabbitmq-server
  • PersistentVolumeClaim(PVC)名称:data-rabbitmq-server-0
  • helm 发布名称:rabbitmq-server
  • helm chart 名称:stable/rabbitmq

您可以使用以下命令在您的环境中找到这些值:

  • PVC 名称和 StorageClass 名称:kubectl get pvc
  • StatefulSet 名称:kubectl get sts
  • helm 发布名称:helm list
  • helm chart 名称:你应该知道你正在尝试更新哪个 helm chart :D

以下是在 Helm Chart 的 StatefulSet 中更新 PV 大小的步骤:

  1. kubectl edit storageClass standard并设置/确保 allowVolumeExpansion: true (在我的情况下已经是了)
  2. kubectl delete sts --cascade=orphan rabbitmq-server
  3. kubectl edit pvc data-rabbitmq-server-0并改变规格大小为 50Gi
  4. 将我的 helm chart(rabbitmq-values.yaml)中的大小更改为 50Gi
  5. helm upgrade --recreate-pods --reuse-values -f rabbit-values.yaml rabbitmq-server stable/rabbitmq

注意:最后一步使用--recreate-pods标志强制重新启动 Pod,这将触发实际的文件系统大小调整。这也会导致这些 Pod 停机。如果您想尝试在不停机的情况下完成此操作,可以尝试删除该标志,然后手动一次终止/重新启动一个 Pod,或者其他操作。

答案3

以下是根据其他答案调整 STS 卷大小的完整脚本。删除 STS 时我不需要这样做,--cascade=false因为在此步骤之前它已经缩放到 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 不会反映新大小,直到启动 pod 后它会自动调整文件系统的大小:
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 upgrade 或 kubectl apply),该大小应与 PVC 上应用的新大小相匹配。启动后,副本中的每个 pod 都会触发文件系统大小调整,并立即反映在其 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

答案4

以下是对我有用的步骤:

  1. 确保 PVC 中使用的存储类中的卷扩展处于打开状态。
  2. Kubectl 编辑您想要更新的 PVC。(例如将卷更新为 50GB)
  3. Kubectl 删除有状态集级联=false
  4. 在清单文件中编辑 Statefulset。
  5. 检出部署在集群上的版本/发布版本。
  6. 再次升级 Kubectl/Helm 堆栈以再次创建 Statefuloset。
  7. 现在,您应该已经更新了 Statefulset 和 PVC。(卷更新 50GB)
  8. Kubectl 推出重新启动 Statefulset。

相关内容