Como implantar um aplicativo com estado

Nesta página, explicamos como implantar um aplicativo com estado usando o Google Kubernetes Engine (GKE).

Visão geral

Os aplicativos com estado salvam dados no armazenamento em disco permanente para uso do servidor, de clientes e de outros aplicativos. Um exemplo de aplicativo com estado é um banco de dados ou armazenamento de chave-valor em que os dados são salvos e recuperados por outros aplicativos.

O armazenamento permanente pode ser provisionado de forma dinâmica, de modo que os volumes subjacentes sejam criados sob demanda. No Kubernetes, você configura o provisionamento dinâmico criando um StorageClass. No GKE, um StorageClass padrão permite provisionar de forma dinâmica os discos permanentes do Compute Engine.

O Kubernetes usa o controlador StatefulSet para implantar aplicativos com estado como objetos StatefulSet. Os pods no StatefulSets não podem ser trocados. Cada pod tem um identificador exclusivo que é mantido, independentemente de onde está programado.

Os aplicativos com estado são diferentes dos aplicativos sem estado, em que os dados do cliente não são salvos no servidor entre as sessões.

Saiba mais sobre armazenamento permanente em clusters regionais e de várias zonas.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e inicialize a gcloud CLI. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.
  • Verifique se o aplicativo em contêiner está armazenado em um registro de imagens, como o Artifact Registry.

É possível seguir as instruções do início rápido para ativar a API do GKE, criar um cluster e saber mais sobre o GKE.

Como solicitar armazenamento permanente em um StatefulSet

Os aplicativos podem solicitar armazenamento permanente com um PersistentVolumeClaim.

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

Também é possível usar um disco preexistente em um StatefulSet.

Como criar um StatefulSet

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

O comando kubectl apply usa arquivos de manifesto para criar, atualizar e excluir recursos do cluster. Esse é um método declarativo de configuração de objetos. Esse método retém gravações feitas em objetos ativos sem mesclar as alterações nos arquivos de configuração do objeto.

Linux

O seguinte arquivo de manifesto é um exemplo simples de um StatefulSet controlado por um serviço 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:

  • STATEFULSET_NAME: o nome do StatefulSet, por exemplo, web.
  • SERVICE_NAME: o nome do serviço, por exemplo, nginx.
  • APP_NAME: o nome do aplicativo executado nos pods, por exemplo, nginx.
  • CONTAINER_NAME: o nome dos contêineres nos pods, por exemplo, nginx.
  • IMAGE: a imagem do contêiner, 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 contêiner em que o armazenamento é montado, por exemplo, /usr/share/nginx/html.
  • KEY e VALUE: um par de chave-valor de anotação a ser aplicado aos metadados do PersistentVolumeClaim. É possível usar anotações para anexar metadados arbitrários sem identificação a objetos que podem ser recuperados por clientes, como ferramentas e bibliotecas. Para saber mais, consulte Anotações.

Nesse arquivo, o campo kind especifica que um objeto StatefulSet precisa ser criado com as especificações definidas no arquivo. Nesse exemplo, o StatefulSet produz três Pods replicados e abre a porta 80 para expor o StatefulSet na Internet.

Windows

Ao usar clusters com pools de nós do Windows Server, você precisa criar um StorageClass, porque o StorageClass padrão usa ext4 como o tipo de sistema de arquivos, que só funciona para contêineres do Linux. Se você estiver usando um disco permanente do Compute Engine, use NTFS como o tipo de armazenamento de arquivo, conforme mostrado no exemplo a seguir:

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 manifesto StatefulSet a seguir usa o StorageClass definido acima. Ele cria quatro pares de PersistentVolume e PersistentVolumeClaim para representar quatro discos permanentes do Compute Engine. Cada pod no StatefulSet consome um disco permanente.

Para garantir que seus pods sejam programados corretamente em nós do Windows Server, você precisa 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:

  • STATEFULSET_NAME: o nome do StatefulSet, por exemplo, web-windows.
  • APP_NAME: o nome do aplicativo executado nos pods, por exemplo, iis.
  • CONTAINER_NAME: o nome dos contêineres nos pods, por exemplo, iis.
  • IMAGE: a imagem do contêiner, 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 contêiner em que o armazenamento é montado, por exemplo, C:\mnt\state.
  • STORAGECLASS_NAME: o nome do StorageClass, por exemplo, my-storage-class.

Para criar um recurso StatefulSet, execute o comando a seguir substituindo STATEFULSET_FILE pelo nome do arquivo de manifesto:

kubectl apply -f STATEFULSET_FILE

Também é possível usar kubectl apply -f DIRECTORY/ para criar todos os objetos (exceto os atuais) definidos em arquivos de configuração armazenados em um diretório.

Como inspecionar um StatefulSet

kubectl

Para inspecionar o StatefulSet, execute o seguinte comando:

kubectl get statefulset STATEFULSET_NAME -o yaml

Esse comando exibe a configuração ativa do recurso StatefulSet no formato YAML.

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

kubectl get pods -l app=APP_NAME

Neste comando, a sinalização -l instrui kubectl a receber todos os pods rotulados para o APP_NAME.

A saída será assim:

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 comando a seguir:

kubectl describe statefulset STATEFULSET_NAME

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

kubectl describe pod POD_NAME

Para listar os objetos PersistentVolumeClaim que foram criados, execute o seguinte comando:

kubectl get pvc

A saída será assim:

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 comando a seguir:

kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0

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

kubectl describe pv PV_NAME

Console

Para inspecionar um StatefulSet, siga as etapas a seguir:

  1. Acesse a página Cargas de trabalho no console Google Cloud .

    Acesse "Cargas de trabalho"

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

  3. Na página Detalhes do conjunto de estado, siga um destes procedimentos:

    • Clique na guia Histórico de revisões para ver o histórico de revisões do StatefulSet.
    • Clique na guia Eventos para ver todos os eventos relacionados ao StatefulSet.
    • Clique na guia Registros para ver os registros de contêiner do StatefulSet.
    • Clique na guia YAML para ver, copiar ou fazer o download do YAML de configuração para o StatefulSet.

Como atualizar um StatefulSet

Há várias maneiras de atualizar StatefulSets. O método declarativo comum é kubectl apply. Para atualizar o StatefulSet diretamente do shell ou em um editor preferencial, use kubectl edit. Também é possível usar o editor YAML no menu "Cargas de trabalho do GKE" no Google Cloud console.

É possível lançar atualizações na especificação de pods de um recurso StatefulSet, como imagem, uso/solicitações de recursos ou configuração.

kubectl apply

Para atualizar o StatefulSet, você pode aplicar um arquivo de manifesto novo ou atualizado. Isso é útil para fazer várias alterações no StatefulSet. Por exemplo, ao dimensionar ou especificar uma nova versão do aplicativo.

Para atualizar um StatefulSet, execute o comando a seguir:

kubectl apply -f STATEFULSET_FILE

Substitua STATEFULSET_FILE pelo arquivo de manifesto atualizado.

O comando kubectl apply aplica um arquivo de manifesto a um recurso. Se o recurso especificado não existir, ele será criado pelo comando.

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

Console

Para editar a configuração ativa de um StatefulSet, siga as etapas a seguir:

  1. Acesse a página Cargas de trabalho no console Google Cloud .

    Acesse "Cargas de trabalho"

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

  3. Clique em Editar.

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

  5. Clique em Salvar.

Como inspecionar o lançamento de atualizações

Para inspecionar a lançamento do StatefulSet, execute o seguinte comando:

kubectl rollout status statefulset STATEFULSET_NAME

Para ver o histórico de lançamentos do StatefulSet, execute o seguinte comando:

kubectl rollout history statefulset STATEFULSET_NAME

Para desfazer um lançamento, execute o seguinte comando:

kubectl rollout undo statefulset STATEFULSET_NAME

Atualizar estratégias

O campo updateStrategy de StatefulSet permite configurar e desativar atualizações graduais automáticas para contêineres, marcadores, limites e solicitações de recursos e anotações para os pods em um StatefulSet.

Saiba mais sobre como Atualizar estratégias para StatefulSets na documentação do Kubernetes.

Como escalonar um StatefulSet

kubectl

O comando kubectl scale pode ser usado a qualquer momento para escalonar seu StatefulSet.

Para escalonar manualmente um StatefulSet, execute o comando a seguir:

kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS

Substitua NUMBER_OF_REPLICAS pelo número pretendido de pods replicados.

Console

Para escalonar um StatefulSet, siga as etapas a seguir:

  1. Acesse a página Cargas de trabalho no console Google Cloud .

    Acesse "Cargas de trabalho"

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

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

  4. Digite o novo número de Réplicas do StatefulSet.

  5. Clique em Escalonar.

Como excluir um StatefulSet

kubectl

Para excluir um StatefulSet, execute o seguinte comando:

kubectl delete statefulset STATEFULSET_NAME

Console

Para excluir um StatefulSet, siga as etapas a seguir:

  1. Acesse a página Cargas de trabalho no console Google Cloud .

    Acesse "Cargas de trabalho"

  2. Na lista de cargas de trabalho, selecione um ou mais StatefulSets que você quer excluir.

  3. Clique em Excluir

  4. Quando solicitado a confirmar, clique em Excluir.

A seguir