KubernetesでElasticsearchデプロイメントを管理しています。ディスクストレージがいっぱいに近づいているので、永続ボリュームのサイズを増やしたいと思います。
ステートフルセットのこの値を変更したい:
spec.
volumeClaimTemplates[0].spec.resources.requests.storage : "10Gi"
しかし、Kubernetes-dashboardを使用してこれを行うと、次のメッセージが表示されます。
内部サーバーエラー
StatefulSet.apps "es-cluster"は無効です:仕様:禁止: 'replicas'、 'template'、および 'updateStrategy'以外のフィールドの状態フルセット>仕様への更新は禁止されています。
これにより、既存のステートフルセットを削除して、新しいものをデプロイする必要があると思います。
サービスの中断やデータの損失なしに、ポッドごとのディスクストレージを増やすことはできますか?
複数のElasticsearchデータポッドがあり、レプリカカウント= 1を使用しているため、それらを削除して、一度に1つのポッドでディスクストレージをアップグレードできれば、問題はないはずです。上記の制限があるため、これを行う方法がわかりません。
Kubernetes 1.11からKubernetes を使用して永続ボリュームのサイズを変更しても、いくつかの問題があるようです。
GitHub:StatefulSet:K8s v1.11でのサイズ変更pvcストレージのサポート#68737
この制限により、Kubernetesの多くのデータベースオペレーターはPVCのサイズ変更をサポートしていません。データベースが予想よりも大きくなると、これは重大な問題です。選択肢がなく、DBをバックアップして、バックアップから新しいDBを再作成する必要があります。
Statefulsetを削除してサイズを変更する必要があります。つまり、すべてのポッドが削除され、ダウンタイムが発生します。
DaveWHarvey によって回避策が投稿されました
EBSボリュームが間違ったアベイラビリティーゾーンにあるために割り当てられないようにする必要があったため、つまりAZごとにステートフルセットを作成したため、elasticsearchのこの制限を回避しました。一部のストレージ特性を変更する場合は、同じストレージクラスを使用して新しい「AZ」を作成し、すべてのデータをその新しいAZのポッドに移行してから、古いAZを破棄します。
これが少し役立つことを願っています。
https://github.com/kubernetes/kubernetes/issues/68737 に関する他のコメントに基づいて、この手順をまとめました。私はこれをkubernetes 1.14でテストしました:
kubectl edit pvc <name>
は、StatefulSet内の各PVCの容量を増やすためです。kubectl delete sts --cascade=false <name>
は、StatefulSetを削除してそのポッドを残します。kubectl apply -f <name>
StatefulSetを再作成します。kubectl rollout restart sts <name>
ポッドを1つずつ再起動します。再起動中に、ポッドのPVCのサイズが変更されます。何が起こっているのかを監視したい場合は、上記のコマンドの前に、これらのコマンドを使用してさらに2つのシェルウィンドウを実行します。
kubectl get pod -w
kubectl get pvc -w
このプリンシパルをヘルムチャートに適用するために、上記の入力とこのスレッドに関するいくつかのガイダンスに基づいて、次のことを実行できました。 https://github.com/kubernetes/kubernetes/issues/68737 #issuecomment-469647348
以下の例では、次の値を使用しています。
これらの値は、次のコマンドを使用して環境で見つけることができます。
kubectl get pvc
kubectl get sts
helm list
ヘルムチャートのStatefulSetでPVサイズを更新する手順は次のとおりです。
kubectl edit storageClass standard
およびset/ensure allowVolumeExpansion:true(すでに私の場合にありました)kubectl delete sts --cascade=false rabbitmq-server
kubectl edit pvc data-rabbitmq-server-0
およびspecサイズを50Giに変更しますhelm upgrade --recreate-pods --reuse-values -f rabbit-values.yaml rabbitmq-server stable/rabbitmq
注:最後のステップでは--recreate-pods
フラグは、ポッドを強制的に再起動し、実際のファイルシステムのサイズ変更をトリガーします。また、これらのポッドのダウンタイムも発生します。ダウンタイムなしで実行したい場合は、そのフラグを削除して、手動で一度に1つのポッドなどを強制終了または再起動してみてください。
以下は、他の回答に基づいてSTSボリュームのサイズを変更する完全なスクリプトです。 --cascade=false
このステップの前に0にスケーリングされていたため、STSを削除するとき。
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