Usar StorageClasses com cargas de trabalho

O GKE na AWS implanta automaticamente o Container Storage Interface (CSI, na sigla em inglês) Amazon Elastic Block Store (EBS) e o Amazon Elastic File Store (EFS).

As versões dos drivers CSI do EBS e EFS do driver CSI do EFS estão vinculadas a uma versão do GKE na AWS Kubernetes. 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 o StorageClass padrão

A criação de um PersistentVolumeClaim sem o campo spec.storageClassName provisiona um volume de volumes SSD de uso geral (gp2) usando o GKE padrão no driver CSI do EBS da AWS.

O YAML a seguir cria um PersistentVolumeClaim (PDF) chamado mypvc com um tamanho de 30 gibibytes.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

Usar um StorageClass pré-instalado diferente

O driver CSI do GKE no AWS EBS também inclui o StorageClass premium-rwo, que provisiona volumes maiores de capacidade Volumes SSD de IOPS provisionados (io1).

É possível usá-lo especificando-o no spec.storageClassName do PVC.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageClassName: premium-rwo

Usar um StorageClass personalizado

Se o StorageClass padrão ou premium-rwo não atender às suas necessidades, você pode criar StorageClasses adicionais para volumes EBS ou usar os drivers Container Storage Interface (CSI).

  1. Escolha se você está usando um volume EBS ou outro driver CSI.

    Volume do EBS

    Esta guia descreve como criar seu próprio StorageClass personalizado que especifica um tipo de volume EBS, um tipo de sistema de arquivos e outros parâmetros. É possível encontrar outros parâmetros StorageClass na página do GKE no driver CSI do EBS da AWS (em inglês).

    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: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    

    Substitua CLASS_NAME pelo nome do novo StorageClass.

    Por exemplo, o YAML a seguir cria um novo StorageClass que provisiona volumes EBS de HDD de capacidade otimizada formatados com o sistema de arquivos XFS.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-class
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    StorageClass do EFS personalizado

    Esta guia descreve como criar um StorageClass personalizado para o provisionador de driver CSI da EFS. Consulte Usar um recurso da EFS para ver uma lista dos pré-requisitos para esse StorageClass. A página do driver CSI da EFS lista outros parâmetros StorageClass além daqueles presentes no manifesto a seguir.

    Copie o seguinte manifesto do YAML para um arquivo chamado my-custom-class.yaml:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: <var>EFS_STORAGE_CLASS_NAME</var>
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    

    Substitua:

    • EFS_STORAGE_CLASS_NAME com o nome do StorageClass.
    • EFS_ID pelo ID do sistema de arquivos da EFS, por exemplo, fs-12345678a.

    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
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      ...
    

    Substitua:

    • CSI_DRIVER_NAME pelo nome do driver CSI, por exemplo, csi.example.com;
    • CLASS_NAME pelo nome do StorageClass, por exemplo, my-custom-class.

    Configure os subcampos em parameters de acordo com seu driver CSI.

  2. Aplique o YAML ao cluster.

    kubectl apply -f my-custom-class.yaml
    

Criar um PersistentVolumeClaim com um StorageClass personalizado

  1. Depois que um StorageClass personalizado é criado, é possível especificá-lo em um PVC. O exemplo abaixo 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 na AWS usa um StorageClass padrão chamado standard-rwo que provisiona volumes EBS do gp2. É 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 ebs.csi.aws.com. Para instalar outro driver de armazenamento, consulte Instalar outros drivers 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: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

    Substitua:

    • EBS_VOLUME_TYPE: o tipo de volume EBS da AWS que o StorageClass cria.
    • CLASS_NAME pelo nome do novo StorageClass.

    Por exemplo, o YAML a seguir cria um novo StorageClass padrão que provisiona volumes SSD de uso geral (gp3).

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-default-class
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: gp3
    
  3. Aplique a nova classe personalizada ao cluster.

    kubectl apply -f my-custom-class.yaml
    

Depois de aplicar esse manifesto, o GKE na AWS usa o StorageClass my-custom-default-class para novas solicitações de armazenamento.

Referenciar o StorageClass em um StatefulSet

Para usar o novo StorageClass, refira-se a ele 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