Kubernetes - Volumes

No Kubernetes, um volume pode ser considerado um diretório acessível aos contêineres de um pod. Temos diferentes tipos de volumes no Kubernetes e o tipo define como o volume é criado e seu conteúdo.

O conceito de volume estava presente no Docker, mas o único problema era que o volume era muito limitado a um pod específico. Assim que a vida de um pod acabou, o volume também foi perdido.

Por outro lado, os volumes criados por meio do Kubernetes não se limitam a nenhum contêiner. Ele é compatível com qualquer um ou todos os contêineres implantados no pod do Kubernetes. Uma das principais vantagens do volume Kubernetes é que ele oferece suporte a diferentes tipos de armazenamento, em que o pod pode usar vários deles ao mesmo tempo.

Tipos de volume do Kubernetes

Aqui está uma lista de alguns volumes populares do Kubernetes -

  • emptyDir- É um tipo de volume criado quando um pod é atribuído pela primeira vez a um nó. Ele permanece ativo enquanto o pod estiver em execução nesse nó. O volume está inicialmente vazio e os contêineres no pod podem ler e gravar os arquivos no volume emptyDir. Depois que o pod é removido do nó, os dados em emptyDir são apagados.

  • hostPath - Este tipo de volume monta um arquivo ou diretório do sistema de arquivos do nó do host em seu pod.

  • gcePersistentDisk- Este tipo de volume monta um disco permanente do Google Compute Engine (GCE) em seu pod. Os dados em umgcePersistentDisk permanece intacto quando o pod é removido do nó.

  • awsElasticBlockStore- Este tipo de volume monta um armazenamento Elastic Block da Amazon Web Services (AWS) em seu pod. Assim comogcePersistentDisk, os dados em um awsElasticBlockStore permanece intacto quando o pod é removido do nó.

  • nfs - um nfsvolume permite que um NFS (Network File System) existente seja montado em seu pod. Os dados em umnfso volume não é apagado quando o pod é removido do nó. O volume está apenas desmontado.

  • iscsi - um iscsi volume permite que um volume iSCSI (SCSI sobre IP) existente seja montado em seu pod.

  • flocker- É um gerenciador de volume de dados de contêiner em cluster de código aberto. É usado para gerenciar volumes de dados. UMAflockervolume permite que um conjunto de dados Flocker seja montado em um pod. Se o conjunto de dados não existe no Flocker, você primeiro precisa criá-lo usando a API do Flocker.

  • glusterfs- Glusterfs é um sistema de arquivos em rede de código aberto. Um volume glusterfs permite que um volume glusterfs seja montado em seu pod.

  • rbd- RBD significa Rados Block Device. Arbdvolume permite que um volume do Rados Block Device seja montado em seu pod. Os dados permanecem preservados depois que o pod é removido do nó.

  • cephfs - A cephfsvolume permite que um volume CephFS existente seja montado em seu pod. Os dados permanecem intactos depois que o pod é removido do nó.

  • gitRepo - A gitRepo volume monta um diretório vazio e clona um git repositório nele para seu pod usar.

  • secret - A secret volume é usado para passar informações confidenciais, como senhas, para pods.

  • persistentVolumeClaim - A persistentVolumeClaimvolume é usado para montar um PersistentVolume em um pod. PersistentVolumes são uma forma de os usuários “reivindicarem” armazenamento durável (como um PersistentDisk GCE ou um volume iSCSI) sem saber os detalhes do ambiente de nuvem específico.

  • downwardAPI - A downwardAPIo volume é usado para disponibilizar os dados da API descendente para os aplicativos. Ele monta um diretório e grava os dados solicitados em arquivos de texto simples.

  • azureDiskVolume - um AzureDiskVolume é usado para montar um disco de dados do Microsoft Azure em um pod.

Volume Persistente e Reivindicação de Volume Persistente

Persistent Volume (PV)- É um pedaço de armazenamento de rede que foi provisionado pelo administrador. É um recurso no cluster que é independente de qualquer pod individual que usa o PV.

Persistent Volume Claim (PVC)- O armazenamento solicitado pelo Kubernetes para seus pods é conhecido como PVC. O usuário não precisa saber o provisionamento subjacente. As declarações devem ser criadas no mesmo namespace em que o pod foi criado.

Criação de volume persistente

kind: PersistentVolume ---------> 1
apiVersion: v1
metadata:
   name: pv0001 ------------------> 2
   labels:
      type: local
spec:
   capacity: -----------------------> 3
      storage: 10Gi ----------------------> 4
   accessModes:
      - ReadWriteOnce -------------------> 5
      hostPath:
         path: "/tmp/data01" --------------------------> 6

No código acima, definimos -

  • kind: PersistentVolume → Definimos o tipo como PersistentVolume, que informa ao kubernetes que o arquivo yaml que está sendo usado é para criar o volume persistente.

  • name: pv0001 → Nome do PersistentVolume que estamos criando.

  • capacity: → Esta especificação definirá a capacidade de PV que estamos tentando criar.

  • storage: 10Gi → Isso informa à infraestrutura subjacente que estamos tentando reivindicar um espaço 10Gi no caminho definido.

  • ReadWriteOnce → Isso informa os direitos de acesso do volume que estamos criando.

  • path: "/tmp/data01" → Esta definição diz à máquina que estamos tentando criar volume sob este caminho na infraestrutura subjacente.

Criando PV

$ kubectl create –f local-01.yaml
persistentvolume "pv0001" created

Verificando PV

$ kubectl get pv
NAME        CAPACITY      ACCESSMODES       STATUS       CLAIM      REASON     AGE
pv0001        10Gi            RWO         Available                            14s

Descrevendo PV

$ kubectl describe pv pv0001

Criação de reivindicação de volume persistente

kind: PersistentVolumeClaim --------------> 1
apiVersion: v1
metadata:
   name: myclaim-1 --------------------> 2
spec:
   accessModes:
      - ReadWriteOnce ------------------------> 3
   resources:
      requests:
         storage: 3Gi ---------------------> 4

No código acima, definimos -

  • kind: PersistentVolumeClaim → Instrui a infraestrutura subjacente que estamos tentando reivindicar uma quantidade especificada de espaço.

  • name: myclaim-1 → Nome da reivindicação que estamos tentando criar.

  • ReadWriteOnce → Isso especifica o modo da declaração que estamos tentando criar.

  • storage: 3Gi → Isso dirá ao kubernetes sobre a quantidade de espaço que estamos tentando reivindicar.

Criando PVC

$ kubectl create –f myclaim-1
persistentvolumeclaim "myclaim-1" created

Obtendo detalhes sobre o PVC

$ kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESSMODES   AGE
myclaim-1   Bound    pv0001     10Gi         RWO       7s

Descrever PVC

$ kubectl describe pv pv0001

Usando PV e PVC com POD

kind: Pod
apiVersion: v1
metadata:
   name: mypod
   labels:
      name: frontendhttp
spec:
   containers:
   - name: myfrontend
      image: nginx
      ports:
      - containerPort: 80
         name: "http-server"
      volumeMounts: ----------------------------> 1
      - mountPath: "/usr/share/tomcat/html"
         name: mypd
   volumes: -----------------------> 2
      - name: mypd
         persistentVolumeClaim: ------------------------->3
         claimName: myclaim-1

No código acima, definimos -

  • volumeMounts: → Este é o caminho no recipiente em que a montagem será realizada.

  • Volume: → Esta definição define a definição de volume que vamos reivindicar.

  • persistentVolumeClaim: → Abaixo, definimos o nome do volume que vamos usar no pod definido.