web-dev-qa-db-ja.com

ステートフルセットのディスクサイズを増やす方法

KubernetesでElasticsearchデプロイメントを管理しています。ディスクストレージがいっぱいに近づいているので、永続ボリュームのサイズを増やしたいと思います。

ステートフルセットのこの値を変更したい:

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

しかし、Kubernetes-dashboardを使用してこれを行うと、次のメッセージが表示されます。

内部サーバーエラー

StatefulSet.apps "es-cluster"は無効です:仕様:禁止: 'replicas'、 'template'、および 'updateStrategy'以外のフィールドの状態フルセット>仕様への更新は禁止されています。

これにより、既存のステートフルセットを削除して、新しいものをデプロイする必要があると思います。

サービスの中断やデータの損失なしに、ポッドごとのディスクストレージを増やすことはできますか?

追加の詳細

複数のElasticsearchデータポッドがあり、レプリカカウント= 1を使用しているため、それらを削除して、一度に1つのポッドでディスクストレージをアップグレードできれば、問題はないはずです。上記の制限があるため、これを行う方法がわかりません。

4
nobar

Kubernetes 1.11からKubernetes を使用して永続ボリュームのサイズを変更しても、いくつかの問題があるようです。

GitHub:StatefulSet:K8s v1.11でのサイズ変更pvcストレージのサポート#68737

この制限により、Kubernetesの多くのデータベースオペレーターはPVCのサイズ変更をサポートしていません。データベースが予想よりも大きくなると、これは重大な問題です。選択肢がなく、DBをバックアップして、バックアップから新しいDBを再作成する必要があります。

Statefulsetを削除してサイズを変更する必要があります。つまり、すべてのポッドが削除され、ダウンタイムが発生します。

DaveWHarvey によって回避策が投稿されました

EBSボリュームが間違ったアベイラビリティーゾーンにあるために割り当てられないようにする必要があったため、つまりAZごとにステートフルセットを作成したため、elasticsearchのこの制限を回避しました。一部のストレージ特性を変更する場合は、同じストレージクラスを使用して新しい「AZ」を作成し、すべてのデータをその新しいAZのポッドに移行してから、古いAZを破棄します。

これが少し役立つことを願っています。

4
Crou

https://github.com/kubernetes/kubernetes/issues/68737 に関する他のコメントに基づいて、この手順をまとめました。私はこれをkubernetes 1.14でテストしました:

  1. kubectl edit pvc <name>は、StatefulSet内の各PVCの容量を増やすためです。
  2. kubectl delete sts --cascade=false <name>は、StatefulSetを削除してそのポッドを残します。
  3. kubectl apply -f <name> St​​atefulSetを再作成します。
  4. kubectl rollout restart sts <name>ポッドを1つずつ再起動します。再起動中に、ポッドのPVCのサイズが変更されます。

何が起こっているのかを監視したい場合は、上記のコマンドの前に、これらのコマンドを使用してさらに2つのシェルウィンドウを実行します。

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

このプリンシパルをヘルムチャートに適用するために、上記の入力とこのスレッドに関するいくつかのガイダンスに基づいて、次のことを実行できました。 https://github.com/kubernetes/kubernetes/issues/68737 #issuecomment-469647348

以下の例では、次の値を使用しています。

  • StorageClass名:標準
  • ステートフルセット名:rabbitmq-server
  • PersistentVolumeClaim(PVC)名:data-rabbitmq-server-0
  • helmリリース名:rabbitmq-server
  • ヘルムチャート名:stable/rabbitmq

これらの値は、次のコマンドを使用して環境で見つけることができます。

  • PVC名とStorageClass名:kubectl get pvc
  • ステートフルセット名:kubectl get sts
  • ヘルムリリース名:helm list
  • ヘルムチャート名:更新しようとしているヘルムチャートを知っている必要があります:D

ヘルムチャートのStatefulSetでPVサイズを更新する手順は次のとおりです。

  1. kubectl edit storageClass standardおよびset/ensure allowVolumeExpansion:true(すでに私の場合にありました)
  2. kubectl delete sts --cascade=false rabbitmq-server
  3. kubectl edit pvc data-rabbitmq-server-0およびspecサイズを50Giに変更します
  4. ヘルムチャート(rabbitmq-values.yaml)のサイズを50Giに変更します。
  5. helm upgrade --recreate-pods --reuse-values -f rabbit-values.yaml rabbitmq-server stable/rabbitmq

注:最後のステップでは--recreate-podsフラグは、ポッドを強制的に再起動し、実際のファイルシステムのサイズ変更をトリガーします。また、これらのポッドのダウンタイムも発生します。ダウンタイムなしで実行したい場合は、そのフラグを削除して、手動で一度に1つのポッドなどを強制終了または再起動してみてください。

0
mltsy

以下は、他の回答に基づいてSTSボリュームのサイズを変更する完全なスクリプトです。 --cascade=falseこのステップの前に0にスケーリングされていたため、STSを削除するとき。

  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. PVCに適用される新しいサイズと一致する必要がある要求されたサイズを編集した後、STS(helm upgradeまたはkubectl apply)を再作成します。開始すると、レプリカ内のすべてのポッドがファイルシステムのサイズ変更をトリガーし、すぐにその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
0
hammady