À la fin de ce tutoriel, vous installerez l’EKS Pod Identity Agent, créerez un rôle IAM de confiance
pods.eks.amazonaws.com, associerez un ServiceAccount viacreate-pod-identity-association, et prouverez l’accès S3 depuis un pod — sans annotation IRSA legacy ni clés longues dans le cluster — le tout enca-central-1.Niveau : Intermédiaire · Temps estimé : 50–70 min · Versions cibles : Amazon EKS 1.29+ · EKS Pod Identity Agent · AWS CLI v2 · kubectl · Dernière vérification : 2026-09-11 · Region :
ca-central-1Slug :
wow-eks-pod-identity· Série : WOW Platform / DevOps · Mot-clé SEO : EKS Pod Identity← Connexe : EKS concepts · EKS nœuds & IRSA · EKS Ingress / IRSA LB · GitHub Actions OIDC AWS · Secrets K8s · Hub : Démarrer avec AWS · Kubernetes · Cousin Azure : Workload Identity AKS
Prérequis
- Compte AWS lab (profil
lab) avec droits EKS + IAM + S3 ; budget d’alerte activé - Cluster EKS jetable ou existant (série AWS :
lab-eks) enca-central-1,kubectlcontext OK - AWS CLI v2,
eksctloptionnel, notions IAM / ServiceAccount (EKS nœuds & IRSA) - Suppression obligatoire en fin de session (association, rôle, bucket, ns ; cluster si créé pour le lab)
- Aucun secret réel dans Git : placeholders
lab-*uniquement
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
export CLUSTER_NAME=lab-eks
export NAMESPACE=podid-demo
export SERVICE_ACCOUNT_NAME=sa-podid-s3
export ROLE_NAME=eks-podid-s3-lab
ACCOUNT_ID="$(aws sts get-caller-identity --query Account --output text)"
export BUCKET="lab-podid-s3-${ACCOUNT_ID}-cac1"
aws sts get-caller-identity
kubectl config current-context
kubectl get nodes
Vérifiez l’identité lab — jamais un compte de production. Région ca-central-1 (Canada Central) pour aligner data residency et coût lab.
Ce que nous allons construire
Lab EKS Pod Identity (ca-central-1)
├── Addon eks-pod-identity-agent (DaemonSet)
├── Bucket S3 lab privé + objet démo
├── Rôle IAM trust pods.eks.amazonaws.com + policy S3 GetObject
├── Association cluster ↔ namespace ↔ ServiceAccount ↔ roleArn
├── Namespace + SA + Deployment aws-cli (preuve S3)
└── Nettoyage : pod → association → rôle → bucket → ns
(Schéma — alt : « Un pod EKS obtient des credentials temporaires via Pod Identity Agent et lit un objet S3 sans IRSA ni access keys ».)
Objectif : plus de clés IAM dans les pods ; liaison API EKS (pas d’annotation IRSA). Wow : une association + un SA nu → aws s3 cp depuis le pod.
Étape 1 — Pourquoi Pod Identity (vs IRSA legacy)
IRSA (IAM Roles for Service Accounts) reste supporté : issuer OIDC du cluster, annotation eks.amazonaws.com/role-arn sur le SA, trust policy sts:AssumeRoleWithWebIdentity. Ça marche — et c’est ce que beaucoup de charts (AWS LB Controller, etc.) documentent encore (Ingress EKS).
EKS Pod Identity simplifie le modèle 2026 :
| Approche | Forces | Limites |
|---|---|---|
| Clés longues dans le pod | Simple à « faire marcher » | Fuite, rotation, anti-pattern |
| IRSA | Natif OIDC ; mature | Trust JSON verbeux ; annotation SA ; issuer par cluster |
| Pod Identity | Association API EKS ; pas d’annotation role-arn ; trust standard pods.eks.amazonaws.com |
Addon agent requis ; EKS 1.24+ (ciblez 1.29+) |
Même esprit que Azure Workload Identity et OIDC GitHub → AWS : federation, zero secret long. La liaison vit hors du manifeste SA (moins d’ARN hardcodés en GitOps).
Étape 2 — Installer l’addon Pod Identity Agent
L’agent tourne en DaemonSet et injecte les credentials temporaires dans le pod associé.
# État des addons
aws eks list-addons --cluster-name "$CLUSTER_NAME" --region "$AWS_DEFAULT_REGION"
# Installer (ou mettre à jour) l’agent
aws eks create-addon
--cluster-name "$CLUSTER_NAME"
--addon-name eks-pod-identity-agent
--region "$AWS_DEFAULT_REGION"
|| aws eks update-addon
--cluster-name "$CLUSTER_NAME"
--addon-name eks-pod-identity-agent
--region "$AWS_DEFAULT_REGION"
aws eks describe-addon
--cluster-name "$CLUSTER_NAME"
--addon-name eks-pod-identity-agent
--region "$AWS_DEFAULT_REGION"
--query 'addon.status' --output text
kubectl -n kube-system get daemonset -l app.kubernetes.io/name=eks-pod-identity-agent
kubectl -n kube-system get pods -l app.kubernetes.io/name=eks-pod-identity-agent
Attendu : addon ACTIVE, pods agent Running sur les nœuds. Sans agent, l’association IAM existe mais le pod ne reçoit pas de credentials.
Prod : pinnez une version d’addon (
--addon-version), surveillez le DaemonSet, et restreignez les associations au moindre privilège (un rôle = un namespace/SA).
Étape 3 — Bucket S3 lab (preuve d’accès)
aws s3api create-bucket
--bucket "$BUCKET"
--region "$AWS_DEFAULT_REGION"
--create-bucket-configuration LocationConstraint="$AWS_DEFAULT_REGION"
aws s3api put-public-access-block
--bucket "$BUCKET"
--public-access-block-configuration
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
echo "hello-pod-identity-lab" | aws s3 cp - "s3://${BUCKET}/lab/hello.txt"
aws s3 ls "s3://${BUCKET}/lab/"
Bucket privé + BPA. L’objet lab/hello.txt servira de preuve depuis le pod.
Étape 4 — Rôle IAM trust Pod Identity + policy S3
Trust policy standard Pod Identity (plus le JSON OIDC issuer/sub IRSA) :
cat > /tmp/podid-trust.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "pods.eks.amazonaws.com" },
"Action": [ "sts:AssumeRole", "sts:TagSession" ],
"Condition": {
"StringEquals": {
"aws:SourceAccount": "${ACCOUNT_ID}"
},
"ArnEquals": {
"aws:SourceArn": "arn:aws:eks:${AWS_DEFAULT_REGION}:${ACCOUNT_ID}:cluster/${CLUSTER_NAME}"
}
}
}
]
}
EOF
cat > /tmp/podid-s3-policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListLabPrefix",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": "arn:aws:s3:::${BUCKET}",
"Condition": {
"StringLike": { "s3:prefix": ["lab/*"] }
}
},
{
"Sid": "GetLabObjects",
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": "arn:aws:s3:::${BUCKET}/lab/*"
}
]
}
EOF
aws iam create-role
--role-name "$ROLE_NAME"
--assume-role-policy-document file:///tmp/podid-trust.json
--description "Lab EKS Pod Identity S3 read ca-central-1"
--tags Key=Environment,Value=lab Key=ManagedBy,Value=wow-eks-pod-identity
aws iam put-role-policy
--role-name "$ROLE_NAME"
--policy-name s3-lab-get
--policy-document file:///tmp/podid-s3-policy.json
ROLE_ARN="$(aws iam get-role --role-name "$ROLE_NAME" --query Role.Arn --output text)"
echo "ROLE_ARN=$ROLE_ARN"
Le principal pods.eks.amazonaws.com + conditions SourceAccount / SourceArn limite l’assumption au votre cluster lab.
Étape 5 — Association Pod Identity (cluster ↔ SA ↔ rôle)
aws eks create-pod-identity-association
--cluster-name "$CLUSTER_NAME"
--namespace "$NAMESPACE"
--service-account "$SERVICE_ACCOUNT_NAME"
--role-arn "$ROLE_ARN"
--region "$AWS_DEFAULT_REGION"
aws eks list-pod-identity-associations
--cluster-name "$CLUSTER_NAME"
--region "$AWS_DEFAULT_REGION"
--query "associations[?namespace=='$NAMESPACE']" --output table
Pas besoin d’annoter le ServiceAccount avec eks.amazonaws.com/role-arn. L’association vit dans l’API EKS (auditable, centralisée). Note : le namespace et le SA doivent exister ensuite avec exactement ces noms.
Étape 6 — Namespace, ServiceAccount, preuve pod
kubectl create namespace "$NAMESPACE"
kubectl -n "$NAMESPACE" create serviceaccount "$SERVICE_ACCOUNT_NAME"
cat <<YAML | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: podid-s3-proof
namespace: ${NAMESPACE}
labels:
app: podid-demo
spec:
serviceAccountName: ${SERVICE_ACCOUNT_NAME}
containers:
- name: aws-cli
image: public.ecr.aws/aws-cli/aws-cli:2.17.0
command: ["sleep", "3600"]
restartPolicy: Never
YAML
kubectl -n "$NAMESPACE" wait --for=condition=Ready pod/podid-s3-proof --timeout=120s
# Preuve : credentials temporaires + lecture S3
kubectl -n "$NAMESPACE" exec podid-s3-proof -- aws sts get-caller-identity
kubectl -n "$NAMESPACE" exec podid-s3-proof -- aws s3 cp "s3://${BUCKET}/lab/hello.txt" -
Attendu : get-caller-identity montre le rôle $ROLE_NAME (AssumedRole), et hello-pod-identity-lab s’affiche. Si AccessDenied : vérifiez association (ns/SA), policy S3, addon Running, et relancez le pod après création de l’association.
Étape 7 — Migration IRSA → Pod Identity (aperçu)
- Inventaire des annotations
eks.amazonaws.com/role-arn(nœuds & IRSA). - Nouveau trust
pods.eks.amazonaws.com+create-pod-identity-associationpar ns/SA. - Preuve pod, puis retrait de l’annotation IRSA (évite double chemin).
- Charts tiers (ex. LB Controller) : garder IRSA tant que le chart n’est pas migré.
- IaC : Terraform
aws_eks_pod_identity_associationplutôt que CLI one-shot.
Migrez une app lab d’abord, puis élargissez.
Nettoyage
kubectl -n "$NAMESPACE" delete pod podid-s3-proof --ignore-not-found
kubectl delete namespace "$NAMESPACE" --ignore-not-found
ASSOC_ID="$(aws eks list-pod-identity-associations
--cluster-name "$CLUSTER_NAME" --region "$AWS_DEFAULT_REGION"
--query "associations[?namespace=='$NAMESPACE' && serviceAccount=='$SERVICE_ACCOUNT_NAME'].associationId"
--output text)"
if [ -n "$ASSOC_ID" ] && [ "$ASSOC_ID" != "None" ]; then
aws eks delete-pod-identity-association
--cluster-name "$CLUSTER_NAME"
--association-id "$ASSOC_ID"
--region "$AWS_DEFAULT_REGION"
fi
aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name s3-lab-get
aws iam delete-role --role-name "$ROLE_NAME"
aws s3 rm "s3://${BUCKET}" --recursive
aws s3api delete-bucket --bucket "$BUCKET" --region "$AWS_DEFAULT_REGION"
Cluster créé uniquement pour ce lab : eksctl delete cluster -n "$CLUSTER_NAME" --region "$AWS_DEFAULT_REGION" (~0,10 USD/h control plane — pas overnight).
Coût approximatif lab
| Ressource | Ordre de grandeur |
|---|---|
| EKS control plane | ≈ 0,10 USD/h |
| Nœuds / Fargate | Selon votre cluster lab existant |
| S3 objets lab | Cents |
| IAM / associations | Gratuit |
Alerte budget AWS ; jamais d’EKS overnight oublié.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
| AccessDenied S3 dans le pod | Association absente / mauvais ns-SA / policy | Relister associations ; vérifier noms exacts ; policy lab/* |
get-caller-identity = node role |
Agent absent ou pod créé avant association | Addon ACTIVE ; delete/recreate pod |
| AssumeRole denied | Trust sans pods.eks.amazonaws.com ou mauvais SourceArn |
Recréer trust + conditions Account/cluster |
| Addon CREATE_FAILED | Droits IAM cluster / CNI | Logs addon ; rôle cluster ; retry update-addon |
| Confusion IRSA + Pod Identity | Annotation role-arn encore présente | Retirer annotation après preuve Pod Identity |
| Bucket 404 / WrongRegion | Bucket hors ca-central-1 |
Recréer avec LocationConstraint Canada |
FAQ
Pod Identity remplace-t-il totalement IRSA ?
Pour les nouveaux workloads 2026, privilégiez Pod Identity. IRSA reste valide ; migration progressive (addons encore documentés en IRSA).
Faut-il un issuer OIDC pour Pod Identity ?
Pas le flux IRSA (annotation + OIDC IAM). Ici : agent + associations API. L’OIDC cluster peut rester pour d’autres usages.
Le ServiceAccount doit-il être annoté ?
Non pour role-arn. SA « nu » + association API suffisent.
Pourquoi ca-central-1 ?
Data residency Canada, cohérence série AWS. Cluster et S3 dans la même région.
Différence avec Azure Workload Identity ?
Même idée federation. Azure : FIC Entra. AWS : association EKS + pods.eks.amazonaws.com. Voir Workload Identity AKS.
Quiz (3 questions)
1. Quel service principal apparaît dans le trust IAM Pod Identity ?
– A. ec2.amazonaws.com uniquement
– B. pods.eks.amazonaws.com
– C. lambda.amazonaws.com
2. Où lie-t-on namespace + ServiceAccount + rôle IAM ?
– A. Un ConfigMap kube-system
– B. aws eks create-pod-identity-association
– C. Une annotation obligatoire eks.amazonaws.com/role-arn
3. Pourquoi installer eks-pod-identity-agent ?
– A. Pour remplacer kube-proxy
– B. Pour délivrer les credentials temporaires aux pods associés
– C. Pour facturer S3
Réponses : 1‑B · 2‑B · 3‑B
Pour aller plus loin
- Documenter les associations en Terraform / CloudFormation (IaC, pas CLI one-shot)
- EKS Ingress : comparer IRSA du LB Controller vs roadmap Pod Identity
- GitHub Actions OIDC AWS · Crossplane AWS · Karpenter (
wow-karpenter-eks) - Docs AWS : EKS Pod Identities (User Guide)
Maillage WOW / Platform
| Série | WOW ×50 — Platform Engineering & GitOps |
| Voisins | wow-karpenter-eks · wow-azure-workload-identity · wow-crossplane-aws · wow-ecs-fargate-prod |
| Hubs live | AWS · Kubernetes · DevOps (menus du site) |
Meta publication (SEO) — Publish HOLD
- Title SEO : EKS Pod Identity : lab sans IRSA legacy (2026)
- Meta description (≤ 160) : Installez l’agent Pod Identity sur EKS, associez un ServiceAccount à un rôle IAM et lisez un objet S3 en ca-central-1 sans annotation IRSA ni access keys.
- Image mise en avant :
assets/web/devopelastichayway/cover-wow-eks-pod-identity-1200x630.webp - Cover alt : Pod EKS authentifié à S3 via EKS Pod Identity Agent
- Catégorie : DevOps / Platform · Niveau : Intermédiaire
- KW principal : EKS Pod Identity · Secondaires : IRSA legacy, pods.eks.amazonaws.com, create-pod-identity-association, eks-pod-identity-agent, IAM ServiceAccount EKS
- Schema : HowTo + FAQPage + Article
- URL cible : https://devopelastichayway.com/tutoriels/wow-eks-pod-identity/
- Statut : Publish HOLD — draft only, pas de Rank Math live sans feu vert
- Region lab :
ca-central-1
Pour aller plus loin — hubs live
Retour parcours Kubernetes — hub de la série et leçons sœurs.