-
[Kubernetes] EKS Workshop #3Kubernetes/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 설치하면 시각적으로 확인가능..
CI/CD 는...다음편에,,,
'Kubernetes > EKS' 카테고리의 다른 글
[EKS] EKS 업그레이드 후기 (2) 2024.10.27 [Kubernetes] EKS Workshop #2 (0) 2024.06.09 [Kubernetes] EKS Workshop #1 (1) 2024.06.09