Installare manualmente un driver CSI


Questa pagina spiega come installare un driver di archiviazione Container Storage Interface (CSI) sui cluster Google Kubernetes Engine (GKE) Standard. Questa pagina non si applica ai cluster GKE Autopilot, che utilizzano automaticamente il driver CSI del disco permanente di Compute Engine.

Se utilizzi il driver CSI per il disco permanente di Compute Engine nel tuo cluster Standard, ti consigliamo di eseguire automaticamente il deployment del driver per ridurre il sovraccarico di gestione.

Panoramica

CSI è un'API standard aperta che consente a Kubernetes di esporre sistemi di archiviazione arbitrari a carichi di lavoro containerizzati. I volumi Kubernetes sono gestiti da driver di archiviazione specifici del fornitore, che storicamente sono stati compilati in binari Kubernetes. In precedenza, non era possibile utilizzare un driver di archiviazione non incluso in Kubernetes. L'installazione di un driver CSI aggiunge il supporto per un sistema di archiviazione non supportato in modo nativo da Kubernetes. Inoltre, CSI consente l'utilizzo di funzionalità di archiviazione moderne, come snapshot e ridimensionamento.

Installazione di un driver CSI del fornitore

Altri fornitori di spazio di archiviazione sviluppano i propri driver CSI e sono responsabili di fornire le istruzioni di installazione. Nei casi più semplici, l'installazione potrebbe comportare solo il deployment dei manifest nei cluster. Consulta l'elenco dei driver CSI nella documentazione CSI.

Verifica dell'installazione di un driver

Dopo aver installato un driver CSI, puoi verificarne l'installazione eseguendo uno dei seguenti comandi, a seconda della versione di GKE del tuo cluster:

1.14+

kubectl get csinodes \
-o jsonpath='{range .items[*]} {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'

1.13.x

kubectl get nodes \
-o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'

Utilizzo di un driver CSI

Per utilizzare un driver CSI:

  1. Crea un oggetto StorageClass di Kubernetes che faccia riferimento al driver nel campo provisioner, se non viene creato un oggetto StorageClass per te nell'ambito dell'installazione del driver. Alcuni driver CSI eseguono il deployment di una StorageClass quando li installi.

  2. Per eseguire il provisioning dello spazio di archiviazione, puoi:

Considerazioni per StorageClasses supportate da un driver CSI

Quando crei una StorageClass, considera quanto segue:

  • La documentazione del driver CSI deve includere i parametri specifici del driver che fornisci a StorageClass, incluso il nome del provisioner.
  • Devi denominare StorageClass in base alle sue proprietà, anziché in base al nome del driver o dell'appliance specifici che lo supportano. Assegnare un nome alla StorageClass in base alle sue proprietà ti consente di creare StorageClass con lo stesso nome in più cluster e ambienti e consente alle tue applicazioni di ottenere spazio di archiviazione con le stesse proprietà in tutti i cluster.

Esempio: fai riferimento a StorageClass in un oggetto StatefulSet

L'esempio seguente mostra come definire un driver CSI in una StorageClass e fare riferimento alla StorageClass in un carico di lavoro StatefulSet. L'esempio presuppone che il driver sia già stato installato nel cluster.

Di seguito è riportato un semplice oggetto StorageClass denominato premium-rwo che utilizza un driver CSI fittizio, csi.example.com, come provisioner:

# fast-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: premium-rwo
provisioner: csi.example.com # CSI driver
parameters: # You provide vendor-specific parameters to this specification
  type: example-parameter # Be sure to follow the vendor's instructions
  datastore: my-datastore
reclaimPolicy: Retain
allowVolumeExpansion: true

Fai riferimento a StorageClass nella specifica volumeClaimTemplates di un oggetto StatefulSet.

Quando fai riferimento a un oggetto StorageClass nella specifica volumeClaimTemplates di uno StatefulSet, Kubernetes fornisce uno spazio di archiviazione stabile utilizzando PersistentVolume. Kubernetes chiama il provisioner definito in StorageClass per creare un nuovo volume di archiviazione. In questo caso, Kubernetes chiama il provider fittizio csi.example.com, che chiama l'API del provider per creare un volume. Una volta eseguito il provisioning del volume, Kubernetes crea automaticamente un PersistentVolume per rappresentare lo spazio di archiviazione.

Ecco un semplice StatefulSet che fa riferimento a StorageClass:

# statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # This is the specification in which you reference the StorageClass
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
      storageClassName: premium-rwo # This field references the existing StorageClass

Passaggi successivi