CloudBackend
[AWS] EKS KEDA 구성하기 본문
기본적으로 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 게시글을 참고하였습니다.
'클라우드' 카테고리의 다른 글
AWS Client VPN으로 안전하게 VPC에 연결하기 (0) | 2025.04.09 |
---|---|
Docker permission denied 오류 해결하기 (0) | 2025.01.14 |
[Oracle Cloud] WARNING: UNPROTECTED PRIVATE KEY FILE! 문제 해결하기 (2) | 2024.10.22 |