次の方法で共有


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 Kubernetes クラスターでワークロードのボリュームをプロビジョニングする方法を示す図

図: 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 は、ストレージ アプライアンスから派生した状態を示します。 状態は、AvailableError、または Provisioning のいずれかです。

  • Provisioning State は、ストレージ アプライアンスの現在のプロビジョニングの状態を指定します。 プロビジョニングの状態は SucceededFailed、または InProgress のいずれかです。

  • Capacity は、ストレージ アプライアンスの合計容量と使用容量を指定します。

  • Remote Vendor Management は、ストレージ アプライアンスに対してリモート ベンダー管理が有効か無効かを示します。

ストレージ アプライアンスの操作

  • ストレージ アプライアンスの一覧表示: 指定されたリソース グループまたはサブスクリプション内のストレージ アプライアンスを一覧表示します。
  • ストレージ アプライアンスの表示: 指定されたストレージ アプライアンスのプロパティを取得します。
  • ストレージ アプライアンスの更新: 指定されたストレージ アプライアンスのプロパティまたはタグを更新します。
  • ストレージ アプライアンスのリモート ベンダー管理の有効化/無効化: 指定されたストレージ アプライアンスのリモート ベンダー管理を有効または無効にします。

Note

顧客は、ストレージ アプライアンスを直接作成または削除することはできません。 これらのリソースは、クラスター ライフサイクルを実現するためにのみ作成されます。 実装では、任意のユーザーからの作成または削除要求がブロックされ、内部/アプリケーション駆動型の作成または削除操作のみをできるようにします。