EKS supprime la gestion du control plane Kubernetes — nodes masters, etcd, API server. Vous gérez uniquement les nœuds worker. En contrepartie, quelques spécificités AWS à connaître pour éviter les pièges courants.
Créer un cluster EKS avec Terraform
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 20.0"
cluster_name = "myapp-production"
cluster_version = "1.29"
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets
# Accès à l'API server depuis les nœuds uniquement (pas depuis Internet)
cluster_endpoint_public_access = true
cluster_endpoint_private_access = true
cluster_endpoint_public_access_cidrs = ["${var.office_ip}/32"]
# Chiffrement etcd avec KMS
cluster_encryption_config = {
resources = ["secrets"]
provider_key_arn = aws_kms_key.eks.arn
}
eks_managed_node_groups = {
general = {
instance_types = ["m6i.large"]
min_size = 2
max_size = 10
desired_size = 3
labels = { role = "general" }
taints = []
}
spot = {
instance_types = ["m6i.large", "m5.large", "m5a.large"]
capacity_type = "SPOT"
min_size = 0
max_size = 20
desired_size = 0
labels = { role = "spot", "lifecycle" = "spot" }
taints = [{
key = "lifecycle"
value = "spot"
effect = "NO_SCHEDULE"
}]
}
}
}
IRSA : IAM pour les Service Accounts
IRSA permet aux pods de s’authentifier auprès d’AWS sans stocker de credentials. Un pod avec un Service Account approprié peut appeler S3, DynamoDB, SQS directement.
# Créer un rôle IAM utilisable par le Service Account "myapp" dans le namespace "production"
module "myapp_irsa" {
source = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
role_name = "myapp-production"
oidc_providers = {
main = {
provider_arn = module.eks.oidc_provider_arn
namespace_service_accounts = ["production:myapp"]
}
}
}
resource "aws_iam_role_policy" "myapp_s3" {
role = module.myapp_irsa.iam_role_name
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["s3:GetObject", "s3:PutObject"]
Resource = "${aws_s3_bucket.uploads.arn}/*"
}]
})
}
# Service Account annoté avec le rôle IAM
apiVersion: v1
kind: ServiceAccount
metadata:
name: myapp
namespace: production
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789:role/myapp-production
Addons essentiels post-installation
# AWS Load Balancer Controller — remplace l'ALB Ingress Controller
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=myapp-production --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller
# EBS CSI Driver — nécessaire pour les PersistentVolumes EBS
eksctl create addon --name aws-ebs-csi-driver --cluster myapp-production
# Cluster Autoscaler — scale les node groups automatiquement
helm install cluster-autoscaler autoscaler/cluster-autoscaler --set autoDiscovery.clusterName=myapp-production --set awsRegion=eu-west-1
Accéder au cluster
# Configurer kubectl
aws eks update-kubeconfig --name myapp-production --region eu-west-1
# Vérifier l'accès
kubectl get nodes
kubectl get pods -A
# Accès en lecture seule pour les développeurs
aws eks update-kubeconfig --name myapp-production --region eu-west-1 --role-arn arn:aws:iam::123456789:role/developer-readonly
Notre formation AWS couvre EKS avec des ateliers Terraform sur des comptes AWS réels.