Introdução
O Field Notes tem vinte fotografias de jardins licenciadas e precisa de uma pequena galeria que a equipe possa baixar. Primeiro, você experimentará um grupo; depois, executará todos os quatro grupos com um Job do Kubernetes. O último grupo contém apenas duas fotografias; ele ainda precisa de seu próprio índice de conclusão bem-sucedido.
Você já deve reconhecer Pods, Deployments, Services, labels, YAML simples e caminhos básicos no terminal. Jobs, índices de conclusão, este volume compartilhado e os comandos de edição usados aqui são apresentados abaixo. O cluster, a imagem do processador, as fotografias originais, o site e o armazenamento estão preparados. Você não precisa escrever Python, criar uma imagem nem ter uma conta de nuvem.
Use Workspace para os comandos e Gallery para o site. Ambas as entradas usam uma única VM de treinamento. Mantenha inalterados os arquivos fornecidos em starter/ e inputs/, as fotografias de origem, a referência, o processador, os serviços e o armazenamento. A duração de 45 minutos é uma estimativa do autor que inclui leitura e erros comuns.
Experimente Primeiro um Grupo
Nesta etapa, compare um exemplo normal concluído com sua origem e depois use um Job de um único índice para processar uma amostra separada.
Abra Gallery. A página inicial identifica sua fotografia grande como Source collection · licensed garden photographs: ela é uma entrada, não um trabalho que você concluiu. Selecione See the reference. A Thumbnail é um JPEG de 320 × 220 fornecido; a Licensed source copy mantém suas proporções originais. O recorte explica por que suas bordas diferem. Selecione Gallery na navegação da página. Inicialmente, ela mostra 0 of 20 images available.
Mude para Workspace. Este terminal começa em /home/labex/project/photo-gallery. pwd exibe esse diretório de trabalho:
pwd
Se você mudou para outro lugar, retorne com cd /home/labex/project/photo-gallery. Todos os nomes de arquivos relativos abaixo partem desse diretório. Os arquivos persistem nesta VM, mas outro laboratório começa com seus próprios arquivos e recursos de cluster independentes.
Um Deployment mantém um serviço em execução. Já um Job executa Pods até que uma tarefa finita esteja concluída. O worker fornecido processa um grupo de fotografias e termina. Em um Job indexado, o Kubernetes atribui a cada conclusão exigida um número começando em zero. O worker lê seu valor nativo de JOB_COMPLETION_INDEX e escolhe o grupo correspondente. Você configura o Job em vez de escrever o worker.
Leia o manifesto de amostra fornecido. cat exibe um arquivo sem alterá-lo:
cat starter/sample-job.yaml
Seus campos importantes são completionMode: Indexed, completions: 1 e parallelism: 1. Eles solicitam apenas o índice 0, com um worker simultâneo desejado. restartPolicy: Never significa que um contêiner que falha permanece com falha em seu Pod; a política do Job decide se outro Pod é necessário. backoffLimit: 0 significa nenhuma nova tentativa neste exercício com fonte saudável, e activeDeadlineSeconds: 180 limita o tempo de vida ativo do Job. Os outros campos conectam a imagem preparada, o plano de entrada e o volume de saída; deixe-os inalterados.
Uma PersistentVolumeClaim, ou PVC, solicita armazenamento persistente. A PVC gallery-output preparada mantém os arquivos depois que um worker termina. Aqui, seu volume ReadWriteOnce pode ser montado por vários Pods no mesmo nó. Isso não promete escrita compartilhada entre vários nós. A amostra grava em um diretório sample separado, portanto não pode preencher silenciosamente a galeria final.
Aplique a amostra. apply -f lê o arquivo YAML indicado; -n seleciona o namespace, que agrupa os recursos Kubernetes deste projeto:
kubectl apply -n photo-workshop -f starter/sample-job.yaml
Espere pela condição nativa Complete do Job. --timeout=180s limita o tempo de espera deste comando; ele não altera o prazo do Job:
kubectl wait -n photo-workshop --for=condition=Complete job/gallery-sample --timeout=180s
Final esperado: job.batch/gallery-sample condition met. O esgotamento do tempo, por si só, não comprova falha: inspecione o Job e seus logs usando os comandos ensinados na Etapa 3 antes de decidir o que alterar. Não execute a preparação novamente nem exclua os recursos fornecidos.
Mude para Gallery, selecione Sample e confirme 6 of 6 images available. Abra Windmill garden, compare sua miniatura com a origem e selecione Back to sample. Selecione Gallery na navegação da página: a coleção final ainda está vazia. Essa distinção evita que uma execução de prática bem-sucedida seja confundida com a entrega completa.
Planeje Todos os Índices de Conclusão
Nesta etapa, transforme o agrupamento de entrada em um manifesto de Job salvo. Nada nesta etapa inicia o trabalho final ainda.
Mude para Workspace, começando em /home/labex/project/photo-gallery. Leia o mapeamento completo das entradas:
cat inputs/groups.txt
Há quatro linhas, de Index 0 a Index 3. As três primeiras contêm seis fotografias cada; o índice 3 contém photo-19 e photo-20. completions conta grupos, não fotografias: esta entrega precisa de 4 índices bem-sucedidos, não 20 nem 3.
Leia as instruções da equipe:
cat inputs/brief.txt
Elas permitem paralelismo solicitado de 1 a 2. Solicitaremos 2 para que dois grupos possam avançar juntos. O Kubernetes pode executar menos Pods enquanto os recursos estiverem indisponíveis; o paralelismo solicitado não é um limite absoluto para todos os processos durante novas tentativas ou encerramentos. Este projeto usa um único nó pequeno preparado, em vez de uma plataforma de processamento distribuído.
Copie o modelo preparado do Job final para seu arquivo editável. cp copia um arquivo; ele mantém intacta a origem em starter/:
cp starter/gallery-job.yaml gallery-job.yaml
Se cp informar No such file or directory, verifique pwd, retorne ao diretório acima e repita a mesma cópia com o nome exato do arquivo. Não crie um modelo substituto vazio.
Use sed para alterar dois valores literais de campos no arquivo copiado. -i edita esse arquivo diretamente. Cada expressão tem a forma s/old/new/: substitui o texto antigo pelo novo. Aspas simples fazem o shell passar a expressão literalmente. Cada um desses campos exatos aparece uma vez neste modelo fornecido:
sed -i 's/completions: 1/completions: 4/' gallery-job.yaml
sed -i 's/parallelism: 1/parallelism: 2/' gallery-job.yaml
Leia o resultado salvo antes de aplicá-lo:
cat gallery-job.yaml
Confirme metadata.name: gallery-batch, completionMode: Indexed, completions: 4 e parallelism: 2. Mantenha a imagem do processador preparada, o comando, o ambiente, as montagens, as configurações de recursos, a política sem novas tentativas e o prazo de 180 segundos. Formatação YAML equivalente ou um novo nome diferente para o Job final são aceitáveis; o arquivo salvo deve descrever o Job que você realmente executa.
Uma substituição digitada incorretamente pode terminar com sucesso sem corresponder a nada, por isso é importante ler o resultado. Se você ainda não aplicou o arquivo, recupere-o copiando o modelo original novamente e repetindo as duas edições. Depois de aplicar um Job, evite copiar novamente com um nome conflitante: os modelos de tarefa dos Jobs geralmente são imutáveis, portanto prepare um novo nome de Job para uma tentativa diferente.
Execute o Lote Completo
Nesta etapa, aplique seu Job salvo e relacione suas evidências nativas de conclusão aos Pods reais dos workers.
Em Workspace, em /home/labex/project/photo-gallery, aplique o arquivo salvo:
kubectl apply -n photo-workshop -f gallery-job.yaml
Espere por todos os índices exigidos:
kubectl wait -n photo-workshop --for=condition=Complete job/gallery-batch --timeout=180s
Leia o resumo nativo do Job:
kubectl get job gallery-batch -n photo-workshop
O Job concluído deve mostrar 4/4 conclusões. describe acrescenta detalhes e eventos:
kubectl describe job gallery-batch -n photo-workshop
Procure Completion Mode: Indexed e Completed Indexes: 0-3. Um intervalo inclui ambas as extremidades, portanto isso cobre todos os quatro grupos, incluindo o último grupo curto. Evidências de conclusão, por si só, não comprovam que o conteúdo das imagens esteja correto; você as inspecionará e baixará a seguir.
Liste apenas os Pods pertencentes a este Job. -l seleciona por uma label. -L acrescenta uma coluna que mostra outra label, aqui o índice de conclusão:
kubectl get pods -n photo-workshop -l batch.kubernetes.io/job-name=gallery-batch -L batch.kubernetes.io/job-completion-index
Espere Pods concluídos para os índices 0, 1, 2 e 3. Completed nesta tabela corresponde à fase de sucesso do Pod. Leia a saída real dos workers. --all-pods=true inclui os Pods do Job, e --prefix=true identifica qual Pod produziu cada linha:
kubectl logs -n photo-workshop job/gallery-batch --all-pods=true --prefix=true
Cada worker nomeia suas fotografias atribuídas e informa saídas de 320 x 220. O índice 3 deve concluir duas fotografias. Esses logs ajudam a explicar o que aconteceu; os arquivos reais, suas relações com as fontes e os Pods bem-sucedidos pertencentes ao Job também são verificados.
Se o tempo de espera se esgotar, use describe e os mesmos comandos de Pods e logs para distinguir uma carga de trabalho inacabada de uma que falhou. Um nome de Job desconhecido geralmente significa que o arquivo não foi aplicado ou que seu nome é diferente: leia gallery-job.yaml e use esse nome real. Não apague os Pods concluídos nem a amostra. O próximo laboratório guiado ensina a recuperação de uma falha temporária deliberada da fonte.
Entregue Imagens Reais
Nesta etapa, inspecione o site completo e salve ambos os arquivos utilizáveis de entrega.
Mude para Gallery, selecione Gallery na navegação da página e atualize. Confirme 20 of 20 images available. Abra Blue and yellow flowers (photo-20), do último grupo curto. Compare a miniatura com sua própria fonte; ela não deve ser uma cópia repetida de outra flor. Selecione Download thumbnail e depois Back to gallery.

A galeria final contém vinte fotografias preparadas distintas, incluindo as duas imagens do último grupo curto. As ações de download ficam abaixo da coleção.
Em Take the collection with you, selecione Download source index CSV e Download gallery ZIP. O CSV associa cada saída ao hash de sua fonte, ao hash da miniatura, ao criador e à página de origem. O ZIP contém index.csv e os JPEGs reais em photos/. A página informa os arquivos realmente disponíveis; ela não recria trabalhos ausentes a partir dos originais. Ainda é possível baixar uma coleção incompleta, portanto verifique o resultado completo antes de entregá-lo.
Selecione Reference na navegação da página e confirme que o exemplo original fornecido ainda funciona. Selecione Credits para ver os criadores e os links das fontes no Wikimedia Commons. As fotografias são materiais de exemplo licenciados sob CC0, não fotografias tiradas pelo LabEx.
Mude para Workspace, em /home/labex/project/photo-gallery. Salve aqui os mesmos downloads reais. curl faz uma requisição a uma URL; --fail retorna um erro para uma falha HTTP, --silent --show-error oculta o medidor de progresso mantendo os erros, e -o nomeia o arquivo de saída. A porta 8091 acessa o Service da galeria preparado a partir desta VM:
curl --fail --silent --show-error http://127.0.0.1:8091/download/index.csv -o gallery-index.csv
curl --fail --silent --show-error http://127.0.0.1:8091/download/gallery.zip -o gallery.zip
Os downloads do navegador são salvos pelo navegador; esses dois comandos salvam as cópias exigidas no espaço de trabalho da VM. Se uma requisição falhar, inspecione o site e repita a requisição depois de resolver o problema. Não edite um índice recebido para ocultar imagens ausentes.
Exiba o cabeçalho e as duas primeiras linhas de dados. head -n 3 lê as três primeiras linhas:
head -n 3 gallery-index.csv
O cabeçalho começa com id,title,source_file,thumbnail,width,height. Cada linha associa uma fotografia ao seu próprio photos/photo-NN.jpg, com dimensões 320,220 e seu crédito real de origem.
Liste o arquivo compactado sem extraí-lo. python3 -m zipfile executa o utilitário ZIP padrão do Python; -l lista os membros:
python3 -m zipfile -l gallery.zip
Encontre index.csv e todos os vinte caminhos JPEG, incluindo photos/photo-20.jpg. Nomes ou contagens, por si só, não comprovam a correção das imagens, portanto as verificações funcionais também decodificam os JPEGs reais e comparam cada um com seu próprio resultado derivado da fonte. Mantenha disponíveis gallery-job.yaml, ambos os downloads, a amostra, os Pods concluídos, os arquivos de origem, a referência e os serviços preparados.
Resumo
Você entregou uma galeria real de fotos com um Job indexado. Mapeou fotografias para índices de conclusão, limitou o paralelismo solicitado, verificou evidências nativas de Pods e Jobs e entregou imagens reais com um índice de fontes. A amostra e a referência permaneceram separadas do trabalho final.



