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:30
CloudNet@ 팀의 AWS EKS Workshop Study 5주차 정리입니다.
# Karpenter Workshop 의 내용입니다.

IMPLEMENT AUTOSCALING WITH HPA AND KARPENTER

작업자 노드 및 애플리케이션 배포를 자동으로 확장하기 위한 패턴을 보여줍니다. K8s의 자동 확장은 몇 가지 형태로 제공됩니다

  • Deploying a microservice application 
  • 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 마이크로서비스를 제공하기 위해 ServiceDeployment 를 모두 배포합니다.

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

Comments