Introducción
Helm empaqueta plantillas de Kubernetes como lanzamientos (releases). Kustomize adopta un enfoque diferente: parte de archivos YAML de Kubernetes comunes y aplica cambios por capas sin utilizar expresiones de plantilla. Esto resulta útil cuando se desea una base compartida con pequeñas diferencias específicas del entorno, como nombres, espacios de nombres (namespaces), número de réplicas o parches.
En este laboratorio, creará un Deployment y un Service base, renderizará esa base con Kustomize y, a continuación, creará una capa de producción (overlay) que modificará el nombre, el espacio de nombres, el número de réplicas y el mensaje de la aplicación. Finalmente, desplegará la capa con kubectl apply -k y probará el Service resultante.
Preparar un espacio de trabajo de Kustomize
En este paso, preparará un espacio de nombres y confirmará que la compatibilidad con Kustomize está disponible a través de kubectl.
Comience en /home/labex/project. Este laboratorio mantiene los manifiestos base y los archivos de la capa en este espacio de trabajo.
mkdir -p /home/labex/project
cd /home/labex/project
Compruebe que el servidor de la API de Kubernetes sea accesible. Si la máquina virtual acaba de iniciarse y el nodo aún no está listo, espere unos segundos y vuelva a ejecutar el comando.
kubectl get nodes --request-timeout=5s
La salida esperada incluye:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Espere hasta que el Pod de red del clúster esté listo (Ready). Probará un Service al final del laboratorio, por lo que la red del clúster debe estar operativa.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Salida esperada:
pod/calico-node-... condition met
Cree un espacio de nombres llamado ckad-prep-kustomize y establézcalo como el espacio de nombres actual:
kubectl create namespace ckad-prep-kustomize
kubectl config set-context --current --namespace=ckad-prep-kustomize
Confirme el espacio de nombres y compruebe que kubectl kustomize está disponible. kubectl kustomize renderiza directorios de Kustomize sin aplicarlos.
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
kubectl kustomize --help | sed -n '1,3p'
La salida esperada incluye:
ckad-prep-kustomize
Build a set of KRM resources...
Crear una base reutilizable
En este paso, creará una base de Kustomize a partir de archivos YAML de Kubernetes comunes.
Una base es el punto de partida compartido. Debe contener objetos de Kubernetes completos y válidos antes de añadir cualquier personalización específica del entorno. Aquí, la base contiene un Deployment y un Service. La aplicación escribe el valor de la variable de entorno MESSAGE en una pequeña página web.
Cree el directorio base:
mkdir -p kustomize-demo/base
Escriba el Deployment base:
cat > kustomize-demo/base/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: kustomize-web
labels:
app: kustomize-web
spec:
replicas: 1
selector:
matchLabels:
app: kustomize-web
template:
metadata:
labels:
app: kustomize-web
spec:
terminationGracePeriodSeconds: 0
containers:
- name: web
image: busybox:1.36
env:
- name: MESSAGE
value: base-v1
command:
- /bin/sh
- -c
- |
mkdir -p /www
echo "$MESSAGE" > /www/index.html
httpd -f -p 8080 -h /www
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 1
periodSeconds: 2
EOF
Escriba el Service base. Su selector coincide con la etiqueta (label) del Pod del Deployment.
cat > kustomize-demo/base/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: kustomize-web
spec:
selector:
app: kustomize-web
ports:
- port: 80
targetPort: 8080
EOF
Cree el archivo kustomization.yaml base. Este archivo indica a Kustomize qué recursos pertenecen a la base.
cat > kustomize-demo/base/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
EOF
Renderice la base sin aplicarla:
kubectl kustomize kustomize-demo/base | sed -n '1,120p'
La salida esperada incluye un Service llamado kustomize-web, un Deployment llamado kustomize-web, replicas: 1 y value: base-v1.
Añadir una capa de producción
En este paso, creará una capa (overlay) que personaliza la base para un despliegue de tipo producción.
Una capa apunta a una base y luego añade cambios. Esta capa colocará los objetos en ckad-prep-kustomize, añadirá el prefijo prod- al nombre, escalará el Deployment a tres réplicas y aplicará un parche al valor de MESSAGE para que sea prod-v2.
Cree el directorio de la capa:
mkdir -p kustomize-demo/overlays/prod
Escriba un parche para el Deployment. El parche nombra al objeto base original, kustomize-web. Kustomize hace coincidir el parche antes de añadir el prefijo prod-.
cat > kustomize-demo/overlays/prod/deployment-patch.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: kustomize-web
spec:
replicas: 3
template:
spec:
containers:
- name: web
env:
- name: MESSAGE
value: prod-v2
EOF
Cree el archivo kustomization.yaml de la capa. La entrada resources apunta de vuelta a la base, mientras que namespace, namePrefix y patches describen la personalización.
cat > kustomize-demo/overlays/prod/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ckad-prep-kustomize
namePrefix: prod-
resources:
- ../../base
patches:
- path: deployment-patch.yaml
EOF
Renderice la capa de producción:
kubectl kustomize kustomize-demo/overlays/prod | sed -n '1,160p'
La salida esperada incluye:
name: prod-kustomize-web
namespace: ckad-prep-kustomize
replicas: 3
value: prod-v2
Desplegar y probar la aplicación personalizada
En este paso, aplicará la capa de producción y probará el Service que crea.
El comando kubectl apply -k renderiza un directorio de Kustomize y envía los objetos renderizados al servidor de la API de Kubernetes. No es necesario crear un archivo YAML temporal.
Aplique la capa de producción:
kubectl apply -k kustomize-demo/overlays/prod
La salida esperada incluye:
service/prod-kustomize-web created
deployment.apps/prod-kustomize-web created
Espere a que el Deployment personalizado esté listo:
kubectl rollout status deployment/prod-kustomize-web --timeout=120s
Salida esperada:
deployment "prod-kustomize-web" successfully rolled out
Inspeccione los objetos creados a partir de la capa:
kubectl get deployment,service prod-kustomize-web
La salida esperada incluye:
deployment.apps/prod-kustomize-web 3/3
service/prod-kustomize-web
Cree un Pod cliente y pruebe el Service. La respuesta debería ser prod-v2, lo que demuestra que el parche de la capa modificó la configuración de la aplicación en ejecución.
kubectl run kustomize-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/kustomize-client --timeout=120s
kubectl exec kustomize-client -- wget -qO- http://prod-kustomize-web
Salida esperada:
prod-v2
Resumen
Ha construido una base de Kustomize a partir de archivos YAML comunes de Deployment y Service, y luego ha creado una capa de producción que cambió el espacio de nombres, los nombres de los objetos, el número de réplicas y el mensaje de la aplicación. Ha renderizado tanto la base como la capa antes de aplicar esta última con kubectl apply -k, y finalmente ha verificado la aplicación personalizada a través de su Service.


