你当前正在访问 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 的性能和可用性足以满足大多数应用,但我们建议 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
指示从存储设备派生的状态。 状态可能是Available
、Error
或Provisioning
。Provisioning State
提供存储设备的当前预配状态。 预配状态可以是Succeeded
、Failed
或InProgress
。Capacity
提供存储设备的总容量和已用容量。Remote Vendor Management
指示是否为存储设备启用或禁用远程供应商管理。
存储设备操作
- 列出存储设备:列出提供的资源组或订阅中的存储设备。
- 显示存储设备:获取提供的存储设备的属性。
- 更新存储设备:更新提供的存储设备的属性或标记。
- 为存储设备启用/禁用远程供应商管理:为提供的存储设备启用或禁用远程供应商管理。
注意
客户无法直接创建或删除存储设备。 这些资源仅作为群集生命周期的实现来创建。 实现会阻止来自任何用户的创建或删除请求,并且仅允许内部/应用程序驱动的创建或删除操作。