Azure から「2026年9月30日までに BlobFuse を最新化せよ」という通知が届くと、AKS ではどこをどう見ればよいのか迷いがちです。本記事は“いまクラスタが何を使っているのか”“どうアップグレードするのが安全か”“v1→v2(fuse→fuse2)切り替えは何をすればよいか”を、現場でそのまま使えるコマンドと運用ノウハウで解説します。
AKS における BlobFuse の正体と管理主体
ポイントは、AKS では BlobFuse が「Azure Blob CSI ドライバー」に内包されており、実体は kube-system の DaemonSet(csi-blob-node)に載ったコンテナ内のバイナリだということです。多くのケースでノード OS に手動インストールはされていません。よって、Linux ノードに SSH して blobfuse2 --version を直接叩いても見つからないのは正常です。確認は Pod 内で行います。
いま使っているのは v1(fuse)か v2(fuse2)かを素早く判定する
最短距離で「どのプロトコルでマウントしているか」を掴むには、StorageClass と CSI ノード Pod を見るのが定石です。
方法A:StorageClass の parameters で判定
AKS の Azure Blob 用 StorageClass は provisioner: blob.csi.azure.com を持ち、parameters.protocol に fuse(v1)または fuse2(v2)が設定されます。記載が無い場合は既定(多くは v1 互換)として扱われます。
# Blob 用 StorageClass を探す
kubectl get sc -o wide | grep -E '(azureblob|blob\.csi\.azure\.com)'
# 具体的な内容を確認(<SC_NAME> を差し替え)
kubectl describe sc <SC_NAME>
# parameters: protocol: fuse2 なら v2、fuse または無記載なら v1 系として扱われます
方法B:CSI ノード Pod 内でバイナリのバージョンを確認
kube-system の csi-blob-node DaemonSet の Pod に入って blobfuse / blobfuse2 を確認します。
# Pod を特定
kubectl -n kube-system get pods -l app=csi-blob-node -o wide
# 先頭の Pod 名を環境変数に格納
export BLOB_NODE=$(kubectl -n kube-system get pods -l app=csi-blob-node
-o jsonpath='{.items[0].metadata.name}')
# どのコンテナにバイナリが入っているかを確認
kubectl -n kube-system get pod $BLOB_NODE -o jsonpath='{.spec.containers[*].name}'; echo
# (例)最初のコンテナで確認。必要に応じて -c を付け替え
kubectl -n kube-system exec -it $BLOB_NODE -- sh -lc '
command -v blobfuse2 && blobfuse2 --version || true;
command -v blobfuse && blobfuse --version || true'
上の出力で blobfuse2 のバージョンが表示されれば v2 が展開済みです。blobfuse のみなら v1。
方法C:実マウントの状態をワークロード Pod 側で確認
既に Blob をマウントしている Pod から見ても判定できます。マウント文字列に blobfuse2 と出ていれば v2 です。
# 対象 Pod の中で
mount | grep -E 'blobfuse'
# または
cat /proc/mounts | grep -E 'blobfuse'
早見表:どの方法をいつ使う?
| 目的 | 見る場所 | 代表コマンド | 判断ポイント |
|---|---|---|---|
| クラスタのデフォルト挙動を知る | StorageClass | kubectl describe sc <SC> | protocol: fuse2 なら v2 |
| 実際の実装バージョンを知る | kube-system の csi-blob-node Pod | blobfuse2 --version | バイナリのメジャー/マイナーを直接確認 |
| ワークロード影響の最終確認 | アプリ Pod | mount | grep blobfuse | マウント実態が v1/v2 のいずれかを確認 |
推奨:最小労力で最新を維持するアップグレード戦略
AKS では、クラスタ(制御プレーン)とノードイメージのアップグレードで CSI ドライバー群と同梱コンポーネントが更新されます。BlobFuse の更新だけを狙い撃ちするより、AKS 標準のアップグレード手順に乗せる方が安全かつ再現性が高いです。
手順1:利用可能なバージョンの確認
az aks get-upgrades -g <RESOURCE_GROUP> -n <AKS_NAME> -o table
手順2:クラスタ(制御プレーン)のアップグレード
az aks upgrade -g <RESOURCE_GROUP> -n <AKS_NAME> \
--kubernetes-version <ターゲット版> --yes
この操作はコントロールプレーンのみを更新します。アプリの Pod は引き続きノード上で動き続けます。
手順3:ノードプールのアップグレード
# Kubernetes バージョンも合わせて上げる場合
az aks nodepool upgrade -g <RESOURCE_GROUP> --cluster-name <AKS_NAME> \
--name <NODEPOOL_NAME> --kubernetes-version <同上> --yes
# 既存の K8s 版を維持しつつ、最新ノードイメージ(含:CSI/BlobFuse)だけ取り込む場合
az aks nodepool upgrade -g --cluster-name
--name --node-image-only --yes
node-image-only は実運用で重宝します。Kubernetes のメジャー/マイナーを据え置きながら、ノード OS やアドオンを最新化できるため、BlobFuse の通知対応だけを手早く終わらせたいときに有効です。
ローリングの影響と事前準備
- AKS はノードを cordon → drain しながら順次更新します。PodDisruptionBudget を適切に設定し、同時退避数を制御します。
- StatefulSet は既定で順次更新です。必要なら
maxUnavailable・minReadySeconds・readinessProbeの条件を見直します。 - DaemonSet でノードローカルにキャッシュしている設計は、退避時の再同期時間を考慮します。
BlobFuse v1(fuse)から v2(fuse2)へ「使い分け」or「移行」する
新規から v2 を使う:StorageClass で明示
v2 を強制したい場合は、専用の StorageClass を作り protocol: fuse2 を指定します。以後、この StorageClass を参照する新規 PVC は v2 経由でマウントされます。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azureblob-fuse2
provisioner: blob.csi.azure.com
parameters:
protocol: fuse2
# 例: 既定のコンテナ名やアカウント指定など、環境に応じて追記
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
既存ワークロードの切替え方
- 上記の
azureblob-fuse2StorageClass を作る。 - 対象アプリのマニフェストを新しい PVC(SC:
azureblob-fuse2)に切り替える。 - ローリング再起動で新しいボリュームをマウントして起動する。
注意:Blob は外部サービスのオブジェクトストレージであり、PV/PVC 自体にデータを保持しているわけではありません。「fuse → fuse2」への切替えでデータ移行は不要です。ただし、マウントオプションやキャッシュ動作が変わるため、性能や一時ファイルの扱いは事前に検証しましょう。
強制的に v2 バイナリを使いたい(上級)
標準のノードイメージ更新を待たずに v2 の特定バージョンを使いたい要件がある場合、csi-blob-node DaemonSet に initContainer を注入し、ノード上にバイナリを配置する設計もあります(Change 管理を厳格に)。以下は概念例です。
# 例:DaemonSet に initContainer を追加するパッチ(概念)
kubectl -n kube-system patch daemonset csi-blob-node --type merge -p '{
"spec": {
"template": {
"spec": {
"initContainers": [{
"name": "install-blobfuse2",
"image": "ubuntu:22.04",
"securityContext": {"runAsUser": 0},
"command": ["sh","-lc"],
"args": [
"set -e; \
mkdir -p /host/usr/local/bin; \
# ここで社内アーティファクトから blobfuse2 の検証済みバイナリを取得する処理に置換 \
cp /opt/blobfuse2/blobfuse2 /host/usr/local/bin/blobfuse2; \
chmod 0755 /host/usr/local/bin/blobfuse2"
],
"volumeMounts": [{
"name": "usr-local-bin",
"mountPath": "/host/usr/local/bin"
}]
}],
"volumes": [{
"name": "usr-local-bin",
"hostPath": {"path": "/usr/local/bin", "type": "Directory"}
}]
}
}
}
}'
この方式は、サプライチェーン管理・署名・復旧手順まで含めて運用できる組織でのみ採用してください。通常は AKS の更新サイクルに乗せる方が安全です。
アップグレード手段の比較
| 手段 | 作業量 | 安全性 | BlobFuse更新の確実さ | 適した状況 |
|---|---|---|---|---|
| クラスタ & ノードプール標準アップグレード | 低 | 高 | 高 | 標準運用、定期メンテで最新化したい |
| node-image-only | 低 | 高 | 高 | K8s 版は据え置きつつ通知対応だけ急ぎたい |
| DaemonSet への initContainer 追加 | 中〜高 | 中(設計次第) | 高(狙った版を使用可能) | バイナリ版を固定した社内標準がある |
運用に効くチェックリスト
- StorageClass に
protocol: fuse2を指定した v2 用 SC を用意したか。 - kube-system の
csi-blob-nodeでblobfuse2 --versionを採取したか(証跡保全)。 - 主要ワークロードで
mountの文字列にblobfuse2が出るかを確認したか。 - ノードプールの node-image-only 実行履歴(日時・実施者・対象)を残しているか。
- PodDisruptionBudget・readinessProbe・再試行戦略(
restartPolicy)が妥当か。
検証(ステージング)から本番へ:実行手順テンプレート
- ステージングで node-image-only を実施し、csi-blob-node のバージョンと StorageClass の挙動を確認。
- v2 用 StorageClass(
protocol: fuse2)を作成。 - 代表ワークロードを v2 SC で起動し、I/O テスト(ランダム read/write、並列度、キャッシュ設定)を記録。
- 本番で PDB を確認し、段階的にノードプールを更新(1プールずつ)。
- ロールアウト後に
mountの確認とアプリ観点の SLA/SLO をモニタリング。
性能・チューニング観点(v1→v2 での体感差)
- ディレクトリリスト性能:v2 の方がメタデータ処理が効率的で、ファイル数が多いコンテナで効果が出やすい。
- キャッシュ:v2 はキャッシュの粒度とクリア条件が整理されており、読み取り偏重ワークロードで安定することが多い。
- マウントオプション:
allow_other等の一部挙動が v1 と異なる場合があるため、セキュリティポリシー(Kata/SELinux/AppArmor 等)と合わせて検証する。
トラブルシュート(よく遭遇する症状と初動)
| 症状 | 考えられる要因 | 初動コマンド | 対処の方向性 |
|---|---|---|---|
| Pod 起動時にマウント失敗 | 資格情報不一致、ネットワーク疎通、マウントオプション不正 | kubectl logs -n kube-system <blob-node-pod> --tail=200 | Secret/Managed Identity の再確認、protocol の見直し |
| 高負荷時に 429/5xx | スロットリング、同時接続過多、キャッシュ未最適化 | アプリ Pod のログ、メトリクス(レイテンシ/エラー率) | 同時 I/O 低減、バックオフ、キャッシュ調整 |
| ノード更新で一時的にSLO悪化 | PDB/レプリカ数不足、Readiness 遅延 | kubectl get pdb / kubectl get hpa | レプリカ増・PDB 調整・ウォームアップ導入 |
セキュリティと資格情報の扱い(再確認)
- 資格情報は Secret で持たず、可能なら Managed Identity / Workload Identity を使う構成へ移行する。
- Pod の権限は最小化(
runAsUser、fsGroup、readOnlyRootFilesystem)。 - 監査観点では、どの StorageClass/PVC が v1/v2 かを定期レポート化するとよい(
kubectl get pvc -A -o jsonを整形)。
実務で使えるコマンド集(コピー&ペースト可)
v1/v2 の実態把握(一覧)
# すべての Blob 系 StorageClass と protocol を一覧
kubectl get sc -o json | jq -r '
.items[] | select(.provisioner == "blob.csi.azure.com") |
.metadata.name + "\tprotocol=" + (.parameters.protocol // "default")'
# すべての PVC -> 参照している StorageClass を一覧
kubectl get pvc -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.spec.storageClassName}{"\n"}{end}'
CSI ノードのバージョン採取
# csi-blob-node のコンテナイメージ(タグ)を一覧
kubectl -n kube-system get ds csi-blob-node -o jsonpath='{range .spec.template.spec.containers[*]}{.name}{"\t"}{.image}{"\n"}{end}'
# 代表 Pod から blobfuse2 / blobfuse のバージョン
export BLOB_NODE=$(kubectl -n kube-system get pods -l app=csi-blob-node -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system exec -it $BLOB_NODE -- sh -lc 'blobfuse2 --version || true; blobfuse --version || true'
ノードイメージのみ更新
az aks nodepool upgrade -g <RG> --cluster-name <AKS> \
--name <POOL> --node-image-only --yes
v2 専用 StorageClass のサンプル
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azureblob-fuse2
provisioner: blob.csi.azure.com
parameters:
protocol: fuse2
# 必要に応じて container, secretName 等を追加
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
よくある誤解と解消法
- 誤解:ノードに SSH して
blobfuse2 --checkすればよい。
解消:AKS ではドライバーは Pod 内にあり、ノード OS に直接は無いのが普通。kube-system の Pod で確認します。 - 誤解:v1→v2 は「データ移行」が必要。
解消:Blob は外部のオブジェクトストレージ。PV/PVC の切替え(StorageClass)とマウントオプション見直しが中心です。 - 誤解:既存 PV は自動で v2 に切り替わる。
解消:既存 PV/PVC は作成時の定義に従います。新規 PVC を v2 SC で作るか、アプリを切替える必要があります。
コンプライアンス通知(2026/09/30 期日)への実務対応例
- 現状把握(1〜2日):全 StorageClass / PVC の棚卸し、
csi-blob-nodeのバージョン採取。 - 是正方針決定(1日):標準は node-image-only の定期化。移行設計は「新規 v2 SC」「既存は順次置換」。
- ステージング検証(2〜3日):機能・性能・キャッシュ・フォールト注入。
- 本番適用(1スプリント):ノードプール単位の段階適用、メトリクス監視。
- 証跡化:実行コマンド、日時、対象、バージョン画面出力を保全。
まとめ:最終的な指針
- AKS を定期アップグレード(または node-image-only の定期運用)していれば、BlobFuse を含む CSI 周辺は基本的にサポート対象バージョンに保たれます。
- 現時点で v1 と v2 が並存していても、通知は「古い v1 か、古い v2」への是正要請という理解で OK。ノードイメージ更新で解消するのが王道です。
- 積極的に v2 を使いたい場合は、
protocol: fuse2の StorageClassを作成し、新規 PVC から v2 を適用。既存 PV は自動では切り替わらないため、アプリ側の切替え計画を立てましょう。
付録:運用ドキュメント雛形(そのまま社内 Wiki に流用可)
目的
AKS 上の BlobFuse をサポート対象バージョンに維持し、2026/09/30 の期日までに是正を完了する。
対象
- AKS すべてのノードプール(Linux)
- Azure Blob CSI ドライバー(
csi-blob-node) - Blob マウントを用いるワークロード(有無・数を棚卸し)
作業
- 現状採取:
kubectl describe sc、blobfuse2 --version、mount。 - 是正:
az aks nodepool upgrade --node-image-only(本番は段階的)。 - 切替:v2 用 StorageClass へ新規 PVC を切替え、ワークロードをローリング。
- 検証:I/O・レイテンシ・エラー率・起動時間を比較。
- 証跡:全ログと実行者・日時をチケットに添付。
ロールバック
- アップグレード前のノードプールの スケールアウト + 優先スケジュール で即時復旧可能な体制を用意。
- v2 SC 切替え後に問題があれば、旧 PVC を参照する manifest へ戻しローリング。
結論:AKS では BlobFuse は CSI ドライバーに内包されており、ノードイメージ更新=BlobFuse 更新が基本動作です。
「どのプロトコルでマウントしているか」を StorageClass と実マウントで確かめ、node-image-only を定期運用しつつ、v2 を積極採用したい領域から protocol: fuse2 を適用していけば、期限内に無理なく完了できます。

コメント