TP 15 : Provider Kubernetes de Terraform
Objectif
Section intitulée « Objectif »Déployer des ressources Kubernetes avec le provider Terraform hashicorp/kubernetes.
Ce TP permet de voir comment :
- configurer le provider Kubernetes dans Terraform
- créer un namespace
- créer un secret Kubernetes
- déployer un pod
- créer un deployment avec plusieurs réplicas
- exposer un déploiement avec un service NodePort
Prérequis
Section intitulée « Prérequis »- Terraform installé
- Un cluster Kubernetes fonctionnel (Kind — voir TP 14)
- kubectl installé et configuré
terraform versionkubectl version --clientkubectl cluster-infoPréparer l’environnement Terraform
Section intitulée « Préparer l’environnement Terraform »Créez un répertoire pour le projet :
mkdir terraform-kubernetes-tpcd terraform-kubernetes-tpCréez un fichier main.tf avec le provider Kubernetes :
terraform { required_providers { kubernetes = { source = "hashicorp/kubernetes" version = "~> 2.20" } }
required_version = ">= 1.5.0"}
provider "kubernetes" { config_path = "~/.kube/config"}Créer un namespace
Section intitulée « Créer un namespace »resource "kubernetes_namespace" "demo" { metadata { name = "demo-namespace" }}Appliquez et vérifiez :
terraform initterraform applykubectl get namespacesCréer un secret
Section intitulée « Créer un secret »Note : Le provider Kubernetes encode automatiquement les valeurs du bloc
dataen Base64 avant de les envoyer à l’API. Saisir les valeurs en clair dans Terraform —kubectl get secret -o yamlaffichera les valeurs encodées en Base64, c’est normal.
resource "kubernetes_secret" "demo-secret" { metadata { name = "my-secret" namespace = kubernetes_namespace.demo.metadata[0].name }
data = { username = "admin" password = "P@ssw0rd" }
type = "Opaque"}Appliquez et vérifiez :
terraform applykubectl get secret -n demo-namespacekubectl get secret my-secret -n demo-namespace -o yamlDéployer un Pod
Section intitulée « Déployer un Pod »resource "kubernetes_pod" "demo-pod" { metadata { name = "nginx-pod" namespace = kubernetes_namespace.demo.metadata[0].name
labels = { app = "nginx" } }
spec { container { name = "nginx" image = "nginx:1.21"
port { container_port = 80 } } }}Appliquez et vérifiez :
terraform applykubectl get pods -n demo-namespaceCréer un Deployment
Section intitulée « Créer un Deployment »resource "kubernetes_deployment" "demo-deployment" { metadata { name = "nginx-deployment" namespace = kubernetes_namespace.demo.metadata[0].name }
spec { replicas = 3
selector { match_labels = { app = "nginx" } }
template { metadata { labels = { app = "nginx" } }
spec { container { name = "nginx" image = "nginx:1.21"
port { container_port = 80 } } } } }}Appliquez et vérifiez :
terraform applykubectl get deployments -n demo-namespacekubectl get pods -n demo-namespaceExposer le déploiement avec un service
Section intitulée « Exposer le déploiement avec un service »resource "kubernetes_service" "demo-service" { metadata { name = "nginx-service" namespace = kubernetes_namespace.demo.metadata[0].name }
spec { selector = { app = "nginx" }
type = "NodePort"
port { port = 80 target_port = 80 } }}Appliquez et accédez au service :
terraform applykubectl get services -n demo-namespacekubectl port-forward service/nginx-service 8080:80 -n demo-namespacecurl http://localhost:8080Supprimer les ressources
Section intitulée « Supprimer les ressources »terraform destroy