Introduction
Ce guide explique comment utiliser GitHub Actions pour créer une application conteneurisée, l’envoyer (push) à Google Container Registry (GCR) et la déployer sur Google Kubernetes Engine (GKE) lors d’un envoi (push) à la branche main
.
GKE est un service de clusters Kubernetes managés à partir de Google Cloud qui peut héberger vos charges de travail conteneurisées dans le cloud ou dans votre propre centre de données. Pour plus d’informations, consultez Google Kubernetes Engine.
Remarque : Si vos workflows GitHub Actions doivent accéder aux ressources d’un fournisseur de cloud qui prend en charge OpenID Connecter (OIDC), vous pouvez configurer vos workflows pour qu’ils s’authentifient directement auprès du fournisseur de cloud. Cela vous permet d’arrêter de stocker ces informations d’identification en tant que secrets de longue durée, et de fournir d’autres avantages en matière de sécurité. Pour plus d’informations, consultez « À propos du renforcement de la sécurité avec OpenID Connect ».
Prérequis
Avant de continuer à créer le workflow, vous devez effectuer les étapes suivantes pour votre projet Kubernetes. Ce guide suppose que la racine de votre projet dispose déjà d’un fichier Dockerfile
et d’un fichier config de déploiement Kubernetes.
Création d’un cluster GKE
Pour créer le cluster GKE, vous devez d’abord vous authentifier à l’aide de l’interface CLI gcloud
. Pour plus d’informations sur cette étape, consultez les articles suivants :
Par exemple :
$ gcloud container clusters create $GKE_CLUSTER \ --project=$GKE_PROJECT \ --zone=$GKE_ZONE
$ gcloud container clusters create $GKE_CLUSTER \
--project=$GKE_PROJECT \
--zone=$GKE_ZONE
Activation des API
Activez les API Kubernetes Engine et Container Registry. Par exemple :
$ gcloud services enable \ containerregistry.googleapis.com \ container.googleapis.com
$ gcloud services enable \
containerregistry.googleapis.com \
container.googleapis.com
Configuration d’un compte de service et stockage de ses informations d’identification
Cette procédure montre comment créer le compte de service pour votre intégration GKE. Il explique comment créer le compte, lui ajouter des rôles, récupérer ses clés et les stocker en tant que secret de référentiel encodé en base64 chiffré nommé GKE_SA_KEY
.
-
Créer un nouveau compte de service :
Shell gcloud iam service-accounts create $SA_NAME
gcloud iam service-accounts create $SA_NAME
-
Récupérer l’adresse e-mail du compte de service que vous venez de créer :
Shell gcloud iam service-accounts list
gcloud iam service-accounts list
-
Ajoutez des rôles au compte de service.
Remarque : appliquez des rôles plus restrictifs pour répondre à vos besoins.
Shell 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
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
-
Téléchargez le keyfile JSON pour le compte de service :
Shell gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
-
Stockez la clé de compte de service en tant que secret nommé
GKE_SA_KEY
:Shell export GKE_SA_KEY=$(cat key.json | base64)
export GKE_SA_KEY=$(cat key.json | base64)
Pour plus d’informations sur la façon de stocker un secret, consultez « Utilisation de secrets dans GitHub Actions ».
Stockage du nom de votre projet
Stockez le nom de votre projet en tant que secret nommé GKE_PROJECT
. Pour plus d’informations sur la façon de stocker un secret, consultez « Utilisation de secrets dans GitHub Actions ».
(Facultatif) Configuration de kustomize
Kustomize est un outil facultatif utilisé pour gérer les spécifications YAML. Après avoir créé un fichier kustomization
, le workflow ci-dessous peut être utilisé pour définir dynamiquement les champs de l’image et du canal dans le résultat sur kubectl
. Pour plus d’informations, consultez « Utilisation de kustomize ».
Si vous le souhaitez, configurez un environnement de déploiement.
Les environnements sont utilisés pour décrire une cible de déploiement général comme production
, staging
ou development
. Quand un workflow GitHub Actions est déployé dans un environnement, l’environnement s’affiche dans la page principale du dépôt. Vous pouvez utiliser des environnements pour exiger l’approbation d’un travail, restreindre les branches pouvant déclencher un workflow, contrôler les déploiements avec des règles de protection de déploiement personnalisées, ou limiter l’accès aux secrets. Pour plus d’informations sur la création d’environnements, consultez « Gestion des environnements pour le déploiement ».
Création du workflow
Une fois les conditions préalables remplies, vous pouvez procéder à la création du workflow.
L’exemple de workflow suivant montre comment créer une image conteneur et l’envoyer à GCR. Il utilise ensuite les outils Kubernetes (tels que kubectl
et kustomize
) pour extraire l’image dans le déploiement du cluster.
Sous la clé env
, remplacez la valeur de GKE_CLUSTER
par le nom de votre cluster, GKE_ZONE
par votre zone de cluster, DEPLOYMENT_NAME
par le nom de votre déploiement et IMAGE
par le nom de votre image.
Si vous avez configuré un environnement de déploiement, remplacez la valeur environment
par le nom de votre environnement. Si vous n’avez pas configuré d’environnement ou si votre workflow se trouve dans un référentiel privé et que vous n’utilisez pas GitHub Enterprise Cloud, supprimez la clé environment
.
# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub. # Elles sont fournies par un tiers et régies par # des conditions d’utilisation du service, une politique de confidentialité et un support distincts. # documentation en ligne. # GitHub recommande d’épingler les actions à un SHA de commit. # Pour obtenir une version plus récente, vous devez mettre à jour le SHA. # Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement. 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@v4 # Setup gcloud CLI - uses: google-github-actions/setup-gcloud@1bee7de035d65ec5da40a31f8589e240eba8fde5 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@db150f2cc60d1716e61922b832eae71d2a45938f 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
# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions d’utilisation du service, une politique de confidentialité et un support distincts.
# documentation en ligne.
# GitHub recommande d’épingler les actions à un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement.
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@v4
# Setup gcloud CLI
- uses: google-github-actions/setup-gcloud@1bee7de035d65ec5da40a31f8589e240eba8fde5
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@db150f2cc60d1716e61922b832eae71d2a45938f
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
Ressources supplémentaires
Pour plus d’informations sur les outils utilisés dans ces exemples, consultez la documentation suivante :
- Pour obtenir le modèle de workflow complet, consultez le workflow « Générer et déployer sur GKE ».
- Moteur de personnalisation Kubernetes YAML : Kustomize.
- « Déploiement d’une application web conteneurisée » dans la documentation Google Kubernetes Engine.