Ssoon
[5주차] EKS Autoscaling - Scaling App and Cluster - BUILD THE MICROSERVICE 본문
AWS EKS Workshop Study
[5주차] EKS Autoscaling - Scaling App and Cluster - BUILD THE MICROSERVICE
구구달스 2023. 5. 25. 18:30CloudNet@ 팀의 AWS EKS Workshop Study 5주차 정리입니다.
# Karpenter Workshop 의 내용입니다.
IMPLEMENT AUTOSCALING WITH HPA AND KARPENTER
작업자 노드 및 애플리케이션 배포를 자동으로 확장하기 위한 패턴을 보여줍니다. K8s의 자동 확장은 몇 가지 형태로 제공됩니다
- Deploying a microservice application
- Horizontal Pod Autoscaler (HPA) 를 사용한 애플리케이션 확장과 Karpenter 를 사용한 클러스터 확장을 설명하기 위해 CPU 로드를 생성하는 마이크로서비스를 배포합니다. 우리가 사용할 마이크로서비스는 Monte Carlo method to approximate pi 사소한 웹 서비스입니다.
- Horizontal Pod Autoscaler (HPA)
- deployment 또는 replica set의 포드를 확장합니다. K8s API 리소스 및 컨트롤러로 구현됩니다. 컨트롤러 관리자는 각 HorizontalPodAutoscaler 정의에 지정된 메트릭에 대해 리소스 사용률을 쿼리합니다. 리소스 메트릭 API(Pod별 리소스 메트릭의 경우) 또는 사용자 지정 메트릭 API(기타 모든 메트릭의 경우)에서 메트릭을 가져옵니다.
- Karpenter
- HPA와 함께 사용
BUILD THE MICROSERVICE
이 섹션에서는 클러스터를 확장하는 데 사용되는 애플리케이션을 빌드합니다. 먼저 애플리케이션과 이미지를 빌드하는 데 필요한 모든 자산을 다운로드하겠습니다. 다음 명령을 실행합니다. git을 사용하여 프로젝트를 다운로드하고 Monte Carlo 마이크로서비스 애플리케이션을 빌드하는 데 필요한 모든 파일을 가져올 것입니다.
cd ~/environment
git clone https://github.com/awslabs/ec2-spot-workshops.git
cd ~/environment/ec2-spot-workshops/workshops/karpenter
- 애플리케이션을 빌드하고, 컴파일하고, 도커 이미지를 빌드하고, 마지막으로 이미지를 Amazon ECR로 푸시할 준비를 합니다.
export APP_NAME=monte-carlo-sim
aws ecr get-login-password | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
aws ecr create-repository --repository-name ${APP_NAME}
export MONTE_CARLO_REPO=$(aws ecr describe-repositories --repository-names ${APP_NAME} | jq -r '.repositories[0].repositoryUri')
echo "export MONTE_CARLO_IMAGE=$(echo ${MONTE_CARLO_REPO}:latest)" >> ~/.bash_profile
source ~/.bash_profile
docker build -f Dockerfile --tag ${MONTE_CARLO_IMAGE} .
docker push ${MONTE_CARLO_IMAGE}
echo "${MONTE_CARLO_IMAGE} image ready for use"
- ECR에서 monte-carlo-sim 애플리케이션을 위한 새 레지스트리를 만듭니다.
- Docker파일을 사용하여 애플리케이션을 빌드합니다. Docker파일은 Go 애플리케이션을 컴파일한 다음 처음부터 가져오는 최소한의 이미지로 패키징하는 multi-stage build 를 사용합니다.
- 새로 생성된 이미지는 레지스트리에 푸시되고 레지스트리는 나머지 실습에서 참조할 수 있도록 환경 변수로 저장됩니다.
Monte Carlo Pi Microservice
이제 애플리케이션을 배포할 준비가 되었습니다. Monte Carlo 마이크로서비스를 제공하기 위해 Service 및 Deployment 를 모두 배포합니다.
cd ~/environment
cat <<EoF > monte-carlo-pi-service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: monte-carlo-pi-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: monte-carlo-pi-service
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: monte-carlo-pi-service
labels:
app: monte-carlo-pi-service
spec:
replicas: 2
selector:
matchLabels:
app: monte-carlo-pi-service
template:
metadata:
labels:
app: monte-carlo-pi-service
spec:
nodeSelector:
intent: apps
kubernetes.io/arch: amd64
karpenter.sh/capacity-type: spot
containers:
- name: monte-carlo-pi-service
image: ${MONTE_CARLO_IMAGE}
resources:
requests:
memory: "512Mi"
cpu: "1024m"
limits:
memory: "512Mi"
cpu: "1024m"
securityContext:
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
ports:
- containerPort: 8080
EoF
kubectl apply -f monte-carlo-pi-service.yaml
이렇게 하면 서비스와 디플로이먼트를 정의하는 monte-carlo-pi-service.yml 템플릿 파일이 생성됩니다.
이 구성은 클러스터에 단일 컨테이너가 있는 파드의 replicas 두 개를 배포하도록 지시하며, 리소스 요청과 제한을 고정 값 ~0.5vCPU 및 1024Mi의 RAM으로 설정합니다.
몇 개의 replicas 을 생성하고 어떤 유형의 노드에 replicas 을 할당할 것인가요?
spec:
replicas: 2
- karpenter.sh/provisioner-name 에 대해 설정된 nodeSelector 가 없었기 때문에 Karpenter가 default 프로비저너를 사용할 것으로 예상됩니다.
spec:
nodeSelector:
intent: apps
kubernetes.io/arch: amd64
karpenter.sh/capacity-type: spot
- well-known label 인 amd64 로 설정된 kubernetes.io/arch 에 대한 nodeSelector 가 있습니다. 방금 생성한 마이크로서비스의 컴파일 단계를 확인해보면, amd64 버전만 푸시했습니다.
- 애플리케이션이 OnDemand Managed Node groups 에 배포되지 않도록 intet:apps 에 대해 정의된 nodeSelector 가 있습니다.
- karpenter.sh/capacity-type: spot 에 대한 nodeSelector 도 있습니다. 모든 인스턴스가 spot 유형일 것으로 예상하고 있습니다. 즉, AWS Node-Termination-Handler Daemonset 가 생성된 새 spot 노드에 자동으로 배포됩니다.
서비스 URL에 액세스하려면 어떻게 해야 하나요?
- 애플리케이션이 배포되면 다음 명령어를 사용하여 Monte Carlo Pi approximation service 에 액세스하기 위한 외부 URL을 찾을 수 있습니다.
kubectl get svc monte-carlo-pi-service | tail -n 1 | awk '{ print "monte-carlo-pi-service URL = http://"$4 }'
콘솔에서 추가 매개변수를 사용하여 요청을 실행할 수도 있습니다.
URL=$(kubectl get svc monte-carlo-pi-service | tail -n 1 | awk '{ print $4 }')
time curl ${URL}/?iterations=100000000
'AWS EKS Workshop Study' 카테고리의 다른 글
Comments