[Kubernetes] EKS Workshop #3
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 설치하면 시각적으로 확인가능..
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 는...다음편에,,,