Usar um StorageClass personalizado com as cargas de trabalho

O GKE no Azure implanta automaticamente o driver CSI do Disco do Azure e o Driver CSI de Arquivos do Azure.

As versões dos drivers CSI do Disco do Azure e de Arquivos do Azure estão vinculadas a uma versão do Kubernetes do GKE no Azure. Geralmente, a versão do driver é a mais recente disponível quando a versão do GKE é lançada. Quando o cluster é atualizado, os drivers são atualizados automaticamente.

Usar um StorageClass personalizado

É possível criar mais StorageClasses para volumes EBS ou usar drivers do Container Storage Interface (CSI).

  1. Escolha se você está usando um volume de disco do Azure ou outro driver CSI.

    Volume do disco do Azure

    É possível criar seu próprio StorageClass personalizado que especifica um tipo de volume de disco do Azure, um tipo de sistema de arquivos e outros parâmetros. É possível encontrar outros parâmetros StorageClass na página do GitHub do driver CSI do Disco do Azure do GKE do Azure.

    Para configurar um StorageClass personalizado, copie o seguinte manifesto YAML em um arquivo chamado 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 do novo StorageClass.

    Por exemplo, o YAML a seguir cria um novo StorageClass que provisiona volumes em uma conta de armazenamento específica e aplica uma tag de group=dev para 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
    

    Driver CSI

    É possível especificar um driver CSI diferente no campo provisioner.

    Para criar um StorageClass com outro driver CSI, use 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 do StorageClass (por exemplo, my-custom-class).
    • CSI_DRIVER_NAME: o nome do driver CSI (por exemplo, csi.example.com).

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

  2. Aplique o YAML ao cluster.

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

    Depois de criar um StorageClass personalizado, é possível especificá-lo em um PVC. O exemplo a seguir cria um PVC chamado my-pvc que referencia o StorageClass my-custom-class.

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

Definir o StorageClass padrão

O GKE no Azure usa um StorageClass padrão chamado standard-rwo que provisiona discos SSD padrão do Azure com LRS. É possível alterar o padrão para outro StorageClass.

Para alterar o StorageClass padrão:

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

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

    O StorageClass a seguir usa o driver disk.csi.azure.com. Para instalar outro driver de armazenamento, consulte Como instalar um driver CSI.

    Copie o seguinte YAML para um arquivo chamado 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:

    • CLASS_NAME: o nome do novo StorageClass.
    • VOLUME_TYPE: o tipo de volume do Disco do Azure que o StorageClass cria.

    Por exemplo, o YAML a seguir cria um novo StorageClass padrão que provisiona volumes SSD Premium do 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 cluster.

    kubectl apply -f my-custom-class.yaml
    

Depois de aplicar esse manifesto, o GKE no Azure usará o StorageClass my-custom-default-class para novas solicitações de armazenamento.

Referenciar o StorageClass em um StatefulSet

Para usar o novo StorageClass, é possível referenciá-lo no volumeClaimTemplates do StatefulSet.

Quando você se referir a um StorageClass na especificação volumeClaimTemplates de um StatefulSet, o Kubernetes fornecerá armazenamento estável usando PersistentVolumes (PVs). O Kubernetes chama o provisionador definido no StorageClass para criar um novo volume de armazenamento. Depois que o volume for provisionado, o Kubernetes criará automaticamente um PV.

O StatefulSet a seguir referencia o StorageClass my-custom-class e provisiona 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

A seguir