35 Storage-Klassen

Storage-Klassen implementieren Service-Level-Abstraktion für Storage-Bereitstellung in OpenShift durch policy-basierte Storage-Charakteristik-Definition und automatisierte Provisioning-Workflows. Diese Template-Mechanismen ermöglichen Self-Service Storage-Bereitstellung mit vordefinierten Performance-, Verfügbarkeits- und Kostenprofilen für verschiedene Anwendungsanforderungen.

35.1 Grundkonzepte der Storage-Klassen

Storage-Klassen fungieren als Blueprint-Definitionen für dynamische Volume-Bereitstellung und spezifizieren Storage-Backend-Parameter, Performance-Charakteristika und Provisioning-Policies. Diese template-basierten Definitionen standardisieren Storage-Bereitstellungs-Workflows und reduzieren die Konfigurationskomplexität für Entwicklungsteams.

35.1.1 Provisioner-Integration

Die Provisioner-Integration definiert spezifische Storage-Backend-Treiber und deren Parameter für automatisierte Volume-Erstellungsprozesse. Diese Provisioner-Abstraktion ermöglicht vendor-neutrale Storage-Anfragen bei gleichzeitiger backend-spezifischer Optimierung.

Grundlegende Storage Class Struktur:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: high-performance-ssd
  annotations:
    storageclass.kubernetes.io/is-default-class: "false"
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iops: "3000"
  throughput: "125"
  encrypted: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

35.1.2 Policy-Framework

Das Policy-Framework implementiert Governance-Kontrollen für Storage-Bereitstellung mit Standard-Parametern, Ressourcenquoten und Zugriffsbeschränkungen. Diese Policy-Integration gewährleistet konsistente Storage-Bereitstellung entsprechend organisatorischen Standards und Budget-Einschränkungen.

35.1.3 Quality-of-Service-Klassifikation

QoS-Klassifikation ermöglicht Service-Level-Agreement-Definition für verschiedene Storage-Tiers mit Performance-, Verfügbarkeits- und Dauerhaftigkeits-Garantien. Diese QoS-Integration unterstützt anwendungsspezifische Storage-Anforderungen und Kostenoptimierungs-Strategien.

[Diagramm: Storage-Class-Architektur mit Provisioner, Policies und QoS-Ebenen]

35.2 Storage-Tier-Klassifikation

Die verschiedenen Storage-Tiers adressieren unterschiedliche Anwendungsanforderungen mit spezifischen Performance- und Kostencharakteristika.

35.2.1 Performance-Tiers im Überblick

Tier IOPS Durchsatz Latenz Kosten Anwendungsfall
Premium > 10.000 > 500 MB/s < 1ms Hoch Datenbanken, Real-time Analytics
Standard 3.000-10.000 100-500 MB/s < 5ms Mittel Web-Apps, APIs
Basic < 3.000 < 100 MB/s < 10ms Niedrig Entwicklung, Testing
Archive < 100 < 10 MB/s > 100ms Sehr niedrig Backups, Compliance

35.2.2 High-Performance Storage-Classes

High-Performance Storage-Classes spezifizieren SSD-basierte Storage mit niedrigen Latenzen und hohen IOPS-Charakteristika für performance-kritische Anwendungen:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: database-tier
  labels:
    performance: high
    cost: premium
provisioner: ebs.csi.aws.com
parameters:
  type: io2
  iopsPerGB: "50"
  fsType: xfs
  encrypted: "true"
reclaimPolicy: Retain  # Wichtige Daten behalten
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
mountOptions:
- noatime
- nodiratime

35.2.3 Standard Storage-Classes

Standard Storage-Classes balancieren Performance und Kosten für allgemeine Anwendungen mit moderaten Performance-Anforderungen:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: general-purpose
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  iops: "3000"
  throughput: "125"
  fsType: ext4
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

35.2.4 Archive Storage-Classes

Archive Storage-Classes implementieren kostenoptimierte Storage für langfristige Datenaufbewahrung mit reduzierten Performance-Anforderungen:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: archive-storage
  labels:
    performance: low
    cost: optimized
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
  fileSystemId: fs-12345678
  directoryPerms: "0755"
  performanceMode: generalPurpose
  throughputMode: provisioned
reclaimPolicy: Retain
volumeBindingMode: Immediate

35.2.5 Regional Storage-Classes

Regionale Storage-Classes definieren geografisch spezifische Storage-Bereitstellung für Datenresidenz und Compliance-Anforderungen:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: eu-compliant-storage
provisioner: kubernetes.io/azure-disk
parameters:
  storageaccounttype: Premium_LRS
  location: westeurope
  cachingmode: ReadOnly
reclaimPolicy: Retain
allowedTopologies:
- matchLabelExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
    values:
    - westeurope-1
    - westeurope-2

35.3 Provisioner-Typen und Backend-Integration

35.3.1 CSI-Provisioner (Modern)

CSI-Provisioner implementieren Container Storage Interface Standards für moderne Storage-Backend-Integration:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-csi-rbd
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: ceph-cluster-1
  pool: kubernetes-rbd
  imageFormat: "2"
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
  csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-rbd
  csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-rbd
  csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
  csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-rbd
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard

35.3.2 In-Tree-Provisioner (Legacy)

In-Tree-Provisioner repräsentieren Legacy Storage-Integration-Methoden mit direkter Kubernetes-Code-Integration:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: legacy-nfs-storage
  annotations:
    storageclass.kubernetes.io/deprecated: "true"
provisioner: kubernetes.io/nfs
parameters:
  server: nfs-server.example.com
  path: /exports/kubernetes
  readOnly: "false"
reclaimPolicy: Retain
mountOptions:
- hard
- nfsvers=4.1
- proto=tcp
- timeo=600
- retrans=2

35.3.3 External-Provisioner

External-Provisioner ermöglichen Third-Party Storage-System-Integration ohne Core-Kubernetes-Modifikationen:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: netapp-ontap-nas
provisioner: csi.trident.netapp.io
parameters:
  backendType: ontap-nas
  media: ssd
  provisioningType: thin
  snapshots: "true"
  clones: "true"
  encryption: "true"
  unixPermissions: "---rwxr-xr-x"
  snapshotPolicy: default
  exportPolicy: default
reclaimPolicy: Delete
allowVolumeExpansion: true

35.4 Parameter-Management und Konfiguration

35.4.1 Volume-Binding-Modi

Volume-Binding-Mode-Konfiguration steuert das Timing von Volume-Bereitstellung und Pod-Scheduling:

Immediate Binding:

volumeBindingMode: Immediate
# Volume wird sofort nach PVC-Erstellung bereitgestellt
# Gut für: Shared Storage, weniger topology-sensitive Workloads

WaitForFirstConsumer (Empfohlen):

volumeBindingMode: WaitForFirstConsumer
# Volume wird erst bereitgestellt, wenn Pod erstellt wird
# Gut für: Topology-aware provisioning, lokale Storage

35.4.2 Allowed-Topologies

Topology-Spezifikation beschränkt Storage-Bereitstellung auf spezifische Node-Pools oder Availability-Zones:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: zone-specific-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.kubernetes.io/zone
    values:
    - us-west-2a
    - us-west-2b
  - key: node.kubernetes.io/instance-type
    values:
    - m5.large
    - m5.xlarge

35.4.3 Mount-Options

Mount-Options-Definition spezifiziert Dateisystem-Mount-Parameter für Performance-Tuning oder Security-Hardening:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: performance-optimized
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  fsType: xfs
Mount-Options definieren wichtige Dateisystem-Parameter für Performance-Tuning und Security-Hardening. Die Option noatime verhindert Access-Time-Updates für bessere Performance, während nodiratime Directory-Access-Time-Updates deaktiviert. Weitere Performance-Optimierungen umfassen nobarrier für deaktivierte Write-Barriers, inode64 für 64-bit-Inodes in großen Dateisystemen und allocsize=16m für optimierte Allocation-Größen.

35.5 Dynamic Provisioning-Workflows

35.5.1 PVC-zu-StorageClass-Binding

Das PVC-zu-StorageClass-Binding initiiert automatische Volume-Bereitstellung basierend auf Storage-Class-Spezifikationen:

# PVC mit expliziter Storage Class
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: database-storage
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
  storageClassName: database-tier  # Explizite Storage Class
# PVC ohne Storage Class (verwendet Default)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-storage
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  # storageClassName weggelassen = Default Storage Class

35.5.2 Volume-Size-Management

Volume-Size-Management implementiert Minimum-, Maximum- und Standard-Size-Constraints:

# Erweiterte Storage Class mit Size-Constraints
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: size-controlled-storage
  annotations:
    # Metadata für Size-Management (implementierungsabhängig)
    storage.alpha.kubernetes.io/minimum-size: "1Gi"
    storage.alpha.kubernetes.io/maximum-size: "1Ti"
    storage.alpha.kubernetes.io/default-size: "10Gi"
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
allowVolumeExpansion: true

35.5.3 Provisioning-Retry und Error-Handling

Retry-Logik für fehlgeschlagene Provisioning-Versuche wird automatisch von Kubernetes gehandhabt, kann aber konfiguriert werden:

# Provisioning-Status prüfen
oc describe pvc failed-pvc

# Events für Troubleshooting
oc get events --field-selector reason=ProvisioningFailed

# Storage Class Parameter validieren
oc describe storageclass problematic-storage-class

35.6 Performance-Tuning und Optimierung

35.6.1 IOPS-Provisioning-Profile

IOPS-Provisioning-Profile definieren Input/Output-Operations-Per-Second-Garantien für verschiedene Performance-Tiers:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: iops-optimized
provisioner: ebs.csi.aws.com
parameters:
  type: io2
  iopsPerGB: "50"      # 50 IOPS pro GB
  # Für 100GB Volume = 5000 IOPS garantiert
reclaimPolicy: Delete
allowVolumeExpansion: true

35.6.2 Throughput-Optimierung

Throughput-Optimierungs-Parameter spezifizieren Bandbreiten-Charakteristika für Streaming- oder Batch-Processing-Anwendungen:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: throughput-optimized
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  throughput: "1000"   # 1000 MB/s Durchsatz
  iops: "16000"        # Maximale IOPS für Throughput
reclaimPolicy: Delete

35.6.3 Latenz-Optimierung

Latenz-Optimierung durch Storage-Tier-Auswahl und Caching-Konfiguration:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ultra-low-latency
provisioner: local.csi.k8s.io  # Lokale NVMe-SSDs
parameters:
  volumeType: nvme
  fsType: xfs
  directIO: "true"     # Direct I/O für niedrigste Latenz
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: node.kubernetes.io/instance-type
    values:
    - i3.large         # Instance-Typen mit lokalen NVMe-SSDs
    - i3.xlarge

35.7 Security-Integration

35.7.1 Encryption-at-Rest-Policies

Encryption-at-Rest-Policies definieren Standard-Verschlüsselungseinstellungen für verschiedene Storage-Classes:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: encrypted-storage
  labels:
    security: high
    compliance: required
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  encrypted: "true"
  kmsKeyId: "arn:aws:kms:us-west-2:123456789012:key/12345678-1234-1234-1234-123456789012"
reclaimPolicy: Retain  # Verschlüsselte Daten behalten

35.7.2 Access-Control-Integration

Access-Control-Integration mit RBAC-Systemen beschränkt Storage-Class-Nutzung basierend auf Benutzerrollen:

# RBAC für Storage Class Nutzung
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: premium-storage-user
rules:
- apiGroups: [""]
  resources: ["persistentvolumeclaims"]
  verbs: ["create", "get", "list"]
  resourceNames: []
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get"]
  resourceNames: ["database-tier", "high-performance-ssd"]  # Nur bestimmte Storage Classes

35.7.3 Compliance-Tagging

Automatisches Tagging von bereitgestellten Volumes für Compliance-Tracking:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gdpr-compliant-storage
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  encrypted: "true"
  # Cloud-Provider-spezifische Tags
  tagSpecification_1: "compliance=gdpr"
  tagSpecification_2: "data-classification=personal"
  tagSpecification_3: "retention-policy=7years"
reclaimPolicy: Retain

35.8 Cost-Management und Optimierung

35.8.1 Cost-Tier-Definition

Cost-Tier-Definition implementiert Preis-Performance-Optimierung durch Storage-Backend-Auswahl:

# Budget Storage Class
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: budget-storage
  labels:
    cost-tier: budget
    performance-tier: basic
provisioner: ebs.csi.aws.com
parameters:
  type: gp2          # Günstigere GP2 statt GP3
  fsType: ext4
reclaimPolicy: Delete
allowVolumeExpansion: false  # Expansion deaktiviert für Kostenkontrolle

---
# Premium Storage Class  
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: premium-storage
  labels:
    cost-tier: premium
    performance-tier: high
provisioner: ebs.csi.aws.com
parameters:
  type: io2
  iopsPerGB: "50"
  encrypted: "true"
reclaimPolicy: Retain
allowVolumeExpansion: true

35.8.2 Lifecycle-Management

Automatisierte Lifecycle-Management-Policies für Kostenoptimierung:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: lifecycle-managed-storage
  annotations:
    # Lifecycle-Policies (implementierungsabhängig)
    lifecycle.storage.k8s.io/tier-transition: "standard-30d,archive-90d"
    lifecycle.storage.k8s.io/deletion-policy: "delete-after-365d"
provisioner: s3.csi.aws.com
parameters:
  mounter: geesefs
  bucket: app-data-bucket
  # S3 Lifecycle-Konfiguration
  storageClass: STANDARD_IA
reclaimPolicy: Delete

35.9 Multi-Cloud und Hybrid-Storage

35.9.1 Cloud-Provider-Integration

Native Cloud-Storage-Services-Nutzung durch Kubernetes-Abstraktionen:

# AWS Storage Class
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: aws-multi-az-storage
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  encrypted: "true"
allowedTopologies:
- matchLabelExpressions:
  - key: topology.kubernetes.io/zone
    values: ["us-west-2a", "us-west-2b", "us-west-2c"]

---
# Azure Storage Class
apiVersion: storage.k8s.io/v1  
kind: StorageClass
metadata:
  name: azure-premium-storage
provisioner: disk.csi.azure.com
parameters:
  skuName: Premium_LRS
  location: westeurope
  cachingmode: ReadOnly

35.9.2 Cross-Cloud-Replication

Multi-Cloud-Data-Protection-Strategien für Disaster Recovery:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: replicated-storage
  annotations:
    replication.storage.k8s.io/targets: "aws-us-west,azure-westeurope,gcp-us-central"
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
  clusterID: multi-cloud-ceph
  pool: replicated-pool
  replication: "3"  # 3-fache Replikation über Clouds

35.10 Storage Class Best Practices

35.10.1 Naming Conventions

Konsistente Namenskonventionen für Storage Classes erleichtern die Verwaltung:

# Empfohlene Namensstruktur: [provider]-[performance]-[features]
metadata:
  name: aws-premium-encrypted    # AWS, Premium Performance, Verschlüsselt
  name: azure-standard-replicated # Azure, Standard Performance, Repliziert  
  name: local-fast-dev           # Lokal, Schnell, Development

Strukturierte Labels ermöglichen bessere Organisation und Auswahl von Storage Classes. Typische Label-Kategorien umfassen provider für den Cloud-Anbieter, performance für die Leistungsklasse, encryption für Verschlüsselungsstatus, cost-tier für Kostenkategorien, compliance für Compliance-Anforderungen und environment für die Umgebungsklassifikation.

35.10.2 Default Storage Class Management

Sorgfältige Verwaltung der Standard-Storage-Class:

# Aktuelle Default Storage Class anzeigen
oc get storageclass | grep "(default)"

# Default Storage Class ändern
oc patch storageclass old-default -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
oc patch storageclass new-default -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

35.11 Monitoring und Troubleshooting

35.11.1 Storage Class Metriken

Wichtige Metriken für Storage Class Monitoring:

# ServiceMonitor für Storage Class Metriken
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: storage-class-metrics
spec:
  selector:
    matchLabels:
      app: csi-driver
  endpoints:
  - port: metrics
    interval: 30s

Storage Class Monitoring erfordert verschiedene wichtige Metriken wie Provisioning-Erfolgsrate pro Storage Class, durchschnittliche Provisioning-Zeit, Volume-Utilization nach Storage Class und Cost-per-GB nach Storage Class. Diese Metriken ermöglichen proaktive Kapazitätsplanung und Kostenoptimierung.

35.11.2 Troubleshooting Storage Classes

Häufige Probleme und Lösungsansätze:

# Storage Classes auflisten
oc get storageclass

# Storage Class Details anzeigen
oc describe storageclass problematic-storage-class

# PVC-Provisioning-Probleme debuggen
oc describe pvc stuck-pvc

# CSI-Driver-Status prüfen
oc get csidriver

# Storage Class Events prüfen
oc get events --all-namespaces | grep StorageClass