Lab Adv 03 : Déployer un cluster OKS avec Terraform
Objectif du lab
Section intitulée « Objectif du lab »À la fin de ce lab, vous serez capable de :
- Créer un projet OKS avec Terraform
- Déployer un cluster OKS avec Terraform
- Générer automatiquement le kubeconfig du cluster
- Interagir avec le cluster à l’aide de
kubectl
Préparation de l’environnement
Section intitulée « Préparation de l’environnement »Avant de commencer ce lab, assurez-vous de disposer des éléments suivants :
- Terraform installé
kubectlinstallé
Initialisation du projet Terraform
Section intitulée « Initialisation du projet Terraform »Créez l’arborescence suivante :
oks-terraform/├── main.tf├── providers.tf├── variables.tf├── terraform.tfvars└── outputs.tfConfiguration du provider OUTSCALE
Section intitulée « Configuration du provider OUTSCALE »Créez le fichier providers.tf :
terraform { required_version = ">= 1.0" required_providers { outscale = { source = "outscale/outscale" version = "1.3.0" } }}
provider "outscale" { access_key_id = var.access_key secret_key_id = var.secret_key region = var.region endpoints { api = "api.${var.region}.outscale.com" }}Définition des variables
Section intitulée « Définition des variables »Créez le fichier variables.tf :
variable "access_key" { description = "Access Key" type = string}variable "secret_key" { description = "Secret Key" type = string sensitive = true}variable "region" { description = "Region" type = string}
variable "project_name" { description = "Nom du projet OKS" type = string}
variable "project_cidr" { description = "CIDR du projet OKS" type = string}
variable "cluster_name" { description = "Nom du cluster OKS" type = string}
variable "cidr_pods" { description = "CIDR du réseau des pods" type = string}
variable "cidr_services" { description = "CIDR du réseau des services" type = string}
variable "cluster_version" { description = "Version Kubernetes du cluster OKS" type = string}
variable "admin_whitelist" { description = "Liste des CIDR autorisés à accéder à l’API Kubernetes" type = list(string)}
variable "control_planes" { description = "Control Planes" type = string default = "cp.mono.master"}
variable "cp_multi_az" { description = "Control Plane Multi AZ" type = bool default = false}
variable "cp_subregions" { description = "Control Plane Subregions" type = list(string) default = ["1a", "1b", "1c"]}Valeurs des variables
Section intitulée « Valeurs des variables »Créez le fichier terraform.tfvars :
access_key = ""secret_key = ""region = "eu-west-2"project_name = "my-project"project_cidr = "10.50.0.0/16"cluster_name = "cluster01"cluster_version = "1.32"cidr_pods = "10.91.0.0/16"cidr_services = "10.92.0.0/16"admin_whitelist = ["46.231.147.8/32"]Création du projet OKS
Section intitulée « Création du projet OKS »Dans le fichier main.tf, ajoutez :
resource "outscale_oks_project" "project01" { name = var.project_name cidr = var.project_cidr region = var.region}Création du cluster OKS
Section intitulée « Création du cluster OKS »Toujours dans main.tf:
resource "outscale_oks_cluster" "cluster01" { name = var.cluster_name project_id = outscale_oks_project.project01.id
version = var.cluster_version cidr_pods = var.cidr_pods cidr_service = var.cidr_services admin_whitelist = var.admin_whitelist
control_planes = var.control_planes cp_multi_az = var.cp_multi_az cp_subregions = var.cp_subregions}Cette configuration permet de définir le type de control plane, son déploiement mono-AZ ou multi-AZ, ainsi que les sous-régions utilisées.
Récupération du kubeconfig du cluster
Section intitulée « Récupération du kubeconfig du cluster »Dans ce lab, le kubeconfig du cluster OKS est récupéré automatiquement à l’aide d’une datasource Terraform et exposé via un output.
Créez le fichier output.tf:
data "outscale_oks_kubeconfig" "cluster01" { cluster_id = outscale_oks_cluster.cluster01.id}
output "kubeconfig" { description = "Kubeconfig du cluster OKS" value = data.outscale_oks_kubeconfig.cluster01.kubeconfig sensitive = true}Déploiement de l’infrastructure
Section intitulée « Déploiement de l’infrastructure »Initialisez le projet Terraform :
terraform initVérifiez le plan d’exécution :
terraform planAppliquez la configuration :
terraform applyConfiguration du kubeconfig local
Section intitulée « Configuration du kubeconfig local »Une fois le déploiement terminé, exportez le kubeconfig généré par Terraform :
terraform output -raw kubeconfig > kubeconfigexport KUBECONFIG=$PWD/kubeconfigVérification de l’accès au cluster
Section intitulée « Vérification de l’accès au cluster »Vérifiez que le cluster est accessible :
kubectl get nskubectl get pods -ADéploiement d’un NodePool
Section intitulée « Déploiement d’un NodePool »Une fois le cluster OKS déployé et le kubeconfig configuré, il est nécessaire de créer un NodePool afin de disposer de worker nodes pour exécuter des workloads Kubernetes.
Créez un fichier nodepool.yaml avec le contenu suivant :
apiVersion: oks.dev/v1beta2kind: NodePoolmetadata: name: nodepool-01spec: desiredNodes: 2 nodeType: tinav7.c2r4p2 zones: - eu-west-2a upgradeStrategy: maxUnavailable: 1 maxSurge: 0 autoUpgradeEnabled: true autoUpgradeMaintenance: durationHours: 1 startHour: 12 weekDay: Tue autoHealing: trueAppliquez la configuration avec la commande suivante :
kubectl apply -f nodepool.yamlVérifiez que le NodePool a bien été créé :
kubectl get nodepoolsLa création des machines du NodePool peut prendre plusieurs minutes.
Exemple de configuration d’un backend Terraform distant (optionnel)
Section intitulée « Exemple de configuration d’un backend Terraform distant (optionnel) »Cet exemple est fourni à titre indicatif et n’est pas requis pour exécuter ce lab.
Dans ce lab, le backend Terraform est volontairement laissé en local. Le fichier d’état (terraform.tfstate) est donc stocké sur la machine locale.
En environnement de production, il est recommandé d’utiliser un backend distant afin de centraliser l’état Terraform, permettre le travail collaboratif et renforcer la sécurité.
Exemple du fichier backend.tf
terraform { backend "s3" { bucket = "terraform-bucket" endpoint = "https://oos.eu-west-2.outscale.com" key = "terraform/terraform.tfstate" profile = "my-profile" region = "eu-west-2" skip_credentials_validation = true skip_metadata_api_check = true skip_region_validation = true skip_requesting_account_id = true skip_s3_checksum = true }}