Instale manualmente um controlador CSI

Esta página explica como instalar um controlador de armazenamento da interface de armazenamento de contentores (CSI) em clusters padrão do Google Kubernetes Engine (GKE). Esta página não se aplica a clusters do GKE Autopilot, que usam automaticamente o controlador CSI de disco persistente do Compute Engine.

Se estiver a usar o controlador CSI de disco persistente do Compute Engine no seu cluster Standard, recomendamos que implemente automaticamente o controlador para reduzir os custos gerais de gestão.

Vista geral

CSI é uma API de norma aberta que permite ao Kubernetes expor sistemas de armazenamento arbitrários a cargas de trabalho contentorizadas. Os volumes do Kubernetes são geridos por controladores de armazenamento específicos do fornecedor, que foram historicamente compilados em ficheiros binários do Kubernetes. Anteriormente, não podia usar um controlador de armazenamento que não estivesse incluído no Kubernetes. A instalação de um controlador CSI adiciona suporte para um sistema de armazenamento que não é suportado nativamente pelo Kubernetes. Além disso, o CSI permite a utilização de funcionalidades de armazenamento modernas, como instantâneos e redimensionamento.

Instalar um controlador CSI de um fornecedor

Outros fornecedores de armazenamento desenvolvem os seus próprios controladores CSI e são responsáveis por fornecer instruções de instalação. Em casos simples, a instalação pode envolver apenas a implementação de manifestos nos seus clusters. Consulte a lista de controladores CSI na documentação CSI.

Validar a instalação de um controlador

Depois de instalar um controlador CSI, pode validar a instalação executando um dos seguintes comandos, consoante a versão do GKE do seu 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}'

Usar um controlador CSI

Para usar um controlador CSI:

  1. Crie um StorageClass do Kubernetes que faça referência ao controlador no respetivo campo provisioner, se não for criado um StorageClass para si como parte da instalação do controlador. Alguns controladores CSI implementam uma StorageClass quando os instala.

  2. Para aprovisionar armazenamento, pode:

Considerações para StorageClasses suportadas por um controlador CSI

Quando cria uma StorageClass, considere o seguinte:

  • A documentação do controlador CSI deve incluir os parâmetros específicos do controlador que fornece à sua StorageClass, incluindo o nome do aprovisionador.
  • Deve dar o nome StorageClass de acordo com as respetivas propriedades e não de acordo com o nome do controlador ou do dispositivo específico subjacente. A atribuição de nomes à StorageClass com base nas respetivas propriedades permite-lhe criar StorageClasses com o mesmo nome em vários clusters e ambientes, e permite que as suas aplicações obtenham armazenamento com as mesmas propriedades em todos os clusters.

Exemplo: referencie StorageClass num StatefulSet

O exemplo seguinte modela como definir um controlador CSI numa StorageClass e, em seguida, referenciar a StorageClass numa carga de trabalho StatefulSet. O exemplo pressupõe que o controlador já foi instalado no cluster.

Segue-se um StorageClass simples denominado premium-rwo que usa um controlador CSI fictício, csi.example.com, como provisionador:

# 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

Referencia a StorageClass na especificação de um StatefulSet.volumeClaimTemplates

Quando faz referência a uma StorageClass na especificação de um StatefulSet, o Kubernetes fornece armazenamento estável através de PersistentVolumes.volumeClaimTemplates O Kubernetes chama o aprovisionador definido na StorageClass para criar um novo volume de armazenamento. Neste caso, o Kubernetes chama o fornecedor fictício csi.example.com que, por sua vez, chama a API do fornecedor para criar um volume. Depois de o volume ser aprovisionado, o Kubernetes cria automaticamente um PersistentVolume para representar o armazenamento.

Segue-se um StatefulSet simples que faz referência à 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

O que se segue?