Skip to main content

Command Palette

Search for a command to run...

The Complete Guide to EKS Pod Identity: Understanding the Magic Behind eksctl

Published
4 min read

Introduction

Pod Identity in Amazon EKS is a game-changer for managing AWS service access from Kubernetes pods. While the underlying mechanism is complex, eksctl makes it incredibly simple. In this comprehensive guide, we'll dive deep into how everything works under the hood, and how eksctl automates the entire process.

Understanding the Architecture

The Components

  1. EKS Cluster: Your Kubernetes environment in AWS

  2. OIDC Provider: Handles identity federation between EKS and AWS IAM

  3. IAM Role: Defines AWS permissions

  4. Service Account: Kubernetes resource that links to the IAM role

  5. Pod: Runs with the permissions from the IAM role

The Flow

Detailed Setup Process

1. OIDC Provider Configuration

First, let's ensure our cluster has an OIDC provider:

# Get the OIDC provider URL
OIDC_URL=$(aws eks describe-cluster \
    --name your-cluster-name \
    --query "cluster.identity.oidc.issuer" \
    --output text)

# Associate OIDC provider with cluster
eksctl utils associate-iam-oidc-provider \
    --cluster your-cluster-name \
    --approve

2. Creating the IAM Policy

Let's create a detailed policy for S3 access:

cat <<EOF > s3-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": "*"
    }
  ]
}

EOF

# Create the IAM policy
aws iam create-policy \
    --policy-name eks-pod-s3-policy \
    --policy-document file://s3-policy.json

3. The Magic of eksctl

Here's where eksctl shines. One command does it all:

eksctl create iamserviceaccount \
    --name s3-access-sa \
    --namespace default \
    --cluster your-cluster-name \
    --attach-policy-arn arn:aws:iam::YOUR_ACCOUNT_ID:policy/eks-pod-s3-policy \
    --approve

What eksctl Does Behind the Scenes

  1. Creates IAM Role:

    • Generates a unique role name

    • Attaches the specified policy

  2. Sets up Trust Relationship:

    • Creates trust policy allowing EKS OIDC provider

    • Links to specific namespace and service account

  3. Creates Kubernetes Service Account:

    • Creates service account in specified namespace

    • Adds IAM role annotation

    • Configures proper RBAC permissions

Implementing Pod Identity

Basic Pod Example

# save as s3-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: aws-cli-pod
spec:
  serviceAccountName: s3-access-sa
  containers:
  - name: aws-cli
    image: amazon/aws-cli:latest
    command:
    - sleep
    - "3600"

Production Deployment Example

# save as app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: s3-app
  labels:
    app: s3-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: s3-app
  template:
    metadata:
      labels:
        app: s3-app
    spec:
      serviceAccountName: s3-access-sa
      containers:
      - name: app
        image: your-app:latest
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

Understanding Pod Authentication Flow

When a pod starts, here's what happens:

  1. Token Mounting:

    • Kubernetes mounts service account token

    • Token contains OIDC claims

  2. AWS SDK Authentication:

  3. Credential Refresh:

    • AWS SDK automatically handles credential rotation

    • No application changes needed

Advanced Configurations

Multi-Policy Service Account

# Create service account with multiple policies
eksctl create iamserviceaccount \
    --name multi-service-sa \
    --namespace default \
    --cluster your-cluster-name \
    --attach-policy-arn arn:aws:iam::YOUR_ACCOUNT_ID:policy/policy1 \
    --attach-policy-arn arn:aws:iam::YOUR_ACCOUNT_ID:policy/policy2 \
    --approve

Namespace-Specific Setup

# Create namespace
kubectl create namespace app-namespace

# Create service account in namespace
eksctl create iamserviceaccount \
    --name s3-access-sa \
    --namespace app-namespace \
    --cluster your-cluster-name \
    --attach-policy-arn arn:aws:iam::YOUR_ACCOUNT_ID:policy/eks-pod-s3-policy \
    --approve

Monitoring and Debugging

1. Service Account Verification

# Check service account details
kubectl describe serviceaccount s3-access-sa -n default

# View service account annotations
kubectl get serviceaccount s3-access-sa -n default -o yaml

2. Pod Identity Verification

# Check pod AWS environment variables
kubectl exec -it aws-cli-pod -- env | grep AWS

# Test AWS credentials
kubectl exec -it aws-cli-pod -- aws sts get-caller-identity

3. Common Issues and Solutions

  1. Missing AWS Credentials

     # Check pod events
     kubectl describe pod aws-cli-pod
    
     # Verify service account annotation
     kubectl get serviceaccount s3-access-sa -o yaml
    
  2. Permission Issues

     # Test specific AWS service access
     kubectl exec -it aws-cli-pod -- aws s3 ls s3://your-bucket
    
     # Check AWS CLI errors
     kubectl logs aws-cli-pod
    

Best Practices

1. Security

  • Use namespace isolation

  • Implement least privilege access

  • Regularly rotate service account tokens

  • Audit IAM role usage

    Managing Service Accounts

Update Existing Service Account

# Update service account policies
eksctl update iamserviceaccount \
    --name s3-access-sa \
    --namespace default \
    --cluster your-cluster-name \
    --attach-policy-arn arn:aws:iam::YOUR_ACCOUNT_ID:policy/new-policy \
    --approve

Delete Service Account

# Remove service account and IAM role
eksctl delete iamserviceaccount \
    --name s3-access-sa \
    --namespace default \
    --cluster your-cluster-name

Conclusion

Pod Identity in EKS, powered by eksctl, provides a secure and efficient way to manage AWS service access. Key takeaways:

  1. eksctl automates complex IAM and Kubernetes configurations

  2. Service accounts provide pod-level AWS access control

  3. OIDC integration enables secure authentication

  4. Regular monitoring and updates ensure security

Remember:

  • Keep policies focused and minimal

  • Use namespace isolation

  • Monitor and audit regularly

  • Update and rotate credentials as needed

By following this guide, you can implement Pod Identity effectively in your EKS environment, ensuring secure and manageable AWS service access for your applications.


Found this helpful? Follow for more Kubernetes and AWS content!