このプロジェクトについて
pillar-csiは、セルフホスト型ベアメタルクラスタ向けのKubernetes CSIドライバです。専用ストレージノード上のローカルZFS zvolまたはLVM論理ボリュームを取得し、NVMe-oF/TCP経由でクラスタの残りのノードへエクスポートします。SSH、Pythonデーモン、外部ターゲットCLIに依存せず、configfsを介してカーネルへ直接書き込みます。これは明示的に分散ファイルシステムではありません。ノード間でストレージを複製、ストライプ、プールすることはありません。
アーキテクチャは3つのワークロードで構成されます。pillar-controllerはDeploymentとして動作し、クラスタスコープのPillar* CRDを調整します。pillar-agentはストレージノード上でのみDaemonSetとして動作し、ホスト上のすべてのconfigfs書き込みを所有します。pillar-nodeはすべてのワーカー上で動作し、CSI Nodeサービス(イニシエータ接続、mkfs、バインドマウント)を処理します。両方のDaemonSetはhostNetworkを使用するため、NVMe-oF/TCPデータプレーンはホストのネットワーク名前空間にバインドできます。
設定はCRDを通じて宣言的に行います。PillarAgentはストレージエージェントを特定し、PillarStoreはストレージプール(ZFSプール名、LVM VG、バックエンド設定)を記述し、PillarProtocolはネットワークプロトコル設定を記述し、PillarStorageClassはプールとプロトコルを組み合わせて自動生成されたStorageClassを作成します。内部のPillarVolumeState CRDは、部分的なプロビジョニング失敗からの復旧とパブリケーション追跡のための永続状態を記録します。コントローラはその記録からCSIアクセスモードの排他性を強制します。
注目すべき設計要素は、古い操作のフェンシングです。ボリュームのリソースを変更するすべてのエージェント呼び出しには、ボリューム状態UID(ライフサイクルID)と、compare-and-swapでインクリメントされるpublicationGenerationカウンタで構成されるフェンシングトークンが付与されます。エージェントはストレージノードのローカルディスク上の/var/lib/pillar-csi/agent/generations/にボリュームごとの永続マークを保持し、hostPathとしてマウントされるため、マークは再起動やリブート後も存続します。マークより古いリクエスト、終了または置換されたライフサイクルからのリクエスト、トークンを持たないリクエストはFAILED_PRECONDITIONで拒否されます。READMEにはアップグレード時の注意事項が記載されています。以前のバージョンではパブリケーション、ライフサイクル、ジェネレーションが記録されておらず、移行シムも提供されていないため、アップグレード前にすべてのボリュームをデタッチしてください。
ノードステージ状態はワーカー上の/var/lib/pillar-csi/node/に記録され、一時ファイル、sync、renameによってアトミックに書き込まれます。NodeUnstageVolumeは記録を読み戻します。これはCOがアンステージ時にボリュームケイパビリティもボリュームコンテキストも送信しないためです。アンマウントの判断はマウンターの冪等なUnmountに委譲され、破損したマウントのプローブエラー(EIO、ENOTCONN、ESTALE、EACCES)はまだマウントされているものとして扱われるため、kubeletはファイルシステムがカーネルシャットダウンに入ったPodを回収できます。
サポートマトリクス: NVMe-oF/TCP上のZFS zvolとLVM LVは出荷済みです。iSCSIは設計済みですがまだ出荷されていません。ZFSデータセット向けのNFSは設計済みですがまだ出荷されていません。CSI操作にはCreateVolume、DeleteVolume、ControllerPublish/Unpublish、ControllerExpandVolume、NodeStage/Unstage、NodePublish/Unpublish、NodeExpandVolume、NodeGetVolumeStats、ValidateVolumeCapabilities、GetCapacityが含まれます。アクセスモードはReadWriteOnce、ReadWriteOncePod、ReadOnlyManyです。ボリュームモードはFilesystem(ext4/xfs)とBlockです。
インストールはHelm経由で行います。コントローラとエージェント間のmTLSはオプトインです(cert-managerモードまたは提供されたSecretモード)。デフォルトは平文gRPCです。Kubernetes 1.24以降が必要です。ストレージノードにはnvmetおよびnvmet_tcpカーネルモジュールが必要です。ワーカーノードにはnvme_tcpおよびnvme_fabricsが必要です。initコンテナは起動時にmodprobeを実行します。
READMEには、CRD YAMLの例を含むクイックスタート、標準のkubectl describeとログによるトラブルシューティング、ExportSpecMissingでスタックしたレガシーボリュームの詳細な復旧手順が含まれており、実行時の観察から推測するのではなく、bindAddress、port、aclEnabledについて明示的なオペレータの判断を強調しています。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.