본문 바로가기
카테고리 없음

[AEWS-3기][6주차-도전과제-2][EKS Workshop] EKS Pod Identity

by james_janghun 2025. 3. 16.

이번 블로깅은 EKS의 Pod Identity에 대한 워크샵 실습을 정리하였습니다.

https://www.eksworkshop.com/docs/security/amazon-eks-pod-identity/

 

Amazon EKS Pod Identity | EKS Workshop

Manage AWS credentials for your applications running on Amazon Elastic Kubernetes Service with EKS Pod Identity.

www.eksworkshop.com

 

EKS Pod Identity 개요

EKS Pod Identity는 Amazon EC2 Instance Profile이 인스턴스에 자격 증명을 제공하는 방식과 유사하게 애플리케이션에 대한 자격 증명을 관리할 수 있는 기능을 제공합니다. AWS 자격 증명을 컨테이너에 직접 생성하고 배포하거나 Amazon EC2 인스턴스의 역할을 사용하는 대신, IAM 역할을 Kubernetes 서비스 계정과 연결하고 Pod를 해당 Service Account로 구성할 수 있습니다.

IRSA와의 차이점

EKS Pod Identity가 IAM Roles for Service Accounts(IRSA)보다 좋은 점은 다음과 같습니다.

 

- 구현 방식: Pod Identity는 EKS 관리형 애드온으로 제공되어 더 쉽게 설정하고 관리할 수 있습니다.

- 호환성: IRSA보다 더 넓은 버전 범위의 Kubernetes 클러스터에서 사용할 수 있습니다.

- 관리: AWS에서 지속적으로 유지 관리하고 업데이트합니다.

 

실습 목표

실습은 현재 pod에서 사용하고 있는 dynamoDB를 AWS DynamoDB 서비스로 올리고, 다른 pod에서 해당 DynamoDB에 접근해 사용할 수 있는 IAM 역할을 EKS Pod Identity를 사용해 구성하고자 합니다.

참고로 해당 실습의 1번부터 3번까지는 IRSA와 완전 동일합니다.

 

다음 명령어를 통해 실습환경을 세팅합니다.

prepare-environment security/eks-pod-identity

 

1. carts 서비스의 ConfigMap을 수정해, 실제 AWS DynamoDB테이블을 사용하도록 변경합니다.

carts-6878b878f5-4d5sn라는 이름의 pod는 장바구니용 애플리케이션 입니다.

이 애플리케이션 pod는 carts-dynamodb-68bd8f6f6d-5zw6m라는 DynamoDB pod가 DB역할을 하고 있습니다.

kubectl -n carts get pod

 

컴포넌트를 확인해 봅니다. ENV를 통해 확인해보면 ENDPOINT가 http://carts-dynamodb:8000로 설정된 것을 확인할 수 있습니다.

kubectl -n carts exec deployment/carts -- env | grep CARTS_DYNAMODB_ENDPOINT

 

 

 

2. DynamoDB 연동하기

일단 carts의 configmap을 통해서 설정정보를 확인해보겠습니다.

kubectl -n carts get -o yaml cm carts

 

AWS ACCESS KEY와 SECRET KEY를 Configmap에 그대로 사용하고 있는데 이것은 보안적으로도 좋지않으며, 요구사항에 따라서 기존 pod에 있는 DynamoDB를 AWS의 DynamoDB 서비스로 이관하고자 합니다.

apiVersion: v1
data:
  AWS_ACCESS_KEY_ID: key
  AWS_SECRET_ACCESS_KEY: secret
  CARTS_DYNAMODB_CREATETABLE: true
  CARTS_DYNAMODB_ENDPOINT: http://carts-dynamodb:8000
  CARTS_DYNAMODB_TABLENAME: Items
kind: ConfigMap
metadata:
  name: carts
  namespace: carts

 

따라서 다음과 같이 모든 내용을 제거하고 새로운 configmap을 설정합니다.

kubectl -n carts edit cm carts

# 혹은 실습간에는
kubectl kustomize ~/environment/eks-workshop/modules/security/eks-pod-identity/dynamo \
  | envsubst | kubectl apply -f-

 

바뀐 configmap을 확인해봅니다.

kubectl -n carts get cm carts -o yaml
apiVersion: v1
data:
  CARTS_DYNAMODB_TABLENAME: eks-workshop-carts
kind: ConfigMap
metadata:
  labels:
    app: carts
  name: carts
  namespace: carts

 

ConfigMap 적용을 위해서 deployment를 재시작합니다.

kubectl rollout restart -n carts deployment/carts

 

상태를 확인해보면 계속해서 pod가 문제상태입니다.

이유가 뭘까요?

일단 DynamoDB 접근에 대한 인증정보를 모두 제거했기 때문에 권한이 없습니다. DynamoDB에 직접 접근하려면 IAM 권한이 필요한데 현재는 해당 pod는 접근권한이 없습니다.

 

3. Pod IAM 문제 이해하기

문제를 명확하게 확인하기 위해 pod 로그를 살펴봅시다.

LATEST_POD=$(kubectl get pods -n carts --sort-by=.metadata.creationTimestamp -o jsonpath='{.items[-1:].metadata.name}')
kubectl logs -n carts -p $LATEST_POD

 

다음과 같이 DynamoDB에 대한 access가 없음을 확인할 수 있습니다.

***************************
APPLICATION FAILED TO START
***************************

Description:

An error occurred when accessing Amazon DynamoDB: 

User: arn:aws:sts::160889332534:assumed-role/eksctl-eks-workshop-nodegroup-defa-NodeInstanceRole-kOGZCDJ4cNgi/i-0686e40c392541d9b is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-west-2:160889332534:table/eks-workshop-carts/index/idx_global_customerId because no identity-based policy allows the dynamodb:Query action (Service: DynamoDb, Status Code: 400, Request ID: PC2FENH1FKR8JE58O0IQPFE46JVV4KQNSO5AEMVJF66Q9ASUAAJG)

Action:

Check that the DynamoDB table has been created and your IAM credentials are configured with the appropriate access.

 

기본적으로 Pod의 경우 직접적인 IAM 역할이나 정책이 연결되지 않을 경우 Pod가 실행 중인 EC2 인스턴스에 할당된 인스턴스 프로파일에 연결된 IAM 역할을 사용합니다. 따라서 EC2 워커노드에서는 DynamoDB에 대한 접근 허용이 없기 때문에 접근이 불가능합니다.

 

이번에는 EKS Pod Identity를 사용해서 권한을 부여하겠습니다.

 

4. EKS Pod Identity 사용하기

먼저 EKS Pod Identity를 사용하려면  EKS Pod Identity Agent 애드온이 EKS 클러스터에 설치되어 있어야 합니다. 

 

addon 설치하기

aws eks create-addon --cluster-name $EKS_CLUSTER_NAME --addon-name eks-pod-identity-agent

# 설치까지 대기
aws eks wait addon-active --cluster-name $EKS_CLUSTER_NAME --addon-name eks-pod-identity-agent

 

애드온이 잘 설치되었는지 한 번 확인해봅니다.

kubectl -n kube-system get daemonset eks-pod-identity-agent

kubectl -n kube-system get pods -l app.kubernetes.io/name=eks-pod-identity-agent

 

IAM 역할 및 정책 확인

aws iam get-policy-version \
  --version-id v1 --policy-arn \
  --query 'PolicyVersion.Document' \
  arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${EKS_CLUSTER_NAME}-carts-dynamo | jq .

 

 

신뢰관계 확인

aws iam get-role \
  --query 'Role.AssumeRolePolicyDocument' \
  --role-name ${EKS_CLUSTER_NAME}-carts-dynamo | jq .

 

 

 

Pod Identity 연결 생성

먼저 carts 서비스가 carts serviceaccount를 사용하는지 한번 확인합니다.

kubectl -n carts describe deployment carts | grep 'Service Account'

 

다음 명령어를 통해서 간단하게 생성한 role과 serivceaccount와 연결합니다.

aws eks create-pod-identity-association --cluster-name ${EKS_CLUSTER_NAME} \
  --role-arn arn:aws:iam::${AWS_ACCOUNT_ID}:role/${EKS_CLUSTER_NAME}-carts-dynamo \
  --namespace carts --service-account carts

 

 

재적용을 위해서 deployment를 재시작합니다.

kubectl -n carts rollout restart deployment/carts
kubectl -n carts rollout status deployment/carts

 

 

5. DynamoDB 접근 확인하기

이제 잘 적용되었는지 확인해봅시다. carts Pod는 DynamoDB 서비스에 접근할 수 있는 권한이 생겼습니다.

LB_HOSTNAME=$(kubectl -n ui get service ui-nlb -o jsonpath='{.status.loadBalancer.ingress[*].hostname}{"\n"}')
echo "http://$LB_HOSTNAME"

 

실제 서비스제 접속해 carts에 담아보면 AWS DynamoDB에 잘 담기는것을 확인할 수 있었습니다.

 

6. EKS Pod Identity 작동 원리 살펴보기

ServiceAccount와 AWS IAM 역할이 연결되면 해당 ServiceAccount를 사용하는 pod들은 모두 EKS Pod Identity 웹훅에 의해 요청이 전달됩니다. 이 웹훅은 EKS 클러스터의 컨트롤 플레인에서 실행되고 AWS에 의해서 관리됩니다.

 

다음명령어를 통해 env를 확인해보겠습니다.

kubectl -n carts exec deployment/carts -- env | grep AWS

 

확인해보면, AWS_CONTAINER_CREDENTIALS_FULL_URI를 통해서 AWS SDK에 HTTP 자격 증명 제공자를 사용해 자격 증명을 얻게 됩니다.

해당 정보는 AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE에서 저장되어 인증된 임시정보를 저장해 사용합니다. 실제 그 위치에 가보면 토큰 정보가 저장된 것을 확인할 수 있습니다.

 

이상으로 EKS Pod Identity도 알아보았습니다.