Container Network File System (CNFS) の自動スケーリングを使用すると、一度ポリシーを定義するだけで、storage-operator が NAS ボリュームの使用量を監視し、使用量がしきい値を超えると自動的に容量を拡張します。コード変更、手動介入、ストレージレベルの自己監視は不要です。
仕組み
自動スケーリングワークフローは、storage-operator コンポーネントによって完全に処理されます。
-
ポリシーの定義。 ターゲット PersistentVolumeClaim (PVC)、トリガー条件、およびスケールアウトアクションを指定する
StorageAutoScalerPolicyリソースを作成します。PVC で使用される StorageClass は、
allowVolumeExpansion: trueである必要があります。 -
継続的な監視。 storage-operator は、ターゲット PVC のリアルタイムのストレージ使用量を監視します。
-
スケールアウトのトリガー。 条件が満たされると、storage-operator は PVC にスケールアウト要求を送信します。
-
スケールアウトの実行。 Container Storage Interface (CSI) ドライバーが要求を処理し、Alibaba Cloud NAS が実際のファイルシステム拡張を実行します。
-
ステータスの同期。 PVC ステータスは、新しい容量を反映するように自動的に更新されます。
前提条件
開始する前に、以下を確認してください。
-
csi-plugin および csi-provisioner がバージョン v1.20.5-ff6490f-aliyun 以降であること。アップグレードするには、「CSI コンポーネントのアップグレード」をご参照ください。
-
storage-operator がバージョン v1.18.8.56-2aa33ba-aliyun 以降であること。アップグレードするには、「storage-operator コンポーネントの管理」をご参照ください。
-
cnfs-controller がインストールされていること。これはデフォルトでインストールされるマネージドコンポーネントです。アンインストールされていないことを確認してください。
-
Availableステータスの CNFS があること。作成するには、「CNFS を使用した NAS ファイルシステムの管理」をご参照ください。
storage-operator のバージョンが v1.33.1 より前の場合: 続行する前に、次のコマンドを実行して ConfigMap で自動スケーリング機能を有効にします。
kubectl patch configmap/storage-operator \
-n kube-system \
--type merge \
-p '{"data":{"storage-auto-expander":"{\"imageRep\":\"acs/storage-auto-expander\",\"imageTag\":\"\",\"install\":\"true\",\"template\":\"/acs/templates/storage-auto-expander/install.yaml\",\"type\":\"deployment\"}"}}'
CNFS ステータスを確認するには:
# すべての CNFS オブジェクトを一覧表示します
kubectl get cnfs
# 特定の CNFS のステータスを確認します
kubectl get cnfs <CNFS_NAME> -o yaml | grep Available
予想される出力:
NAME AGE
default-cnfs-nas-837d6ea-20210819155623 14dstatus: Available
ステップ 1: スケールアウトポリシーの定義
StorageAutoScalerPolicy リソースを作成して、storage-operator が NAS ボリュームをいつ、どのように拡張するかを指定します。
次の例では、app: nginx というラベルが付いた PVC ( default または nginx 名前空間内) の容量使用量が 80% を超えたときにスケールアウトをトリガーします。各拡張は現在の容量を倍増させ、最大 200 GiB まで拡張します。
cat << EOF | kubectl apply -f -
apiVersion: storage.alibabacloud.com/v1alpha1
kind: StorageAutoScalerPolicy
metadata:
name: hybrid-expand-policy
spec:
# ラベルセレクターで PVC を照合します。
pvcSelector:
matchLabels:
app: nginx # PVC および Deployment のラベルと一致する必要があります。
# このポリシーが適用される名前空間。
namespaces:
- default
- nginx
# スケールアウトをトリガーする条件。
conditions:
- name: condition1
key: volume-capacity-used-percentage # メトリック: 容量使用率。
operator: Gt # より大きい。
values:
- "80" # しきい値: 80%。
# 条件が満たされたときに実行するアクション。
actions:
- name: action1
type: volume-expand
params:
scale: 100% # 現在のサイズの 100% で容量を増やします。
limits: 200Gi # 合計容量を 200 GiB に制限します。
EOF
ポリシーパラメーター:
| パラメーター | 説明 |
|---|---|
pvcSelector |
このポリシーが適用される PVC と一致するラベルセレクター。 |
namespaces |
ポリシーがアクティブな名前空間。複数の名前空間は OR ロジックを使用します。設定されていない場合、デフォルトは default です。 |
conditions |
1 つ以上のトリガー条件。複数の条件は AND ロジックを使用します。ポリシーがトリガーされる前にすべて満たされる必要があります。 |
actions |
条件が満たされたときに実行するアクション。システムは最初の一致するアクションを実行します。 |
conditions パラメーター:
| パラメーター | 値 | 説明 |
|---|---|---|
key |
volume-capacity-used-percentage |
使用済み容量がしきい値を超えたときにトリガーされます。 |
volume-capacity-free-size |
空き領域がしきい値を下回ったときにトリガーされます。 | |
volume-capacity-pvc-size |
元の要求された容量 (pvc.spec.resources.requests.storage) がしきい値を下回ったときにトリガーされます。 |
|
operator |
Gt、Lt、Eq、Ne |
比較演算子。大文字と小文字は区別されません。 |
values |
数値文字列 | 条件のしきい値。 |
actions パラメーター:
| パラメーター | 説明 |
|---|---|
type |
アクションタイプ。現在、volume-expand のみがサポートされています。 |
scale |
拡張ステップサイズ。パーセンテージ (例: 50%) または静的値 (例: 100Gi) を使用します。 |
limits |
拡張後の最大合計容量。コストを制御し、暴走的な増加を防ぐためにこれを設定します。 |
ステップ 2: StorageClass の作成
既存の CNFS NAS ファイルシステムを参照する StorageClass を作成します。allowVolumeExpansion: true を設定します。これは、自動スケーリングポリシーが使用量を計算するために使用する容量ベースラインを確立します。
cat << EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alibabacloud-cnfs-nas # 次のステップで PVC で参照されます。
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
volumeAs: subpath
# 形式: <nas-server-address>:/<path>
server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s"
archiveOnDelete: "true"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
allowVolumeExpansion: true # 自動スケーリングに必要です。
EOF
StorageClass パラメーターの完全なリストについては、「CNFS を使用して NAS ファイルシステムを管理する」をご参照ください。
ステップ 3: アプリケーションと PVC のデプロイ
ポリシーの pvcSelector.matchLabels (app: nginx) と一致するラベルを持つ PVC と Deployment を作成します。storage-operator はこれらのラベルを使用して、ポリシーを正しい PVC に関連付けます。
cat << EOF | kubectl apply -f -
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: cnfs-nas-pvc
labels:
app: nginx # ポリシーの pvcSelector.matchLabels と一致する必要があります。
spec:
accessModes:
- ReadWriteMany
storageClassName: alibabacloud-cnfs-nas # 以前に作成した StorageClass を参照します。
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cnfs-nas-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx # ポリシーの pvcSelector.matchLabels と一致する必要があります。
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
volumeMounts:
- mountPath: "/data"
name: cnfs-nas-pvc
volumes:
- name: cnfs-nas-pvc
persistentVolumeClaim:
claimName: cnfs-nas-pvc
EOF
ステップ 4: 自動スケーリングの検証
テストデータを書き込むことでスケールアウトをトリガーし、イベントとモニタリングダッシュボードを通じて拡張を確認します。
-
Pod が実行中であることを確認します。
kubectl get pods -l app=nginx予想される出力:
NAME READY STATUS RESTARTS AGE cnfs-nas-deployment-56dbcc7fb7-wh79z 1/1 Running 0 20m -
データを書き込む前に、初期 PVC 容量を記録します。
kubectl get pvc cnfs-nas-pvc予想される出力 (初期状態、20 GiB):
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE cnfs-nas-pvc Bound ... 20Gi RWX alibabacloud-cnfs-nas 2m -
20 GiB のテストデータを書き込み、使用量を 80% のしきい値以上に押し上げます。
書き込み操作は、ネットワークスループットとストレージパフォーマンスに応じて数分かかる場合があります。
kubectl exec -it <POD_NAME> -- dd if=/dev/zero of=/data/testfile bs=1G count=20 -
スケールアウトによって生成されたイベントを確認します。
kubectl get events | grep cnfs-nas-pvcStartExpandおよびVolumeResizeSuccessfulイベントは、拡張が完了したことを確認します。この例では、PVC は 20 GiB から 40 GiB にスケールしました (100% 増加)。12s Warning StartExpand persistentvolumeclaim/cnfs-nas-pvc Start to expand of pvc cnfs-nas-pvc from 20Gi to 40Gi, usedCapacityPercentage:99%, freeSize:204MB. 12s Normal ExternalExpanding persistentvolumeclaim/cnfs-nas-pvc waiting for an external controller to expand this PVC 12s Normal Resizing persistentvolumeclaim/cnfs-nas-pvc External resizer is resizing volume nas-462db2b2-717d-44fe-b0b6-fb4db03a**** 12s Normal VolumeResizeSuccessful persistentvolumeclaim/cnfs-nas-pvc Resize volume succeeded更新された容量を確認します:
kubectl get pvc cnfs-nas-pvc -
(オプション) CSI NAS モニタリングダッシュボードで利用傾向を表示します。この例では、スケールアウトは 10:23:30 にトリガーされ、拡張後の容量は 100 GiB です。
Alibaba Cloud Prometheus Monitoring が必要です。詳細については、「Alibaba Cloud Prometheus Monitoring」をご参照ください。
-
[クラスター] ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、[運用] > [Prometheus モニタリング] を選択します。
-
[Storage Monitoring] タブをクリックし、次に [CSI NAS] をクリックします。
-
[名前空間] を [デフォルト] に設定し、[PVC 名] を cnfs-nas-pvc に設定すると、[合計容量] エリアで容量を表示できます。

-
ベストプラクティス
本番環境で NAS ボリュームの自動スケーリングを使用する際に、これらの推奨事項を適用します。
| ディメンション | ガイダンス |
|---|---|
| コスト管理 | スケールアウトポリシーで limits を設定し、合計容量を制限します。非常に大きなボリュームの場合、より予測可能なコスト管理のために、パーセンテージの代わりに静的な scale 値 (例: 200Gi) を使用します。 |
| しきい値のチューニング | トリガーしきい値を 75% から 80% の間に設定します。95% 以上のしきい値では、ボリュームの空き容量がなくなる前に拡張が完了するのに十分な時間がありません。 |
| モニタリング | コンテナストレージモニタリングを有効にし、ストレージメトリックのアラート機能のために Alibaba Cloud Prometheus Monitoring を設定します。詳細については、「コンテナストレージモニタリング」および「Alibaba Cloud Prometheus Monitoring の設定」をご参照ください。 |
| 詳細なポリシー | アプリケーションまたは環境ごとに個別の StorageAutoScalerPolicy オブジェクトを作成し、容量を個別に管理します。 |
| パフォーマンス | 自動スケーリングは容量の制約に対処するものであり、パフォーマンスボトルネックではありません。IOPS 制限や多数の小さなファイル操作によりアプリケーションが遅い場合は、より高性能な NAS ティアを選択してください。 |