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
| Fichier | Rôle |
|---|---|
vpc.tf | Déclare le VPC et un subnet pour isoler le cluster, ainsi que les variables project_id / region et le provider Google. |
gke.tf | Cré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.tf | Fixe le provider Google à la version 7.33.0 et Terraform >= 0.14. |
outputs.tf | Expose la région, le project ID, le nom et l’endpoint du cluster. |
terraform.tfvars | Variables d’entrée (project_id à remplacer, région us-central1). |
kubernetes-dashboard-admin.rbac.yaml | Manifest 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
