Use uma StorageClass personalizada com as suas cargas de trabalho

O GKE on Azure implementa automaticamente o controlador CSI de disco do Azure e o controlador CSI de ficheiros do Azure.

As versões do controlador CSI do disco do Azure e do controlador CSI de ficheiros do Azure estão associadas a uma versão do GKE no Azure Kubernetes. Normalmente, a versão do controlador é a mais recente disponível quando é lançada uma versão do GKE. Quando o cluster é atualizado, os controladores são atualizados automaticamente.

Use uma StorageClass personalizada

Pode criar StorageClasses adicionais para volumes ou usar controladores da interface de armazenamento de contentores (CSI).

  1. Escolha se está a usar um volume de disco do Azure ou outro controlador CSI.

    Volume de disco do Azure

    Pode criar a sua própria StorageClass personalizada que especifica um tipo de volume de disco do Azure, um tipo de sistema de ficheiros e outros parâmetros. Pode encontrar parâmetros StorageClass adicionais na página do GitHub do controlador CSI do disco do Azure do GKE no Azure.

    Para configurar uma StorageClass personalizada, copie o seguinte manifesto YAML para um ficheiro denominado my-custom-class.yaml.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    

    Substitua CLASS_NAME pelo nome da nova StorageClass.

    Por exemplo, o YAML seguinte cria uma nova StorageClass que aprovisiona volumes numa conta de armazenamento específica e aplica uma etiqueta de group=dev a cada novo volume.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-class
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      storageAccount: my-storage-account
      tags: group=dev
    

    Controlador CSI

    Pode especificar um controlador CSI diferente no campo provisioner.

    Para criar uma StorageClass com outro controlador CSI, pode usar o exemplo de YAML abaixo.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      ...
    

    Substitua os seguintes valores:

    • CLASS_NAME: o nome da StorageClass (por exemplo, my-custom-class).
    • CSI_DRIVER_NAME: o nome do controlador CSI (por exemplo, csi.example.com).

    Em seguida, configure os subcampos em parameters de acordo com a documentação do controlador CSI.

  2. Aplique o YAML ao seu cluster.

    kubectl apply -f my-custom-class.yaml
    
  3. Crie um PersistentVolumeClaim com uma StorageClass personalizada.

    Depois de criar uma StorageClass personalizada, pode especificá-la num PVC. O exemplo seguinte cria um PVC denominado my-pvc que faz referência à StorageClass my-custom-class.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 30Gi
      storageclassName: my-custom-class
    

Defina a StorageClass predefinida

O GKE no Azure usa uma StorageClass predefinida denominada standard-rwo que aprovisiona discos do Azure SSD padrão com LRS. Pode alterar a predefinição para outra StorageClass.

Para alterar a StorageClass predefinida:

  1. Atualize a anotação is-default-class para a standard-rwo StorageClass com kubectl patch.

    kubectl patch storageclass standard-rwo -p \
      '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. Crie uma nova StorageClass com a anotação storageclass.kubernetes.io/is-default-class: true.

    O exemplo seguinte de StorageClass usa o controlador disk.csi.azure.com. Para instalar outro controlador de armazenamento, consulte o artigo Instalar um controlador CSI.

    Copie o seguinte YAML para um ficheiro com o nome my-custom-class.yaml.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
      annotations:
        storageclass.kubernetes.io/is-default-class: true
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      skuName: VOLUME_TYPE
    

    Substitua o seguinte:

    • CLASS_NAME: o nome da nova StorageClass.
    • VOLUME_TYPE: o tipo de volume do disco do Azure que a StorageClass cria.

    Por exemplo, o YAML seguinte cria uma nova StorageClass predefinida que aprovisiona SSD Premium volumes de disco do Azure.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-default-class
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      skuName: Premium_LRS
    
  3. Aplique a nova classe personalizada ao seu cluster.

    kubectl apply -f my-custom-class.yaml
    

Depois de aplicar este manifesto, o GKE no Azure usa a my-custom-default-class StorageClass para novos pedidos de armazenamento.

Referencie a StorageClass num StatefulSet

Para usar a nova StorageClass, pode referenciá-la no volumeClaimTemplatesde um StatefulSet.

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. Depois de o volume ser aprovisionado, o Kubernetes cria automaticamente um PV.

O StatefulSet seguinte faz referência à my-custom-classStorageClass e aprovisiona um volume de 1 gibibyte:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  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: my-custom-class # This field references the existing StorageClass

O que se segue?