Note
このドキュメントは Claude Code を用いて作業しながら生成したものです。
GiganticMinecraft/seichi_infra での実装例を題材にしていますが、democratic-csi で TrueNAS Scale を iSCSI バックエンドとして使用する方法を広く紹介することを主な目的としています。秘匿情報の管理や ArgoCD との連携といった seichi_infra 固有の構成はそのまま適用できない場合がありますが、CSI ドライバーの設定や TrueNAS Scale 側の権限設定については汎用的な参考になるはずです。
はじめに
オンプレミスの Kubernetes クラスター (seichi-onp-k8s) に、TrueNAS Scale をバックエンドとした iSCSI の動的ストレージプロビジョニングを導入しました。CSI ドライバーには democratic-csi を採用しています。
全体構成
democratic-csi は Helm chart で提供されており、接続設定(TrueNAS の API キーや ZFS データセットのパス等)を Kubernetes Secret として渡すことで動作します。seichi_infra では GitOps パターン(ArgoCD + Terraform + GitHub Actions)を用いてこれを管理しています。
| |
実装の詳細
1. CSI ドライバーの設定
democratic-csi を Helm でインストールする際の最小限の設定は以下の通りです。接続設定(API キー等)は existingConfigSecret で既存の Kubernetes Secret を参照する形にしており、Helm values に秘匿情報を直接書かないようにしています。
| |
seichi_infra での ArgoCD Application 定義は app-of-other-apps/democratic-csi-sc-truenas-03.yaml を参照してください。
2. 接続設定(Kubernetes Secret の中身)
existingConfigSecret で参照する Secret には以下の形式の YAML を driver-config-file.yaml というキーで格納します。
| |
Note
seichi_infra での秘匿情報管理について seichi_infra では GitHub Actions Repository Secret に
TF_VAR_プレフィックスで登録した値が、CI スクリプト経由で自動的に Terraform 変数として渡され、onp_cluster_secrets.tfが Kubernetes Secret を作成・更新します。詳細はcluster-boot-up/democratic-csi-sc-truenas-03.mdを参照してください。
3. TrueNAS Scale 側の事前設定
iSCSI サービスの有効化
Services から iSCSI サービスを有効化し、起動しておく必要があります。
iSCSI Portal Group
iSCSI の接続受付口となる Portal Group を作成します。Shares > iSCSI > Portals から作成し、待ち受け IP アドレスとポート(デフォルト: 3260)を設定します。接続設定の targetPortal に指定するアドレスがここで設定したものになります。
ZFS データセット
democratic-csi がボリュームとスナップショットを格納する ZFS データセットをあらかじめ作成しておく必要があります。Datasets から以下の2つを作成します。
| データセット | 用途 | 接続設定での対応キー |
|---|---|---|
<pool>/<任意のパス>/volumes | PVC として払い出すボリュームの親 | zfs.datasetParentName |
<pool>/<任意のパス>/snapshots | VolumeSnapshot の格納先の親 | zfs.detachedSnapshotsDatasetParentName |
democratic-csi はこれらのデータセット配下にボリュームごとの子データセットを自動で作成・削除します。親データセット自体は手動で用意しておく必要があります。
API キー
API キーは TrueNAS Scale WebUI の Credentials > API Keys から発行します。API キーは発行したユーザーの権限を継承します。democratic-csi は ZFS データセットの作成・削除(ボリューム・スナップショット用)、iSCSI ターゲット・Extent・Target-Extent 関連付けの作成・削除、iSCSI 設定の参照を TrueNAS Scale API 経由で実行するため、これらを行えるユーザーのキーが必要です。
TrueNAS Scale のデフォルト管理者ユーザー(truenas_admin)の API キーを使えば上記すべての権限が得られます。最小権限の観点からは専用サービスアカウントを作成することが望ましいですが、TrueNAS Scale の RBAC は現時点では粒度が粗いため、管理者権限のキーを使うことが現実的な選択になりがちです。
iSCSI Initiator Group
iSCSI では Initiator Group によって「どのホストからの接続を許可するか」を制御します。今回は TrueNAS Scale に Proxmox 向けの iSCSI 設定がすでに存在していたため、以下の2グループを共存させています。
| Initiator Group | 用途 | 設定 |
|---|---|---|
| ID: 1 | Proxmox 用 | Proxmox ホストの IQN を明示指定(それ以外は拒否) |
| ID: 2 | k8s 用(新設) | 全許可(Initiators フィールド空欄) |
democratic-csi の接続設定で targetGroupInitiatorGroup: 2 を明示指定することで、democratic-csi が作成する iSCSI ターゲットは最初から Initiator Group 2 に紐付けられます。Proxmox 用のターゲットは Initiator Group 1 に紐付けられているため、ターゲットレベルで分離されており、同一の Portal Group(ID: 1、ポート 3260)を共用しながら Proxmox と k8s のストレージが互いに干渉しない構成になっています。
k8s 用の Initiator Group を全許可にしているのは、k8s ノードの IQN が動的に変わりうることと、ノードを追加するたびに Initiator Group を更新する運用コストを避けるためです。iSCSI ターゲット名に nameSuffix: "-seichi-onp-k8s" を付与することで、k8s 用ボリュームと Proxmox 用ボリュームを名前で区別しています。
既存の iSCSI 設定がない場合は、全許可の Initiator Group を1つ作成するだけで問題ありません。
動作確認
以下の PVC と Pod を作成して動作を確認しました。
| |
| |
PVC が TrueNAS Scale から動的にプロビジョニングされ、Pod からの読み書きが正常に動作することを確認しました。
まとめ
- CSI ドライバー: democratic-csi v0.15.1(
freenas-api-iscsiドライバー) - StorageClass:
sc-truenas-03-iscsi(RWO、ext4、動的プロビジョニング) - VolumeSnapshotClass:
sc-truenas-03-iscsi-vsc - 接続設定は
existingConfigSecretで Kubernetes Secret から参照し、Helm values に秘匿情報を含めない - TrueNAS Scale 上の既存 Proxmox iSCSI 設定との共存を Initiator Group の分離で実現