@@ -26,22 +26,24 @@ Además:
2626## 2) Estructura de manifiestos
2727
2828Los manifests del portfolio viven bajo:
29+ ``` text
2930k8s/portfolio/
3031├── backend/
31- │ ├── deployment.yaml
32- │ ├── service.yaml
33- │ ├── configmap.yaml
34- │ ├── secret.yaml
35- │ └── job-migrations.yaml
32+ │ ├── deployment.yaml
33+ │ ├── service.yaml
34+ │ ├── configmap.yaml
35+ │ ├── secret.yaml
36+ │ └── job-migrations.yaml
3637├── frontend/
37- │ ├── deployment.yaml
38- │ └── service.yaml
38+ │ ├── deployment.yaml
39+ │ └── service.yaml
3940├── postgres/
40- │ ├── deployment.yaml
41- │ ├── service.yaml
42- │ └── pvc.yaml
41+ │ ├── deployment.yaml
42+ │ ├── service.yaml
43+ │ └── pvc.yaml
4344└── traefik/
44- └── (opcional) CRDs / IngressRoute / Middleware si se usan
45+ └── (opcional) CRDs / IngressRoute / Middleware si se usan
46+ ```
4547
4648> Nota: el objetivo de esta estructura es separar el trabajo propio del contenido upstream y mantener una evolución por fases.
4749
@@ -53,9 +55,11 @@ Namespace:
5355- ` portfolio `
5456
5557Comandos útiles:
58+ ``` bash
5659kubectl get ns
5760kubectl -n portfolio get pods,svc,ingress,ingressroute,middleware,job
5861kubectl -n portfolio describe deploy backend
62+ ```
5963
6064## 4) Estructura de manifiestos
6165Imágenes y versionado (tags inmutables)
@@ -64,9 +68,10 @@ Las imágenes se publican en GHCR.
6468Para despliegues “reproducibles”, los deployments usan tags inmutables (ej: sha-...) en lugar de latest, para evitar latest en producción.
6569
6670Ver imagen actual:
67-
71+ ``` bash
6872kubectl -n portfolio get deploy backend -o=jsonpath=' {.spec.template.spec.containers[0].image}{"\n"}'
6973kubectl -n portfolio get deploy frontend -o=jsonpath=' {.spec.template.spec.containers[0].image}{"\n"}'
74+ ```
7075
7176## 5) Variables de entorno (ConfigMap/Secret)
7277
@@ -79,9 +84,10 @@ backend-secret (Secret)
7984Se inyectan vía envFrom en el deployment.
8085
8186Ver qué hay definido:
82-
87+ ``` bash
8388kubectl -n portfolio get cm backend-config -o yaml
8489kubectl -n portfolio get secret backend-secret -o yaml
90+ ```
8591
8692Importante: no versionar secretos reales. En el repo se deja un ejemplo o placeholders si corresponde.
8793
94100k8s/portfolio/backend/job-migrations.yaml
95101
96102Ejecutar migraciones (manual / on-demand):
97-
103+ ``` bash
98104kubectl -n portfolio delete job backend-migrations --ignore-not-found
99105kubectl -n portfolio apply -f k8s/portfolio/backend/job-migrations.yaml
100106kubectl -n portfolio get jobs
@@ -103,93 +109,50 @@ kubectl -n portfolio logs "$POD"
103109
104110Salida esperada:
105111✅ migrations + initial_data OK
112+ ```
106113
107114## 7) Exposición pública (Traefik / Ingress)
108115Este cluster usa Traefik (incluido en k3s) como Ingress Controller.
109116
117+ ``` text
110118Reglas de ruteo:
111119
112120/ → frontend (service:80)
113121
114122/api → backend (service:8000)
115123
116124/docs → manejado por backend (FastAPI)
117-
125+ ```
118126Ver recursos de entrada:
119127
128+ ``` bash
120129kubectl -n portfolio get ingress
121130kubectl -n portfolio get ingressroute,middleware
122-
123- Si se usa IngressRoute/Middleware (CRDs de Traefik), asegurarse de que existan los CRDs instalados:
124-
131+ ```
132+ Nota > Si se usa IngressRoute/Middleware (CRDs de Traefik), asegurarse de que existan los CRDs instalados:
133+ ``` bash
125134kubectl get crd | grep -i traefik
126-
135+ ```
127136## 8) Operación y troubleshooting
128137Rollouts
138+ ``` bash
129139kubectl -n portfolio rollout status deploy/backend
130140kubectl -n portfolio rollout status deploy/frontend
131-
141+ ```
132142Logs
143+ ``` bash
133144kubectl -n portfolio logs deploy/backend --tail=200
134145kubectl -n portfolio logs deploy/frontend --tail=200
135-
146+ ```
136147ImagePullBackOff / ErrImagePull
137148
138149Checklist:
139150
140- - el tag existe en GHCR.
141-
142- - el owner en ghcr.io/<owner >/... está en minúsculas
143-
144- el deployment apunta al tag correcto (no duplicado/concatenado)
145-
146- si el package es privado: configurar imagePullSecret
147-
148- 9 ) Próximas mejoras (Kubernetes)
149-
150- Healthchecks (liveness/readiness) para backend/frontend
151-
152- Requests/limits
153-
154- HPA (si aplica)
155-
156- TLS (HTTPS) con certificados
157-
158- Automatizar CD (deploy automático) y/o GitOps
159-
160-
161- ---
162-
163- ## Paso 2 — Actualizar los README chicos (para que no mientan)
164-
165- ### A) ` k8s/portfolio/README.md `
166- Tu texto está bien como “principios”. Yo le agregaría 3 líneas para guiar:
167-
168- ** Pegá esto abajo** del texto que ya tenés:
169-
170- ``` md
171- Estructura:
172- - ` backend/ ` , ` frontend/ ` , ` postgres/ ` : recursos por servicio (Deployment/Service/PVC/Job)
173- - ` traefik/ ` : recursos de entrada (Ingress/IngressRoute/Middleware si aplica)
174-
175- Aplicación:
176- ``` bash
177- kubectl -n portfolio apply -f k8s/portfolio/postgres
178- kubectl -n portfolio apply -f k8s/portfolio/backend
179- kubectl -n portfolio apply -f k8s/portfolio/frontend
180- kubectl -n portfolio apply -f k8s/portfolio/traefik # si existe
181-
182-
183- # ## B) `.github/workflows/README.md`
184- Ahí hay una inconsistencia: tu README dice “CD al mergear a main”, pero vos venís trabajando en ` master` . En tu README principal también se menciona CD como “próximo paso”.
185-
186- Propongo dejarlo así, neutro y cierto:
151+ - [x] el tag existe en GHCR.
187152
188- ` ` ` md
189- # Workflows (portfolio)
153+ - [x] el owner en ghcr.io/<owner >/... está en minúsculas
190154
191- - ` ci.yml` : build y validaciones en PRs y/o pushes (checks obligatorios con branch protection).
192- - ` cd.yml` (pendiente): deploy automático cuando se mergea a la rama protegida (master/main).
155+ - [x] el deployment apunta al tag correcto (no duplicado/concatenado)
193156
194- > Nota: la rama protegida puede ser ` master ` o ` main ` según la configuración del repo.
157+ - [x] si el package es privado: configurar imagePullSecre
195158
0 commit comments