Azure Operator Nexus 스토리지 어플라이언스
Azure Operator Nexus는 컴퓨팅 서버, 스토리지 어플라이언스 및 네트워크 패브릭 디바이스와 같은 기본 구문을 기반으로 빌드되었습니다. Azure Operator Nexus 스토리지 어플라이언스는 랙의 영구 스토리지 어플라이언스를 나타냅니다.
각 스토리지 어플라이언스에는 단일 스토리지 풀을 제공하기 위해 집계되는 스토리지 디바이스가 여러 개 포함되어 있습니다. 그런 다음, 이 스토리지 풀은 볼륨 여러 개로 조각화되어 컴퓨팅 서버에 블록 스토리지 디바이스로 표시됩니다. 컴퓨팅 서버는 이러한 블록 스토리지 디바이스를 영구 워크로드 스토리지로 사용할 수 있습니다. 각 Azure Operator Nexus 클러스터는 모든 테넌트 워크로드에서 공유되는 단일 스토리지 어플라이언스로 프로비전됩니다.
Azure Operator Nexus 인스턴스의 스토리지 어플라이언스는 Azure 리소스로 표시됩니다. 운영자는 다른 Azure 리소스와 같은 특성을 볼 수 있는 액세스 권한을 부여받습니다.
Kubernetes 스토리지 클래스
Azure Operator Nexus 소프트웨어 Kubernetes 스택은 두 가지 형식의 스토리지를 제공합니다. 운영자는 Kubernetes StorageClass 메커니즘을 통해 스토리지를 선택합니다.
Important
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 클러스터의 여러 Pod가 동시에 동일한 볼륨에 액세스하고 공유할 수 있도록 하여 고가용성 공유 스토리지 솔루션을 제공합니다. nexus 공유 스토리지 클래스는 고가용성 NFS 스토리지 서비스에서 지원됩니다. 이 NFS 스토리지 서비스(현재 최대 크기 1TiB로 제한되는 스토리지 풀)는 CSN(Cloud Service Network)당 사용할 수 있습니다. NFS 스토리지 서비스는 CSN 리소스를 만들 때 자동으로 배포됩니다. CSN에 연결된 모든 Nexus Kubernetes 클러스터는 이 공유 스토리지 풀에서 영구 볼륨을 프로비전할 수 있습니다. nexus-shared는 RWO(Read Write Once) 및 RWX(Read Write Many) 액세스 모드를 모두 지원합니다. 즉, 워크로드 애플리케이션은 이러한 액세스 모드 중 하나를 사용하여 공유 스토리지에 액세스할 수 있습니다.
그림: Nexus 공유 볼륨
대부분의 애플리케이션에서는 nexus-shared 성능과 가용성만으로도 충분하지만 I/O 요구 사항이 많은 워크로드에서는 최적의 성능을 위해 nexus-volume 옵션을 사용하는 것이 좋습니다.
RWO(Read Write Once)
RWO(읽기 쓰기 한 번) 모드에서는 한 번에 하나의 노드 또는 클레임자만 nexus 공유 볼륨을 탑재할 수 있습니다. ReadWriteOnce 액세스 모드를 계속 사용하면 Pod가 같은 노드에서 실행 중일 때 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(Read Write Many)
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(Read Write Once)
이 예제 매니페스트는 ReadWriteOnce 모드에서 nexus-volume Storage 클래스를 사용하여 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(Read Write Many)
다음 매니페스트는 ReadWriteMany 모드에서 nexus-shared 스토리지 클래스를 사용하여 PVC(PersistentVolumeClaim)로 배포를 만듭니다. 생성된 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-volume 및 nexus-shared를 사용하여 만든 PVC에는 최소 및 최대 클레임 크기가 있습니다.
스토리지 클래스 | 최소 PVC 크기 | 최대 PVC 크기 |
---|---|---|
nexus-volume | 1MiB | 12TiB |
nexus-shared | None | 1TiB |
Important
사용량 한도에 도달하는 볼륨은 사용 중인 워크로드에서 디스크 공간 오류가 발생합니다. 워크로드 요구 사항에 적합한 볼륨 크기를 프로비전해야 합니다. 스토리지 어플라이언스 및 모든 NFS 서버에서 해당 백분율 스토리지 사용량을 모니터링해야 합니다. 사용 가능한 메트릭 목록에 설명된 메트릭을 사용하여 이 작업을 수행할 수 있습니다.
- nexus-volume 및 nexus 공유 PVC에는 모두 요청된 스토리지 용량이 소비 한도로 적용됩니다. 볼륨은 연결된 PVC 요청보다 더 많은 스토리지를 사용할 수 없습니다.
- 모든 물리적 볼륨은 씬 프로비전됩니다. 필요한 경우 스토리지 어플라이언스의 총 스토리지 사용량을 모니터링하고 유지 관리 작업을 수행하여 스토리지 공간을 확보해야 합니다.
- 요청된 크기가 최소 크기보다 작거나 지원되는 최대 볼륨 크기보다 큰 경우 nexus-volume PVC 프로비저닝 요청이 실패합니다.
- Nexus 공유 볼륨은 지원 NFS 서버에서 논리적으로 씬 프로비저닝됩니다. 이 NFS 서버의 고정 용량은 1TiB입니다.
- 1TiB 이상의 스토리지를 요청했음에도 불구하고 nexus 공유 PVC를 프로비전할 수 있지만 1TiB만 사용할 수 있습니다.
- 용량 요청의 합계가 1TiB보다 큰 PVC 집합을 프로비전할 수 있습니다. 그러나 1TiB의 소비 한도가 적용됩니다. 연결된 PV 집합은 1TiB 이상의 스토리지를 사용하지 않을 수 있습니다.
스토리지 어플라이언스 상태
다음 속성은 스토리지 어플라이언스 작동 상태를 반영합니다.
Status
는 상태를 스토리지 어플라이언스에서 파생됨으로 나타냅니다. 상태는Available
,Error
또는Provisioning
일 수 있습니다.Provisioning State
는 스토리지 어플라이언스의 현재 프로비전 상태를 제공합니다. 프로비전 상태는Succeeded
,Failed
또는InProgress
일 수 있습니다.Capacity
는 사용된 스토리지 어플라이언스 용량과 총 스토리지 어플라이언스 용량을 제공합니다.Remote Vendor Management
는 스토리지 어플라이언스에 원격 공급업체 관리를 사용하거나 사용하지 않도록 설정했는지 여부를 나타냅니다.
스토리지 어플라이언스 작업
- 스토리지 어플라이언스 나열: 제공된 리소스 그룹이나 구독에 있는 스토리지 어플라이언스를 나열합니다.
- 스토리지 어플라이언스 표시: 제공된 스토리지 어플라이언스의 속성을 가져옵니다.
- 스토리지 어플라이언스 업데이트: 제공된 스토리지 어플라이언스의 속성이나 태그를 업데이트합니다.
- 스토리지 어플라이언스에 원격 공급업체 관리 사용/사용 안 함: 제공된 스토리지 어플라이언스에 원격 공급업체 관리를 사용하거나 사용하지 않도록 설정합니다.
참고 항목
고객은 스토리지 어플라이언스를 직접 만들거나 삭제할 수 없습니다. 이러한 리소스는 클러스터 수명 주기를 구현하기 위해서만 생성됩니다. 구현에서는 모든 사용자의 만들기 또는 삭제 요청을 차단하고 내부/애플리케이션 기반 만들기 또는 삭제 작업만 허용합니다.