Nota: Los ejecutores hospedados en GitHub no son compatibles con GitHub Enterprise Server actualmente. Puedes encontrar más información sobre el soporte que se tiene planeado en el futuro en el Itinerario público de GitHub.
Introducción
Esta guía te explica cómo utilizar las GitHub Actions para crear una aplicación contenerizada, subirla al Registro de Contenedores de Google (GCR) y desplegarla en Google Kubernetes Engine (GKE) cuando haya una subida a la rama main
.
GKE es un agrupamiento administrado de Kubernetes de Google Cloud que puede hospedar tus cargas de trabajo contenerizadas en la nube o en tu propio centro de datos. Para obtener más información, consulta la página de Google Kubernetes Engine.
Prerrequisitos
Antes de proceder con la creación del flujo de trabajo, necesitarás completar los siguientes pasos par tu proyecto de Kubernetes. Esta guía asume que la raíz de tu proyecto ya tiene un Dockerfile
y un archivo de configuración para el despliegue de Kubernetes. Para encontrar un ejemplo, consulta google-github-actions.
Crear un agrupamiento de GKE
Para crear un agrupamiento de GKE, primero necesitarás autenticarte utilizando el CLI de gcloud
. Para obtener más información sobre este paso, consulta los siguientes artículos:
Por ejemplo:
$ gcloud container clusters create $GKE_CLUSTER \
--project=$GKE_PROJECT \
--zone=$GKE_ZONE
Habilitar las API
Habilita las API de Kubernetes Engine y del Registro de Contenedor. Por ejemplo:
$ gcloud services enable \
containerregistry.googleapis.com \
container.googleapis.com
Configurar una cuenta de servicio y almacenar sus crendenciales
Este procedimiento demuestra cómo crear la cuenta de servicio para tu integración con GKE. Explica cómo crear la cuenta, agregarle roles, recuperar sus llaves y almacenarlas como un secreto de repositorio cifrado y codificado en base 64 de nombre GKE_SA_KEY
.
-
Crea una cuenta de servicio nueva:
$ gcloud iam service-accounts create $SA_NAME
-
Recupera la dirección de correo electrónico en la cuenta de servicio que acabas de crear:
$ gcloud iam service-accounts list
-
Agrega roles a la cuenta de servicio. Nota: Aplica roles más restrictivos para que se acoplen a tus requisitos.
$ gcloud projects add-iam-policy-binding $GKE_PROJECT \ --member=serviceAccount:$SA_EMAIL \ --role=roles/container.admin $ gcloud projects add-iam-policy-binding $GKE_PROJECT \ --member=serviceAccount:$SA_EMAIL \ --role=roles/storage.admin $ gcloud projects add-iam-policy-binding $GKE_PROJECT \ --member=serviceAccount:$SA_EMAIL \ --role=roles/container.clusterViewer
-
Descarga el archivo de llave JSON para la cuenta de servicio:
$ gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
-
Almacena la clave de cuenta de servicio como un secreto llamado
GKE_SA_KEY
:$ export GKE_SA_KEY=$(cat key.json | base64)
Para obtener más información sobre cómo almacenar un secreto, consulta la sección "Secretos cifrados".
Almacenar el nombre de tu proyecto
Almacenar el nombre de tu proyecto como un secreto llamado GKE_PROJECT
. Para obtener más información sobre cómo almacenar un secreto, consulta la sección "Secretos cifrados".
(Opcional) Configurar kustomize
Kustomize es una herramietna opcional que se utiliza para administrar las especificaciones YAML. Después de crear un archivo de kustomization
, el siguiente flujo de trabajo puede utilizarse para configurar campos de la imagen dinámicamente y agregar el resultado en kubectl
. Para obtener más información, consulta la sección uso de kustomize.
(Opcional) Configurar un ambiente de despliegue
Los ambientes se utilizan para describir un objetivo de despliegue general como production
, staging
o development
. Cuando se despliega un flujo de trabajo de GitHub Actions en un ambiente, dicho ambiente se desplegará en la página principal del repositorio. Puedes utilizar ambientes para que requieran la aprobación para que un job proceda, restringir qué ramas pueden activar un flujo de trabajo o limitar el acceso a los secretos. Para obtener más información sobre cómo crear ambientes, consulta la sección "Utilizar ambientes para despliegue".
Crear un flujo de trabajo
Una vez que hayas completado los prerequisitos, puedes proceder con la creación del flujo de trabajo.
El siguiente flujo de trabajo demuestra cómo crear una imagen de contenedor y cómo subirla a GCR. Utiliza entonces las herramientas de Kubernetes (tales como kubectl
y kustomize
) para extraer la imagen en el despliegue del agrupamiento.
Debajo de la llave env
, cambia el valor de GKE_CLUSTER
al nombre de tu clúster, el de GKE_ZONE
a tu zona de clúster, el de DEPLOYMENT_NAME
al nombre de tu despliegue y el de IMAGE
al nombre de tu imagen.
Si configuras un ambiente de despliegue, cambia el valor de environment
para que sea el nombre de tu ambiente. Si no configuraste un ambiente, borra la clave environment
.
# This workflow uses actions that are not certified by GitHub.
# Estas las proporcionan entidades terceras y las gobiernan
# condiciones de servicio, políticas de privacidad y documentación de soporte
# documentación.
name: Build and Deploy to GKE
on:
push:
branches:
- main
env:
PROJECT_ID: ${{ secrets.GKE_PROJECT }}
GKE_CLUSTER: cluster-1 # Add your cluster name here.
GKE_ZONE: us-central1-c # Add your cluster zone here.
DEPLOYMENT_NAME: gke-test # Add your deployment name here.
IMAGE: static-site
jobs:
setup-build-publish-deploy:
name: Setup, Build, Publish, and Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v2
# Setup gcloud CLI
- uses: google-github-actions/setup-gcloud@94337306dda8180d967a56932ceb4ddcf01edae7
with:
service_account_key: ${{ secrets.GKE_SA_KEY }}
project_id: ${{ secrets.GKE_PROJECT }}
# Configure Docker to use the gcloud command-line tool as a credential
# helper for authentication
- run: |-
gcloud --quiet auth configure-docker
# Get the GKE credentials so we can deploy to the cluster
- uses: google-github-actions/get-gke-credentials@fb08709ba27618c31c09e014e1d8364b02e5042e
with:
cluster_name: ${{ env.GKE_CLUSTER }}
location: ${{ env.GKE_ZONE }}
credentials: ${{ secrets.GKE_SA_KEY }}
# Build the Docker image
- name: Build
run: |-
docker build \
--tag "gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA" \
--build-arg GITHUB_SHA="$GITHUB_SHA" \
--build-arg GITHUB_REF="$GITHUB_REF" \
.
# Push the Docker image to Google Container Registry
- name: Publish
run: |-
docker push "gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA"
# Set up kustomize
- name: Set up Kustomize
run: |-
curl -sfLo kustomize https://github.com/kubernetes-sigs/kustomize/releases/download/v3.1.0/kustomize_3.1.0_linux_amd64
chmod u+x ./kustomize
# Deploy the Docker image to the GKE cluster
- name: Deploy
run: |-
./kustomize edit set image gcr.io/PROJECT_ID/IMAGE:TAG=gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA
./kustomize build . | kubectl apply -f -
kubectl rollout status deployment/$DEPLOYMENT_NAME
kubectl get services -o wide
Recursos adicionales
Para obtener más información sobre las herramientas que se utilizan en estos ejemplos, consulta la siguiente documentación:
- Para encontrar un flujo de trabajo inicial completo, consulta el flujo de trabajo de "Crear y Desplegar hacia GKE".
- Para ver más flujos de trabajo iniciales y el código que los acompaña, consulta los Flujos de trabajo de ejemplo de GitHub Actions de Google.
- El motor de personalización de YAML de Kubernetes: Kustomize.
- "Desplegar una aplicación web contenerizada" en la documentación de Google Kubernetes Engine.