refactor(medusa): migrar a base+overlay de platform-templates
Reemplaza medusa.yaml (Deployment+Service en un solo archivo) por un overlay de Kustomize sobre el base remoto de platform-templates (workloads/ecommerce/commerce/medusa/). Agrega securityContext, incluyendo runAsUser: 1000 explicito desde el arranque (confirmado con 'docker run ... id node' contra la imagen real antes de asumir el UID -- ya se aprendio en la migracion de frontend que runAsNonRoot solo no alcanza si el USER de la imagen es un nombre). El podAffinity del workaround de MTU/PMTUD y los 2 initContainers (wait-for-postgres, migrations) se preservan igual, son campos aditivos que no forman parte del base. El Ingress generico del base se excluye via $patch:delete -- medusa no tiene Ingress propio, comparte commerce-ingress. Validado con kubectl kustomize contra el arbol completo de workloads/ecommerce antes de aplicar. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_011FqYP3Wf1W63Qmh7qgXAAT
This commit is contained in:
1 parent
4da96a8314
commit
8c79a045fd
4 files changed
+102
-25
No files matched your search
@@ -7,5 +7,5 @@ resources:
|
|||||||
- redis.yaml
|
- redis.yaml
|
||||||
- minio.yaml
|
- minio.yaml
|
||||||
- minio-bootstrap-job.yaml
|
- minio-bootstrap-job.yaml
|
||||||
- medusa.yaml
|
- medusa/
|
||||||
- ingress-commerce.yaml
|
- ingress-commerce.yaml
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
|
||||||
|
namespace: ecommerce
|
||||||
|
|
||||||
|
# Solo Deployment + Service -- el Ingress de commerce vive en
|
||||||
|
# ingress-commerce.yaml dentro de workloads/ecommerce/commerce/,
|
||||||
|
# separado de este Deployment/Service, no le toca al overlay.
|
||||||
|
resources:
|
||||||
|
- https://gitea.cruzcloud.net/devops/platform-templates.git//k8s-manifests/base?ref=main
|
||||||
|
|
||||||
|
patches:
|
||||||
|
# medusa no tiene Ingress propio (el commerce-ingress vive aparte,
|
||||||
|
# en workloads/ecommerce/commerce/ingress-commerce.yaml) -- mismo
|
||||||
|
# patrón que frontend, borrar el Ingress genérico del base.
|
||||||
|
- target:
|
||||||
|
kind: Ingress
|
||||||
|
name: app-ingress
|
||||||
|
patch: |-
|
||||||
|
$patch: delete
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: app-ingress
|
||||||
|
|
||||||
|
- target:
|
||||||
|
kind: Deployment
|
||||||
|
name: app-deployment
|
||||||
|
path: patches/deployment.yaml
|
||||||
|
- target:
|
||||||
|
kind: Service
|
||||||
|
name: app-svc
|
||||||
|
path: patches/service.yaml
|
||||||
|
|
||||||
|
- target:
|
||||||
|
kind: Deployment
|
||||||
|
name: app-deployment
|
||||||
|
patch: |-
|
||||||
|
- op: replace
|
||||||
|
path: /metadata/name
|
||||||
|
value: medusa-deploy
|
||||||
|
- op: replace
|
||||||
|
path: /spec/template/spec/containers/0/ports
|
||||||
|
value:
|
||||||
|
- name: http
|
||||||
|
containerPort: 9000
|
||||||
|
- target:
|
||||||
|
kind: Service
|
||||||
|
name: app-svc
|
||||||
|
patch: |-
|
||||||
|
- op: replace
|
||||||
|
path: /metadata/name
|
||||||
|
value: medusa-svc
|
||||||
|
# Mismo motivo que el ports de la Deployment: el puerto de Medusa
|
||||||
|
# (9000) no coincide con el default del base (80), así que un
|
||||||
|
# patch de merge normal duplica en vez de reemplazar.
|
||||||
|
- op: replace
|
||||||
|
path: /spec/ports
|
||||||
|
value:
|
||||||
|
- name: http
|
||||||
|
port: 9000
|
||||||
|
targetPort: 9000
|
||||||
+28
-24
@@ -1,7 +1,9 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: medusa-deploy
|
name: app-deployment
|
||||||
|
labels:
|
||||||
|
app: medusa
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
strategy:
|
strategy:
|
||||||
@@ -17,9 +19,20 @@ spec:
|
|||||||
labels:
|
labels:
|
||||||
app: medusa
|
app: medusa
|
||||||
spec:
|
spec:
|
||||||
imagePullSecrets:
|
# runAsNonRoot solo no alcanza si el USER de la imagen es un
|
||||||
- name: gitea-registry-secret
|
# nombre, no un UID -- confirmado en vivo migrando frontend
|
||||||
|
# (mismo problema exacto, error real: "cannot verify user is
|
||||||
|
# non-root"). Acá el Dockerfile usa el usuario "node" que ya trae
|
||||||
|
# la imagen base node:22.18.0-bookworm-slim -- confirmado con
|
||||||
|
# `docker run ... id node` antes de asumir el UID: 1000.
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 1000
|
||||||
|
# Workaround del blackhole MTU/PMTUD cross-node (ver
|
||||||
|
# docs/known-issues.md en apps-registry) -- ya no es
|
||||||
|
# estrictamente necesario (el fix real de fondo se aplicó
|
||||||
|
# 2026-08-16), pero se deja como red de contención a propósito.
|
||||||
|
# No es un campo del base -- se agrega entero acá, es aditivo,
|
||||||
|
# no pisa nada.
|
||||||
affinity:
|
affinity:
|
||||||
podAffinity:
|
podAffinity:
|
||||||
requiredDuringSchedulingIgnoredDuringExecution:
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
@@ -54,10 +67,6 @@ spec:
|
|||||||
- name: migrations
|
- name: migrations
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.112
|
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.112
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
# node directo, sin npx: la imagen ya no trae npm (ver
|
|
||||||
# Dockerfile de commerce-backend, remediacion de
|
|
||||||
# CVE-2026-59873) -- mismo binario que ya invoca el CMD de
|
|
||||||
# runtime de esa misma imagen.
|
|
||||||
command:
|
command:
|
||||||
- node
|
- node
|
||||||
- node_modules/@medusajs/cli/dist/index.js
|
- node_modules/@medusajs/cli/dist/index.js
|
||||||
@@ -76,7 +85,7 @@ spec:
|
|||||||
memory: 768Mi
|
memory: 768Mi
|
||||||
|
|
||||||
containers:
|
containers:
|
||||||
- name: medusa
|
- name: app
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.112
|
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.112
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
envFrom:
|
envFrom:
|
||||||
@@ -84,9 +93,6 @@ spec:
|
|||||||
name: commerce-config
|
name: commerce-config
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: commerce-secrets
|
name: commerce-secrets
|
||||||
ports:
|
|
||||||
- name: http
|
|
||||||
containerPort: 9000
|
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /health
|
path: /health
|
||||||
@@ -103,6 +109,16 @@ spec:
|
|||||||
periodSeconds: 20
|
periodSeconds: 20
|
||||||
timeoutSeconds: 5
|
timeoutSeconds: 5
|
||||||
failureThreshold: 6
|
failureThreshold: 6
|
||||||
|
# Puerto 9000, no privilegiado -- a diferencia de
|
||||||
|
# frontend/docs-portal, acá el drop: ALL del base no
|
||||||
|
# necesita ningún add de vuelta. Medusa ya corre como
|
||||||
|
# usuario "node" no-root (ver Dockerfile de commerce-backend).
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
readOnlyRootFilesystem: false
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
cpu: 150m
|
cpu: 150m
|
||||||
@@ -110,15 +126,3 @@ spec:
|
|||||||
limits:
|
limits:
|
||||||
cpu: 750m
|
cpu: 750m
|
||||||
memory: 1Gi
|
memory: 1Gi
|
||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: medusa-svc
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
app: medusa
|
|
||||||
ports:
|
|
||||||
- name: http
|
|
||||||
port: 9000
|
|
||||||
targetPort: 9000
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: app-svc
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: medusa
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 9000
|
||||||
|
targetPort: 9000
|
||||||
Reference in new issue
Block a user