Estima los costos de GKE al principio del ciclo de desarrollo con GitHub

Last reviewed 2022-12-15 UTC

En este instructivo, se muestra la práctica recomendada para que tu equipo de desarrollo vea los costos de Google Kubernetes Engine (GKE). Esta práctica de visualización genera conocimiento de los costos al comienzo del proceso, lo que te ayuda a evitar sorpresas en tu factura de Google Cloud.

Este instructivo está dirigido a desarrolladores, operadores y profesionales de FinOps que deseen optimizar los costos de los clústeres de GKE y que usen GitLab en producción. Si, en su lugar, usas GitLab, consulta Estima los costos de GKE al comienzo del ciclo de desarrollo mediante GitLab.

En el instructivo, se supone que estás familiarizado con Docker, GitHub, Kubernetes, GKE, Cloud Build y Linux.

Descripción general

Muchos equipos que adoptan la nube pública no están acostumbrados al estilo de facturación prepago. Por lo general, no comprenden por completo el entorno en el que se ejecutan las apps, en este caso, GKE. El modelo operativo de FinOps fomenta esta cultura de responsabilidad financiera. Una práctica recomendada de FinOps es proporcionar a los equipos información en tiempo real sobre sus gastos para que los problemas de costos se puedan abordar en cuanto surjan.

En este documento, se muestra cómo ir un paso más allá mediante la estimación de costos antes de que se convierta en un gasto en tu factura. Como se destaca en el sitio web de GitHub, “En GitHub, se integran herramientas ligeras de revisión de código en cada solicitud de extracción”. Esto te permite “evolucionar proyectos, proponer funciones nuevas y debatir sobre los detalles de la implementación antes de cambiar el código fuente”. El mejor momento para estimar los costos es al comienzo del proceso durante el desarrollo y en el momento de la revisión de código. De esta manera, los profesionales pueden comprender y analizar alternativas para el costo de las nuevas funciones y correcciones de errores antes de que se conviertan en un problema. En el siguiente diagrama, se resume esta práctica.

Práctica recomendada para estimar el costo con anticipación.

Como se muestra en el diagrama, un desarrollador estima los costos de GKE en su entorno local; lo ideal sería en el tiempo de compilación. Esta estimación les brinda una buena comprensión del costo de la carga de trabajo de producción mensual. Cuando la función o la corrección de errores están completas en el código, se propone una solicitud de extracción que activa Cloud Build para verificar la diferencia entre el costo anterior y el nuevo. Si hay aumentos por encima del umbral predefinido, pueden solicitar una nueva revisión de código. Esta práctica ayuda a los desarrolladores a conocer más su capacidad de carga de trabajo y solucionar de forma proactiva los problemas de la aplicación en lugar de agregar más recursos cada vez que se encuentra una inestabilidad en producción.

Objetivos

  • Compila y envía la imagen del estimador de costos de Kubernetes.
  • Crea un repositorio de GitHub.
  • Conecta Cloud Build a tu repositorio de GitHub.
  • Envía el código de ejemplo a tu repositorio de GitHub.
  • Cambia el código y propón una solicitud de extracción para ver la estimación de costos en acción.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. En la consola de Google Cloud, ve a la página del selector de proyectos.

    Ir al selector de proyectos

  2. Selecciona o crea un proyecto de Google Cloud.

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de la consola de Google Cloud, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

Prepare el entorno

  1. En Cloud Shell, clona el repositorio gke-shift-left-cost de GitHub.

    git clone https://github.com/GoogleCloudPlatform/gke-shift-left-cost
    cd gke-shift-left-cost
    

    El código de este repositorio se organiza en las siguientes carpetas:

    • Raíz: contiene un archivo Dockerfile que se usa para compilar la imagen del estimador de costos y el archivo main.go que implementa la lógica de la línea de comandos del estimador.
    • api/: contiene la API de Golang para manipular los objetos de Kubernetes y realizar la estimación de costos.
    • samples/: contiene ejemplos de manifiestos de Kubernetes para que puedas experimentar con el proceso antes de implementarlo en tu organización.
  2. Configura el ID del proyecto de Google Cloud, el usuario de GitHub y la dirección de correo electrónico, y otro usuario de GitHub para que actúe como revisor de FinOps:

    export GCP_PROJECT_ID=YOUR_PROJECT_ID
    export GITHUB_USER=YOUR_GITHUB_USER
    export GITHUB_EMAIL=YOUR_GITHUB_EMAIL_ADDRESS
    export GITHUB_FINOPS_REVIEWER_USER=ANOTHER_GITHUB_USER
    

    Reemplaza lo siguiente:

    • YOUR_PROJECT_ID: Es el ID del proyecto de Google Cloud para el proyecto que usas en este instructivo.
    • YOUR_GITHUB_USER: es el usuario que usas para acceder a tu cuenta de GitHub.
    • YOUR_GITHUB_EMAIL_ADDRESS: es el correo electrónico que usas en tu cuenta de GitHub.
    • ANOTHER_GITHUB_USER: es otro usuario de GitHub para que actúe como revisor de FinOps. Ten en cuenta que para este instructivo debes agregar a este usuario como colaborador del repositorio y, por lo tanto, no puedes ser tú mismo. Para evitar que te detengas durante los pasos del instructivo, asegúrate de que este usuario acepte tu invitación en cuanto la crees.
  3. Configura el proyecto de Google Cloud y habilita las APIs necesarias:

    gcloud config set project $GCP_PROJECT_ID
    
    gcloud services enable cloudbilling.googleapis.com \
        artifactregistry.googleapis.com \
        cloudbuild.googleapis.com
    

Compila y envía la imagen del estimador de costos de Kubernetes.

La herramienta de estimación de costos de Kubernetes que se incluye en este instructivo es solo un ejemplo de lo que se puede hacer. Ofrece la capacidad de estimar el costo de los objetos de Kubernetes de DaemonSet, Deployment, StatefulSet, ReplicaSet, HorizontalPodAutoScaler y PersistentVolumeClaim. También puedes implementar tu propia herramienta de estimación de costos o proponer solicitudes de extracción con las mejoras que desees.

  1. En Cloud Shell, permite que application-default use tus credenciales:

    gcloud auth application-default login
    
  2. Compila el objeto binario del estimador de costos de Kubernetes:

    mkdir ./bin
    go test ./api
    go build -v -o ./bin/k8s-cost-estimator .
    
  3. Prueba el objeto binario mediante la ejecución de la estimación de costos en una carpeta de muestra:

    ./bin/k8s-cost-estimator \
        --k8s ./samples/k8s-cost-estimator-local/app-v1  \
        --config ./samples/k8s-cost-estimator-local/example-conf.yaml --v trace
    

    En el resultado, verás una tabla de Markdown que detalla los costos mensuales estimados de la carpeta ./samples/k8s-cost-estimator-local/app-v1/. Para comprender mejor el costo de producción mensual de sus aplicaciones, los desarrolladores pueden ejecutar este paso antes de enviarlo al repositorio remoto.

    INFO[0000] Starting cost estimation (version v0.0.1)...
    ...
    
    |         KIND          | MIN REQUESTED (USD) | MIN REQ + HPA CPU BUFFER (USD) | MAX REQUESTED (USD) | MIN LIMITED (USD) | MAX LIMITED (USD) |
    |-----------------------|---------------------|--------------------------------|---------------------|-------------------|-------------------|
    | Deployment            |             $133.31 |                        $198.71 |             $266.54 |           $312.83 |           $579.29 |
    | StatefulSet           |              $36.33 |                         $36.33 |              $36.33 |            $72.67 |            $72.67 |
    | DaemonSet             |              $29.68 |                         $29.68 |              $29.68 |            $53.19 |            $53.19 |
    | PersistentVolumeClaim |              $28.88 |                         $28.88 |              $28.88 |            $33.68 |            $33.68 |
    | **TOTAL**             |         **$228.20** |                    **$293.60** |         **$361.43** |       **$472.38** |       **$738.83** |
    
    INFO[0002] Finished cost estimation!
    
  4. Compila la imagen de contenedor del estimador de costos de Kubernetes:

    docker build . -t us-central1-docker.pkg.dev/$GCP_PROJECT_ID/docker-repo/k8s-cost-estimator:v0.0.1
    
  5. Crea el repositorio de Docker de Artifact Registry para almacenar la imagen:

    gcloud artifacts repositories create docker-repo \
            --repository-format=docker \
            --location=us-central1 \
            --description="Docker repository"
    
  6. Registra gcloud como auxiliar de credenciales para el archivo de configuración de Docker. Si se te solicita, confirma la actualización del archivo.

    gcloud auth configure-docker us-central1-docker.pkg.dev
    
  7. Envía la imagen a Artifact Registry:

    docker push us-central1-docker.pkg.dev/$GCP_PROJECT_ID/docker-repo/k8s-cost-estimator:v0.0.1
    

Crea un repositorio de GitHub nuevo

  1. En Cloud Shell, cambia los directorios al ejemplo de GitHub:

    cd samples/k8s-cost-estimator-github
    
  2. En GitHub, crea un token de acceso:

    Navega a la página Personal access tokens de GitHub.

    1. En el campo Nota, ingresa una descripción del token.
    2. En Seleccionar permisos, selecciona las casillas de verificación repo, admin:public_key y delete_repo.
    3. Haz clic en Generar token y copia el valor Tu nuevo token de acceso personal en la parte superior de la página.
  3. En Cloud Shell, guarda el token de acceso personal en una variable.

    GITHUB_TOKEN=YOUR_NEW_PERSONAL_ACCESS_TOKEN
    

    Reemplaza lo siguiente:

    • YOUR_NEW_PERSONAL_ACCESS_TOKEN: es el token de acceso personal que acabas de crear.
  4. Crea un repositorio de GitHub:

    curl -X POST \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/user/repos \
      -d '{"name":"k8s-cost-estimator-github"}' | jq
    

    El resultado es similar al siguiente:

    {
      "id": 36099474,
      "node_id": "MDEwOldfsdjA5OTQ3Njc=",
      "name": "k8s-cost-estimator-github",
      ...
    }
    
  5. Agrega al revisor de FinOps como colaborador en tu repositorio:

    curl -X PUT \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github/collaborators/$GITHUB_FINOPS_REVIEWER_USER  | jq -r .html_url
    

    El resultado es similar al siguiente:

    https://github.com/your-user/k8s-cost-estimator-github/invitations
    
  6. Comparte la URL de salida con el usuario que estableciste en la variable GITHUB_FINOPS_REVIEWER_USER para que pueda aceptar la invitación. Antes de continuar con el siguiente paso, visita la misma URL para asegurarte de que se haya aceptado la invitación.

    Verifica que se haya aceptado la invitación.

Conecta Cloud Build a tu repositorio de GitHub.

En esta sección, se muestra cómo instalar la app de GitHub de Cloud Build. Esta instalación te permite conectar el repositorio de GitHub con el proyecto de Google Cloud para que Cloud Build pueda ejecutar de forma automática la herramienta de estimador de Kubernetes en cada solicitud de extracción.

  1. Ve a la página GitHub Marketplace de la app de Cloud Build:

    Abrir Cloud Build

  2. Configura el acceso a la cuenta de GitHub para la app:

    1. Si es la primera vez que configuras una app en GitHub, haz clic en Configurar con Google Cloud Build en la parte inferior de la página y, a continuación, haz clic en Otorga a esta aplicación acceso a tu cuenta de GitHub.
    2. Si ya configuraste una app en GitHub, haz clic en Configurar acceso.
  3. En la página Aplicaciones que se abre, sigue estos pasos:

    1. En la fila de Google Cloud Build, haz clic en Configurar.
    2. Selecciona la opción Solo seleccionar repositorios.
    3. Selecciona k8s-cost-estimator-github para conectarte al repositorio que acabas de crear.
    4. Haz clic en Guardar o Instalar (la etiqueta del botón cambia según el flujo que ejecutas).
  4. Ahora se te redireccionará a Google Cloud para continuar con la instalación. Accede con tu cuenta de Google Cloud. Si se te solicita, autoriza la integración de Cloud Build con GitHub.

  5. En la página Cloud Build, selecciona el proyecto. Aparecerá un asistente.

  6. En la sección Selecciona un repositorio del asistente, selecciona tu cuenta de GitHub y el repositorio k8s-cost-estimator-github.

  7. Si aceptas los Términos y Condiciones, selecciona la casilla de verificación y, luego, haz clic en Conectar.

  8. En la sección Crea un activador, haz clic en Crear un activador y sigue estos pasos:

    1. Ingresa un nombre para el activador.
    2. En la sección Evento, selecciona Solicitud de extracción (solo en la app de GitHub).
    3. En la sección Fuente, haz lo siguiente:
      • Asegúrate de que el campo Repositorio se complete automáticamente con your-github-user/k8s-cost-estimator-github (app de GitHub).
      • En el menú desplegable Rama de base, selecciona .*.
    4. En la sección Tipo de configuración, selecciona Archivo de configuración de Cloud Build (yaml o json).
    5. En la sección Avanzado, agrega las siguientes variables de sustitución:

      • _GITHUB_TOKEN = YOUR_PERSONAL_ACCESS_TOKEN
      • _GITHUB_FINOPS_REVIEWER_USER = THE_GITHUB_FINOPS_REVIEWER_USER
      • _GITHUB_FINOPS_COST_USD_THRESHOLD = 10

      Reemplaza lo siguiente:

      • YOUR_PERSONAL_ACCESS_TOKEN: es el token de acceso personal de GitHub que creaste. Este token está disponible en la variable GITHUB_TOKEN de Cloud Shell.
      • THE_GITHUB_FINOPS_REVIEWER_USER: es el usuario que invitaste como colaborador en tu repositorio de GitHub. Este nombre de usuario está disponible en la variable GITHUB_FINOPS_REVIEWER_USER en Cloud Shell.
  9. Haz clic en Crear.

La app de GitHub de Cloud Build ya está configurada y el repositorio de GitHub está vinculado al proyecto de Google Cloud. Las solicitudes de extracción a tu repositorio de GitHub ahora activan ejecuciones de Cloud Build, que informan los resultados a GitHub mediante las Verificaciones de GitHub.

Envía el código de ejemplo a tu repositorio de GitHub.

  1. Crea un par de claves de SSH para poder enviar el código de muestra a tu repositorio de GitHub:

    mkdir -p ssh && cd ssh
    ssh-keygen -t rsa -b 4096 -N '' -f github-key
    eval `ssh-agent` && ssh-add $(pwd)/github-key
    curl -X POST \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/user/keys \
      -d "{\"title\":\"k8s-cost-estimator-key\", \"key\":\"$(cat github-key.pub)\"}" | jq
    cd ..
    

    El resultado es similar al siguiente:

    {
      "id": 52356205,
      "key": "ssh-rsa AAAAB3NzaC….wJICyt0yvWjGFZGCWBPUw==",
      "url": "https://api.github.com/user/keys/526205",
      "title": "k8s-cost-estimator-key",
      "verified": true,
      "created_at": "2021-04-23T16:22:58Z",
      "read_only": false
    }
    
  2. Envía el contenido a tu repositorio de GitHub nuevo.

    sed "s/GCP_PROJECT_ID/$GCP_PROJECT_ID/g; s/GITHUB_USER/$GITHUB_USER/g; s/GITHUB_EMAIL/$GITHUB_EMAIL/g;" templates/cloudbuild.yaml.tpl > cloudbuild.yaml
    
    GITHUB_SSH_URL_REPO=$(curl -X GET \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github | jq -r .ssh_url)
    [ -z "$GITHUB_SSH_URL_REPO" ] && echo "GITHUB_SSH_URL_REPO is not exported" || echo "GITHUB_SSH_URL_REPO is $GITHUB_SSH_URL_REPO"
    
    git init
    git remote add origin $GITHUB_SSH_URL_REPO
    git add -A .
    git commit -m "Initial commit"
    git checkout -b main
    git push -u origin main
    

Cambia el código y crea una solicitud de extracción para probar la estimación de costos

  1. En Cloud Shell, obtén la URL de GitHub del archivo wordpress/wordpress_hpa.yaml:

    echo "https://github.com/$GITHUB_USER/k8s-cost-estimator-github/edit/main/wordpress/wordpress_hpa.yaml"
    
  2. Ctrl+clic (Cmd + clic para los usuarios de Mac) en la URL de salida a fin de navegar a GitHub y editar el archivo wordpress/wordpress_hpa.yaml.

  3. En GitHub, cambia minReplicas por 5.

  4. Selecciona Crear una rama nueva para esta confirmación y comenzar una solicitud de extracción y, luego, haz clic en Proponer cambios.

  5. En la pantalla Abrir una solicitud de extracción, haz clic en Crear solicitud de extracción.

    Además de crear una solicitud de extracción nueva, este paso activa una ejecución de Cloud Build basada en el archivo cloudbuild.yaml que creaste antes. Esta ejecución de Cloud Build usa la imagen de contenedor que compilaste en Compila y envía la imagen del estimador de costos de Kubernetes y toma la decisión cuando se requiere un revisor de FinOps.

  6. Espera aproximadamente un minuto para que finalice la canalización. Cuando finaliza, se agrega un comentario con los detalles de los costos a la solicitud de extracción y, debido a que el aumento del costo del código que propones superó el límite de $10, también se solicita un revisor de FinOps.

    El resultado es similar al siguiente:

    Se agrega un desglose detallado de los costos a la solicitud de extracción.

Ahora sabes cómo brindarles a los desarrolladores visibilidad sobre su consumo al principio del ciclo de desarrollo. Esta configuración te ayuda a ti y a tu organización a evitar sorpresas en tu factura de Google Cloud.

Limpia

Puedes borrar tu proyecto para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo.

Borra el proyecto

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra el repositorio de GitHub

Si no deseas conservar tu repositorio de GitHub, sigue estos pasos:

  1. En Cloud Shell, borra tu repositorio de GitHub:

    curl -X DELETE \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github
    

    Si pierdes la conexión con Cloud Shell, debes restablecer las variables GITHUB_TOKEN y GITHUB_USER.

¿Qué sigue?