Provider Kubernetes
Le provider Kubernetes permet de gerer les ressources K8s directement depuis Terraform.
Configuration du provider
provider "kubernetes" {
host = data.aws_eks_cluster.cluster.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority[0].data)
exec {
api_version = "client.authentication.k8s.io/v1beta1"
command = "aws"
args = ["eks", "get-token", "--cluster-name", var.cluster_name]
}
}
Deployer un Namespace et un Deployment
resource "kubernetes_namespace" "app" {
metadata {
name = "mon-application"
labels = {
environment = var.environment
}
}
}
resource "kubernetes_deployment" "app" {
metadata {
name = "mon-api"
namespace = kubernetes_namespace.app.metadata[0].name
labels = {
app = "mon-api"
}
}
spec {
replicas = 3
selector {
match_labels = {
app = "mon-api"
}
}
template {
metadata {
labels = {
app = "mon-api"
}
}
spec {
container {
image = "mon-api:latest"
name = "mon-api"
port {
container_port = 8080
}
resources {
limits = {
cpu = "500m"
memory = "256Mi"
}
requests = {
cpu = "250m"
memory = "128Mi"
}
}
}
}
}
}
}
Deployer un cluster EKS avec Terraform
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 19.0"
cluster_name = "mon-cluster"
cluster_version = "1.28"
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets
eks_managed_node_groups = {
general = {
desired_size = 3
min_size = 2
max_size = 5
instance_types = ["t3.medium"]
}
}
}
Provider Helm
provider "helm" {
kubernetes {
host = module.eks.cluster_endpoint
cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
exec {
api_version = "client.authentication.k8s.io/v1beta1"
command = "aws"
args = ["eks", "get-token", "--cluster-name", module.eks.cluster_name]
}
}
}
resource "helm_release" "nginx_ingress" {
name = "nginx-ingress"
repository = "https://kubernetes.github.io/ingress-nginx"
chart = "ingress-nginx"
namespace = "ingress"
create_namespace = true
set {
name = "controller.replicaCount"
value = "2"
}
}
Bonne pratique : Separez la creation du cluster (EKS/GKE/AKS) et le deploiement des applications K8s dans des states differents pour limiter le blast radius.