[AWS] EKS monitoring - 4주차
이번주는 스터디를 통해 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
과정은 아래와 같다.
로깅을 활성화하여 웹콘솔에서 확인하기
로깅 활성화
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주차 -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