Nesta página, mostramos como melhorar a latência de inicialização da carga de trabalho usando discos de inicialização secundários no Google Kubernetes Engine (GKE). Com discos de inicialização secundários, é possível pré-carregar dados ou imagens de contêiner em novos nós. Isso permite que as cargas de trabalho realizem uma inicialização a frio rápida e melhorem a utilização geral dos recursos provisionados.
Visão geral
A partir da versão 1.28.3-gke.1067000, é possível configurar o pool de nós com discos de inicialização secundários. Peça ao GKE para provisionar os nós e pré-carregá-los com dados, como um modelo de machine learning ou uma imagem de contêiner. O uso de dados pré-carregados ou de uma imagem de contêiner em um disco secundário tem os seguintes benefícios para suas cargas de trabalho:
- Escalonamento automático mais rápido
- Latência reduzida ao extrair imagens grandes
- Recuperação mais rápida de interrupções, como eventos de manutenção e erros do sistema
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 Google Cloud CLI para essa tarefa,
instale e, em seguida,
inicialize a
CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão
mais recente executando
gcloud components update
.
Ative a API Container File System.
Verifique se o cluster tem acesso à imagem do disco para carregar nos nós.
Requisitos
Os requisitos a seguir se aplicam ao uso do disco de inicialização secundário:
- O recurso está disponível na versão 1.28.3-gke.106700 e mais recentes do GKE.
Ao modificar a imagem do disco, é preciso criar um novo pool de nós. Não é possível atualizar a imagem do disco nos nós atuais.
Configure o streaming de imagens para usar o recurso do disco de inicialização secundário.
Configurar o disco de inicialização secundário
As seções a seguir descrevem como configurar o disco de inicialização secundário:
Pré-carregar dados
Antes de criar o cluster do GKE e o pool de nós com um disco de inicialização secundário, recomendamos que você prepare a imagem do disco quando os dados estiverem prontos durante a criação, de preferência automatizados em um pipeline de CI/CD.
Preparar a imagem do disco que contém os dados
Crie uma imagem de disco personalizada como a fonte de dados concluindo as seguintes etapas:
- Crie uma VM com um disco em branco.
- Conecte-se por SSH à VM.
- Crie uma imagem personalizada a partir do disco.
Crie o pool de nós e o cluster do GKE com um disco de inicialização secundário
É possível configurar um disco de inicialização secundário usando a gcloud CLI:
Crie um cluster do GKE Standard com o streaming de imagens ativado usando a sinalização
--enable-image-streaming
:gcloud container clusters create CLUSTER_NAME \ --location LOCATION \ --cluster-version=CLUSTER_VERSION \ --enable-image-streaming
Substitua:
- CLUSTER_NAME: o nome do cluster.
- LOCATION: o local do cluster.
- CLUSTER-VERSION: a versão do GKE a ser
usada. Precisa ser
1.28.3-gke.106700
ou mais recente.
Crie um pool de nós com um disco de inicialização secundário usando a sinalização
--secondary-boot-disk=disk-image
:gcloud beta container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DATA_DISK IMAGE
Substitua DISK_IMAGE_NAME pelo nome da imagem do disco.
O GKE cria um pool de nós em que cada nó tem um disco secundário com dados pré-carregados. Isso anexa e monta o disco de inicialização secundário no nó.
Outra opção é montar a imagem do disco secundário nos contêineres do pod usando uma montagem de volume hostPath. Use o manifesto a seguir para definir os recursos do pod e use uma montagem de volume hostPath para pré-carregar o disco de dados nos contêineres:
apiVersion: v1 kind: Pod metadata: name: pod-name spec: containers: ... volumeMounts: - mountPath: /usr/local/data_path_sbd name: data_path_sbd ... volumes: - name: data_path_sbd hostPath: path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
Substitua DISK_IMAGE_NAME pelo nome da imagem do disco.
Pré-carregar a imagem do contêiner
Neste guia, você usa gke-disk-image-builder
para criar uma instância de VM e extrair as imagens de contêiner em um disco. O
gke-disk-image-builder
cria uma imagem do disco a partir desse disco. Recomendamos que você prepare a imagem do disco logo após a etapa de criação da imagem do contêiner, idealmente automatizada em um pipeline de CI/CD.
- Crie um bucket do Cloud Storage
para armazenar os registros de execução de
gke-disk-image-builder
. Criar uma imagem de disco com imagens de contêiner pré-carregadas.
go run ./cli \ --project-name=PROJECT_ID \ --image-name=DISK_IMAGE_NAME \ --zone=LOCATION \ --gcs-path=gs://LOG_BUCKET_NAME \ --disk-size-gb=10 \ --container-image=docker.io/library/python:latest \ --container-image=docker.io/library/nginx:latest
Substitua:
- PROJECT_ID: o nome do seu projeto do Google Cloud.
- DISK_IMAGE_NAME: o nome da imagem do disco. Por exemplo,
nginx-python-image
. - LOCATION: o local do cluster.
LOG_BUCKET_NAME: o nome do bucket do Cloud Storage para armazenar os registros de execução. Por exemplo,
gke-secondary-disk-image-logs/
.
Crie um cluster do GKE Standard com o streaming de imagens ativado:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=CLUSTER_VERSION \ --enable-image-streaming
Crie um pool de nós com um disco de inicialização secundário:
gcloud beta container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
Adicione um
nodeSelector
ao seu modelo de pod:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Confirme se o cache do disco de inicialização secundário está em uso:
kubectl get events --all-namespaces
O resultado será assim:
75s Normal SecondaryDiskCachin node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
A latência de extração esperada da imagem do contêiner em cache não deve ser maior do que alguns segundos, independentemente do tamanho da imagem. Verifique a latência de extração da imagem executando o seguinte comando:
kubectl describe pod POD_NAME
Substitua
POD_NAME
pelo nome do pod.A saída será assim:
… Normal Pulled 15m kubelet Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s …
A seguir
- Use Usar streaming de imagens para extrair imagens de contêiner para extrair imagens de contêiner transmitindo os dados da imagem conforme suas cargas de trabalho precisarem.
- Consulte Melhorar a eficiência da carga de trabalho usando o NCCL Fast Socket para saber como usar o plug-in Fast Socket da Biblioteca NVIDIA Collective Communication (NCCL).