Kubernetes/EKS

[Kubernetes] EKS Workshop #3

팽팽 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 는...다음편에,,,