Azure Operator Nexus ストレージ アプライアンス
Azure Operator Nexus は、コンピューティング サーバー、ストレージ アプライアンス、ネットワーク ファブリック デバイスなどの基本的なコンストラクトに基づいて構築されています。 Azure Operator Nexus ストレージ アプライアンスは、ラック上の永続ストレージ アプライアンスを表します。
各ストレージ アプライアンスには複数のストレージ デバイスが含まれており、これらが集約されて 1 つのストレージ プールを提供します。 その後、このストレージ プールは複数のボリュームに分割され、ブロック ストレージ デバイスとしてコンピューティング サーバーに提示されます。 コンピューティング サーバーは、これらのブロック ストレージ デバイスをワークロードの永続ストレージとして使用できます。 各 Azure Operator Nexus クラスターは、すべてのテナント ワークロード間で共有される 1 つのストレージ アプライアンスを使用してプロビジョニングされます。
Azure Operator Nexus インスタンス内の各ストレージ アプライアンスは、Azure リソースとして表されます。 オペレーターは、他の Azure リソースと同様に属性を表示するためのアクセス権を取得します。
Kubernetes ストレージ クラス
Azure Operator Nexus ソフトウェア Kubernetes スタックには、2 種類のストレージが用意されています。 オペレーターは、Kubernetes StorageClass メカニズムを使用してそれらを選択します。
重要
Azure Operator Nexus では、エフェメラル ボリュームはサポートされていません。 このドキュメントで説明する永続ボリューム ストレージ メカニズムは最高レベルのパフォーマンスと可用性を提供するので、Nexus ではそれをすべてのワークロード ボリュームに使うことをお勧めします。 Azure Operator Nexus のすべてのストレージは、ストレージ アプライアンスによって提供されます。 ベアメタル マシン ディスクによって提供されるストレージはサポートされていません。
StorageClass: nexus-volume
デフォルトのストレージ メカニズム nexus-volumeは、ほとんどのユーザーに推奨される選択肢です。 これは、最高レベルのパフォーマンスと可用性を提供します。 ただし、複数のワーカー ノード間でボリュームを同時に共有することはできません。 オペレーターは、ボリューム リソースを介して Azure API とポータルを使用して、これらのボリュームにアクセスして管理できます。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: testPvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 107Mi
storageClassName: nexus-volume
volumeMode: Block
volumeName: testVolume
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 107Mi
phase: Bound
StorageClass: nexus-shared
共有ファイル システムが必要な場合は、nexus-shared ストレージ クラスを使用できます。 このストレージ クラスは、同じ Nexus Kubernetes クラスター内の複数のポッドが同時にアクセスして同じボリュームを共有できるので、可用性の高い共有ストレージ ソリューションを実現できます。 nexus-shared ストレージ クラスは、可用性の高い NFS ストレージ サービスによってサポートされます。 この NFS ストレージ サービス (現在、ストレージ プールの最大サイズは 1 TiB に制限されています) は、クラウド サービス ネットワーク (CSN) ごとに使用できます。 NFS ストレージ サービスは、CSN リソースの作成時に自動的にデプロイされます。 CSN に接続されている Nexus Kubernetes クラスターは、この共有ストレージ プールから永続ボリュームをプロビジョニングできます。 Nexus 共有では、読み取り/書き込み (1 回のみ) (RWO) アクセス モードと読み取り/書き込み (複数回) (RWX) アクセス モードの両方がサポートされています。 つまり、ワークロード アプリケーションは、これらのアクセス モードのいずれかを使用して共有ストレージにアクセスできます。
図: Nexus 共有ボリューム
ほとんどのアプリケーションでは nexus-shared のパフォーマンスと可用性で十分ですが、I/O 要件が多いワークロードでは、最適なパフォーマンスを得るために nexus-volume オプションを使用することをお勧めします。
読み取り/書き込み (1 回のみ) (RWO)
読み取り/書き込み (1 回のみ) (RWO) モードでは、一度に 1 つのノードまたは要求者のみが Nexus 共有ボリュームをマウントできます。 ReadWriteOnce (1 回のみ) アクセス モードでは、ポッドが同じノードで実行されている場合でも、複数のポッドがボリュームにアクセスできます。
apiVersion: v1
items:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: nexus-shared
volumeMode: Filesystem
volumeName: TestVolume
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
phase: Bound
読み取り/書き込み (複数回) (RWX)
読み取り/書き込み (複数回) (RWX) モードでは、複数のノードまたは要求者が Nexus 共有ボリュームを同時にマウントできます。
apiVersion: v1
items:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: nexus-shared
volumeMode: Filesystem
volumeName: TestVolume
status:
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
phase: Bound
例
Nexus ボリューム ストレージ クラスを使用した読み取り/書き込み (RWO) (1 回のみ)
このマニフェスト例では、ReadWriteOnce モードの Nexus ボリューム ストレージ クラスを使用して、PersistentVolumeClaimTemplate で StatefulSet を作成します。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: test-sts-rwo
labels:
app: test-sts-rwo
spec:
serviceName: test-sts-rwo-svc
replicas: 3
selector:
matchLabels:
app: test-sts-rwo
template:
metadata:
labels:
app: test-sts-rwo
spec:
containers:
- name: busybox
command:
- "/bin/sh"
- "-c"
- while true; do echo "$(date) -- $(hostname)" >> /mnt/hostname.txt; sleep 1; done
image: busybox
volumeMounts:
- name: test-volume-rwo
mountPath: /mnt/
volumeClaimTemplates:
- metadata:
name: test-volume-rwo
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
storageClassName: nexus-volume
StatefulSet のポッドごとに、1 つの PersistentVolumeClaim が作成されます。
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-volume-rwo-test-sts-rwo-0 Bound pvc-e41fec47-cc43-4cd5-8547-5a4457cbdced 10Gi RWO nexus-volume 8m17s
test-volume-rwo-test-sts-rwo-1 Bound pvc-1589dc79-59d2-4a1d-8043-b6a883b7881d 10Gi RWO nexus-volume 7m58s
test-volume-rwo-test-sts-rwo-2 Bound pvc-82e3beac-fe67-4676-9c61-e982022d443f 10Gi RWO nexus-volume 12s
# kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-sts-rwo-0 1/1 Running 0 8m31s 10.245.231.74 nexus-cluster-6a8c4018-agentpool2-md-vhhv6 <none> <none>
test-sts-rwo-1 1/1 Running 0 8m12s 10.245.126.73 nexus-cluster-6a8c4018-agentpool1-md-27nw4 <none> <none>
test-sts-rwo-2 1/1 Running 0 26s 10.245.183.9 nexus-cluster-6a8c4018-agentpool1-md-4jprt <none> <none>
# kubectl exec test-sts-rwo-0 -- cat /mnt/hostname.txt
Thu Nov 9 21:57:25 UTC 2023 -- test-sts-rwo-0
Thu Nov 9 21:57:26 UTC 2023 -- test-sts-rwo-0
Thu Nov 9 21:57:27 UTC 2023 -- test-sts-rwo-0
# kubectl exec test-sts-rwo-1 -- cat /mnt/hostname.txt
Thu Nov 9 21:57:19 UTC 2023 -- test-sts-rwo-1
Thu Nov 9 21:57:20 UTC 2023 -- test-sts-rwo-1
Thu Nov 9 21:57:21 UTC 2023 -- test-sts-rwo-1
# kubectl exec test-sts-rwo-s -- cat /mnt/hostname.txt
Thu Nov 9 21:58:32 UTC 2023 -- test-sts-rwo-2
Thu Nov 9 21:58:33 UTC 2023 -- test-sts-rwo-2
Thu Nov 9 21:58:34 UTC 2023 -- test-sts-rwo-2
Nexus 共有ストレージ クラスを使用した読み取り/書き込み (複数回) (RWX)
次のマニフェストでは、ReadWriteMany モードの Nexus 共有ストレージ クラスを使用して、PersistentVolumeClaim (PVC) でデプロイを作成します。 作成された PVC は、デプロイのすべてのポッドで共有され、すべてのポッドが同時に読み取りと書き込みに使用できます。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-volume-rwx
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 3Gi
storageClassName: nexus-shared
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-deploy-rwx
name: test-deploy-rwx
spec:
replicas: 3
selector:
matchLabels:
app: test-deploy-rwx
template:
metadata:
labels:
app: test-deploy-rwx
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: kubernetes.azure.com/agentpool
operator: Exists
values: []
topologyKey: "kubernetes.io/hostname"
containers:
- name: busybox
command:
- "/bin/sh"
- "-c"
- while true; do echo "$(date) -- $(hostname)" >> /mnt/hostname.txt; sleep 1; done
image: busybox
volumeMounts:
- name: test-volume-rwx
mountPath: /mnt/
volumes:
- name: test-volume-rwx
persistentVolumeClaim:
claimName: test-volume-rwx
...
適用すると、同じ PVC を共有するデプロイのレプリカが 3 つ存在することになります。
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-volume-rwx Bound pvc-32f0717e-6b63-4d64-a458-5be4ffe21d37 3Gi RWX nexus-shared 6s
# kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-deploy-rwx-fdb8f49c-86pv4 1/1 Running 0 18s 10.245.224.140 nexus-cluster-6a8c4018-agentpool1-md-s2dh7 <none> <none>
test-deploy-rwx-fdb8f49c-9zsjf 1/1 Running 0 18s 10.245.126.74 nexus-cluster-6a8c4018-agentpool1-md-27nw4 <none> <none>
test-deploy-rwx-fdb8f49c-wdgw7 1/1 Running 0 18s 10.245.231.75 nexus-cluster-6a8c4018-agentpool2-md-vhhv6 <none> <none>
次の出力を見ると、すべてのポッドが同じ PVC に書き込んでいるのがわかります。
# kubectl exec test-deploy-rwx-fdb8f49c-86pv4 -- cat /mnt/hostname.txt
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-9zsjf
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-wdgw7
Thu Nov 9 21:51:42 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
# kubectl exec test-deploy-rwx-fdb8f49c-9zsjf -- cat /mnt/hostname.txt
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-9zsjf
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-wdgw7
Thu Nov 9 21:51:42 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
# kubectl exec test-deploy-rwx-fdb8f49c-wdgw7 -- cat /mnt/hostname.txt
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-9zsjf
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-wdgw7
Thu Nov 9 21:51:42 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
ボリューム サイズの制限と容量管理
nexus-volume と nexus-shared を使用して作成された PVC には、最小と最大の要求サイズがあります。
ストレージ クラス | 最小 PVC サイズ | 最大 PVC サイズ |
---|---|---|
nexus-volume | 1 MiB | 12 TiB |
nexus-shared | なし | 1 TiB |
重要
ボリュームが消費制限に達すると、ボリュームを消費するワークロードでディスク領域不足エラーが発生します。 ワークロード要件に適したボリューム サイズをプロビジョニングする必要があります。 ストレージ アプライアンスとすべての NFS サーバーの両方についてストレージ消費率を監視する必要があります。 これは、使用できるメトリックの一覧に記載されているメトリックを使用して実行できます。
- nexus-volume と nexus-shared PVC の両方に、要求されたストレージ容量が消費制限として適用されます。 ボリュームは、関連付けられた PVC 要求を超えるストレージを消費することはできません。
- すべての物理ボリュームは仮想プロビジョニング対応です。 ストレージ アプライアンスの合計ストレージ消費量を監視し、必要に応じてメンテナンス操作を実行してストレージ領域を解放する必要があります。
- 要求されたサイズがサポートされている最小ボリューム サイズより小さいか、サポートされている最大ボリューム サイズより大きい場合、Nexus ボリューム PVC プロビジョニング要求は失敗します。
- Nexus 共有ボリュームは、バッキング NFS サーバー上で論理的に仮想プロビジョニング対応です。 この NFS サーバーの容量は 1 TiB に固定されています。
- Nexus 共有 PVC は、1 TiB を超えるストレージを要求してもプロビジョニングできますが、消費できるのは 1 TiB のみです。
- 容量要求の合計が 1 TiB を超える PVC のセットをプロビジョニングすることができます。 ただし、1 TiB の消費制限が適用されます。関連付けられた PV のセットは、1 TiB を超えるストレージを消費することはできません。
ストレージ アプライアンスの状態
次のプロパティは、ストレージ アプライアンスの操作状態を反映しています。
Status
は、ストレージ アプライアンスから派生した状態を示します。 状態は、Available
、Error
、またはProvisioning
のいずれかです。Provisioning State
は、ストレージ アプライアンスの現在のプロビジョニングの状態を指定します。 プロビジョニングの状態はSucceeded
、Failed
、またはInProgress
のいずれかです。Capacity
は、ストレージ アプライアンスの合計容量と使用容量を指定します。Remote Vendor Management
は、ストレージ アプライアンスに対してリモート ベンダー管理が有効か無効かを示します。
ストレージ アプライアンスの操作
- ストレージ アプライアンスの一覧表示: 指定されたリソース グループまたはサブスクリプション内のストレージ アプライアンスを一覧表示します。
- ストレージ アプライアンスの表示: 指定されたストレージ アプライアンスのプロパティを取得します。
- ストレージ アプライアンスの更新: 指定されたストレージ アプライアンスのプロパティまたはタグを更新します。
- ストレージ アプライアンスのリモート ベンダー管理の有効化/無効化: 指定されたストレージ アプライアンスのリモート ベンダー管理を有効または無効にします。
Note
顧客は、ストレージ アプライアンスを直接作成または削除することはできません。 これらのリソースは、クラスター ライフサイクルを実現するためにのみ作成されます。 実装では、任意のユーザーからの作成または削除要求がブロックされ、内部/アプリケーション駆動型の作成または削除操作のみをできるようにします。