Use StorageClasses com as suas cargas de trabalho

O GKE on AWS implementa automaticamente o controlador da interface de armazenamento de contentores (CSI) para o Amazon Elastic Block Store (EBS) para aprovisionar e gerir volumes do Amazon EBS nos seus clusters.

A versão do controlador CSI do EBS do GKE no AWS está associada a uma versão do Kubernetes do GKE no AWS. Normalmente, a versão do controlador é a mais recente disponível quando a versão do GKE é lançada. Quando o cluster é atualizado, os controladores são atualizados automaticamente.

Como usar a StorageClass predefinida

A criação de um PersistentVolumeClaim sem o campo spec.storageClassName definido aprovisiona um volume com a StorageClass do controlador CSI do EBS do GKE on AWS predefinida.gp2

O YAML seguinte cria um PersistentVolumeClaim (PVC) denominado mypvc com um tamanho de 30 gibibytes.

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

Como usar uma StorageClass pré-instalada diferente

O controlador CSI do EBS do GKE on AWS também inclui a premium-rwo StorageClass, que aprovisiona volumes io1 com maior débito.

Pode 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

Como usar uma StorageClass personalizada

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

  1. Escolha se está a usar um volume EBS ou um controlador CSI específico.

    Volume do EBS

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

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

    Substitua CLASS_NAME pelo nome da nova StorageClass.

    Por exemplo, o YAML seguinte cria uma nova StorageClass que aprovisiona volumes EBS HDD otimizados para débito formatados com o sistema de ficheiros XFS.

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

    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 o seguinte:

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

    Configure os subcampos em parameters de acordo com o seu controlador CSI.

  2. Aplique o YAML ao seu cluster.

    kubectl apply -f my-custom-class.yaml
    

Como criar um PersistentVolumeClaim com uma StorageClass personalizada

  1. Depois de criar uma StorageClass personalizada, pode especificá-la num PVC. O exemplo abaixo 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
    

Como definir a StorageClass predefinida

O GKE no AWS usa uma StorageClass predefinida denominada standard-rwo que aprovisiona volumes EBS gp2. 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 ebs.csi.aws.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: ebs.csi.aws.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

    Substitua o seguinte:

    • EBS_VOLUME_TYPE: o tipo de volume EBS da AWS que a StorageClass cria.
    • CLASS_NAME com o nome da sua nova StorageClass

    Por exemplo, o YAML seguinte cria uma nova StorageClass predefinida que aprovisiona volumes de HDD otimizados para débito EBS formatados com o sistema de ficheiros XFS.

    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
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    
  3. Aplique a nova classe personalizada ao seu cluster.

    kubectl apply -f my-custom-class.yaml
    

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

Referencie a StorageClass num StatefulSet

Para usar a nova StorageClass, tem de fazer referência à mesma no volumeClaimTemplates de 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?