Urządzenie magazynu Operator Platformy Azure Nexus

Operator platformy Azure Nexus jest oparty na podstawowych konstrukcjach, takich jak serwery obliczeniowe, urządzenia magazynujące i urządzenia sieci szkieletowej. Urządzenia magazynujące Operator Nexus platformy Azure reprezentują trwałe urządzenia magazynujące na stojaku.

Każde urządzenie magazynu zawiera wiele urządzeń magazynujących, które są agregowane w celu zapewnienia pojedynczej puli magazynów. Ta pula magazynów jest następnie wyodrębniona na wiele woluminów, które są prezentowane serwerom obliczeniowym jako urządzenia magazynujące blokowe. Serwery obliczeniowe mogą używać tych urządzeń magazynujących blokowych jako magazynu trwałego dla obciążeń. Każdy klaster Operator Nexus platformy Azure jest aprowizowany przy użyciu jednego urządzenia magazynu współużytkowanego we wszystkich obciążeniach dzierżawy.

Urządzenie magazynu w wystąpieniu operatora platformy Azure Nexus jest reprezentowane jako zasób platformy Azure. Operatorzy uzyskują dostęp do wyświetlania swoich atrybutów, takich jak każdy inny zasób platformy Azure.

Klasy magazynu Kubernetes

Stos Kubernetes oprogramowania Platformy Kubernetes operatora platformy Azure oferuje dwa typy magazynu. Operatorzy wybierają je za pomocą mechanizmu Kubernetes StorageClass.

StorageClass: nexus-volume

Domyślny mechanizm przechowywania, nexus-volume, jest preferowanym wyborem dla większości użytkowników. Zapewnia najwyższy poziom wydajności i dostępności. Woluminy nie mogą być jednak współużytkowane jednocześnie w wielu węzłach roboczych. Operatorzy mogą uzyskiwać dostęp do tych woluminów i zarządzać nimi przy użyciu interfejsu API platformy Azure i portalu za pośrednictwem zasobu woluminu.

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

W sytuacjach, w których wymagany jest udostępniony system plików, dostępna jest klasa magazynu współużytkowanego typu nexus. Ta klasa magazynu udostępnia udostępnione rozwiązanie magazynu, włączając wiele zasobników w tym samym klastrze Nexus Kubernetes w celu współbieżnego dostępu i współużytkowania tego samego woluminu. Klasa magazynu udostępnionego nexus jest wspierana przez usługę magazynu NFS. Ta usługa magazynu NFS (pula magazynów obecnie ograniczona do maksymalnego rozmiaru 1TiB) jest dostępna dla sieci usług w chmurze (CSN). Każdy klaster Kubernetes Nexus dołączony do csN może aprowizować wolumin trwały z tej udostępnionej puli magazynów. Nexus-shared obsługuje zarówno tryb odczytu i zapisu raz (RWO) i odczyt zapisu wiele (RWX). Oznacza to, że aplikacje obciążeń mogą korzystać z jednego z tych trybów dostępu w celu uzyskania dostępu do magazynu udostępnionego.

Mimo że wydajność i dostępność nexus-shared są wystarczające dla większości aplikacji, zalecamy, aby obciążenia z dużymi wymaganiami we/wy używały opcji nexus-volume w celu uzyskania optymalnej wydajności.

Odczyt zapisu raz (RWO)

W trybie odczytu zapisu raz (RWO) wolumin współużytkowany nexus może być zainstalowany tylko przez jeden węzeł lub oświadczenie w danym momencie. Tryb dostępu ReadWriteOnce nadal umożliwia wielu zasobnikom dostęp do woluminu, gdy zasobniki są uruchomione w tym samym węźle.

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

Odczytywanie wielu zapisów (RWX)

W trybie Odczytuj wiele (RWX) współużytkowany wolumin nexus może być instalowany przez wiele węzłów lub oświadczeń w tym samym czasie.

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

Przykłady

Odczyt zapisu raz (RWO) z klasą magazynu woluminów nexus

Poniższy manifest tworzy element StatefulSet z elementem PersistentVolumeClaimTemplate przy użyciu klasy magazynu woluminów nexus w trybie ReadWriteOnce.

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

Każdy zasobnik statefulSet będzie miał utworzony jeden element 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

Odczytywanie wielu zapisów (RWX) za pomocą udostępnionej klasy magazynu nexus

Poniższy manifest tworzy wdrożenie z trwałymvolumeClaim (PVC) przy użyciu klasy magazynu udostępnionego nexus w trybie ReadWriteMany. Utworzony element PVC jest współużytkowany przez wszystkie zasobniki wdrożenia i może służyć do odczytywania i zapisywania wszystkich z nich jednocześnie.

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

Po zastosowaniu będą dostępne trzy repliki wdrożenia współużytkowania tego samego 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>

Można zaobserwować z poniższych danych wyjściowych, że wszystkie zasobniki zapisują się w tym samym PCV.

# 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

Stan urządzenia magazynu

Następujące właściwości odzwierciedlają stan operacyjny urządzenia magazynu:

  • Status wskazuje stan pochodzący z urządzenia magazynu. Stanem może być Available, Errorlub Provisioning.

  • Provisioning State zapewnia bieżący stan aprowizacji urządzenia magazynu. Stan aprowizacji może mieć wartość Succeeded, Failedlub InProgress.

  • Capacity zapewnia łączną i używaną pojemność urządzenia magazynu.

  • Remote Vendor Management wskazuje, czy zdalne zarządzanie dostawcami jest włączone, czy wyłączone dla urządzenia magazynu.

Operacje na urządzeniu magazynu

  • Wyświetlanie listy urządzeń magazynu: wyświetlanie listy urządzeń magazynujących w podanej grupie zasobów lub subskrypcji.
  • Pokaż urządzenie magazynu: pobierz właściwości dostarczonego urządzenia magazynu.
  • Aktualizuj urządzenie magazynu: zaktualizuj właściwości lub tagi dostarczonego urządzenia magazynu.
  • Włącz/wyłącz zdalne zarządzanie dostawcami dla urządzenia magazynu: włącz lub wyłącz zdalne zarządzanie dostawcami dla dostarczonego urządzenia magazynu.

Uwaga

Klienci nie mogą bezpośrednio tworzyć ani usuwać urządzeń magazynujących. Te zasoby są tworzone tylko jako realizacja cyklu życia klastra. Implementacja blokuje tworzenie lub usuwanie żądań od dowolnego użytkownika i umożliwia tylko operacje tworzenia i usuwania oparte na aplikacjach wewnętrznych/aplikacji.