Implementar uma aplicação com estado

Esta página explica como implementar uma aplicação com estado através do Google Kubernetes Engine (GKE).

Vista geral

As aplicações com estado guardam dados no armazenamento em disco persistente para utilização pelo servidor, pelos clientes e por outras aplicações. Um exemplo de uma aplicação com estado é uma base de dados ou um armazenamento de chave/valor no qual os dados são guardados e obtidos por outras aplicações.

O armazenamento persistente pode ser aprovisionado dinamicamente, para que os volumes subjacentes sejam criados a pedido. No Kubernetes, pode configurar o aprovisionamento dinâmico criando uma StorageClass. No GKE, uma StorageClass predefinida permite aprovisionar dinamicamente Persistent Disks do Compute Engine.

O Kubernetes usa o controlador StatefulSet para implementar aplicações com estado como objetos StatefulSet. Os pods em StatefulSets não são intermutáveis: cada pod tem um identificador exclusivo que é mantido independentemente de onde é agendado.

As aplicações com estado são diferentes das aplicações sem estado, nas quais os dados do cliente não são guardados no servidor entre sessões.

Pode saber mais acerca do armazenamento persistente em clusters multizonais e regionais.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.
  • Certifique-se de que a aplicação em contentor está armazenada num registo de imagens, como o Artifact Registry.

Pode seguir o início rápido, para ativar a API GKE, criar um cluster e saber mais sobre o GKE.

Pedir armazenamento persistente num StatefulSet

As aplicações podem pedir armazenamento persistente com uma PersistentVolumeClaim.

Normalmente, tem de criar objetos PersistentVolumeClaim, além de criar o pod. No entanto, os objetos StatefulSet incluem uma matriz volumeClaimTemplates, que gera automaticamente os objetos PersistentVolumeClaim. Cada réplica do StatefulSet tem o seu próprio objeto PersistentVolumeClaim.

Também pode usar um disco preexistente num StatefulSet.

Criar um StatefulSet

Para criar um recurso StatefulSet, use o comando kubectl apply.

O comando kubectl apply usa ficheiros de manifesto para criar, atualizar e eliminar recursos no seu cluster. Este é um método declarativo de configuração de objetos. Este método retém as gravações feitas em objetos ativos sem incorporar as alterações novamente nos ficheiros de configuração de objetos.

Linux

O ficheiro de manifesto seguinte é um exemplo simples de um StatefulSet regido por um serviço que foi criado separadamente:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  selector:
    matchLabels:
      # Selects Pods with this label.
      app: APP_NAME
  # Headless Service for network identity.
  serviceName: "SERVICE_NAME"
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: APP_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: IMAGE
        ports:
        - containerPort: 80
          name: PORT_NAME
        volumeMounts:
        - name: PVC_NAME
          mountPath: MOUNT_PATH
  volumeClaimTemplates:
  - metadata:
      name: PVC_NAME
      annotations:
        KEY: VALUE
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Substitua o seguinte:

  • STATEFULSET_NAME: o nome do StatefulSet, por exemplo, web.
  • SERVICE_NAME: o nome do serviço, por exemplo, nginx.
  • APP_NAME: o nome da aplicação executada nos pods, por exemplo, nginx.
  • CONTAINER_NAME: o nome dos contentores nos agrupamentos, por exemplo, nginx.
  • IMAGE: a imagem do contentor, por exemplo, registry.k8s.io/nginx-slim:0.8.
  • PORT_NAME: o nome da porta aberta pelo StatefulSet, por exemplo, web.
  • PVC_NAME: o nome do PersistentVolumeClaim, por exemplo, www.
  • MOUNT_PATH: o caminho no contentor onde o armazenamento está montado, por exemplo, /usr/share/nginx/html.
  • KEY e VALUE: um par de chave-valor de anotação a aplicar aos metadados PersistentVolumeClaim. Pode usar anotações para anexar metadados arbitrários não identificadores a objetos que podem ser obtidos por clientes, como ferramentas e bibliotecas. Para saber mais, consulte o artigo Anotações.

Neste ficheiro, o campo kind especifica que deve ser criado um objeto StatefulSet com as especificações definidas no ficheiro. Este exemplo de StatefulSet produz três pods replicados e abre a porta 80 para expor o StatefulSet à Internet.

Windows

Quando usar clusters com pools de nós do Windows Server, tem de criar uma StorageClass porque a StorageClass predefinida usa ext4 como o tipo de sistema de ficheiros, que só funciona para contentores Linux. Se estiver a usar um Persistent Disk do Compute Engine, tem de usar NTFS como o tipo de armazenamento de ficheiros conforme mostrado no exemplo seguinte:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  # Defines a name for this StorageClass.
  name: STORAGECLASS_NAME
parameters:
  # Specifies the type of Google Compute Engine persistent disk.
  type: pd-standard
  # Uses NTFS file system, which is crucial for Windows nodes
  fstype: NTFS
# The provisioner for Google Compute Engine persistent disks.
provisioner: kubernetes.io/gce-pd
# Specifies that the PersistentVolume will be deleted if the PersistentVolumeClaim is deleted.
reclaimPolicy: Delete
# Delays volume binding until a Pod using the PVC is scheduled.
volumeBindingMode: WaitForFirstConsumer

O seguinte manifesto StatefulSet usa a StorageClass definida acima. Cria quatro pares PersistentVolume e PersistentVolumeClaim para representar quatro discos persistentes do Compute Engine. Cada pod no StatefulSet consome um disco persistente.

Para garantir que os seus pods são agendados corretamente em nós do Windows Server, tem de adicionar um seletor de nós à especificação do pod.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  replicas: 4
  selector:
    matchLabels:
      # Selects Pods with this label.
      app: APP_NAME
  template:
    metadata:
      labels:
        # Labels applied to the Pods created by the StatefulSet.
        app: APP_NAME
      name: CONTAINER_NAME
    spec:
      nodeSelector:
        # Ensures Pods are scheduled on Windows nodes.
        kubernetes.io/os: windows
      containers:
      - name: CONTAINER_NAME
        image: IMAGE
        ports:
        - containerPort: 80
          name: PORT_NAME
        volumeMounts:
        - name: PVC_NAME
          mountPath: MOUNT_PATH
  volumeClaimTemplates:
  - metadata:
      name: PVC_NAME
    spec:
      # Specifies the StorageClass to use, which is crucial for Windows nodes.
      storageClassName: STORAGECLASS_NAME
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Substitua o seguinte:

  • STATEFULSET_NAME: o nome do StatefulSet, por exemplo, web-windows.
  • APP_NAME: o nome da aplicação executada nos pods, por exemplo, iis.
  • CONTAINER_NAME: o nome dos contentores nos agrupamentos, por exemplo, iis.
  • IMAGE: a imagem do contentor, por exemplo, mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019.
  • PORT_NAME: o nome da porta aberta pelo StatefulSet, por exemplo, http.
  • PVC_NAME: o nome do PersistentVolumeClaim, por exemplo, iis-state.
  • MOUNT_PATH: o caminho no contentor onde o armazenamento está montado, por exemplo, C:\mnt\state.
  • STORAGECLASS_NAME: o nome da StorageClass, por exemplo, my-storage-class.

Para criar um recurso StatefulSet, execute o seguinte comando substituindo STATEFULSET_FILE pelo nome do ficheiro de manifesto:

kubectl apply -f STATEFULSET_FILE

Também pode usar kubectl apply -f DIRECTORY/ para criar todos os objetos (exceto os existentes) definidos em ficheiros de configuração armazenados num diretório.

Inspeção de um StatefulSet

kubectl

Para inspecionar o StatefulSet, execute o seguinte comando:

kubectl get statefulset STATEFULSET_NAME -o yaml

Este comando apresenta a configuração ativa do recurso StatefulSet no formato YAML.

Para listar os pods criados pelo StatefulSet, execute o seguinte comando:

kubectl get pods -l app=APP_NAME

Neste comando, a flag -l indica ao kubectl que obtenha todos os pods etiquetados para o APP_NAME.

O resultado é semelhante ao seguinte:

NAME                                READY     STATUS    RESTARTS   AGE
pod-name                            1/1       Running   0          1m
pod-name                            1/1       Running   0          1m

Para obter informações detalhadas sobre o StatefulSet, execute o seguinte comando:

kubectl describe statefulset STATEFULSET_NAME

Para obter informações sobre um pod específico, execute o seguinte comando:

kubectl describe pod POD_NAME

Para apresentar uma lista dos objetos PersistentVolumeClaim que foram criados, execute o seguinte comando:

kubectl get pvc

O resultado é semelhante ao seguinte:

NAME                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
STATEFULSET_NAME-PVC_NAME-0     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800002   1G         RWO            standard        9s
STATEFULSET_NAME-PVC_NAME-1     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800003   1G         RWO            standard        9s
STATEFULSET_NAME-PVC_NAME-2     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800004   1G         RWO            standard        9s

Para obter informações sobre um PersistentVolumeClaim específico, execute o seguinte comando:

kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0

Para obter informações sobre um PersistentVolume específico, execute o seguinte comando:

kubectl describe pv PV_NAME

Consola

Para inspecionar um StatefulSet, siga estes passos:

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Na lista de cargas de trabalho, clique no nome do StatefulSet que quer inspecionar.

  3. Na página Detalhes do conjunto com estado, faça qualquer uma das seguintes ações:

    • Clique no separador Histórico de revisões para ver o histórico de revisões do StatefulSet.
    • Clique no separador Eventos para ver todos os eventos relacionados com o StatefulSet.
    • Clique no separador Registos para ver os registos do contentor do StatefulSet.
    • Clique no separador YAML para ver, copiar ou transferir a configuração YAML do StatefulSet.

Atualizar um StatefulSet

Existem várias formas de atualizar StatefulSets. O método comum e declarativo é kubectl apply. Para atualizar o StatefulSet diretamente a partir da shell ou num editor preferencial, pode usar kubectl edit. Também pode usar o editor YAML no menu Cargas de trabalho do GKE na Google Cloud consola.

Pode implementar atualizações na especificação de pods para um recurso StatefulSet, como a respetiva imagem, utilização/pedidos de recursos ou configuração.

kubectl apply

Pode atualizar o StatefulSet aplicando um ficheiro de manifesto novo ou atualizado. Isto é útil para fazer várias alterações ao seu StatefulSet, como quando dimensiona ou especifica uma nova versão da sua aplicação.

Para atualizar um StatefulSet, execute o seguinte comando:

kubectl apply -f STATEFULSET_FILE

Substitua STATEFULSET_FILE pelo ficheiro de manifesto atualizado.

O comando kubectl apply aplica um ficheiro de manifesto a um recurso. Se o recurso especificado não existir, é criado pelo comando.

Para mais informações sobre a funcionalidade kubectl apply, consulte a documentação de referência.kubectl

Consola

Para editar a configuração em direto de um StatefulSet, siga os seguintes passos:

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Na lista de cargas de trabalho, clique no nome do StatefulSet que quer modificar.

  3. Clique em Editar.

  4. Altere o YAML de configuração conforme quiser.

  5. Clique em Guardar.

Inspeção da implementação da atualização

Para inspecionar a implementação do StatefulSet, execute o seguinte comando:

kubectl rollout status statefulset STATEFULSET_NAME

Para ver o histórico de implementação do StatefulSet, execute o seguinte comando:

kubectl rollout history statefulset STATEFULSET_NAME

Para anular uma implementação, execute o seguinte comando:

kubectl rollout undo statefulset STATEFULSET_NAME

Atualize as estratégias

O campo updateStrategy do StatefulSet permite-lhe configurar e desativar atualizações contínuas automatizadas para contentores, etiquetas, pedidos de recursos, limites e anotações para os pods num StatefulSet.

Pode saber mais acerca das estratégias de atualização para StatefulSets na documentação do Kubernetes.

Dimensionar um StatefulSet

kubectl

O comando kubectl scale pode ser usado em qualquer altura para dimensionar o StatefulSet.

Para dimensionar manualmente um StatefulSet, execute o seguinte comando:

kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS

Substitua NUMBER_OF_REPLICAS pelo número desejado de pods replicados.

Consola

Para dimensionar um StatefulSet, siga estes passos:

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Na lista de cargas de trabalho, clique no nome do StatefulSet que quer modificar.

  3. Clique em Ações > Dimensionar > Editar réplicas.

  4. Introduza o novo número de Réplicas para o StatefulSet.

  5. Clique em Escala.

Eliminar um StatefulSet

kubectl

Para eliminar um StatefulSet, execute o seguinte comando:

kubectl delete statefulset STATEFULSET_NAME

Consola

Para eliminar um StatefulSet, efetue os seguintes passos:

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Na lista de cargas de trabalho, selecione um ou mais StatefulSets que quer eliminar.

  3. Clique em Eliminar.

  4. Quando lhe for pedido que confirme, clique em Eliminar.

O que se segue?