트러블슈팅

AWS EKS 클러스에 OpenSearch 배포 중 IMDSv2 관련 트러블 슈팅 (Pods, pvc 무한 Pending 문제)

chillmyh 2025. 5. 21. 16:34

개요

AWS EKS 클러스터에 Helm Chart를 사용하여 OpenSearch를 배포하는 과정에서 AL2023(Amazon Linux 2023)의 IMDSv2 설정으로 인해 발생한 문제와 해결 과정을 공유한다. 이 글은 나와 비슷한 문제에 직면한 다른 삽질러들에게 도움이 되기를 바란다.

 

배포 환경

 

  • AWS EKS 클러스터
  • Amazon Linux 2023 기반 워커 노드
  • Helm Chart를 통한 OpenSearch 배포
  • 로컬 터미널에 EKS 클러스터 연동 완료

배포 절차

1. 프로젝트 레포지토리 클론

git clone https://github.com/your-org/ssok-monitoring.git
cd ssok-monitoring/logs/opensearch

2. Helm을 사용하여 OpenSearch 배포

helm install opensearch opensearch/opensearch -f opensearch-values.yaml -n logging

3. 배포 상태 확인

kubectl get pods -n logging

 

 

문제 상황

Helm으로 OpenSearch를 배포했지만 Pod가 Pending 상태에서 진행되지 않았다.

배포 확인 명령어를 실행했을 때 다음과 같은 상태가 계속 유지되었다.

kubectl get pods -n logging
NAME                     READY   STATUS    RESTARTS   AGE
opensearch-cluster-master-0   0/1     Pending   0          5m

 

원인 분석

1. PVC 상태 확인

먼저 OpenSearch의 Pod가 Pending 상태인 이유를 파악하기 위해 PVC(Persistent Volume Claim) 상태를 확인했다.

kubectl get pvc -n logging
NAME                                                    STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
opensearch-cluster-master-opensearch-cluster-master-0   Pending                                      gp2            2m23s

 

PVC도 Pending 상태. 더 자세한 정보를 얻기 위해 PVC를 describe 했다.

kubectl describe pvc opensearch-cluster-master-opensearch-cluster-master-0 -n logging

 

결과에서 다음과 같은 오류 메시지를 확인할 수 있었다.

failed to provision volume with StorageClass "gp2": rpc error: 
code = Internal desc = Could not create volume "pvc-411a6b3d-3db9-4201-a8be-a41356bc7c90": 
could not create volume in EC2: operation error EC2: CreateVolume, 
get identity: get credentials: failed to refresh cached credentials, 
no EC2 IMDS role found, operation error ec2imds: GetMetadata, 
request canceled, context deadline exceeded

 

2. EBS CSI 드라이버 확인

오류 메시지를 분석한 결과, EBS CSI 드라이버가 EC2 메타데이터 서비스(IMDS)에 접근하지 못하고 있음을 확인했다.

드라이버가 설치되어 있는지 확인

kubectl get pods -n kube-system | grep ebs-csi

 

결과가 나오지 않아 EBS CSI 드라이버가 설치되어있지 않아있었음을 확인.

EBS CSI 드라이버가 설치되어 있지 않았기 때문에 드라이버를 설치했다.

 

eksctl create addon --name aws-ebs-csi-driver --cluster <your-cluster-name> --force

 

드라이버 설치 후 확인

kubectl get pods -n kube-system | grep ebs
ebs-csi-controller-9df957f45-hncp5   0/6     ContainerCreating   0          1s
ebs-csi-controller-9df957f45-pv6hb   0/6     ContainerCreating   0          0s
ebs-csi-node-gmms8                   0/3     ContainerCreating   0          1s
ebs-csi-node-tnf8n                   0/3     ContainerCreating   0          1s
ebs-csi-node-v7wfn                   0/3     ContainerCreating   0          1s

 

3. IAM 권한 추가

EBS CSI 드라이버가 설치되었지만, 여전히 PVC가 Pending 상태였다.

다시 PVC 상태를 확인했더니 비슷한 오류가 계속 발생했다.

failed to provision volume with StorageClass "gp2": 
rpc error: code = Internal desc = Could not create volume... no EC2 IMDS role found

 

EBS CSI 드라이버가 EBS 볼륨을 생성하고 관리할 수 있는 IAM 권한이 없었기 때문에

EKS 워커 노드의 IAM 역할에 AmazonEBSCSIDriverPolicy 정책을 추가했다.

 

4. IMDSv2 문제 발견

IAM 권한 추가 후에도 문제가 지속되었고, 다음 오류 메시지를 계속 확인할 수 있었다

operation error ec2imds: GetMetadata, request canceled, context deadline exceeded

 

이 시점에서 AL2023의 IMDSv2 설정과 관련된 문제임을 인식했다.

 

근본 원인 : AL2023과 IMDSv2

AWS EKS Cluster를 생성하고, 노드 그룹을 생성할때 인스턴스 유형을 Ubuntu로 설정하고 있었지만, EKS에 호환이 높은 Linux 2023 사용이 권장되고 있었다. (애초에 Ubuntu가 없었다)

 Amazon Linux 2023(AL2023)은 기본적으로 보안 강화를 위해 IMDSv2만 사용하도록 설정되어 있다(IMDSv2=필수).

IMDSv2는 세션 기반의 인증 방식으로, 보안성이 향상되었지만 기본 설정에서 문제가 발생했다.

 

IMDSv2의 주요 특징:

  • 세션 기반 접근: 토큰을 요청하고 이를 사용해야 메타데이터에 접근 가능
  • 응답 홉 제한(hop limit): 기본값은 1로, IP 프로토콜 레벨에서 응답이 통과할 수 있는 네트워크 홉의 수를 제한

문제의 핵심: 컨테이너화된 환경(Kubernetes)에서는 파드가 호스트와 별도의 네트워크 네임스페이스에서 실행되기 때문에, IMDS에 접근하기 위해서는 최소 2개의 네트워크 홉이 필요했다. 그러나 AL2023의 기본 홉 제한은 1이어서, EBS CSI 드라이버가 EC2 메타데이터에 접근할 수 없었다.

 

해결 방법

EC2 인스턴스의 메타데이터 옵션을 수정하여 문제를 해결했다.

ec2 인스턴스 - 작업 - 메타데이터 옵션 수정 - IMDSv2 : 옵션 선택