요약: 새로 구성하는 EKS 환경에서는 Pod Identity를 기본적으로 사용하는 것이 좋다.
설정이 단순하고 Terraform으로 중앙 관리가 가능하며 AWS의 권장 사항이다.
*단 AWS SDK v1기반은 지원하지 않으니, 예외적으로 IRSA를 사용해야 한다.
--
EKS에서 pod가 AWS 리소스(s3, MSK 등)에 접근하려면 IAM 권한이 필요하다.
하지만 파드는 EC2처럼 인스턴스 프로파일을 직접 붙일 수 없다.
해당 문제를 해결하기 위해서는 3가지 방법이 있다.
가상 선호/최신 방법인 Pod Identity부터 알아보자.
Pod Identity (AWS 권장 최신 방식, 2023)
AWS EKS Pod Identity Agent가 파드의 자격증명을 직접 담당한다,
OIDC나 SA 어노테이션 없이 Terraform에서 namepsace + SA 조합을 매핑해 사용한다.
*OIDC(OpenID Conenct): "내가 누구야"를 증명하는 프로토콜
이 방법은 언제 사용하냐?
- EKS 1.24 이상 환경
- AWS SDK v2 기반 애플리케이션
- 새로 구성하는 모든 인프라
파드 기동 -> eks-pod-identity-agent (DeamonSet)에 자격증명 요청 -> AWS에서 임시 자격증명 발급 -> 파드에 주입
설정 방법
# Step1. IAM Role 생성
resource "aws_iam_role" "jenkins" {
name = "${local.cluster_name}-jenkins"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = {
Service = "pods.eks.amazonaws.com"
}
Action = [
"sts:AssumeRole",
"sts:TagSession"
]
}]
})
tags = merge(var.common_tags, {
Name = "${local.cluster_name}-jenkins"
})
}
--
# Step2. Pod Identity Association 생성
resource "aws_eks_pod_identity_association" "jenkins" {
cluster_name = module.eks.cluster_name
namespace = "jenkins"
service_account = "jenkins"
role_arn = aws_iam_role.jenkins.arn
tags = merge(var.common_tags, {
Name = "${local.cluster_name}-jenkins"
})
depends_on = [kubernetes_namespace_v1.jenkins]
}
--
# Step3. Service Account 생성
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins
namespace: jenkins
--
두 번째 방법은 IRSA를 사용하는 방법이다. (IAM Roles for Service Account)
EKS의 OIDC Provider를 통해 k8s Service Account와 IAM Role을 1:1 로 연결하는 방식이다.
SA에 IAM Role ARN을 어노테이션으로 명시하면, pod 가동 시 EKS가 JWT 토큰을 발급하고 AWS STS가 이를 검증해 임시 자격증명을 제공한다.
파드 기동 -> SA 토큰(JWT) 발급(OIDC provider 서명) -> AWS STS -> IAM Role 자격증명 발급
OIDC Provider가 사전에 설정되어 있어야한다.
이 방법은 언제 쓰냐?
- Pod Identity를 지원하지 않는 구형 EKS 버전
- AWS SDK v1 기반을 사용할 경우에는 사용해야함.
권장되지 않는 방법이기에 사용 코드는 생략.
--
세번째 방법은 Node IAM Role 이다.
EC2 노드 자체에 IAM Role을 부여하고, 그 노드 위에서 실행되는 모든 pod가 동일한 권한을 공유하는 방식이다.
EC2 Node (IAM Role: node-role)
├── Pod A → node-role 권한 사용
├── Pod B → node-role 권한 사용
└── Pod C → node-role 권한 사용 (원치 않아도)
해당 방법의 장점은 단순하다는 것 밖에 없다.
노드의 기본 운영에 필요한 권한이나 모든 pod가 동일 권한을 가져야하는 단순한 환경에서만 사용할 것으로 예상된다.
'DevOps' 카테고리의 다른 글
| Karpenter + Spot 조합을 알아보자 (1) (0) | 2026.05.13 |
|---|---|
| 노드에 파드 할당하기 (0) | 2026.05.13 |
| MSK Connect + Debezium 이용하여 CDC 파이프라인 구축 (0) | 2026.05.07 |
| Karpenter 이해하기 (0) | 2026.05.07 |
| OTel 과 CloudWatch 구분하기 (MSK 모니터링) (0) | 2026.05.06 |