Cloud Infra Architecture (AWS)/AWS Build

[Trouble Shooting] AWS EKS Pod로 생성된 Rabbitmq가 무한 Pending 일 때 (Rabbitmq pod가 Status pending)

seongduck 2024. 10. 20. 23:34

AWS EKS로 Rabbitmq pod를 만들었는데 10분이 지나도록 Pending이 뜨면 무언가 문제가 있는 것이다.

즉, Status가 Pending이라면 다음과 같은 원인들이 있고 해결할 수 있다.


원인1

 클러스터에 사용 가능한 스토리지 클래스인지 확인

 

해결법

$ kubectl get storageclass

생성한 EBS Volume의 Type과 해당 클러스터의 Type이 일치한지 확인한다.

다르다면 AWS EBS를 해당 Type에 맞춰 다시 생성해준다.


원인2

Helm Chart로 RabbitMQ를 생성할 때, PV가 설정이 안되어 있는 경우

 

해결법 예시는 다음과 같다.

1) RabbitMQ PV yaml 파일 만들기 (저장소)

1) $ vi rabbitmq-pv.yaml
"""
apiVersion: v1
kind: PersistentVolume
metadata:
  name: rabbitmq-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: gp2-immediate
  awsElasticBlockStore:
    volumeID: "생성한 EBS ID" #""는 제거
    fsType: ext4
"""

$ kubectl apply -f rabbitmq-pv.yaml #yaml 배포
$ kubectl get svc #서비스 생성 확인

 

2) RabbitMQ PVC yaml 파일 만들기 (저장소 전달)

# vi rabbitmq-pvc.yaml
"""
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rabbitmq-pvc
  labels:
    app: rabbitmq
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: gp2-immediate
"""

$ kubectl apply -f rabbitmq-pvc.yaml #yaml 배포
$ kubectl get svc #서비스 생성 확인

 

3) RabbitMQ yaml 파일 만들고 실행하기

vi rabbitmq-deployment.yaml
"""
# RabbitMQ Deployment 정의
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rabbitmq
  labels:
    app: rabbitmq
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rabbitmq
  template:
    metadata:
      labels:
        app: rabbitmq
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                      - ip-172-31-0-33.ap-northeast-2.compute.internal
      containers:
        - name: rabbitmq
          image: rabbitmq:3-management
          ports:
            - containerPort: 5672
            - containerPort: 15672
          env:
            - name: RABBITMQ_DEFAULT_USER
              value: user
            - name: RABBITMQ_DEFAULT_PASS
              value: password
          volumeMounts:
            - mountPath: /var/lib/rabbitmq
              name: rabbitmq-pv
      volumes:
        - name: rabbitmq-pv
          persistentVolumeClaim:
            claimName: rabbitmq-pvc
"""

$ kubectl apply -f rabbitmq-deployment.yaml #yaml 배포
$ kubectl get svc #서비스 생성 확인

원인3

AWS EBS CSI 드라이버가 설치되지 않아 EBS 볼륨을 생성하지 못하는 경우

 

해결법

EC2 (Bastion) 서버 접속

$ eksctl utils associate-iam-oidc-provider --region=<REGION> --cluster=<CLUSTER_NAME> --approve
$ kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=master"

 


원인4

PVC와 PV, Rabbitmq.yaml 실행파일이 모두 같은 가용영역인지 확인한다.

 

해결법

kubectl describe pvc "해당 명" #AZ 확인
kubectl get pv #클러스터에 있는 지 확인

kubectl describe pv "해당 명" #AZ 확인
kubectl get pvc #클러스터에 있는 지 확인

kubectl nodes #AZ 확인

확인 후 yaml파일에서 가용영역을 선언해준다.