실습 4탄 = 13/17
Cloudwatch Container insights 로 EKS Work node를 모니터링 하자
CloudWatch로 알람 받자
부하 테스트 하자
쿼리로 성능 확인 하자
별도의 네임스페이스를 만들어 구축한다.
쿠버네티스에 서비스 어카운트를 만들어야 한다.
서비스 어카운트가 Cloudwatch 권한을 가져야 한다.
1
워커 노드마다 데몬셋으로 CWAgent와 Fluentd가 배포 된다.
워커 노드의 정보가 Cloudwatch로 수집된다.
2
워커 노드가 새로 생기면, 새로 배포 된다.
이미지 출처
https://dev.classmethod.jp/articles/cloudwatch-container-insights-eks/
3
각 Work node에 Cloudwatch Agent , Fluentd pod가 설치되어 모니터링 한다.
Cloudwatch에 수집 된다.
각각의 워커노드에 CloudWatch Agent 파드와 Fluent Bit 파드가 데몬셋으로 배치되어 Metrics 와 Logs 를 수집
Cloudwatch Agent , Fluentd 가 Cloudwatch로 로그를 넣으려면 권한이 있어야 한다.
쿠버네티스에 서비스 어카운트가 있어야 한다.
4
가능 서비스 ?
대시보드는 Amazon ECS, Amazon EKS, AWS ECS Fargate 그리고 EC2 위에 구동되는 k8s 클러스터에서 사용 가능
5
CloudWatch Agent 는 CI 로 메트릭을 보내는 동시에 CW Logs 에 데이터도 전송 → 로그 그룹에 확인
1
별도 터미널에서 모니터링
watch -d kubectl get ns
NAME STATUS AGE
default Active 20h
kube-node-lease Active 20h
kube-public Active 20h
kube-system Active 20h
2
네임스페이스 NS 하나 생성
kubectl create ns amazon-cloudwatch
NAME STATUS AGE
amazon-cloudwatch Active 29s
default Active 20h
kube-node-lease Active 20h
kube-public Active 20h
kube-system Active 20h
3
Cloudwatch Agent , Fluentd 가 Cloudwatch로 로그를 넣으려면 권한이 있어야 한다.
쿠버네티스에 서비스 어카운트가 있어야 하고, Cloudwatch 권한이 있어야 한다.
4
IRSA 설정 >> AWS IAM Role 생성
EKS 에서는 cloudwatch-agent 라는 이름의 서비스 어카운트 생성
권한은 CloudWatchAgentServerPolicy 필요
aws iam roel 생성, 서비스 어카운트 2개 생성 (cloudwatch용, fluent용)
echo $CLUSTER_NAME
eksctl create iamserviceaccount --name cloudwatch-agent --cluster $CLUSTER_NAME --namespace amazon-cloudwatch --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy --approve
cloudformation 가면 iam role이 생성됨
5
EKS 에서는 fluent-bit 라는 이름의 서비스 어카운트 생성
권한은 CloudWatchAgentServerPolicy 필요
eksctl create iamserviceaccount --name fluent-bit --cluster $CLUSTER_NAME --namespace amazon-cloudwatch --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy --approve
6
IRSA 확인, 서비스 어카운트 확인 ?
amazon-cloudwatch 네임스페이스 안에 cloudwatch-agent 라는 이름과 fluent-bit 이라는 이름의 iam service account 가 있다.
Role을 가지고 있다.
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
NAMESPACE NAME ROLE ARN
amazon-cloudwatch cloudwatch-agent arn:aws:iam::role/eksctl-first-eks-addon-iamserviceaccount-ama-Role1
amazon-cloudwatch fluent-bit arn:aws:iam:::role/eksctl-first-eks-addon-iamserviceaccount-ama-Role1
kube-system aws-node arn:aws:iam:::role/eksctl-first-eks-addon-iamserviceaccount-kub-Role1
kubectl get sa -n amazon-cloudwatch -o yaml
kubectl get sa -n fluent-bit -o yaml
7
변수 지정
ClusterName=$CLUSTER_NAME
echo $CLUSTER_NAME
RegionName=$AWS_DEFAULT_REGION
echo $AWS_DEFAULT_REGION
FluentBitHttpPort='2020'
FluentBitReadFromHead='Off'
8
설치 >> 설치 중 'Warning:' 내용은 IRSA 에서 서비스 어카운트를 생성되어 있어서 발생한것이니 문제될게 없음
yaml 파일을 받아서, 변수 지정한 것으로 변경하는 sed 명령 실행.
파일을 cat으로 읽고, 변수로 변경하는 것이다.
사용자에 맞는 클러스터 이름, 리전 등을 변수로 지정하는것이다.
irsa생성에서 '서비스 어카운트'를 이미 생성한 상태라 서비스 어카운트 에러는 무시해도 된다.
cat cwagent-fluent-bit-quickstart.yaml | sed '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}'"/' | kubectl apply -f -
9
확인
데몬셋으로 배포된 CW-agent, fluent-bid 파드의 Env 정보에 IAM Role 정보!
어떻게 노드의 정보를 수집하는가?
Volumes(HostPath)를 확인해보자!
10
네임 스페이스 변경해 확인
kubens amazon-cloudwatch
kubectl get all,cm,sa
cloudwatch와 fluent-bit pod가 2개씩 생긴다.
현재 노드가 2개라 cloudwatch와 fluent-bit 이 2개씩 생긴다.
'데몬셋'으로 배포 되어서, node수만큼 cloudwatch와 fluent-bit이 생기는 것이다.!!!
# kubectl get all,cm,sa
NAME READY STATUS RESTARTS AGE
pod/cloudwatch-agent-8czgd 1/1 Running 0 15m
pod/cloudwatch-agent-nqlvs 1/1 Running 0 15m
pod/fluent-bit-srmd5 1/1 Running 0 15m
pod/fluent-bit-zlnzg 1/1 Running 0 15m
노드가 2개이다.
(seo-eks@myeks:amazon-cloudwatch) [root@myeks-host ~]# k get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-1-167.ap-northeast-1.compute.internal Ready <none> 20h v1.21.2-eks-55daa9d
ip-192-168-2-85.ap-northeast-1.compute.internal Ready <none> 20h v1.21.2-eks-55daa9d
11
상세 확인
kubectl describe cm cwagentconfig
kubectl describe cm fluent-bit-cluster-info
12
pod 정보를 보자
kubectl describe pod cloudwatch-agent-xxxxxxxxx
AWS_ROLE_ARN: arn:aws:iam::xxxxxxxxx:role/eksctl-myeks-addon-iamserviceaccount-amazon-Role1-1HYX8EJRZQ8KP
// irsa 설정으로 role을 가지고 있다.
// 아래 정보들도 가져갈수 있다.
워커 노드의 HostPath로 가져 간다!!
Volumes:
aws-iam-token:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 86400
cwagentconfig:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: cwagentconfig
Optional: false
rootfs:
Type: HostPath (bare host directory volume)
Path: /
HostPathType:
dockersock:
Type: HostPath (bare host directory volume)
Path: /var/run/docker.sock
HostPathType:
varlibdocker:
Type: HostPath (bare host directory volume)
Path: /var/lib/docker
HostPathType:
containerdsock:
Type: HostPath (bare host directory volume)
Path: /run/containerd/containerd.sock
HostPathType:
sys:
Type: HostPath (bare host directory volume)
Path: /sys
HostPathType:
devdisk:
Type: HostPath (bare host directory volume)
1
CloudWatch > Insight > Container Insights 가면 3가지를 볼수 있다.
Container map
리소스
성능 모니터링
2
Container map ?
그림이 보인다.
클릭하면 자원 상태 볼수 있다.
3
리소스 ?
우측 상단에서 시간 변경 (Local Time Zone, 30분으로 변경)
오픈쪽 위 톱니 > TX , RX 체크해 나오도록 하자.
4
성능 모니터링 ?
EKS POD로 변경해 보자.
성능 모니터링 : 클러스터, 노드, 네임스페이스, 서비스, 파드 등의 단위로 정보 출력 → 각각 변경
성능 모니터링에서는 자동으로 갱신 됨.
오른쪽 위 10초마다 갱신하자.
5
참고
https://www.eksworkshop.com/intermediate/250_cloudwatch_container_insights/cwalarms/
1
# 설치
helm 차트로 배포해 보자~
별도 네임스페이스 하나를 만들자~
kubectl create namespace wordpress-cwi
helm repo add bitnami https://charts.bitnami.com/bitnami
helm -n wordpress-cwi install understood-zebu bitnami/wordpress
// helm 설치
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
2
확인
배포 완료되는데 2~3분 , LB 생성 시간
네임 스페이스를 wordpress로 변경 ?
kubens wordpress-cwi
3
생성 확인 ?
kubectl -n wordpress-cwi rollout status deployment understood-zebu-wordpress
deployment "understood-zebu-wordpress" successfully rolled out
4
서비스 확인?
kubectl get svc --namespace wordpress-cwi understood-zebu-wordpress
0189295.ap-southeast-1.elb.amazonaws.com
// 웹브라우저로 접속 확인
5
상세 확인
kubectl get all,ep,cm,secret
kubectl get sc,pv,pvc
// 볼륨 확인 부분
6
웹 접속
export SERVICE_URL=$(kubectl get svc -n wordpress-cwi understood-zebu-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo "Public URL:
http://$SERVICE_URL/"
1
export ADMIN_URL="http://$SERVICE_URL/admin"
export ADMIN_PASSWORD=$(kubectl get secret --namespace wordpress-cwi understood-zebu-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
echo "Admin URL:
http://$SERVICE_URL/admin
"
2
접속 url로 접속
http://a84-1820189295.ap-southeast-1.elb.amazonaws.com/admin
3
echo $ADMIN_PASSWORD
Username: user
Password: $ADMIN_PASSWORD
4
접속
1
watch -d kubectl get pod
2
Load Test 툴(siege) 설치
yum install siege -y
확인
siege -V
or
소스로 설치
yum install gcc -y
wget http://download.joedog.org/siege/siege-latest.tar.gz
tar -zxvf siege-latest.tar.gz
cd siege-*/
./configure --prefix=/usr/local --with-ssl=/usr/bin/openssl
sudo make && make install
설치 참고 사이트
https://ko.linux-console.net/?p=75
3
부하 발생
# This command tells Siege to run 200 concurrent connections to your Wordpress site at varying URLS for 15 seconds.
export WP_ELB=$(kubectl -n wordpress-cwi get svc understood-zebu-wordpress -o jsonpath="{.status.loadBalancer.ingress[].hostname}")
//15초 부하 준다.
siege -t 15S -c 200 -i http://${WP_ELB}
4
60초 동안 지속 부하 발생
siege -t 60S -c 200 -i http://${WP_ELB}
5
Cloudwatch > Contailer insight > 성능 모니터링 > EKS Pods - myeks
아래쪽에 워드프레스 있음. 체크
6
리소스 에서 확인 ?
TX/ RD 확인하기
https://www.eksworkshop.com/intermediate/250_cloudwatch_container_insights/cwalarms/
1
AWS에서 Fluent Bit 도 제공
로그 수집용
현재 로그는 남고 있다.
cloudwatch > 로그 > log insigth 가서 performance 체크 > 성능 쿼리 날려서 확인
2
performance 로그 그룹
# 노드별 평균 CPU 사용률
STATS avg(node_cpu_utilization) as avg_node_cpu_utilization by NodeName
| SORT avg_node_cpu_utilization DESC
3
파드별 재시작(restart) 카운트
STATS avg(number_of_container_restarts) as avg_number_of_container_restarts by PodName
| SORT avg_number_of_container_restarts DESC
4
요청된 Pod와 실행 중인 Pod 간 비교
fields @timestamp, @message
| sort @timestamp desc
| filter Type="Pod"
| stats min(pod_number_of_containers) as requested, min(pod_number_of_running_containers) as running, ceil(avg(pod_number_of_containers-pod_number_of_running_containers)) as pods_missing by kubernetes.pod_name
| sort pods_missing desc
5
클러스터 노드 실패 횟수
stats avg(cluster_failed_node_count) as CountOfNodeFailures
| filter Type="Cluster"
| sort @timestamp desc
6
파드별 디스크 사용량
stats floor(avg(container_filesystem_usage/1024)) as container_filesystem_usage_avg_kb by InstanceId, kubernetes.container_name, device
| filter Type="ContainerFS"
| sort container_filesystem_usage_avg_kb desc
7
파드별 CPU 사용량
cloudwatch > 로그 > log insigth 가서 performance 체크 > 성능 쿼리 날려서 확인
stats pct(container_cpu_usage_total, 50) as CPUPercMedian by kubernetes.container_name
| filter Type="Container"
| sort CPUPercMedian desc
// 아래로 내리면 CPU 많이 쓰는 부분을 확인 할수 있다.
8
applilcation 로그 그룹
# 컨테이너 이름별 애플리케이션 로그 오류
stats count() as countoferrors by kubernetes.container_name
| filter stream="stderr"
| sort countoferrors desc
9
샘플
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-view-metrics.html
10
관리형 그라파나 프로메테우스 실습
11
https://www.eksworkshop.com/intermediate/246_monitoring_amp_amg/
12
<9> 삭제
1
IRSA 삭제
eksctl delete iamserviceaccount --name cwagent-prometheus --cluster $CLUSTER_NAME --namespace amazon-cloudwatch
2
WordPress 삭제 ?
namespace를 디폴트로 변경하고 삭제
kubens default
helm -n wordpress-cwi uninstall understood-zebu
kubectl delete namespace wordpress-cwi
# 2~3분 정도 시간 소요
3
IRSA 삭제
eksctl delete iamserviceaccount --name fluent-bit --cluster $CLUSTER_NAME --namespace amazon-cloudwatch
eksctl delete iamserviceaccount --name cloudwatch-agent --cluster $CLUSTER_NAME --namespace amazon-cloudwatch
4
EKS Control Plane 로깅(CloudWatch Logs) 비활성화
eksctl utils update-cluster-logging --cluster $CLUSTER_NAME --region $AWS_DEFAULT_REGION --disable-types all --approve
5
AWS 콘솔에서 Cloudwatch > 로그 그룹 삭제
https://brunch.co.kr/@topasvga/1888
감사합니다.