클라우드

[AWS] EKS KEDA 구성하기

CloudFullStack 2025. 4. 9. 05:00

기본적으로 VPC는 생성되었다고 가정하고 진행합니다. 필자는 아래와 같이 VPC를 구성하였습니다.

아래 명령어로 awscli에 로그인합니다.

aws configure

eksctl, awscli가 모두 준비되었다면 아래 내용으로 진행하면 됩니다.

 

먼저, EKS 클러스터부터 구성합니다. 필자의 경우 ec2가 아닌 Fargate 전략을 사용하였으나, EC2를 사용해도 무방합니다.

# Fargate 전략

eksctl create cluster \
--name EKS-클러스터-이름 \
--region AWS-리전 \
--version 1.32 \
--vpc-public-subnets 서브넷-id들 \
--fargate

# EC2 전략
eksctl create cluster \
--vpc-public-subnets Public-서브넷들-ID \
--name 클러스터-이름 \
--region ap-northeast-2 \
--version 1.32 \
--nodegroup-name 노드그룹-이름 \
--node-type t3.small \
--nodes 2 \
--nodes-min 2 \
--nodes-max 4

15분정도 기다린 후, CloudFormation을 확인하면 아래와 같이 잘 생성된 모습을 확인할 수 있습니다.

이제, 아래 명령어들을 입력해서 Namespace, Fargate 프로필을 차례로 만들도록 합시다.

kubectl create namespace keda
eksctl create fargateprofile \
--cluster skills-eks-cluster \
--name skills-fg-profile \
--namespace 사용할 ns

 

이제 Helm을 사용하여 KEDA를 설치할 예정입니다. 만약 helm이 없다면 아래 스크립트를 사용하여 다운로드하면 됩니다.

# Helm 다운로드 스크립트
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Helm을 통한 KEDA 설치 스크립트
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda -n keda --version 2.10.2

 

조금만 기다리면, 잘 설치된 것을 볼 수 있습니다.

 

이제, nginx를 EKS에 올려봅시다. 아래 파일을 apache.yaml에 붙여넣습니다.

# apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: registry.k8s.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

아래 명령어를 통해 keda namespace에 위 이미지를 업로드해봅시다.

kubectl apply -f apache.yaml -n keda

 

자, 아래와 같이 쿠버네티스 서비스가 잘 올라온 것을 확인할 수 있습니다.

 

이제, Keda Rule을 만들어 적용해봅시다.

# keda.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: php-apache-cron-scaled
spec:
  minReplicaCount: 0
  maxReplicaCount: 2
  pollingInterval: 30
  cooldownPeriod: 300
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  triggers:
  - type: cron
    metadata:
      timezone: Asia/Seoul
      start: 00,15,30,45 * * * *
      end: 05,20,35,50 * * * *
      desiredReplicas: "1"

이 KEDA Rule은 매 시 0, 15, 30, 45분마다 1개로 Scale-Up하고, 5, 20, 35, 50분마다 0개로 Scale-Out 합니다.

keda.yaml 파일을 생성했다면, keda namespace에 keda rule을 적용해봅시다.

kubectl apply -f keda.yaml -n keda

이 명령어를 작성하고 잘 기다리다 보면, 아래 명령어를 실행했을 때 Event에 스크린샷과 같은 로그가 찍히는 것을 볼 수 있습니다.

kubectl describe all -n keda

 

자, 이제 ALB를 붙여 외부에서도 접속할 수 있게 해봅시다.

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

aws iam create-policy \
  --policy-name AWSLoadBalancerControllerIAMPolicy \
  --policy-document file://iam-policy.json

위 명령어를 실행해서 IAM에 정책을 생성해봅시다.

아래 명령어를 순차적으로 실행하여 EKS에 연동합니다.

eksctl utils associate-iam-oidc-provider \
  --region ap-northeast-2 \
  --cluster skills-eks-cluster \
  --approve

eksctl create iamserviceaccount \
  --cluster skills-eks-cluster \
  --namespace kube-system \
  --name aws-load-balancer-controller \
  --attach-policy-arn arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
  --approve

 

연동이 잘 되었다면, 계속 진행해봅시다.

이번에는 helm을 이용하여 EKS에 ALB 관련 툴을 설치합니다.

helm repo add eks https://aws.github.io/eks-charts
helm repo update

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=skills-eks-cluster \
  --set serviceAccount.create=false \
  --set region=ap-northeast-2 \
  --set vpcId=<VPC_ID> \
  --set serviceAccount.name=aws-load-balancer-controller \
  --set image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/amazon/aws-load-balancer-controller

 

여기까지 잘 되었다면, 터미널에 아래와 같은 문구가 떠야합니다.

 

잘 뜬다면 계속 진행하시기 바랍니다. 이번에는 ingress.yaml을 만들겠습니다.

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: apache-ingress
  namespace: keda
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
    kubernetes.io/ingress.class: alb
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: php-apache
                port:
                  number: 80

자, 바로 반영하지 않고 AWS Console로 들어가서 서브넷 태그를 편집해야 합니다.

ALB를 올릴 서브넷들에 모두 아래와 같이 태그를 설정합니다. 단, Name 태그는 다르게 해야합니다.

필자의 경우 Public Subnet 2개에 모두 설정해주었습니다.

태그까지 모두 설정했다면 

kubectl apply -f ingress.yaml -n keda

위 명령어로 keda namespace에 ALB를 반영합니다.

kubectl get ingress -n keda

 

위 명령어를 실행했을 때, 아래 사진처럼 나오면 성공입니다.

 

이 글은 CloudAlarm님의 KEDA 게시글을 참고하였습니다.

https://kimalarm.tistory.com/61