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
eVALUE
: 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:
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, clique no nome do StatefulSet que quer inspecionar.
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:
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, clique no nome do StatefulSet que quer modificar.
Clique em edit Editar.
Altere o YAML de configuração conforme quiser.
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:
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, clique no nome do StatefulSet que quer modificar.
Clique em list Ações > Dimensionar > Editar réplicas.
Introduza o novo número de Réplicas para o StatefulSet.
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:
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, selecione um ou mais StatefulSets que quer eliminar.
Clique em delete Eliminar.
Quando lhe for pedido que confirme, clique em Eliminar.
O que se segue?
- Saiba como implementar um cluster MySQL no GKE para alta disponibilidade
- Saiba como implementar aplicações sem estado.
- Faça um tutorial sobre como atualizar um cluster que executa uma carga de trabalho com estado.