Proyecto projet13-kubernetes-helm-tp · 36 preguntas de autoevaluación
Estas preguntas tratan precisamente de ESTE proyecto (
chart/,values.yaml,values-dev.yaml,_helpers.tpl,apps/portail, las tres averías). Responde antes de desplegar la corrección. Las respuestas correctas están repartidas entre A, B, C y D.
| Tema | Preguntas |
|---|---|
| A — Helm: ideas de base | 1 a 6 |
| B — Anatomía del Chart hedge | 7 a 12 |
| C — Templates, Values y helpers | 13 a 20 |
| D — Los tres entornos | 21 a 26 |
| E — install, upgrade, rollback | 27 a 31 |
| F — Las tres averías del proyecto | 32 a 36 |
| Corrección recapitulativa | — |
1. En una frase, ¿qué hace Helm?
kubectldocker buildB. Helm renderiza templates YAML con variables (values.yaml) y luego aplica el resultado en el clúster bajo el nombre de una release. kubectl sigue siendo imprescindible para observar el clúster.
2. ¿Qué es una release Helm?
Chart.yaml firmadohedge-dev, hedge-staging, hedge-prod)C. Un mismo Chart puede instalarse varias veces. Cada instalación es una release. El namespace es el lugar de aislamiento; la release es el objeto Helm.
3. En este proyecto, ¿qué afirmación es cierta?
{{ .Chart.Name }} cambia en cada helm install, {{ .Release.Name }} se queda idéntico{{ .Release.Name }} cambia en cada helm install, {{ .Chart.Name }} se queda idénticohelm upgradeB. El Chart se llama siempre hedge. El nombre de release (hedge-dev, hedge-staging, hedge-prod) cambia en cada instalación. Ese contraste es el que permite el multi-entorno.
4. ¿Qué comando produce el YAML sin desplegar nada en el clúster?
helm installhelm upgradehelm linthelm templateD. helm template es un render seco. helm lint verifica la sintaxis, pero no muestra los manifiestos. install y upgrade tocan el clúster.
5. ¿Para qué sirve un archivo cuyo nombre empieza por _ en templates/ (ejemplo: _helpers.tpl)?
_helpersdefine / include)C. El prefijo _ significa «solo helper». Las funciones se llaman después con {{ include "hedge.labels" ... }}.
6. En Chart.yaml, ¿cuál es la diferencia entre version y appVersion?
version es la versión del Chart (empaquetado Helm); appVersion es la versión de la aplicación desplegadaversion es el número de revisión Helm; appVersion es el tag Dockerversion sirve a Kubernetes; appVersion sirve a HelmB. Se puede cambiar version (por ejemplo 0.1.0 a 0.2.0) sin cambiar el código de la aplicación, e inversamente. No es el número de revisión (helm history), ni automáticamente el tag de imagen.
7. En este proyecto, ¿qué contiene la carpeta apps/?
portail y de la api, que no hay que modificarvalues-<env>.yamlvalider.ps1B. Tú eres el DevOps: el código de la aplicación ya está escrito. Modificar apps/ está prohibido por el reglamento del TP.
8. ¿Por qué la carpeta chart/casses/ no está dentro de chart/templates/?
casse-templates/ para observar el bugtemplates/B. Helm renderiza todos los archivos de templates/ (salvo los prefijados por _). Dejar las averías en casses/ evita romper el Chart antes de la misión 6.
9. En el values.yaml de este proyecto, ¿en qué puerto escucha el contenedor portail?
C. portail.service.targetPort: 5000 (es el puerto Flask). port: 80 es el puerto del Service. nodePort: 30130 es el puerto expuesto en la máquina (DEV). 8000 es el targetPort de la api.
10. En este proyecto, ¿qué tipo de Service está previsto para la api en values.yaml?
D. La api se queda interna al clúster. El portal la llama por DNS (http://hedge-dev-api). Solo el portal está en NodePort para el navegador.
11. ¿Cuántas imágenes Docker debes construir una sola vez antes de desplegar los tres entornos?
hedge:1.0)hedge-portail:1.0 y hedge-api:1.0)B. Los tres entornos reutilizan las mismas imágenes. Lo que cambia son los valores inyectados (color, replicas, mensaje), no el código.
12. El portal muestra una franja de color y un mensaje. ¿De dónde vienen esas informaciones?
apps/portail/app.pycouleur.txt montado en volumenB. app.py lee THEME_COLOR, BANNIERE_MESSAGE, ENVIRONMENT, etc. El mismo código se adapta a DEV / STAGING / PROD sin modificación.
13. ¿Qué renderiza {{ .Values.portail.replicas }} si values-prod.yaml contiene portail.replicas: 3 y lo instalas con -f values-prod.yaml?
1 (el valor de values.yaml gana siempre)3 (el archivo pasado con -f sobrescribe values.yaml)defaultB. values.yaml da los valores por defecto. Cada values-<env>.yaml sobrescribe solo lo que cambia. Es el principio mismo del multi-entorno.
14. ¿Por qué un archivo values-prod.yaml que redefine portail.image.repository es un error pedagógico en este proyecto?
repository no existeChart.yamlB. En values-<env>.yaml solo se recopia lo que distingue el entorno (replicas, nodePort, color, mensaje, environment). Recopiar el resto es volver al copiar-pegar que Helm debía sustituir.
15. En este proyecto, el helper hedge.fullname debe producir, para la release hedge-dev y el componente portail:
hedge-portailportail-hedge-devhedge-dev-portailhedgeC. Formato <release>-<composant>. Ese prefijo es el que evita las colisiones de nombres entre DEV, STAGING y PROD (e incluso en un mismo namespace).
16. ¿Qué labels deben figurar solas en hedge.selectorLabels?
name, instance, component — las tres que no cambiarán nunca para esta instanciahedge.labels, incluidas version y hedge/environmenthedge/environmenthelm.sh/chartA. spec.selector.matchLabels es inmutable. Poner ahí version, helm.sh/chart o hedge/environment hará fallar el primer helm upgrade que cambie esos valores.
17. ¿Por qué BACKEND_URL del portal no puede valer http://api a pelo?
hedge-<release>-api (p. ej. hedge-dev-api): el nombre DNS depende de la releaseB. El helper hedge.fullname construye hedge-dev-api, hedge-staging-api, hedge-prod-api. Un nombre a pelo api no resuelve nada en el namespace.
18. ¿Qué hace {{ .Values.environment | quote }}?
B. quote produce "dev" en vez de dev. Sin comillas, ciertos valores YAML (colores hexadecimales, mensajes) pueden romper el manifiesto.
19. ¿Por qué replicas: "{{ .Values.portail.replicas }}" (con comillas alrededor de todo el template) es peligroso?
"1", que la API rechazaB. Nunca pongas comillas a un entero. Se escribe replicas: {{ .Values.portail.replicas }}, no replicas: "{{ ... }}".
20. ¿Para qué sirve nindent 4 en {{ include "hedge.labels" ... | nindent 4 }}?
B. Helm inyecta un bloque de varias líneas. Sin nindent, la indentación YAML se rompe y obtienes error converting YAML to JSON.
21. En este proyecto, ¿qué nodePort está reservado a STAGING?
B. DEV = 30130, STAGING = 30131, PROD = 30132. El 30500 es el portal del proyecto 12, no de este.
22. ¿Cuántas replicas portail + api debes tener en PROD una vez el Chart correctamente desplegado?
C. PROD: 3 portales y 3 apis. DEV: 1+1. STAGING: 2+2. En total, 12 Pods de aplicación lado a lado.
23. ¿Qué color de franja corresponde al entorno DEV?
#ea580c#16a34a#64748b#2563ebD. Azul = DEV, naranja = STAGING, verde = PROD. El gris #64748b es el color por defecto de values.yaml (entorno default), no el de uno de los tres archivos de entorno.
24. ¿Por qué desplegar cada entorno en su propio namespace (hedge-dev, hedge-staging, hedge-prod)?
values.yaml lo imponeB. Helm autoriza varias releases en un mismo namespace (es precisamente la trampa de la avería 1 si los nombres van a pelo). Los namespaces siguen siendo la buena práctica: aislamiento, quotas, RBAC, claridad.
25. ¿Qué comando instala correctamente el entorno DEV de este proyecto?
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. Se apunta al Chart (.\chart), se sobrescribe con -f values-dev.yaml, se nombra la release hedge-dev, se crea el namespace. helm template no despliega nada. values-dev.yaml no es un manifiesto kubectl.
26. Si abres http://localhost:30132 y la franja es verde, ¿qué ves necesariamente en el JSON /api-json?
"env": "dev""env": "staging""env": "prod" y "backend": "ok" si la api del mismo namespace responde"env": "default"C. El puerto 30132 es el de PROD. El campo env viene de .Values.environment. backend: ok prueba que BACKEND_URL apunta bien al Service api de esta release.
27. Después de helm install hedge-dev ... y luego helm upgrade hedge-dev ... --set portail.replicas=5, ¿qué muestra helm history hedge-dev -n hedge-dev?
B. Cada install / upgrade / rollback crea una revisión. Ese diario es el que hace posible la vuelta atrás.
28. ¿Qué hace helm rollback hedge-dev 1 -n hedge-dev?
Rollback to 1values.yaml a cero en el discoB. El rollback no borra el historial: añade una revisión. values-dev.yaml en tu disco no cambia.
29. ¿Cuál es la diferencia fundamental entre helm upgrade --set portail.replicas=5 y kubectl scale deploy/hedge-dev-portail --replicas=5?
kubectl scale es más lentohelm upgrade queda trazado y anulable por Helm; kubectl scale sale del control de Helm y será pisado en el próximo upgrade sin --setkubectl scale sobre un objeto creado por HelmC. Helm reconverge hacia las Values en el próximo upgrade. Una modificación manual (scale, edit) es una deuda invisible. Es la pregunta de reflexión de la misión 5.
30. ¿helm uninstall hedge-dev -n hedge-dev elimina el namespace hedge-dev?
kubectl delete namespace)B. uninstall quita Deployment, Service, etc. de la release. El namespace sobrevive. De ahí el comando de limpieza del README: kubectl delete namespace hedge-dev ....
31. ¿Qué ocurre si haces kubectl delete pod hedge-dev-portail-xxxxx -n hedge-dev sobre un Pod creado por el Deployment Helm?
B. Helm declara el Deployment. Kubernetes mantiene el número de replicas. Eliminar un Pod es el gesto pedagógico de autorreparación, no una avería Helm.
32. Avería 1 (casse-1-configmap.yaml): ¿por qué falla la segunda release en el mismo namespace?
metadata.name: hedge-config es un nombre estático: las dos releases se disputan el mismo objetodatavalues-staging.yaml es inválidoB. El correctivo es prefijar el nombre con la release: {{ include "hedge.fullname" (dict "root" . "composant" "config") }} produce hedge-dev-config y hedge-staging-config.
33. Avería 2 (casse-2-worker-deployment.yaml): ¿qué mensaje Kubernetes ves en el 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á en matchLabels. Cambiar environment cambia el selector, cosa que Kubernetes rechaza. A y B son los síntomas de las averías 3 y 1.
34. En un Deployment, ¿dónde se tiene derecho a poner la label hedge/environment?
spec.selector.matchLabelstemplate.metadata.labels) y las labels del objeto, no en matchLabelsChart.yamlB. Las labels del Pod pueden ser ricas y variables. El selector debe seguir siendo un subconjunto estable. Esa es toda la distinción hedge.labels vs hedge.selectorLabels.
35. Avería 3 (casse-3-cache-deployment.yaml): ¿qué significa el error nil pointer evaluating interface {}.replicas sobre .Values.portal.replicas?
values.yaml define portail (con una i), no portal — Helm evalúa nil.replicas.Release.portal.replicasreplicas está prohibido en un Deployment creado por HelmB. Una sola letra de más. Primer reflejo: helm template --debug y leer el path en el mensaje de error.
36. Mañana debes añadir un 4.º entorno pre-prod. ¿Qué archivos creas, cuáles no tocas?
chart/ y renombras el Chartchart/environments/values-preprod.yaml (y un helm install + namespace); los templates y values.yaml se quedan igualestemplates/apps/portail/app.py para reconocer pre-prodB. Es la promesa de Helm: un Chart, N archivos de valores. Si tienes que tocar los templates para un entorno nuevo, el Chart está mal diseñado.
| # | Respuesta | Idea a retener |
|---|---|---|
| 1 | B | Helm = templates + values + release |
| 2 | C | Una release = una instalación nombrada |
| 3 | B | .Release.Name cambia, .Chart.Name no |
| 4 | D | helm template = render seco |
| 5 | C | _helpers.tpl no crea ningún objeto |
| 6 | B | version = Chart; appVersion = app |
| 7 | B | apps/ está fijado |
| 8 | B | casses/ fuera de templates/ a propósito |
| 9 | C | Contenedor portail = puerto 5000 |
| 10 | D | api = ClusterIP |
| 11 | B | Dos imágenes, tres entornos |
| 12 | B | Color y mensaje vienen de las env vars Helm |
| 13 | B | -f sobrescribe values.yaml |
| 14 | B | Recopiar solo lo que difiere |
| 15 | C | hedge-dev-portail |
| 16 | A | Selector = name + instance + component |
| 17 | B | BACKEND_URL debe incluir el nombre de release |
| 18 | B | quote = comillas YAML |
| 19 | B | Nunca pongas comillas a un entero replicas |
| 20 | B | nindent salva la indentación |
| 21 | B | STAGING = 30131 |
| 22 | C | PROD = 3 + 3 |
| 23 | D | DEV = azul #2563eb |
| 24 | B | Un namespace por entorno |
| 25 | B | helm install ... -f values-dev.yaml -n hedge-dev |
| 26 | C | 30132 = prod + backend ok |
| 27 | B | El historial acumula las revisiones |
| 28 | B | Rollback = nueva revisión |
| 29 | C | scale fuera de Helm será pisado |
| 30 | B | uninstall no mata el namespace |
| 31 | B | Delete pod = autorreparación del Deployment |
| 32 | B | Nombre a pelo = colisión entre releases |
| 33 | C | Selector inmutable |
| 34 | B | Label variable OK en el Pod, prohibida en matchLabels |
| 35 | B | Typo portal / portail |
| 36 | B | Un entorno nuevo = un archivo de valores |
Puntuación indicativa: 30/36 o más = puedes explicar el proyecto a un compañero. Por debajo de 24/36, reléelas secciones «Conceptos esenciales», «Misión 3» y «Misión 6» de 00-ENONCE.md.
Curso creado por el Dr. Haythem REHOUMA — Desarrollo y despliegue de soluciones de datos