EKS 사용해보기

2025. 4. 24. 14:09·Web

VPC 생성

  • CIDR: 172.31.0.0/16

서브넷 4개 생성

  • 퍼블릭 2개 (ex. 10.0.0.0/20, 10.0.16.0/20)
  • 프라이빗 2개 (ex. 10.0.32.0/20, 10.0.48.0/20)
    가용역역은 두가지(a,b)로 생성함

인터넷 게이트웨이 생성 및 VPC에 연결

NAT 게이트웨이 생성

  • 퍼블릭 서브넷에 Elastic IP 할당
  • NAT GW 생성

라우팅 테이블 구성

  • 4개의 라우팅 테이블 생성. 각 서브넷 연결
  • 퍼블릭 라우팅 테이블 → IGW 경로 설정 (0.0.0.0/0 → igw)
  • 프라이빗 라우팅 테이블 → NAT GW 경로 설정 (0.0.0.0/0 → nat)

서브넷과 라우팅 테이블 연결

  • 퍼블릭 서브넷 → 퍼블릭 라우팅 테이블
  • 프라이빗 서브넷 → 프라이빗 라우팅 테이블

EKS 클러스터 생성

brew install eksctl  # mac
choco install eksctl  # windows

EKS 클러스터 + 노드 그룹 생성

eksctl create cluster \
  --name minsu-eks-cluster \
  --version 1.29 \
  --region ap-northeast-2 \
  --nodegroup-name minsu-nodes \
  --node-type t3.medium \
  --nodes 2 \
  --vpc-private-subnets=subnet-017b555232574b966,subnet-0e6ca28916bc86bf3 \
  --vpc-public-subnets=subnet-0512487b335f63989,subnet-0e279a6eb0997d88d

에러발생

2025-04-23 23:45:39 [✖]  unable to use given VPC (vpc-0bfa1cf5694cbce00) and subnets (private:map[ap-northeast-2c:{subnet-0c3c9d5699b674ff2 ap-northeast-2c 172.31.32.0/20 0 }] public:map[ap-northeast-2a:{subnet-0e5219d2e78b538d9 ap-northeast-2a 172.31.0.0/20 0 }])

같은 가용영역에 있어야한다는 에러(위에서는 잘해놨지만 처음할때는 잘 몰라서 가용영역이 중구난방이였음)

2025-04-24 00:02:53 [✖]  unable to use given VPC (vpc-0bfa1cf5694cbce00) and subnets (private:map[ap-northeast-2a:{subnet-017b555232574b966 ap-northeast-2a 172.31.16.0/20 0 }] public:map[ap-northeast-2a:{subnet-0512487b335f63989 ap-northeast-2a 172.31.0.0/20 0 }])

가용 영역이 2개씩 필요(위에서는 2개씩했지만, 처음에는 1개만 생성했었음)

2025-04-24 00:15:08 [ℹ]  waiting for CloudFormation stack "eksctl-minsu-eks-cluster-cluster"

과정이 생각보다 오래걸리며 위와 같은 메시지가 여러번 뜸 그러다가

|Resource handler returned message: "[Issue(Code=Ec2SubnetInvalidConfiguration, Message=One or more Amazon EC2 Subnets of [subnet-0e279a6eb0997d88d, subnet-0512487b335f63989] for node group minsu-nodes does not automatically assign public IP addresses to instances launched into it. If you want your instances to be assigned a public IP address, then you need to enable auto-assign public IP address for the subnet. See IP addressing in VPC guide: https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip, ResourceIds=[subnet-0e279a6eb0997d88d, subnet-0512487b335f63989])] (Service: null, Status Code: 0, Request ID: null)" (RequestToken: b197832a-f69b-76cf-6e37-f3755358d8e4, HandlerErrorCode: GeneralServiceException)|

cloudformation 에서 이벤트 탭을 통해 위와 같은 에러를 확인
원인은 자동 할당 ip 설정이 필요했던 것

  • Deployment + Service + Ingress 정의
  • Ingress에 ALB Ingress Controller Annotation 추가
  • EKS에 배포

spring-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: andyou-back
spec:
  replicas: 2
  selector:
    matchLabels:
      app: andyou-back
  template:
    metadata:
      labels:
        app: andyou-back
    spec:
      containers:
      - name: andyou-back
        image: 880912931204.dkr.ecr.ap-northeast-2.amazonaws.com/andyou-back
        ports:
            - containerPort: 8080
        env:
            - name: SPRING_DATASOURCE_HIKARI_DRIVER_CLASS_NAME=
              value: "rg.mariadb.jdbc.Driver"
            - name: SPRING_DATASOURCE_HIKARI_JDBC_URL
              value: "asd"
            - name: SPRING_DATASOURCE_HIKARI_USERNAME
              value: "asd"
            - name: SPRING_DATASOURCE_HIKARI_PASSWORD
              value: "asd"
            - name: SPRING_DATASOURCE_HIKARI_POOL_NAME
              value: "hikariPool"
            - name: SPRING_DATASOURCE_HIKARI_MAXIMUM_POOL_SIZE
              value: "1"
            - name: GPT_API_KEY
              value: "asd"
            - name: BUCKET_BUCKET_NAME
              value: "asd"
            - name: BUCKET_ACCESS_KEY
              value: "asd"
            - name: BUCKET_SECRET_KEY
              value: "asd"
            - name: KAKAO_CLIENT_ID
              value: "asd"
            - name: KAKAO_CLIENT_SECRET
              value: "asd"
            - name: KAKAO_REDIRECT_URI
              value: "asd"
            - name: NAVER_CLIENT_ID
              value: "asd"
            - name: NAVER_CLIENT_SECRET
              value: "asd"
            - name: NAVER_REDIRECT_URI
              value: "asd"

spring-backend-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: spring-backend-service
spec:
  selector:
    app: spring-backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: NodePort

nextjs-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: andyou-f
spec:
  replicas: 2
  selector:
    matchLabels:
      app: andyou-f
  template:
    metadata:
      labels:
        app: andyou-f
    spec:
      containers:
        - name:andyou-f
          image: 880912931204.dkr.ecr.ap-northeast-2.amazonaws.com/andyou-f
          ports:
            - containerPort: 3000
          env:
            - name: KAKAO_CLIENT_SECRET
              value: asd
            - name: NEXT_PUBLIC_BACKEND_API_URL
              value: asd
            - name: NEXT_PUBLIC_KAKAO_CLIENT_ID
              value: asd
            - name: NEXT_PUBLIC_KAKAO_JS_KEY
              value: asd
            - name: NEXT_PUBLIC_KAKAO_REDIRECT_URI
              value: asd
            - name: NEXT_PUBLIC_NAVER_CLIENT_ID
              value: asd
            - name: NAVER_CLIENT_SECRET
              value: asd
            - name: NEXT_PUBLIC_REDIRECT_URI
              value: asd

nextjs-frontend-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nextjs-frontend-service
spec:
  selector:
    app: nextjs-frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: NodePort

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: spring-backend-service
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nextjs-frontend-service
            port:
              number: 80
kubectl apply -f spring-deployment.yaml
kubectl apply -f nextjs-deployment.yaml
kubectl apply -f ingress.yaml
kubectl apply -f ingress.yaml

Error from server (InternalError): error when creating "ingress.yaml": Internal error occurred: failed calling webhook "vingress.elbv2.k8s.aws": failed to call webhook: Post "https://aws-load-balancer-webhook-service.kube-system.svc:443/validate-networking-v1-ingress?timeout=10s": no endpoints available for service "aws-load-balancer-webhook-service"
kubectl get deployment -n kube-system aws-load-balancer-controller

NAME READY UP-TO-DATE AVAILABLE AGE
aws-load-balancer-controller 0/2 0 0 100s

Deployment는 생성되었으나, 파드가 전혀 뜨지 못하고 있다

아래는 바쁘니까 나중에 잘 정리해보자.

(base) mildw@Minsuui-MacBookAir ~ % helm uninstall aws-load-balancer-controller -n kube-system


release "aws-load-balancer-controller" uninstalled

(base) mildw@Minsuui-MacBookAir ~ % helm install aws-load-balancer-controller eks/aws-load-balancer-controller \

  -n kube-system \

  --set clusterName=minsu-eks-cluster \

  --set serviceAccount.create=false \

  --set serviceAccount.name=aws-load-balancer-controller \

  --set region=ap-northeast-2 \

  --set vpcId=vpc-0bfa1cf5694cbce00

삭제 후 재설치

(base) mildw@Minsuui-MacBookAir ~ % kubectl get pods -n kube-system

NAME                                            READY   STATUS    RESTARTS   AGE

aws-load-balancer-controller-555cb4c578-8m8w7   1/1     Running   0          4m29s

aws-load-balancer-controller-555cb4c578-pmkr9   1/1     Running   0          4m29s

running에 0/1이라면 조금기다리면 1/1로바뀐다.

(base) mildw@Minsuui-MacBookAir ~ % kubectl apply -f ingress.yaml

ingress.networking.k8s.io/app-ingress created
kubectl get ingress -A

NAMESPACE   NAME          CLASS   HOSTS   ADDRESS   PORTS   AGE

default     app-ingress   alb     *                 80      2m12s

만약 kubectl get ingress -A 쳤는데 ADDRESS가 비어있으면

ADDRESS가 안 뜨는 대표적인 이유

  1. ALB Ingress Controller가 정상 설치 안 됨 → helm install로 설치했는데 clusterName 잘못 입력했거나, 서비스 계정 설정 문제 있으면 ALB가 안 만들어져.
  2. Ingress 리소스 설정 문제 → ingressClassName: alb 빠졌거나, Annotation 누락/오타
  3. ALB 생성 대기 시간 → 생성되는데 몇 분 걸릴 수 있어. (보통 1~5분)

확인할 것
ALB Ingress Controller 설치 확인

kubectl get pods -n kube-system | grep aws-load-balancer-controller

→ Running 상태인지 확인

② Ingress 리소스 확인

kubectl describe ingress app-ingress

여기 로그 맨 아래 Events에

Events:
  Type     Reason            Age                   From     Message
  ----     ------            ----                  ----     -------
  Warning  FailedBuildModel  93s (x16 over 4m19s)  ingress  Failed build model due to couldn't auto-discover subnets: unable to resolve at least one subnet (0 match VPC and tags: [kubernetes.io/role/elb])

subnets에 kubernetes.io/role/elb 태그 붙여야함.
key : kubernetes.io/role/elb
value : 1

kubectl get ingress -A

NAMESPACE   NAME          CLASS   HOSTS   ADDRESS                                                                      PORTS   AGE

default     app-ingress   alb     *       k8s-default-appingre-9432fb16f6-506652657.ap-northeast-2.elb.amazonaws.com   80      21m

노트 그룹 이름 출력

(base) mildw@Minsuui-MacBookAir ~ % aws eks list-nodegroups --cluster-name minsu-eks-cluster

{
    "nodegroups": [
        "minsu-nodes"
    ]
}
(base) mildw@Minsuui-MacBookAir ~ % aws eks describe-nodegroup \
  --cluster-name minsu-eks-cluster \
  --nodegroup-name minsu-nodes \     
  --query "nodegroup.nodeRole" \
  --output text

권한 부여

 aws eks describe-nodegroup \

  --cluster-name minsu-eks-cluster \

  --nodegroup-name minsu-nodes \                   

  --query "nodegroup.nodeRole" \

  --output text



arn:aws:iam::880912931204:role/eksctl-minsu-eks-cluster-nodegroup-NodeInstanceRole-h97MaGE5ooZo

권한 확인

 aws iam attach-role-policy \
  --role-name eksctl-minsu-eks-cluster-nodegroup-NodeInstanceRole-h97MaGE5ooZo \
  --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly

역할에 권한 붙이기

AmazonEC2ContainerRegistryReadOnly이란?
이것은 AWS에서 제공하는 관리형 IAM 정책 중 하나로
Amazon ECR (Elastic Container Registry) 에 읽기 권한(Pull) 을 부여하는 정책

 

알고보니 ecr에 이미지가 없어서 문제였음.

### 2️⃣ ECR에 로그인
aws ecr get-login-password --region ap-northeast-2 \ | docker login --username AWS --password-stdin 880912931204.dkr.ecr.ap-northeast-2.amazonaws.com

### 3️⃣ 이미지 태깅
docker tag andyou-back:latest 880912931204.dkr.ecr.ap-northeast-2.amazonaws.com/andyou-back:latest

### 4️⃣ ECR에 푸시
docker push 880912931204.dkr.ecr.ap-northeast-2.amazonaws.com/andyou-back:latest

와 같은 방식으로 진행

kubectl rollout restart deployment andyou-back
kubectl rollout restart deployment andyou-f

재시작

(base) mildw@Minsuui-MacBookAir ~ % kubectl get pods -w

NAME                           READY   STATUS    RESTARTS   AGE
andyou-back-676c5d5869-4csj9   1/1     Running   0          40m
andyou-back-676c5d5869-rrsdt   1/1     Running   0          40m
andyou-f-6979d7556c-54mbv      1/1     Running   0          114s
andyou-f-6979d7556c-zn7jd      1/1     Running   0          82s
 ~ % kubectl get ingress -o wide

NAME          CLASS   HOSTS   ADDRESS                                                                      PORTS   AGE

app-ingress   alb     *       k8s-default-appingre-9432fb16f6-506652657.ap-northeast-2.elb.amazonaws.com   80      117m
kubectl get svc -A
kubectl describe svc <프론트서비스명>
kubectl get pods -l app=<label>
Service가 제대로 파드로 트래픽 전달하는지 확인

selector가 파드의 labels와 정확히 일치해야 연결됨

kubectl edit svc nextjs-frontend-service
→ 아래 부분 수정:
selector:
  app: frontend  # 실제 파드에 있는 label로 수정

 

배포된 모습

'Web' 카테고리의 다른 글

AWS DOP-C02 자격증 시험 후기  (1) 2025.05.17
대용량 트래픽이란 몇건일까  (0) 2025.05.01
AWS DOP - CloudFormation (3)  (1) 2025.04.19
Route53에서 구입한 도메인 ACM발급 실패  (0) 2025.04.19
AWS DOP - CloudFormation (2)  (0) 2025.04.17
'Web' 카테고리의 다른 글
  • AWS DOP-C02 자격증 시험 후기
  • 대용량 트래픽이란 몇건일까
  • AWS DOP - CloudFormation (3)
  • Route53에서 구입한 도메인 ACM발급 실패
마술사의 수습생
마술사의 수습생
언젠간 당신처럼 되고 싶어요.
  • 마술사의 수습생
    개발 기록 블로그
    마술사의 수습생
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • Web (50)
      • 일기 (2)
      • 잡담 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
마술사의 수습생
EKS 사용해보기
상단으로

티스토리툴바