PersistentVolumeClaim
とStorageClass
を使用して、必要なsotrageを動的にプロビジョニングするヘルムチャートを展開しようとしています。これは期待どおりに機能しますが、次のようなワークフローを可能にする構成が見つかりません
helm delete xxx
# Make some changes and repackage chart
helm install --replace xxx
常にリリースを実行したくないので、将来の展開でストレージを再利用したいと考えています。
ストレージクラスをreclaimPolicy: Retain
に設定するとディスクは保持されますが、helmはPVCを削除してそれらを孤立させます。ヘルムがPVCを削除しないようにPVCに注釈を付けると、この問題は修正されますが、インストールを実行するとエラーが発生します
Error: release xxx failed: persistentvolumeclaims "xxx-xxx-storage" already exists
実権を握ってリリースを管理するための基本的なことを誤解していると思います。おそらく、ボリュームはチャートでまったく作成されるべきではありません。
PersistenVolumeClain 実際の PersistentVolume とポッドの間のマッピングを作成します。
PVに"helm.sh/resource-policy": keep
アノテーションを使用することは、 documentation での注釈のため、最良のアイデアではありません。
注釈「helm.sh/resource-policy」:keepは、ヘルム削除操作中にこのリソースをスキップするようTillerに指示します。ただし、このリソースは孤立します。 Helmはそれを管理しなくなります。これは、すでに削除されているがリソースを保持しているリリースでhelm install --replaceを使用する場合に問題を引き起こす可能性があります。
リリースを削除した後にPVを手動で作成する場合、HelmはPVCを削除します。PVCは「利用可能」とマークされ、次のデプロイ時に再利用します。実際には、データを保持するためにPVCをクラスターに保持する必要はありません。ただし、常に同じPVを使用するには、 ラベルとセレクター を使用する必要があります。
ボリュームを保持して再利用するために、次のことができます。
for_app=my-app
というラベルでPersistenVolumeを作成し、そのボリュームに「保持」ポリシーを次のように設定します。apiVersion: v1 kind: PersistentVolume metadata: name: myappvolume namespace: my-app labels: for_app: my-app spec: persistentVolumeReclaimPolicy: Retain capacity: storage: 5Gi accessModes: - ReadWriteOnce
for_app=my-app
が付いたPersistenVolumeのみを使用するためのセレクターを追加する必要があります。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myappvolumeclaim namespace: my-app spec: selector: matchLabels: for_app: my-app accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
したがって、アプリケーションは起動時に毎回同じボリュームを使用するようになります。
ただし、PVを使用しないようにするには、同じ名前空間内の他のアプリのセレクターを使用する必要がある場合があることに注意してください。
実際、StateFulセットとVolumeClaimTemplatesを使用することをお勧めします: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
そこにある例は、それ自体が語るべきです。