Aller au contenu

Lab Adv 03 : Déployer un cluster OKS avec Terraform

À 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

Avant de commencer ce lab, assurez-vous de disposer des éléments suivants :

  • Terraform installé
  • kubectl installé

Créez l’arborescence suivante :

oks-terraform/
├── main.tf
├── providers.tf
├── variables.tf
├── terraform.tfvars
└── outputs.tf

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"
}
}

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"]
}

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"]

Dans le fichier main.tf, ajoutez :

resource "outscale_oks_project" "project01" {
name = var.project_name
cidr = var.project_cidr
region = var.region
}

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.

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
}

Initialisez le projet Terraform :

Terminal window
terraform init

Vérifiez le plan d’exécution :

Terminal window
terraform plan

Appliquez la configuration :

Terminal window
terraform apply

Une fois le déploiement terminé, exportez le kubeconfig généré par Terraform :

Terminal window
terraform output -raw kubeconfig > kubeconfig
export KUBECONFIG=$PWD/kubeconfig

Vérifiez que le cluster est accessible :

Terminal window
kubectl get ns
kubectl get pods -A

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/v1beta2
kind: NodePool
metadata:
name: nodepool-01
spec:
desiredNodes: 2
nodeType: tinav7.c2r4p2
zones:
- eu-west-2a
upgradeStrategy:
maxUnavailable: 1
maxSurge: 0
autoUpgradeEnabled: true
autoUpgradeMaintenance:
durationHours: 1
startHour: 12
weekDay: Tue
autoHealing: true

Appliquez la configuration avec la commande suivante :

Terminal window
kubectl apply -f nodepool.yaml

Vérifiez que le NodePool a bien été créé :

Terminal window
kubectl get nodepools

La 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
}
}