ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] EKS Workshop #3
    Kubernetes/EKS 2024. 6. 9. 20:09

    AWS CloudWatch Container Insight

    - 컨테이너형 애플리케이션 및 마이크로서비스에 대한 모니터링, 트러블 슈팅 및 알람을 위한 완전관리형 관측 서비스

    - Cloudwatch 대쉬보드로 container metrics, Prometeus metrics, application logs 및 performance log events를 탐색, 분석 및 시각화

    - CPU, 메모리, 디스크 및 네트워크와 같은 인프라 메트릭을 자동으로 수집

     

    1. 클러스터의 매트릭 값 수집하기 위해 cloudwatch agent 설치

    2. cloudwatch log에 로그를 보내기 위핸 fluent bit 데몬셋 형태로 설치

     

     

     

    cd ~/environment
    mkdir -p manifests/cloudwatch-insight && cd manifests/cloudwatch-insight
    
    # ns 생성
    kubectl create ns amazon-cloudwatch
    kubectl get ns
    
    # 에이전트랑 fluent bit 설치
    ClusterName=eks-demo
    RegionName=$AWS_REGION
    FluentBitHttpPort='2020'
    FluentBitReadFromHead='Off'
    [[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On'
    [[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On'
    
    # yaml 파일 다운로드
    wget https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/quickstart/cwagent-fluent-bit-quickstart.yaml
    sed -i 's/{{cluster_name}}/'${ClusterName}'/;s/{{region_name}}/'${RegionName}'/;s/{{http_server_toggle}}/"'${FluentBitHttpServer}'"/;s/{{http_server_port}}/"'${FluentBitHttpPort}'"/;s/{{read_from_head}}/"'${FluentBitReadFromHead}'"/;s/{{read_from_tail}}/"'${FluentBitReadFromTail}'"/' cwagent-fluent-bit-quickstart.yaml
    # daemonset에 붙여넣기
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: eks.amazonaws.com/compute-type
              operator: NotIn
              values:
              - fargate
    kubectl apply -f cwagent-fluent-bit-quickstart.yaml 
    kubectl get po -n amazon-cloudwatch

    -> 현재 워커노드가 3개라 3개씩 배포된듯

     

     

     

     

    Autoscaling Pod & Cluster

     

    쿠버네티스에는 크게 두 가지의 오토 스케일링 기능이 있음

    • HPA(Horizontal Pod AutoScaler) : CPU 사용량 또는 사용자 정의 메트릭을 관찰하여 파드 개수를 자동으로 스케일
    • Cluster Autoscaler : EKS 클러스터 자체 자원이 모자르면 클러스터를 오토스케일 하자

    1) HPA 사용해서 파드 스케일링

    - 메트릭 값에 값에 따라 파드의 개수를 할당

    - 컨테니어에 필요한 리소스 할당 -> 스케일할 조건 작성

    metrics server 설치

    - kubelet을 통해서 워커 노드나 컨테이너의 cpu 및 메모리 사용량 같은 메트릭을 수집함

    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
    
    kubectl get deployment metrics-server -n kube-system

     

    - 첫번째 백엔드의 yaml파일을 replica 를 1로, 컨테이너에 필요한 리소스양을 25로 설정

    cd /home/ec2-user/environment/manifests
    
    cat <<EOF> flask-deployment.yaml
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo-flask-backend
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo-flask-backend
      template:
        metadata:
          labels:
            app: demo-flask-backend
        spec:
          containers:
            - name: demo-flask-backend
              image: $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demo-flask-backend:latest
              imagePullPolicy: Always
              ports:
                - containerPort: 8080
              resources:
                requests:
                  cpu: 250m
                limits:
                  cpu: 500m
    EOF

     

    - hpa 설정 : 목표 사용률 30%를 유지하기 위해 파드가 조정됨

    cat <<EOF> flask-hpa.yaml
    ---
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: demo-flask-backend-hpa
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: demo-flask-backend
      minReplicas: 1
      maxReplicas: 5
      targetCPUUtilizationPercentage: 30
    EOF
    kubectl get hpa
    
    # 간단 부하테스트
    kubectl get hpa -w
    
    #siege 도구로 http 부하테스트
    sudo yum -y install siege
    
    
    export flask_api=$(kubectl get ingress/flask-backend-ingress -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')/contents/aws
    
    siege -c 200 -i http://$flask_api

     

     

    2) Cluster Autoscaler 사용하여 클러스터 스케일링 적용

    - 트래픽에 따라 파드가 올라가는 워커 노드 자원이 모자라게됨. 즉, 워커 노드가 가득 차서 파드가 스케줄될 수 없는 상태가 됨

    - 이때, 사용하는 것이 Cluster Autoscaler(CA) 

    - pending 상태인 파드가 존재할 경우, 워커노드를 스케일 아웃함 (오토스케일링그룹이용)

     

     

    - 현재 클러스터 워커노드에 적용된 asg의 값

    aws autoscaling \
        describe-auto-scaling-groups \
        --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='eks-demo']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" \
        --output table

     

    - 오토스케일링 값 5로 크기 조정

    # 오토스케일러 배포
    cd /home/ec2-user/environment/manifests
    wget https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
    
    kubectl apply -f cluster-autoscaler-autodiscover.yaml
    
    kubectl get nodes -w
    
    # 워커노드 늘리기 위해 파드 100개 배포
    kubectl create deployment autoscaler-demo --image=nginx
    kubectl scale deployment autoscaler-demo --replicas=100
    
    
    kubectl get deployment autoscaler-demo --watch

     

    - 노드가 2개 더 생겼음

    kube-ops-view 설치하면 시각적으로 확인가능..

     

     

    https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/990-reference

     

    Amazon EKS web application workshop

    Building simple web application using Amazon EKS. This workshop covers from creating eks cluster to application's life cycle.

    catalog.us-east-1.prod.workshops.aws

     

    CI/CD 는...다음편에,,,

    'Kubernetes > EKS' 카테고리의 다른 글

    [Kubernetes] EKS Workshop #2  (0) 2024.06.09
    [Kubernetes] EKS Workshop #1  (1) 2024.06.09
Designed by Tistory.