Trident: 無効なスナップショット参照でのTrident-csiクラッシュループ

作成日 2020年12月07日  ·  5コメント  ·  ソース: NetApp/trident

バグを説明する

trident-csiの展開は、次の理由でクラッシュループしていました

I1207 08:20:13.609384 1 connection.go:186] GRPC error: rpc error: code = FailedPrecondition desc = Trident initialization failed; error attempting to clean up snapshot snapshot-SOMEUUID from backend ontapnas.... : error reading volume size: flexvol trident_pvc_SOMEOTHERUUID not found

何らかの理由で、trident-csiは、スナップショットをサポートしていないPVCバックエンド上のスナップショットへの残りの参照を追跡していました。
そのPVCのスナップショット自体はもう存在しませんでした(過去[> 1か月前]にkubernetesで誤って作成された可能性があります)。 元のPVCも削除しました。 しかし、本当の問題は、そのスナップショットの「volumesnapshot」オブジェクトを削除しても、それに対する他のすべての参照が削除されていないように見えることでした。

バックエンドは「ontap-nas-economy」(https://netapp-trident.readthedocs.io/en/latest/kubernetes/operations/tasks/backends/ontap/drivers.html、q-treeのもの)でした。

CSIが「economy」バックエンドでプロビジョニングされたPV(qtree)のスナップショットを見つけようとしていたように見えましたが、実際には通常のontap-nasバックエンドでpvcボリュームをチェックしていました。 これもデフォルトとして設定されています。 この問題は、スナップショットが作成されたときのデフォルトのストレージクラスがエコノミークラスであったために発生したと思われます。 これは後で変更され、デフォルトをバックエンドをサポートするontap-nasに設定​​しましたが、参照が壊れているか、その時点で適切にクリーンアップされていません(?)。

それらの他の参照は次のとおりです。

  • 同じスナップショット/ PVCを参照するVolumeSnapshotContent。
  • PVCを削除したことを参照するTridentVolumeオブジェクト
  • そのスナップショットへの参照も含むTridentTransaction。

過去の参照を削除すると、問題が修正されます。

初期状態:

少し前に、ボリュームスナップショットリソースが、それをサポートしていないバックエンド用に作成されました。 そのvolumesnapshotを削除しても、他のトライデントcrdオブジェクトでのそのボリュームスナップショットへの参照は削除されていないようです。

バグの原因:

一部のノードを再起動し、スナップショット/ PVCのボリュームアタッチメントがあったノードの1つでkubeletを再起動しました。

環境
Openshift4.6。*

  • トライデントバージョン:20.07.1(アップグレード後に20.10.0でもクラッシュ)
  • 使用されるトライデントインストールフラグ:-debug
  • コンテナランタイム:cri-o://1.19.0-24
  • Kubernetesバージョン:v1.19.0
  • Kubernetesオーケストレーター:Openshift4.6。*
  • Kubernetes対応の機能ゲート:[例:CSINodeInfo]
  • OS:Red Hat Enterprise Linux CoreOS 46.82
  • NetAppバックエンドタイプ:[例:CVS for AWS、ONTAP AFF 9.5、HCI 1.7]

再現するには

  • デフォルトのストレージバックエンドをスナップショットをサポートしないものに設定します。
  • スナップショットをサポートしないバックエンドのvolumesnapshotオブジェクトを作成します
  • デフォルトのSCをスナップショットをサポートするSCに変更します
  • ボリュームスナップショットを削除します
  • そのスナップショットの添付ファイルが含まれていたノードを再起動します。
  • ノードを再起動した後、trident-csiポッドを再起動します。
  • すべての参照がクリアされているかどうかを確認します。

予想される行動

壊れたTridentTransaction参照でクラッシュループは発生しません。
警告を出力して続行するか、壊れた参照をクリーンアップするか、フラグを追加してこの動作のオン/オフを切り替えます。

bug tracked

全てのコメント5件

回避策は、トライデントトランザクションを手動で削除し、トライデントポッドを再起動することです。 これはまだ対処する必要のあるバグです。
以下の回避策の手順
tridenttransactionsCRDのエントリを確認します。

#oc get tridenttransaction -n trident
#oc get tridenttransaction -n trident -o json

[ corona @ stablrebco2〜 ] $ oc get ttx-nトライデント
名前年齢
pvc-63836175-1515-4326-b73f-cae3e0963be7-snapshot-0462e2ea-f167-4846-86a3-10cc6599b4a8 8d

3)トライデントトランザクションCRDに存在するエントリを削除します。
tridenttransaction CRDエントリを削除する前に、CRDリソースエントリを編集してファイナライザー(trident.netapp.io)を削除する必要がある場合があります。

CRDを編集するには、viエディターを使用します:(変更を保存することを忘れないでください)

kubectl(oc)edit tridenttransaction pvc-63836175-1515-4326-b73f-cae3e0963be7-snapshot-0462e2ea-f167-4846-86a3-10cc6599b4a8 -n trident

エントリ「trident.netapp.io」を含むファイナライザーの下の行を削除します。

4)トライデントトランザクションCRDを削除します。

oc delete ttx pvc-63836175-1515-4326-b73f-cae3e0963be7-snapshot-0462e2ea-f167-4846-86a3-10cc6599b4a8 -n trident

tridenttransactionが削除されたことを確認します。

oc get ttx-nトライデント

5)この後、トライデントポッドが起動し、実行状態になります。 そうでない場合は、メインのトライデントポッド(ポッド名が最も長いポッド)を削除します。
これにより、新しいトライデントポッドが生成され、初期化が再試行されます。初期化中に処理される古いトランザクションがないため、正常に初期化されます。

oc get pods -n trident

oc削除ポッド-nトライデント

バグを修正するためのパッチリリースがありますか

こんにちは@promothp

このバグは、他のすべてのバグとともに重大度に基づいて評価され、それに応じて修正されるように優先順位が付けられます。 可能であれば、この問題のバグ修正は、1月末のTridentv21.01リリースに含まれる予定です。

すぐにパッチを入手することに投票を追加してください!

この修正は、コミット0ce1aafを含むTridentv21.01リリースに含まれています。

このページは役に立ちましたか?
0 / 5 - 0 評価