Projeto projet13-kubernetes-helm-tp · 36 perguntas de autoavaliação
Estas perguntas incidem precisamente sobre ESTE projeto (
chart/,values.yaml,values-dev.yaml,_helpers.tpl,apps/portail, as três avarias). Responda antes de abrir a correção. As respostas certas estão distribuídas entre A, B, C e D.
| Tema | Perguntas |
|---|---|
| A — Helm: ideias de base | 1 a 6 |
| B — Anatomia do Chart hedge | 7 a 12 |
| C — Templates, Values e helpers | 13 a 20 |
| D — Os três ambientes | 21 a 26 |
| E — install, upgrade, rollback | 27 a 31 |
| F — As três avarias do projeto | 32 a 36 |
| Correção recapitulativa | — |
1. Numa frase, o que faz o Helm?
kubectldocker buildB. O Helm renderiza templates YAML com variáveis (values.yaml) e depois aplica o resultado no cluster sob o nome de uma release. O kubectl continua indispensável para observar o cluster.
2. O que é uma release Helm?
Chart.yaml assinadohedge-dev, hedge-staging, hedge-prod)C. O mesmo Chart pode ser instalado várias vezes. Cada instalação é uma release. O namespace é o local de isolamento; a release é o objeto Helm.
3. Neste projeto, qual afirmação é verdadeira?
{{ .Chart.Name }} muda em cada helm install, {{ .Release.Name }} permanece idêntico{{ .Release.Name }} muda em cada helm install, {{ .Chart.Name }} permanece idênticohelm upgradeB. O Chart chama-se sempre hedge. O nome da release (hedge-dev, hedge-staging, hedge-prod) muda em cada instalação. É este contraste que permite o multiambiente.
4. Qual comando produz o YAML sem implantar nada no cluster?
helm installhelm upgradehelm linthelm templateD. helm template é uma renderização seca. helm lint verifica a sintaxe, mas não mostra os manifestos. install e upgrade tocam no cluster.
5. Para que serve um ficheiro cujo nome começa por _ em templates/ (exemplo: _helpers.tpl)?
_helpersdefine / include)C. O prefixo _ significa «apenas helper». As funções chamam-se depois com {{ include "hedge.labels" ... }}.
6. Em Chart.yaml, qual é a diferença entre version e appVersion?
version é a versão do Chart (embalagem Helm); appVersion é a versão da aplicação implantadaversion é o número de revisão Helm; appVersion é a tag Dockerversion serve ao Kubernetes; appVersion serve ao HelmB. Pode mudar version (por exemplo 0.1.0 para 0.2.0) sem mudar o código da aplicação, e inversamente. Não é o número de revisão (helm history), nem automaticamente a tag da imagem.
7. Neste projeto, o que contém a pasta apps/?
portail e da api, a não modificarvalues-<env>.yamlvalider.ps1B. Você é o DevOps: o código da aplicação já está escrito. Modificar apps/ é proibido pelo regulamento do TP.
8. Por que a pasta chart/casses/ não está dentro de chart/templates/?
casse-templates/ a fim de observar o errotemplates/B. O Helm renderiza todos os ficheiros de templates/ (exceto os prefixados por _). Deixar as avarias em casses/ evita partir o Chart antes da missão 6.
9. Em values.yaml deste projeto, em que porta o contentor portail escuta?
C. portail.service.targetPort: 5000 (é a porta Flask). port: 80 é a porta do Service. nodePort: 30130 é a porta exposta na máquina (DEV). 8000 é o targetPort da api.
10. Neste projeto, que tipo de Service está previsto para a api em values.yaml?
D. A api permanece interna ao cluster. O portal chama-a por DNS (http://hedge-dev-api). Só o portal está em NodePort para o navegador.
11. Quantas imagens Docker deve construir uma única vez antes de implantar os três ambientes?
hedge:1.0)hedge-portail:1.0 e hedge-api:1.0)B. Os três ambientes reutilizam as mesmas imagens. O que muda são os valores injetados (cor, replicas, mensagem), não o código.
12. O portal mostra um bandeau colorido e uma mensagem. De onde vêm estas informações?
apps/portail/app.pycouleur.txt montado em volumeB. app.py lê THEME_COLOR, BANNIERE_MESSAGE, ENVIRONMENT, etc. O mesmo código adapta-se a DEV / STAGING / PROD sem alteração.
13. O que renderiza {{ .Values.portail.replicas }} se values-prod.yaml contém portail.replicas: 3 e você instala com -f values-prod.yaml?
1 (o valor de values.yaml ganha sempre)3 (o ficheiro passado com -f sobrepõe values.yaml)defaultB. values.yaml fornece os valores por omissão. Cada values-<env>.yaml sobrepõe apenas o que muda. É o próprio princípio do multiambiente.
14. Por que um ficheiro values-prod.yaml que redefine portail.image.repository é um erro pedagógico neste projeto?
repository não existeChart.yamlB. Recopia-se em values-<env>.yaml apenas o que distingue o ambiente (replicas, nodePort, cor, mensagem, environment). Recopiar o resto é voltar ao copiar-colar que o Helm deveria substituir.
15. Neste projeto, o helper hedge.fullname deve produzir, para a release hedge-dev e o componente portail:
hedge-portailportail-hedge-devhedge-dev-portailhedgeC. Formato <release>-<composant>. É este prefixo que evita as colisões de nomes entre DEV, STAGING e PROD (e até no mesmo namespace).
16. Quais labels devem apenas figurar em hedge.selectorLabels?
name, instance, component — os três que nunca mudarão para esta instânciahedge.labels, incluindo version e hedge/environmenthedge/environmenthelm.sh/chartA. spec.selector.matchLabels é imutável. Colocar aí version, helm.sh/chart ou hedge/environment fará falhar o primeiro helm upgrade que mude estes valores.
17. Por que BACKEND_URL do portal não pode valer http://api em concreto?
hedge-<release>-api (ex. hedge-dev-api): o nome DNS depende da releaseB. O helper hedge.fullname constrói hedge-dev-api, hedge-staging-api, hedge-prod-api. Um nome em concreto api não resolve nada no namespace.
18. O que faz {{ .Values.environment | quote }}?
B. quote produz "dev" em vez de dev. Sem aspas, certos valores YAML (cores hexadecimais, mensagens) podem partir o manifesto.
19. Por que replicas: "{{ .Values.portail.replicas }}" (com aspas à volta de todo o template) é perigoso?
"1", que a API recusaB. Nunca colocar aspas num inteiro. Escreve-se replicas: {{ .Values.portail.replicas }}, não replicas: "{{ ... }}".
20. Para que serve nindent 4 em {{ include "hedge.labels" ... | nindent 4 }}?
B. O Helm injeta um bloco de várias linhas. Sem nindent, a indentação YAML parte e obtém error converting YAML to JSON.
21. Neste projeto, que nodePort está reservado ao STAGING?
B. DEV = 30130, STAGING = 30131, PROD = 30132. O 30500 é o portal do projeto 12, não deste.
22. Quantas replicas portail + api deve ter em PROD depois de o Chart estar corretamente implantado?
C. PROD: 3 portais e 3 apis. DEV: 1+1. STAGING: 2+2. No total, 12 Pods de aplicação lado a lado.
23. Que cor de bandeau corresponde ao ambiente DEV?
#ea580c#16a34a#64748b#2563ebD. Azul = DEV, laranja = STAGING, verde = PROD. O cinzento #64748b é a cor por omissão de values.yaml (ambiente default), não a de um dos três ficheiros de ambiente.
24. Por que implantar cada ambiente no seu próprio namespace (hedge-dev, hedge-staging, hedge-prod)?
values.yaml o impõeB. O Helm autoriza várias releases no mesmo namespace (é aliás a armadilha da avaria 1 se os nomes estiverem em concreto). Os namespaces continuam a ser a boa prática: isolamento, quotas, RBAC, clareza.
25. Que comando instala corretamente o ambiente DEV deste projeto?
kubectl apply -f chart/environments/values-dev.yamlhelm install hedge-dev .\chart -f .\chart\environments\values-dev.yaml -n hedge-dev --create-namespacehelm template hedge-dev .\chartdocker compose up -dB. Aponta-se para o Chart (.\chart), sobrepõe-se com -f values-dev.yaml, nomeia-se a release hedge-dev, cria-se o namespace. helm template não implanta nada. values-dev.yaml não é um manifesto kubectl.
26. Se abrir http://localhost:30132 e o bandeau estiver verde, o que vê necessariamente no JSON /api-json?
"env": "dev""env": "staging""env": "prod" e "backend": "ok" se a api do mesmo namespace responder"env": "default"C. A porta 30132 é a de PROD. O campo env vem de .Values.environment. backend: ok prova que BACKEND_URL aponta mesmo para o Service api desta release.
27. Depois de helm install hedge-dev ... e depois helm upgrade hedge-dev ... --set portail.replicas=5, o que mostra helm history hedge-dev -n hedge-dev?
B. Cada install / upgrade / rollback cria uma revisão. É este diário que torna possível o retorno atrás.
28. helm rollback hedge-dev 1 -n hedge-dev faz o quê?
Rollback to 1values.yaml a zero no discoB. O rollback não apaga o histórico: acrescenta uma revisão. values-dev.yaml no seu disco não muda.
29. Qual é a diferença fundamental entre helm upgrade --set portail.replicas=5 e kubectl scale deploy/hedge-dev-portail --replicas=5?
kubectl scale é mais lentohelm upgrade é rastreado e anulável pelo Helm; kubectl scale sai do controlo do Helm e será substituído no próximo upgrade sem --setkubectl scale é proibido pelo Kubernetes num objeto criado pelo HelmC. O Helm reconverge para os Values no próximo upgrade. Uma alteração manual (scale, edit) é uma dívida invisível. É a questão de reflexão da missão 5.
30. helm uninstall hedge-dev -n hedge-dev apaga o namespace hedge-dev?
kubectl delete namespace)B. uninstall retira Deployment, Service, etc. da release. O namespace sobrevive. Daí o comando de limpeza do README: kubectl delete namespace hedge-dev ....
31. O que acontece se fizer kubectl delete pod hedge-dev-portail-xxxxx -n hedge-dev num Pod criado pelo Deployment Helm?
B. O Helm declara o Deployment. O Kubernetes mantém o número de replicas. Apagar um Pod é o gesto pedagógico de autorreparação, não uma avaria Helm.
32. Avaria 1 (casse-1-configmap.yaml): por que a segunda release no mesmo namespace falha?
metadata.name: hedge-config é um nome estático: as duas releases disputam o mesmo objetodatavalues-staging.yaml é inválidoB. A correção é prefixar o nome com a release: {{ include "hedge.fullname" (dict "root" . "composant" "config") }} produz hedge-dev-config e hedge-staging-config.
33. Avaria 2 (casse-2-worker-deployment.yaml): que mensagem Kubernetes vê no helm upgrade --set environment=recette?
nil pointer evaluating interface {}.replicasConfigMap "hedge-config" exists and cannot be importedspec.selector: Invalid value: ...: field is immutableImagePullBackOffC. hedge/environment está em matchLabels. Mudar environment muda o seletor, o que o Kubernetes recusa. A e B são os sintomas das avarias 3 e 1.
34. Num Deployment, onde se tem o direito de colocar o label hedge/environment?
spec.selector.matchLabelstemplate.metadata.labels) e nos labels do objeto, não em matchLabelsChart.yamlB. Os labels do Pod podem ser ricos e variáveis. O seletor deve permanecer um subconjunto estável. É toda a distinção hedge.labels vs hedge.selectorLabels.
35. Avaria 3 (casse-3-cache-deployment.yaml): o que significa o erro nil pointer evaluating interface {}.replicas em .Values.portal.replicas?
values.yaml define portail (com um i), não portal — o Helm avalia nil.replicas.Release.portal.replicasreplicas é proibido num Deployment criado pelo HelmB. Uma só letra a mais. Primeiro reflexo: helm template --debug e ler o caminho na mensagem de erro.
36. Precisa de acrescentar amanhã um 4.º ambiente pre-prod. Que ficheiros cria, quais não toca?
chart/ e muda o nome do Chartchart/environments/values-preprod.yaml (e um helm install + namespace); os templates e values.yaml permanecem inalteradostemplates/apps/portail/app.py para reconhecer pre-prodB. É a promessa do Helm: um Chart, N ficheiros de valores. Se tiver de tocar nos templates para um novo ambiente, o Chart está mal concebido.
| # | Resposta | Ideia a reter |
|---|---|---|
| 1 | B | Helm = templates + values + release |
| 2 | C | Uma release = uma instalação nomeada |
| 3 | B | .Release.Name muda, .Chart.Name não |
| 4 | D | helm template = renderização seca |
| 5 | C | _helpers.tpl não cria nenhum objeto |
| 6 | B | version = Chart ; appVersion = aplicação |
| 7 | B | apps/ está congelado |
| 8 | B | casses/ fora de templates/ de propósito |
| 9 | C | Contentor portail = porta 5000 |
| 10 | D | api = ClusterIP |
| 11 | B | Duas imagens, três ambientes |
| 12 | B | Cor e mensagem vêm das env vars Helm |
| 13 | B | -f sobrepõe values.yaml |
| 14 | B | Recopiar só o que difere |
| 15 | C | hedge-dev-portail |
| 16 | A | Seletor = name + instance + component |
| 17 | B | BACKEND_URL deve incluir o nome da release |
| 18 | B | quote = aspas YAML |
| 19 | B | Nunca colocar aspas num inteiro replicas |
| 20 | B | nindent salva a indentação |
| 21 | B | STAGING = 30131 |
| 22 | C | PROD = 3 + 3 |
| 23 | D | DEV = azul #2563eb |
| 24 | B | Um namespace por ambiente |
| 25 | B | helm install ... -f values-dev.yaml -n hedge-dev |
| 26 | C | 30132 = prod + backend ok |
| 27 | B | O histórico acumula as revisões |
| 28 | B | Rollback = nova revisão |
| 29 | C | scale fora do Helm será substituído |
| 30 | B | uninstall não mata o namespace |
| 31 | B | Delete pod = autorreparação do Deployment |
| 32 | B | Nome em concreto = colisão entre releases |
| 33 | C | Seletor imutável |
| 34 | B | Label variável OK no Pod, proibido em matchLabels |
| 35 | B | Erro de digitação portal / portail |
| 36 | B | Um novo env = um ficheiro de valores |
Pontuação indicativa: 30/36 ou mais = consegue explicar o projeto a um colega. Abaixo de 24/36, releia as secções «Conceitos essenciais», «Missão 3» e «Missão 6» de 00-ENONCE.md.
Curso criado pelo Dr. Haythem REHOUMA — Desenvolvimento e implantação de soluções de dados