클라우드/AWS

[AWS] EKS monitoring - 4주차

Cloud_Park 2023. 5. 18. 22:21

이번주는 스터디를 통해 eks의 모니터링을 실습해봤는데요.

기존 프로메테우스와 그라파나의 조합으론 실습해 본 경험이 있었는데 EKS에서 AWS의 서비스를 통해 모니터링하는 부분이 인상 깊었습니다. AWS에서 신경써서 CRD를 만든 부분들이 섬세하면서 AWS에서 kubernetes를 사용하면 얻는 이점들을 부각 시킨 것 같아 csp사의 노력이 보입니다.

 

이번주 포스팅시작하겠습니다.

 실습 환경은 이전 글 참고 부탁드립니다.

2023.05.18 - [클라우드/AWS] - [AWS] EKS monitoring - 4주차 원클릭배포

 

AWS LB/ExternalDNS/EBS/EFS, kube-ops-view 설치

2023.05.18 - [클라우드/AWS] - [AWS] EKS monitoring - AWS LB/ExternalDNS/EBS/EFS, kube-ops-view 설치

 

 

AWS가 EKS에서 리소스 및 정보를 확인 할 수 있도록 eks클러스터에서 제공하고 있습니다.

웹콘솔에서 확인 부분만 해당 게시글에 올리고 나머지 실습은 맨 아래 링크로 드리겠습니다.

클러스터룰을 확인해보자.

kubectl get ClusterRole | grep eks

 

AWS 콘솔 EKS에서 여러 오브젝트를 나타나는데, K8S에 잘 알려진 리소스들의 리소스를 리스트화 해놨다.

Workloads : Pods,      ReplicaSets, Deployments, and DaemonSets

Pods : 네임스페이스 필터, 구조화된 보기 structured view vs 원시 보기 raw view

Cluster : Nodes, Namespaces and API Services

 

Nodes : 노드 상태 및 정보, Taints, Conditions, Labels, Annotations 등

Service and Networking : Pods as Service, Endpoints and Ingresses

 

Service : 서비스 정보, 로드 밸런서(CLB/NLB) URL 정보 등

 

Config and Secrets : ConfigMap and Secrets

ConfigMap & Secrets : 정보 확인, 디코드 Decode 지원

 

Storage : PVC, PV, Storage Classes, Volume Attachments, CSI Drivers, CSI Nodes

PVC : 볼륨 정보, 주석, 이벤트

Volume Attachments : PVC가 연결된 CSI Node 정보

 

Authentication : Service Account

Service Account : IAM 역할 arn , add-on 연동

Authorization : Cluster Roles, Roles, ClusterRoleBindings and RoleBindings

 

Cluster Roles & Roles : Roles 에 규칙 확인

Policy : Limit Ranges, Resource Quotas, Network Policies, Pod Disruption Budgets, Pod Security Policies

Pod Security Policies : (기본값) eks.privileged 정보 확인

Extensions : Custom Resource Definitions, Mutating Webhook Configurations, and Validating Webhook Configurations

 

과정은 아래와 같다.

 

https://www.eksworkshop.com/docs/observability/resource-view/extensions/webhook-configurations/

 

 

 


로깅을 활성화하여 웹콘솔에서 확인하기

로깅 활성화

더보기
aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME \
    --logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'

# 로그 그룹 확인
aws logs describe-log-groups | jq

# 로그 tail 확인 : aws logs tail help
aws logs tail /aws/eks/$CLUSTER_NAME/cluster | more

# 신규 로그를 바로 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --follow

# 필터 패턴
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --filter-pattern <필터 패턴>

# 로그 스트림이름
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix <로그 스트림 prefix> --follow
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix kube-controller-manager --follow
kubectl scale deployment -n kube-system coredns --replicas=1
kubectl scale deployment -n kube-system coredns --replicas=2

# 시간 지정: 1초(s) 1분(m) 1시간(h) 하루(d) 한주(w)
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m

# 짧게 출력
aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m --format short

결과

변경되기 전

변경 후

활성화가 되었다면 로깅을 볼 수 있다.

로그 예제

더보기

 

# EC2 Instance가 NodeNotReady 상태인 로그 검색
fields @timestamp, @message
| filter @message like /NodeNotReady/
| sort @timestamp desc

# kube-apiserver-audit 로그에서 userAgent 정렬해서 아래 4개 필드 정보 검색
fields userAgent, requestURI, @timestamp, @message
| filter @logStream ~= "kube-apiserver-audit"
| stats count(userAgent) as count by userAgent
| sort count desc

#
fields @timestamp, @message
| filter @logStream ~= "kube-scheduler"
| sort @timestamp desc

#
fields @timestamp, @message
| filter @logStream ~= "authenticator"
| sort @timestamp desc

#
fields @timestamp, @message
| filter @logStream ~= "kube-controller-manager"
| sort @timestamp desc

로그 비활성화

더보기
# EKS Control Plane 로깅(CloudWatch Logs) 비활성화
eksctl utils update-cluster-logging --cluster $CLUSTER_NAME --region $AWS_DEFAULT_REGION --disable-types all --approve

# 로그 그룹 삭제
aws logs delete-log-group --log-group-name /aws/eks/$CLUSTER_NAME/cluster

control plane metric 이 프로메테우스와 aws cloud watch logs insights 쿼리에 대해 알아보겠습니다.

메트릭 정보 확인하기

kubectl get --raw /metrics | more

EKS에서 ETCD 데이터베이스 사이즈

kubectl get --raw /metrics | grep "etcd_db_total_size_in_bytes"
etcd_db_total_size_in_bytes{endpoint="http://10.0.160.16:2379"} 4.665344e+06
etcd_db_total_size_in_bytes{endpoint="http://10.0.32.16:2379"} 4.636672e+06
etcd_db_total_size_in_bytes{endpoint="http://10.0.96.16:2379"} 4.640768e+06

kubectl get --raw=/metrics | grep apiserver_storage_objects |awk '$2>100' |sort -g -k 2

# CW Logs Insights 쿼리
fields @timestamp, @message, @logStream
| filter @logStream like /kube-apiserver-audit/
| filter @message like /mvcc: database space exceeded/
| limit 10

# How do I identify what is consuming etcd database space?
kubectl get --raw=/metrics | grep apiserver_storage_objects |awk '$2>100' |sort -g -k 2
kubectl get --raw=/metrics | grep apiserver_storage_objects |awk '$2>50' |sort -g -k 2
apiserver_storage_objects{resource="clusterrolebindings.rbac.authorization.k8s.io"} 78
apiserver_storage_objects{resource="clusterroles.rbac.authorization.k8s.io"} 92

쿼리문

더보기
# CW Logs Insights 쿼리 : Request volume - Requests by User Agent:
fields userAgent, requestURI, @timestamp, @message
| filter @logStream like /kube-apiserver-audit/
| stats count(*) as count by userAgent
| sort count desc

# CW Logs Insights 쿼리 : Request volume - Requests by Universal Resource Identifier (URI)/Verb:
filter @logStream like /kube-apiserver-audit/
| stats count(*) as count by requestURI, verb, user.username
| sort count desc

# Object revision updates
fields requestURI
| filter @logStream like /kube-apiserver-audit/
| filter requestURI like /pods/
| filter verb like /patch/
| filter count > 8
| stats count(*) as count by requestURI, responseStatus.code
| filter responseStatus.code not like /500/
| sort count desc

#
fields @timestamp, userAgent, responseStatus.code, requestURI
| filter @logStream like /kube-apiserver-audit/
| filter requestURI like /pods/
| filter verb like /patch/
| filter requestURI like /name_of_the_pod_that_is_updating_fast/
| sort @timestamp


NGINX 배포하여 로그 확인하기

배포 스크립트

# NGINX 웹서버 배포
helm repo add bitnami https://charts.bitnami.com/bitnami

# 사용 리전의 인증서 ARN 확인
CERT_ARN=$(aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text)
echo $CERT_ARN

# 도메인 확인
echo $MyDomain

# 파라미터 파일 생성
cat <<EOT > nginx-values.yaml
service:
    type: NodePort

ingress:
  enabled: true
  ingressClassName: alb
  hostname: nginx.$MyDomain
  path: /*
  annotations: 
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
    alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
    alb.ingress.kubernetes.io/success-codes: 200-399
    alb.ingress.kubernetes.io/load-balancer-name: $CLUSTER_NAME-ingress-alb
    alb.ingress.kubernetes.io/group.name: study
    alb.ingress.kubernetes.io/ssl-redirect: '443'
EOT
cat nginx-values.yaml | yh

# 배포
helm install nginx bitnami/nginx --version 14.1.0 -f nginx-values.yaml

# 확인
kubectl get ingress,deploy,svc,ep nginx
kubectl get targetgroupbindings # ALB TG 확인

# 접속 주소 확인 및 접속
echo -e "Nginx WebServer URL = https://nginx.$MyDomain"
curl -s https://nginx.$MyDomain
kubectl logs deploy/nginx -f

# 반복 접속
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done

* 컨테이너의 환경의 로그는  표준출력 stdout와  표준에러 stderr 로 보내는 것을 권고한다고합니다.

 >해당 권고에 따라 작성된 컨테이너 애플리케이션의 로그는 해당 파드 안으로 접속하지 않아도 사용자는 외부에서 kubectl logs 명령어로 애플리케이션 종류에 상관없이, 애플리케이션마다 로그 파일 위치에 상관없이, 단일 명령어로 조회 가능

모니터링

# 로그 모니터링
kubectl logs deploy/nginx -f

# nginx 웹 접속 시도

# 컨테이너 로그 파일 위치 확인
kubectl exec -it deploy/nginx -- ls -l /opt/bitnami/nginx/logs/
total 0
lrwxrwxrwx 1 root root 11 Feb 18 13:35 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Feb 18 13:35 error.log -> /dev/stderr

*종료된 파드의 로그는 kubectl logs로 조회 할 수 없다

   kubelet 기본 설정은 로그 파일의 최대 크기가 10Mi로 10Mi를 초과하는 로그는 전체 로그 조회가 불가능함

cat /etc/kubernetes/kubelet-config.yaml
...
containerLogMaxSize: 10Mi

수정 예시

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: <cluster-name>
  region: eu-central-1

nodeGroups:
  - name: worker-spot-containerd-large-log
    labels: { instance-type: spot }
    instanceType: t3.large
    minSize: 2
    maxSize: 30
    desiredCapacity: 2
    amiFamily: AmazonLinux2
    containerRuntime: containerd
    availabilityZones: ["eu-central-1a", "eu-central-1b", "eu-central-1c"]
    kubeletExtraConfig:
        containerLogMaxSize: "500Mi"
        containerLogMaxFiles: 5

 

 


실습

2023.05.18 - [클라우드/AWS] - [AWS] EKS monitoring - 4주차 -Container Insights metrics in Amazon CloudWatch & Fluent Bit (Logs)

2023.05.18 - [클라우드/AWS] - [AWS] EKS monitoring - 4주차 -Metrics-server & kwatch & botkube

2023.05.18 - [클라우드/AWS] - [AWS] EKS monitoring - 4주차 - 프로메테우스 & 그라파나

 

 

꼭 삭제하도록 !

eksctl delete cluster --name $CLUSTER_NAME && aws cloudformation delete-stack --stack-name $CLUSTER_NAME