Pré-requis

  • Un compte GCP avec les permissions nécessaires pour créer des ressources.
    • API Kubernetes Engine activée
    • Billing account configuré
  • Terraform installé sur votre machine
  • Quelques connaissances sur Git

Étapes

1. Creation du repository Git

Ici pas question de réinventer la roue, j’utilise un template fournit par Hashicorp(Terraform) pour le bootstrap de mon cluster.

git clone https://github.com/hashicorp-education/learn-terraform-provision-gke-cluster
mv learn-terraform-provision-gke-cluster theforge-infra
cd theforge-infra
git remote set-url origin git@github.com:mon-repo.git      

Nous ferons le tour d’horizon des ressources juste après.


2. Configuration GCLOUD

brew install --cask google-cloud-sdk
gcloud init
gcloud auth application-default login

3. Architecture du repo

FichierRôle
vpc.tfDéclare le VPC et un subnet pour isoler le cluster, ainsi que les variables project_id / region et le provider Google.
gke.tfCrée le cluster GKE (version 1.27.x, default node pool supprimé) et un node pool séparé de 2 nœuds n1-standard-1.
versions.tfFixe le provider Google à la version 7.33.0 et Terraform >= 0.14.
outputs.tfExpose la région, le project ID, le nom et l’endpoint du cluster.
terraform.tfvarsVariables d’entrée (project_id à remplacer, région us-central1).
kubernetes-dashboard-admin.rbac.yamlManifest RBAC Kubernetes pour un accès admin au dashboard (à appliquer post-déploiement).

4. Fine tuning de la configuration Terraform

Ajout du Project ID et de la région

Quelques modifications à apporter à la configuration de base, notamment le project_id et la region dans le fichier terraform.tfvars :

project_id = "MON_PROJECT_ID"
region     = "europe-west1"

Puis on valide que Terraform est correctement configuré et peut communiquer avec GCP :

terraform init

Terraform has been successfully initialized!

Mise à jour de la version de Terraform et des providers

Le template utilise une version de Terraform et du provider Google qui sont un peu anciennes, il est recommandé de les mettre à jour pour bénéficier des dernières fonctionnalités et corrections de bugs. Dans versions.tf, on peut mettre à jour la version de Terraform et du provider Google :

terraform {
  required_version = ">= 1.15"

  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 7.33.0"
    }
  }
}

Sources :

Mise à jour de la version de GKE

Par défaut, le template utilise aussi une version de GKE qui n’est plus supportée (1.27.x). Il faut donc mettre à jour la version du cluster dans gke.tf pour une version plus récente, par exemple 1.36.x :

resource "google_container_cluster" "primary" {
  name     = "theforge-cluster"
  location = var.region

  # Autres configurations...

  # Mise à jour de la version du cluster
  min_master_version = "1.36"
}

Ensuite, on peut relancer terraform plan pour vérifier que la configuration est valide avec la nouvelle version.

Sources :

Séparation des ressources dans des fichiers

Pour une meilleure organisation, j’ai choisi de remanier quelque peu la structure du repo en séparant les ressources dans des fichiers dédiés (variables.tf, providers.tf). J’envisage en effet de réutiliser ce repository à l’avenir pour d’autres projets, à ce titre je souhaite le rendre plus modulaire et facilement maintenable.


Résultat

Une fois satisfait de votre configuration il ne reste qu’à lancer la commande terraform apply pour provisionner le cluster sur GCP. Après quelques minutes d’attente, le cluster devrait être opérationnel et vous devriez voir les outputs suivants :

Connexion au cluster

Google Cloud SDK (gcloud) est nécessaire pour récupérer les credentials du cluster et pouvoir interagir avec lui via kubectl.

gcloud container clusters get-credentials "moncluster" --region europe-west1 --project "monprojet"
#> kubeconfig entry generated for moncluster.

Verification du status des pods

Une fois le cluster déployé vous devriez voir les pods du cluster en cours d’exécution :

kubectl get pods -A
NAMESPACE         NAME                                                             READY   STATUS    RESTARTS   AGE
gke-managed-cim   kube-state-metrics-0                                             2/2     Running   0          35m
gmp-system        collector-jc4t8                                                  2/2     Running   0          30m
gmp-system        collector-jdjzw                                                  2/2     Running   0          30m

Repo disponible sur GitHub

L’ensemble de la configuration Terraform utilisée pour ce projet est disponible sur GitHub : theforge-infra.


Erreurs rencontrées

Pas de billing account configuré

ERROR: (gcloud.services.enable) FAILED_PRECONDITION: Billing account for project ‘X’ is not found

Renseignez un billing account valide pour votre projet et c’est réglé.

API Kubernetes désactivée

Error: Error retrieving available container cluster versions: googleapi: Error 403: Kubernetes Engine API has not been used in project deft-accord-496812-k9 before or it is disabled.

Elle était assez explicite : l’API Kubernetes Engine n’était pas activée sur le projet GCP. Je l’ai activée via la console GCP, puis relancé terraform plan pour valider que tout est bon. Vous pouvez aussi l’activer avec la CLI :

gcloud services enable container.googleapis.com

Problème de provisioning du cluster

Google Compute Engine: Not all instances running in IGM after 35m11.660099086s. Expected 1, running 0, transitioning 1. Current errors: [GCE_STOCKOUT]: Instance ‘gke-deft-accord-496812-k-default-pool-19ca1c15-p6ls’ creation failed: The zone ‘projects/deft-accord-496812-k9/zones/europe-west1-c’ does not have enough resources available to fulfill the request. Try a different zone, or try again later.

Résolution : changer la zone de déploiement du cluster dans gke.tfs pour une zone moins sollicitée, par exemple europe-west1-b ou europe-west1-d.

resource "google_container_cluster" "primary" {
  name     = "${var.project_id}-gke"
  location = var.region
  node_locations = ["europe-west1-b", "europe-west1-d"]
  # Autres configurations...
}

Plugin GKE introuvable

couldn’t get current server API group list: Get “https://35.233.30.210/api?timeout=32s”: getting credentials: exec: executable gke-gcloud-auth-plugin.exe not found

Solution : installer le plugin d’authentification GKE pour kubectl, qui est nécessaire pour se connecter au cluster GKE.

gcloud components install gke-gcloud-auth-plugin