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 共有" ストレージ クラスは、NFS ストレージ サービスによってサポートされます。 この NFS ストレージ サービス (現在、ストレージ プールの最大サイズは 1 TiB に制限されています) は、クラウド サービス ネットワーク (CSN) ごとに使用できます。 CSN に接続されている Nexus Kubernetes クラスターは、この共有ストレージ プールから永続ボリュームをプロビジョニングできます。 Nexus 共有では、読み取り/書き込み (1 回のみ) (RWO) アクセス モードと読み取り/書き込み (複数回) (RWX) アクセス モードの両方がサポートされています。 つまり、ワークロード アプリケーションは、これらのアクセス モードのいずれかを使用して共有ストレージにアクセスできます。

Nexus 共有が Nexus Kubernetes クラスターでワークロードのボリュームをプロビジョニングする方法を示す図

図: Nexus 共有ボリューム

ほとんどのアプリケーションでは nexus-shared のパフォーマンスと可用性で十分ですが、I/O 要件が多いワークロードでは、最適なパフォーマンスを得るために nexus-volume オプションを使用することをお勧めします。

読み取り/書き込み (1 回のみ) (RWO)

読み取り/書き込み (1 回のみ) (RWO) モードでは、Nexus 共有ボリュームは、一度に 1 つのノードまたは要求者のみがマウントできます。 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

ストレージ アプライアンスの状態

次のプロパティは、ストレージ アプライアンスの操作状態を反映しています。

  • Status は、ストレージ アプライアンスから派生した状態を示します。 状態は、AvailableError、または Provisioning のいずれかです。

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

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

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

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

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

Note

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