你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 运营商关系存储设备

Azure 运营商关系是基于计算服务器、存储设备和网络构造设备等基本构造构建的。 Azure 运营商关系存储设备表示机架上的持久性存储设备。

每个存储设备都包含多个存储装置,这些存储装置聚合在一起以提供单个存储池。 此存储池之后被分割成多个卷,这些卷作为块存储设备提供给计算服务器。 计算服务器可以将这些块存储设备用作其工作负载的持久性存储。 每个 Azure 运营商关系群集都预配了跨所有租户工作负载共享的单个存储设备。

Azure 运营商关系实例中的存储设备表示为 Azure 资源。 运营商有权像查看其他任何 Azure 资源一样查看其属性。

Kubernetes 存储类

Azure 运营商关系软件 Kubernetes 堆栈提供两种类型的存储。 运营商通过 Kubernetes StorageClass 机制对其进行选择。

重要

Azure 运营商关系不支持临时卷。 Nexus 建议将本文档中所述的永久性卷存储机制用于所有工作负载卷,因为这些机制可提供最高级别的性能和可用性。 Azure 运营商关系中的所有存储均由存储设备提供。 不支持由裸机磁盘提供的存储。

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 群集中的多个 Pod 并发访问并共享同一卷,以此方式提供高度可用的共享存储解决方案。 Nexus 共享 存储类由高度可用的 NFS 存储服务提供支持。 此 NFS 存储服务(存储池最大大小当前限制为 1 TiB)可用于每个云服务网络 (CSN)。 在创建 CSN 资源时,会自动部署 NFS 存储服务。 附加到 CSN 的任何 Nexus Kubernetes 群集都可以从此共享存储池预配永久性卷。 Nexus 共享支持读写一次 (RWO) 和读写多次 (RWX) 访问模式。 这意味着,工作负载应用程序可以使用这两种访问模式之一来访问共享存储。

此图描绘了 nexus-shared 如何为关系 Kubernetes 群集中的工作负荷预配卷

图:关系共享卷

尽管 nexus-shared 的性能和可用性足以满足大多数应用,但我们建议 I/O 要求非常高的工作负载使用 nexus-volume 选项以获得最佳性能

读写一次 (RWO)

在“读写一次(RWO)”模式下,一次只能装载一个节点或索赔者装载 nexus 共享卷。 当多个 Pod 在同一节点上运行时,ReadWriteOnce 访问模式仍允许多个 Pod 访问卷。

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-volume 存储类读写一次 (RWO)

此示例清单显示的是在 ReadWriteOnce 模式下使用 nexus-volume 存储类创建具有 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 的每个 Pod 都创建了一个 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-shared 存储类读写多次 (RWX)

以下清单显示的是在 ReadWriteMany 模式下使用 nexus-shared 存储类创建具有 PersistentVolumeClaim (PVC) 的 Deployment。 创建的 PVC 由部署的所有 Pod 共享,所有 Pod 可以同时使用它进行读写。

---
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。

# 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>

从以下输出中可以看到,所有 Pod 都写入同一 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 卷和 nexus 共享创建的 PVC 具有最小和最大声明大小。

存储类 最小 PVC 大小 最大 PVC 大小
nexus-volume 1 MiB 12 TiB
nexus-shared 1 TiB

重要

达到其消耗限制的卷将导致消耗它们的工作负荷出现磁盘空间错误。 必须确保为工作负荷要求预配合适的卷大小。 必须监视存储设备和所有 NFS 服务器,以监视其存储消耗百分比。 可以使用可用指标列表中记录的指标执行此操作。

  • Nexus 卷和 nexus 共享的 PVC 均已将其请求的存储容量强制实施为消耗限制。 卷消耗的存储空间不能超过关联的 PVC 请求。
  • 所有物理卷都经过精简预配。 必须监视存储设备上的总存储消耗量,并在必要时执行维护操作以释放存储空间。
  • 如果请求的大小小于最小或大于支持的最大卷大小,则 nexus-volume PVC 预配请求将失败。
  • Nexus 共享卷在支持 NFS 服务器上以逻辑方式精简预配。 此 NFS 服务器具有 1 TiB 的固定容量。
    • 尽管请求存储超过 1 TiB,但可以预配 nexus 共享 PVC,但只能使用 1 TiB。
    • 可以预配一组 PVC,其中容量请求的总和大于 1 TiB。 但是,消耗限制为 1 TiB 仍然适用;关联的 PV 集不能消耗超过 1 TiB 的存储。

存储设备状态

以下属性反映存储设备的操作状态:

  • Status 指示从存储设备派生的状态。 状态可能是 AvailableErrorProvisioning

  • Provisioning State 提供存储设备的当前预配状态。 预配状态可以是 SucceededFailedInProgress

  • Capacity 提供存储设备的总容量和已用容量。

  • Remote Vendor Management 指示是否为存储设备启用或禁用远程供应商管理。

存储设备操作

  • 列出存储设备:列出提供的资源组或订阅中的存储设备。
  • 显示存储设备:获取提供的存储设备的属性。
  • 更新存储设备:更新提供的存储设备的属性或标记。
  • 为存储设备启用/禁用远程供应商管理:为提供的存储设备启用或禁用远程供应商管理。

注意

客户无法直接创建或删除存储设备。 这些资源仅作为群集生命周期的实现来创建。 实现会阻止来自任何用户的创建或删除请求,并且仅允许内部/应用程序驱动的创建或删除操作。