Personalizar una aplicación con Kustomize

KubernetesBeginner
Practicar Ahora

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.