Instale um controlador da interface de armazenamento de contentores

Esta página explica como instalar um controlador de armazenamento da interface de armazenamento de contentores (CSI) em clusters do Google Distributed Cloud.

Vista geral

A interface de armazenamento de contentores (CSI) é uma API de norma aberta suportada por muitos fornecedores de armazenamento importantes que permite ao Kubernetes expor sistemas de armazenamento arbitrários a cargas de trabalho em contentores.

Os volumes do Kubernetes são geridos por controladores de armazenamento específicos do fornecedor, que têm sido 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.

Para usar um controlador CSI, tem de criar uma StorageClass do Kubernetes. Definiu o controlador CSI como o aprovisionador para a StorageClass. Em seguida, pode definir a StorageClass como predefinição do cluster ou configurar as suas cargas de trabalho para usar a StorageClass (exemplo de StatefulSet).

Instale um controlador CSI de um fornecedor

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

Para o armazenamento de produção, recomendamos a instalação de um controlador CSI de um parceiro de armazenamento compatível com o GDC.

Valide a instalação de um controlador

Depois de instalar um controlador CSI, pode validar a instalação executando o seguinte comando:

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

Use um controlador CSI

Para usar um controlador CSI:

  1. Crie uma StorageClass do Kubernetes que faça referência ao controlador no respetivo campo provisioner.

  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, em vez do 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.

A StorageClass simples seguinte, premium-rwo, usa um controlador CSI fictício, csi.example.com, como o respetivo aprovisionador:

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 (PVs).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 PV 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?