Introdução
O Juniper Café está pronto para seu cardápio de outono. O site funciona, mas ainda mostra a seleção habitual. Você publicará o novo cardápio pelo Kubernetes, manterá a configuração anterior disponível e baixará o cardápio real para a equipe do balcão.
Você já deve reconhecer Pods, Deployments, Services, labels e YAML simples. O cluster, a imagem da aplicação e o site estão preparados; não é necessário programar a aplicação nem ter uma conta de nuvem. Este laboratório apresenta a pequena parte do Kustomize necessária para dar a cada configuração um nome baseado em seu conteúdo.
Use Workspace para os comandos, Café Menu para o Juniper e Reference Menu para o café separado da sala de leitura. Todas as entradas compartilham uma única VM de treinamento. Mantenha inalterados o café de referência, o código da aplicação, o Service, o número de réplicas e o histórico de versões fornecido. Os 40 minutos estimados pelo autor incluem a leitura e os erros comuns.
Prepare uma Versão Separada do Cardápio
Nesta etapa, relacione o site atual à sua configuração e prepare um diretório de versão sem alterar o cardápio em execução.
Abra Café Menu, selecione Explore the menu e encontre Maple Latte. Atualmente, ele custa $4.20 e está Not available today. Cold Brew está disponível. Abra About this drink para Oat Latte e depois use Back to the menu. Essas são páginas reais servidas pela aplicação preparada.
Mude para Reference Menu e selecione Our menu. Este é o Willow Reading Room, um serviço separado que deve continuar funcionando. Mude para Workspace. Seu diretório inicial é /home/labex/project/cafe-menu; confirme-o com pwd, que exibe o diretório atual:
pwd
Resultado esperado:
/home/labex/project/cafe-menu
Um ConfigMap do Kubernetes armazena a configuração separadamente da imagem de uma aplicação. Um Pod faz referência a esse ConfigMap pelo nome. O processo deste café lê o arquivo de cardápio montado uma única vez, ao iniciar. Editar a configuração não faz esse processo já existente recarregar o cardápio automaticamente.
O diretório starter preparado contém três arquivos pequenos. ls os lista:
ls starter
deployment.json kustomization.yaml menu.json
JSON também é uma entrada válida para manifestos do Kubernetes; deployment.json é a definição preparada do Deployment. Você manterá as configurações da aplicação e alterará os dados separados do cardápio.
Crie seu próprio diretório com cp -r: cp copia, e -r inclui o conteúdo de um diretório. O destino release ainda não existe:
cp -r starter release
Se executar isso duas vezes por engano, cp poderá criar um release/starter aninhado. Os três arquivos necessários ainda devem ficar diretamente em release; remova somente essa cópia aninhada acidental com rm -r release/starter. Não remova release, versions nem approved.
Leia a configuração com cat, que exibe um arquivo:
cat release/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: cafe-menu
resources:
- deployment.json
configMapGenerator:
- name: cafe-menu
files:
- menu.json
resources inclui o Deployment. configMapGenerator transforma menu.json em dados de ConfigMap. O Kustomize acrescenta um sufixo derivado do conteúdo e atualiza a referência do Deployment para esse nome gerado. Assim, dados alterados podem produzir um novo modelo de Pod e um novo rollout, enquanto o ConfigMap anterior continua disponível. O sufixo identifica o conteúdo; ele não informa se os preços estão corretos.
Escreva o Cardápio de Outono Aprovado
Nesta etapa, prepare o cardápio de outono completo antes de aplicar qualquer alteração ao Kubernetes.
Permaneça em Workspace. A aprovação da equipe do balcão está armazenada em approved/menu.csv. CSV significa valores separados por vírgulas: a primeira linha nomeia as colunas, e cada linha seguinte descreve uma bebida. price_cents é um número inteiro de centavos, portanto 450 significa $4.50. true e false indicam se a bebida está disponível.
cat approved/menu.csv
id,name,price_cents,available
espresso,Espresso,250,true
oat-latte,Oat Latte,350,true
cold-brew,Cold Brew,390,false
maple-latte,Maple Latte,450,true
Mantenha Espresso e Oat Latte inalterados. Cold Brew sai da seleção de hoje, e Maple Latte passa a estar disponível por $4.50. O rótulo da estação deve ser Autumn at Juniper; o nome do café, a localização, os horários, as identidades dos itens e as descrições permanecem inalterados.
Escreva o JSON completo abaixo. JSON usa nomes de propriedades entre aspas, vírgulas entre as entradas e valores booleanos em minúsculas, sem aspas. A expressão de shell cat > release/menu.json <<'EOF' grava o texto delimitado nesse arquivo. > substitui o conteúdo anterior; o EOF entre aspas mantém o texto literal. Cole até a linha final EOF, que deve ficar sozinha:
cat > release/menu.json <<'EOF'
{
"name": "Juniper Café",
"season": "Autumn at Juniper",
"hours": "Mon–Sat · 08:00–17:00",
"address": "14 Willow Lane",
"items": [
{"id": "espresso", "name": "Espresso", "price_cents": 250, "available": true, "description": "A small, rich cup with a golden crema."},
{"id": "oat-latte", "name": "Oat Latte", "price_cents": 350, "available": true, "description": "Our espresso with smooth oat milk."},
{"id": "cold-brew", "name": "Cold Brew", "price_cents": 390, "available": false, "description": "Slow-steeped coffee, served over ice."},
{"id": "maple-latte", "name": "Maple Latte", "price_cents": 450, "available": true, "description": "Espresso, oat milk, and a little maple sweetness."}
]
}
EOF
Valide o JSON antes de usá-lo. python3 -m json.tool lê JSON e exibe uma versão indentada; ele não altera o arquivo:
python3 -m json.tool release/menu.json
Uma saída bem-sucedida contém as quatro bebidas. A ferramenta pode exibir \u00e9 no lugar de é; isso é uma sequência de escape JSON, não uma alteração no nome do café. Uma vírgula ou aspa ausente produz um erro de análise com linha e coluna. Para corrigir, escreva novamente o bloco completo acima e repita esta validação. Um caminho errado produz um erro de arquivo não encontrado; execute pwd e retorne com cd /home/labex/project/cafe-menu antes de tentar novamente.
O site ainda mostra o cardápio habitual porque você alterou apenas o código-fonte da sua versão. Isso é esperado.
Publique uma Nova Versão da Configuração
Nesta etapa, renderize a versão, aplique-a e espere que ambas as réplicas do café usem a nova configuração.
Permaneça em Workspace. kubectl kustomize renderiza um diretório sem aplicá-lo. Inspecione o nome do ConfigMap gerado e a referência correspondente do Deployment:
kubectl kustomize release
A saída inclui um nome no formato cafe-menu-... e o mesmo nome na entrada de volumes do Deployment chamada menu. O sufixo exato depende dos dados. Este é um objeto de configuração diferente daquele do cardápio habitual.
Aplique o diretório com kubectl apply -k. A opção -k pede ao kubectl que renderize um diretório Kustomize, em vez de ler um único manifesto com -f:
kubectl apply -k release
A saída esperada inclui:
configmap/cafe-menu-... created
deployment.apps/cafe configured
A criação de um ConfigMap, por si só, não comprova que a aplicação em execução mudou. rollout status espera que o controlador do Deployment substitua os Pods. -n cafe-menu seleciona o namespace desta lição; --timeout=120s limita a espera:
kubectl rollout status deployment/cafe -n cafe-menu --timeout=120s
deployment "cafe" successfully rolled out
Se o tempo de espera se esgotar, mantenha o cenário existente e inspecione-o com os comandos a seguir. Um erro de imagem ou contêiner aparece no estado e nos eventos dos Pods; não execute a preparação novamente nem exclua o namespace:
kubectl get pods -n cafe-menu
kubectl describe deployment cafe -n cafe-menu
Após um rollout normal, inspecione o Deployment atual e seus ReplicaSets. Um ReplicaSet mantém um modelo específico de Pod; o Deployment conserva ReplicaSets anteriores como histórico de rollout:
kubectl get replicasets -n cafe-menu -l app=cafe
Inspecione o próprio Deployment pelo nome:
kubectl get deployment cafe -n cafe-menu
Ele deve mostrar 2/2 réplicas prontas. Vários objetos de configuração continuam presentes; aplicar uma nova versão não sobrescreveu o cardápio anterior. Liste-os:
kubectl get configmaps -n cafe-menu
Não exclua essas configurações anteriores. Um ReplicaSet anterior precisa do nome exato da configuração à qual faz referência caso essa versão seja restaurada mais tarde.
Verifique o Site e Entregue seu Cardápio
Nesta etapa, verifique a experiência real do cliente e salve o cardápio que a equipe do balcão usará.
Mude para Café Menu, selecione Our menu e atualize a página se ela já estiver aberta. Maple Latte deve estar Available today por $4.50. Cold Brew deve estar Not available today. Abra a página de detalhes de Maple Latte, volte com Back to the menu e depois use Visit us para confirmar que a localização e os horários continuam funcionando.

Observe os indicadores de disponibilidade e os preços: Cold Brew está indisponível, e Maple Latte está disponível por $4.50.
Use Download menu para baixar o CSV completo real. Abra-o e compare as quatro bebidas com a tabela aprovada da Etapa 2. O download inclui bebidas indisponíveis com false, para que a equipe possa distingui-las de itens ausentes por engano.
Mude para Reference Menu e confirme que o cardápio habitual do Willow Reading Room continua funcionando. Depois retorne a Workspace.
Você também pode salvar o download real do Juniper em seu espaço de trabalho. curl faz uma requisição à entrada local do navegador, que a encaminha ao Service real do Kubernetes. --fail informa erros HTTP; --silent oculta o medidor de progresso; --show-error mantém as mensagens de erro visíveis; -o escolhe o nome do arquivo de saída:
curl --fail --silent --show-error http://127.0.0.1:8081/menu.csv -o menu-handover.csv
Compare o arquivo recebido com a aprovação usando diff -u. A opção -u mostra as linhas próximas se houver alguma diferença:
diff -u approved/menu.csv menu-handover.csv
Nenhuma saída significa que os arquivos são iguais. Uma diferença é uma evidência útil: volte ao código-fonte do cardápio e ao rollout em execução, corrija a causa, repita o download e compare novamente. Não edite o CSV recebido para ocultar um site incorreto.
Agora você tem um cardápio utilizável, seu download real para a equipe e um diretório de versão que reproduz a configuração em execução. Mantenha versions e os ConfigMaps anteriores intactos como materiais de recuperação neste cenário. A próxima lição prepara seu próprio ambiente independente.
Resumo
Você preparou uma versão completa do cardápio, gerou um ConfigMap com nome baseado no conteúdo e acompanhou o rollout do Deployment até as duas réplicas da aplicação. Verificou páginas e downloads reais, preservou o café de referência e as configurações anteriores e entregou o CSV real para a equipe do balcão.
O próximo laboratório começa em um ambiente separado. Ele reutiliza essas ideias para restaurar um cardápio cuja aplicação está saudável, mas cujos preços estão errados.



