Skip to main content

Déploiement sur Google Kubernetes Engine

Vous pouvez déployer sur le moteur Google Kubernetes dans le cadre de vos workflows de déploiement continu (CD).

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.

Note

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 :

Shell
$ 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 :

Shell
$ 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.

  1. Créer un nouveau compte de service :

    Shell
    gcloud iam service-accounts create $SA_NAME
    
  2. Récupérer l’adresse e-mail du compte de service que vous venez de créer :

    Shell
    gcloud iam service-accounts list
    
  3. Ajoutez des rôles au compte de service.

    Note

    Appliquer des rôles plus restrictifs en fonction de 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
    
  4. Téléchargez le keyfile JSON pour le compte de service :

    Shell
    gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
    
  5. Stockez la clé de compte de service en tant que secret nommé GKE_SA_KEY :

    Shell
    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.

YAML
# 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 :