Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Gestión eficaz de GKE con Terraform y Kustomize (con código)

By Gurumoorthy RaghupathySep 27, 20234 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

Gestión eficaz de GKE con Terraform y Kustomize

Para muchos, gestionar clusters de GKE (k8s) y las aplicaciones que corren dentro de ellos se ha convertido en una batalla interminable. Administrar con precisión distintos atributos —node-pools, add-ons, ingress controllers, gestores de certificados SSL, el rollout de aplicaciones y su configuración asociada— se vuelve engorroso. Esto es cada vez más común con el auge de los microservicios y las arquitecturas orientadas a eventos, compuestas por muchas piezas.

Gestión de clusters de GKE (K8S)

Configurar un cluster de GKE/K8S es un proceso complejo. Una buena práctica es automatizar su creación como un artefacto de IAC. En este artículo usaremos Terraform como herramienta de IAC.

Configuración de IAC

Crear módulos con parámetros y atributos para cada recurso es la clave para mantener la consistencia (parity) entre entornos. Tendremos 3 módulos en nuestro repo: 1. Módulo de GKE Cluster con dos node pools. 2. Módulo del nginx ingress controller usando un provisioner de helm chart. 3. Módulo del proveedor de certificados SSL kcert con Let's Encrypt para tus endpoints públicos.

El código de todos los módulos a continuación está disponible en nuestro repositorio en : https://github.com/agileguru/gke_nginx_kcert_quick_start

  • Aprovisionamiento de un cluster de GKE con varios node-pools

En este módulo tenemos main.tf, variables.tf y outputs.tf para aprovisionar, parametrizar y exponer metadatos reutilizables de un cluster de GKE, respectivamente.

Captura del módulo IAC de Terraform para GKE

  • Instalación del nginx ingress controller En este módulo tenemos main.tf, variables.tf y un outputs.tf opcional (vacío) para aprovisionar y parametrizar el controlador de nginx, respectivamente.

Captura del main.tf del provisioner IAC de Terraform para NGINX

  • Instalación del gestor SSL kcert con Let's Encrypt En este módulo tenemos main.tf, variables.tf y un outputs.tf opcional (vacío) para aprovisionar y parametrizar el controlador SSL kcert, respectivamente.

Captura del main.tf del provisioner IAC de Terraform para Kcert

  • Orquestar todo en conjunto

Una vez listos los 3 módulos, crearemos un entorno k8s "devops" mediante el módulo "devops", que se invoca desde el main/root para integrarlo todo.

Captura del módulo del entorno k8s Devops

Captura del orquestador raíz que crea el módulo Devops

  • Aprovisiona el cluster y los controllers con Terraform\* Cambia el nombre de project/region/zone en variables.tf

\* Cambia el nombre del bucket en backend.tf después de crearlo en la consola de GCP

\* Ejecuta los siguientes comandos

terraform init

terraform plan -var-file=sample.tfvars (modifica sample.tfvars si es necesario)

terraform apply -var-file=sample.tfvars (modifica sample.tfvars si es necesario)

  1. Tras ejecutar los comandos de Terraform, obtendrás la dirección IP del LoadBalancer para registrar el dominio.
  2. Puedes obtener la configuración de kubectl con el siguiente comando…

gcloud container clusters get-credentials <cluster name> — zone <cluster zone> — project <project id having the cluster>

Gestión de despliegues con Kustomize

El cluster ya está listo para desplegar workloads. Usaremos el plugin Kustomize para gestionarlos de forma más sencilla. Para este artículo usaremos un caso simple.

  • Tenemos 2 apps, api-1 y api-2, basadas en la imagen tutum/hello-world.
  • También tenemos 2 namespaces de k8s correspondientes a los entornos DEV y SIT.
  • Necesitamos desplegar el servicio y exponerlo vía https (ssl) con sus respectivas configuraciones, deployment, service e ingress mapping.
  • Necesitamos guardar todo esto en un repositorio. Para la demo está alojado en nuestro repositorio en https://github.com/agileguru/kustomize_quickstart_demo

Paso 1: crear la estructura de carpetas

Carpetas base de componentes y configuraciones

Paso 2: personalizar cada entorno con overlays

Carpetas de overlays para entornos usando patch/merge config con kustomize.yaml

Paso 3: cambiar el mapping del hostname del Ingress

Reemplaza el hostname en dev-ingress-patch.json y sit-ingress-patch.json por un host/dominio válido. Se ve similar al código que aparece a continuación…

[\
    {\
        "op": "replace",\
        "path": "/spec/rules/0/host",\
        "value": "dev.agileguru.org"\
    },\
    {\
        "op": "replace",\
        "path": "/spec/tls/0/hosts/0",\
        "value": "dev.agileguru.org"\
    }\
]
[\
    {\
        "op": "replace",\
        "path": "/spec/rules/0/host",\
        "value": "sit.agileguru.org"\
    },\
    {\
        "op": "replace",\
        "path": "/spec/tls/0/hosts/0",\
        "value": "sit.agileguru.org"\
    }\
]

Paso 4: desplegar tus aplicaciones

$ kubectl apply -k overlays/dev
namespace/dev created
configmap/config-map-api-1 created
configmap/config-map-api-2 created
service/api-1-service created
service/api-2-service created
deployment.apps/api-1-deployment created
deployment.apps/api-2-deployment created

Paso 5: dar de baja tus aplicaciones

$ kubectl delete -k overlays/dev
namespace "dev" deleted
configmap "config-map-api-1" deleted
configmap "config-map-api-2" deleted
service "api-1-service" deleted
service "api-2-service" deleted
deployment.apps "api-1-deployment" deleted
deployment.apps "api-2-deployment" deleted
ingress.networking.k8s.io "app-ingress" deleted

Buenas prácticas con Kustomize

  1. Lo que sí debes hacer

    Mantén el Replica Count en 0 en la configuración base

— Especifica siempre el Namespace en el kustomization.yaml del overlay

— Haz siempre un Dry Run con salida en yaml para validar que todo esté correcto

— Aplica buenas convenciones de nombres en carpetas y archivos de manifiestos

— Mantén el Ingress Mapping en su propia carpeta

— Ten siempre un override.yaml por cada componente. 2. Lo que no debes hacer

— _Hardcodear el namespace en las configuraciones base_

— Mezclar configuraciones y código de la aplicación en la misma carpeta

— Usar ramas de Git para configurar entornos (lo que se conoce como parity drift)

Recursos

  1. Repo getting started de GKE Nginx Kcert: https://github.com/agileguru/gke_nginx_kcert_quick_start
  2. Repo Quick Start de Kustomize: https://github.com/agileguru/kustomize_quickstart_demo
  3. Documentación de Kustomize: https://kustomize.io/
  4. Kcert en GitHub: https://github.com/nabsul/kcert
  5. Nginx Controller: https://kubernetes.github.io/ingress-nginx/
  6. Let's Encrypt: https://letsencrypt.org/

Tras completar los pasos anteriores tenemos: 1. Un k8s fácil de gestionar y actualizar, con nginx y el gestor de certificados SSL kcert, sin tener que volver a administrar manualmente los certificados SSL de tus endpoints públicos. 2. Un mecanismo/framework para gestionar tus endpoints web seguros siguiendo los principios de IAC, DevOps y DRY.