brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Sep 13. 2021

EKS 4탄-13.CloudWatch Container

실습 4탄 =  13/17

Cloudwatch Container insights 로 EKS Work node를 모니터링 하자

CloudWatch로  알람 받자

부하 테스트 하자

쿼리로 성능 확인 하자




<1> Cloudwatch Container insights 로 Work node 를 모니터링 할수 있다.

<2> 실습1 - 쿠버네티스에 서비스 어카운트가 있어야 하고, Cloudwatch 권한이 있어야 한다.

<3> 성능모니터링, 리소스, Container map 보기 

<4> 워드프레스 설치 해보자

<5> 워드프레스 접속 하기

<6> 부하 테스트

<7> 실습2 - cloudwatch 알람 받기  해보기

<8> 실습3 - 쿼리로 성능 확인하기

<9> 삭제

<10 >  다음편  EKS Auto Scaling 





<1> Cloudwatch Container insights 로 Work node 를 모니터링 할수 있다.


별도의 네임스페이스를 만들어 구축한다.

쿠버네티스에 서비스 어카운트를 만들어야 한다.

서비스 어카운트가 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 에 데이터도 전송 → 로그 그룹에 확인






<2>  실습1 - 쿠버네티스에 서비스 어카운트가 있어야 하고, Cloudwatch 권한이 있어야 한다.



별도 터미널에서 모니터링 

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 에서 서비스 어카운트를 생성되어 있어서 발생한것이니 문제될게 없음

curl -O 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


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)




<3> 실습2 - 성능모니터링, 리소스, Container map 보기 



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/




<4> 워드프레스 설치 해보자



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/"




<5>  워드프레스 접속 하기


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

접속




<6> 실습3 - 부하 테스트


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 확인하기




<7>  실습2 - Cloudwatch 알람 받기  해보기


https://www.eksworkshop.com/intermediate/250_cloudwatch_container_insights/cwalarms/




<8> 실습3 - 쿼리로 성능 확인하기


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

관리형 그라파나 프로메테우스 실습


https://catalog.us-east-1.prod.workshops.aws/v2/workshops/31676d37-bbe9-4992-9cd1-ceae13c5116c/en-US/amg


11

https://www.eksworkshop.com/intermediate/246_monitoring_amp_amg/


12

https://catalog.us-east-1.prod.workshops.aws/v2/workshops/31676d37-bbe9-4992-9cd1-ceae13c5116c/en-US/amp




<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 > 로그 그룹 삭제




<10 >  다음은  EKS Auto Scaling 


https://brunch.co.kr/@topasvga/1888



감사합니다.



                    

매거진의 이전글 EKS 4탄-12. EKS Control Plane 
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari