EKS에서의 다양한 옵저빌리티 도구에 대해 알아보겠습니다.
1. EKS Console
먼저 AWS 웹 콘솔에 EKS 메뉴에 들어가면 클러스터 ARN, 엔드포인트, 정책 리소스 등 Kubernetes API 리소스 유형을 확인할 수 있습니다.
2. Logging in EKS
eks 로깅을 활성화하면 CloudWatch를 통해 손쉽게 로깅을 할 수 있습니다.
Control plane logging
컨트롤 플레인의 로그의 종류는 다음과 같습니다.
- Kubernetes API server component logs (
**api**
) –kube-apiserver-<nnn...>
- Audit (
**audit**
) –kube-apiserver-audit-<nnn...>
- Authenticator (
**authenticator**
) –authenticator-<nnn...>
- Controller manager (
**controllerManager**
) –kube-controller-manager-<nnn...>
- Scheduler (
**scheduler**
) –kube-scheduler-<nnn...>
# 모든 로깅 활성화
# 모든 로깅 활성화
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
로그를 활성화하면 아래와 같이 on
으로 변경되는 것을 확인할 수 있습니다.
로그 그룹의 이름은 /aws/eks/<cluster-name>/cluster
패턴으로 생성됩니다.
웹 콘솔을 통해 손쉽게 필터링하여 확인할 수 있습니다.
혹은, CLI를 통해서도 로그를 확인할 수 있습니다.
Cloudwatch > Logs > Logs Insight
메뉴 카테고리에 CloudWatch Logs Insights 서비스를 이용하면 쿼리를 통해서 로그를 확인할 수 있습니다.
다음은 등록한 로그 그룹을 선택하고 30분 동안의 kube-apiserver의 audit 로그를 불러옵니다.
로깅을 다시 비활성화하려면 아래 명령어를 입력합니다.
# 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
3.Container Insights metrics in Amazon CloudWatch & Fluent Bit (Logs)
- CloudWatch Container Insights는 컨테이너형 애플리케이션 및 마이크로 서비스에 대한 모니터링, 트러블 슈팅 및 알람을 위한 완전 관리형 관측 서비스입니다.
- 각 노드마다
CloudWatch
파드와Fluent Bit
파드가 데몬셋으로 배치되어 Metrics와 Logs를 수집합니다. - 수집
- 아래 3가지 종류의 로그를 CloudWatch Logs에 전송합니다.
- /aws/containerinsights/
Cluster_Name
/application : 로그 소스(All log files in/var/log/containers
), 각 컨테이너/파드 로그 - /aws/containerinsights/
Cluster_Name
/host : 로그 소스(Logs from/var/log/dmesg
,/var/log/secure
, and/var/log/messages
), 노드(호스트) 로그 - /aws/containerinsights/
Cluster_Name
/dataplane : 로그 소스(/var/log/journal
forkubelet.service
,kubeproxy.service
, anddocker.service
), 쿠버네티스 데이터플레인 로그
- 저장
- CloudWatch logs에 로그를 저장하고, 로그 그룹별로 보존 기간 설정이 가능합니다.
- 시각화
- CloudWatch 의 Logs Insights를 사용하여 대상 로그를 분석하고, CloudWatch의 대시보드로 시각화합니다.
CloudWatch Container observability 설치합니다. 현재는 EKS-addon으로 지원하고 있어 손쉽게 설치할 수 있습니다.
# 설치
aws eks create-addon --cluster-name $CLUSTER_NAME --addon-name amazon-cloudwatch-observability
aws eks list-addons --cluster-name myeks --output table
# 설치 확인
kubectl get-all -n amazon-cloudwatch
kubectl get ds,pod,cm,sa,amazoncloudwatchagent -n amazon-cloudwatch
kubectl describe clusterrole cloudwatch-agent-role amazon-cloudwatch-observability-manager-role # 클러스터롤 확인
kubectl describe clusterrolebindings cloudwatch-agent-role-binding amazon-cloudwatch-observability-manager-rolebinding # 클러스터롤 바인딩 확인
kubectl -n amazon-cloudwatch logs -l app.kubernetes.io/component=amazon-cloudwatch-agent -f # 파드 로그 확인
kubectl -n amazon-cloudwatch logs -l k8s-app=fluent-bit -f # 파드 로그 확인
# cloudwatch-agent 설정 확인
kubectl describe cm cloudwatch-agent-agent -n amazon-cloudwatch
CloudWatch 메뉴에 아래 로그 그룹이 생성된 것을 볼 수 있습니다.
컨테이너(파드 로깅)
그럼 , Nginx 웹서버(컨테이너)를 배포해보고 Container Insight
를 통해 로그를 수집하고 확인해보겠습니다.
먼저, Helm Chart를 통해서 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
# 파라미터 파일 생성 : 인증서 ARN 지정하지 않아도 가능! 혹시 https 리스너 설정 안 될 경우 인증서 설정 추가(주석 제거)해서 배포 할 것
cat <<EOT > nginx-values.yaml
service:
type: NodePort
networkPolicy:
enabled: false
ingress:
enabled: true
ingressClassName: alb
hostname: nginx.$MyDomain
pathType: Prefix
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 15.14.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
## 외부에서는 접속이 잘되나, myeks EC2에서 url 접속이 잘 되지 않을 경우 : 이전 aws DNS cache 영향(추정)
dig +short nginx.$MyDomain
dig +short nginx.$MyDomain @192.168.0.2
dig +short nginx.$MyDomain @1.1.1.1
dig +short nginx.$MyDomain @8.8.8.8
cat /etc/resolv.conf
sed -i "s/^nameserver 192.168.0.2/nameserver 1.1.1.1/g" /etc/resolv.conf
cat /etc/resolv.conf
dig +short nginx.$MyDomain
dig +short nginx.$MyDomain @8.8.8.8
dig +short nginx.$MyDomain @192.168.0.2
curl -s https://nginx.$MyDomain
----
# 반복 접속
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done
# (참고) 삭제 시
helm uninstall nginx
ApacheBench
도구를 이용해서 부하를 발생시켜 로그를 더 많이 수집할 수 있도록 합니다.
# 부하 발생
curl -s https://nginx.$MyDomain
yum install -y httpd
ab -c 500 -n 30000 https://nginx.$MyDomain/
# 파드 직접 로그 모니터링
kubectl logs deploy/nginx -f
/aws/containerinsights/myeks/application
로그 그룹의 로그 이벤트를 확인해보면 수많은 애플리케이션 로그를 확인해 볼 수 있습니다. ApacheBench
를 필터링해보면 위에서 발생시킨 부하테스트의 로그를 확인할 수 있습니다.
다음과 같이 Logs Insights의 쿼리를 통해서도 로그를 가져올 수 있습니다.
# Application log errors by container name : 컨테이너 이름별 애플리케이션 로그 오류
# 로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/application
stats count() as error_count by kubernetes.container_name
| filter stream="stderr"
| sort error_count desc
# All Kubelet errors/warning logs for for a given EKS worker node
# 로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/dataplane
fields @timestamp, @message, ec2_instance_id
| filter message =~ /.*(E|W)[0-9]{4}.*/ and ec2_instance_id="<YOUR INSTANCE ID>"
| sort @timestamp desc
# Kubelet errors/warning count per EKS worker node in the cluster
# 로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/dataplane
fields @timestamp, @message, ec2_instance_id
| filter message =~ /.*(E|W)[0-9]{4}.*/
| stats count(*) as error_count by ec2_instance_id
또한, Container Inshgihs를 활성화하면 EKS의 아래 다양한 리소스들의 대시보드를 지원합니다.
- 클러스터 상태요약
- 세부 정보
- 클러스터
- 노드
- 네임스페이스
- 파드
- 컨테이너
- 기본적인 대시보드
4. 메트릭 서버(Metrics-Server)
- 쿠버네티스 메트릭 서버는 쿠버네티스 클러스터 내에서 리소스 사용량 및 성능 데이터를 수집하고 노출하는 역할을 합니다.
- 이 데이터는 HPA (Horizontal Pod Autoscaler)와 같은 컴포넌트가 스케일링 결정을 내릴 때 사용됩니다.
- 메트릭 서버는 각 노드 및 포드의 CPU, 메모리 사용량, 네트워크 트래픽 등을 수집하여 API 서버에 저장하고 이러한 데이터를 쿼리 할 수 있도록 해줍니다.
metric-server 설치
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 메트릭 서버 확인 : 메트릭은 15초 간격으로 cAdvisor를 통하여 가져옴
kubectl api-resources | grep metrics
kubectl get apiservices |egrep '(AVAILABLE|metrics)'
kubectl get pod -n kube-system -l k8s-app=metrics-server
NAME READY STATUS RESTARTS AGE
metrics-server-6d94bc8694-d5v4l 1/1 Running 0 113s
메트릭 확인
# 노드 메트릭 확인
kubectl top node
# 파드 메트릭 확인
kubectl top pod -A
kubectl top pod -n kube-system --sort-by='cpu'
kubectl top pod -n kube-system --sort-by='memory'
5. kwatch
- kwatch는 Kubernetes 클러스터 내의 리소스 변화를 실시간으로 모니터링할 수 있는 유틸리티 도구입니다.
- Slack Webhook을 연동하여 Kubernetes 클러스터의 상태를 실시간으로 파악하여 관리 및 디버깅 작업을 수월하도록 합니다.
kwatch 설치
연동할 <SLACK_WEBHOOK_URL>을 입력합니다.
# 닉네임
NICK=<각자 자신의 닉네임>
NICK=jdg98
# configmap 생성
cat <<EOT > ~/kwatch-config.yaml
apiVersion: v1
kind: Namespace
metadata:
name: kwatch
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kwatch
namespace: kwatch
data:
config.yaml: |
alert:
slack:
webhook: <SLACK_WEBHOOK_URL>
title: $NICK-EKS
#text: Customized text in slack message
pvcMonitor:
enabled: true
interval: 5
threshold: 70
EOT
kubectl apply -f kwatch-config.yaml
# 배포
kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.8.5/deploy/deploy.yaml
Slack을 통한 이상징후 결과 탐지
# 터미널1
watch kubectl get pod
# 잘못된 이미지 정보의 파드 배포
kubectl apply -f https://raw.githubusercontent.com/junghoon2/kube-books/main/ch05/nginx-error-pod.yml
kubectl get events -w
# 이미지 업데이트 방안2 : set 사용 - iamge 등 일부 리소스 값을 변경 가능!
kubectl set
kubectl set image pod nginx-19 nginx-pod=nginx:1.19
# 삭제
kubectl delete pod nginx-19
6. 프로메테우스(Prometheus)
prometheus-stack 설치
프로메테우스 스택은 모니터링에 필요한 여러 요소를(prometheus, grafana, alert-manager 등) 단일 차트(스택)로 제공합니다.
# 모니터링
kubectl create ns monitoring
watch kubectl get pod,pvc,svc,ingress -n monitoring
# 사용 리전의 인증서 ARN 확인 : 정상 상태 확인(만료 상태면 에러 발생!)
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN
# repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 파라미터 파일 생성
cat <<EOT > monitor-values.yaml
prometheus:
prometheusSpec:
podMonitorSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
retention: 5d
retentionSize: "10GiB"
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: gp3
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 30Gi
ingress:
enabled: true
ingressClassName: alb
hosts:
- prometheus.$MyDomain
paths:
- /*
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: myeks-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
grafana:
defaultDashboardsTimezone: Asia/Seoul
adminPassword: prom-operator
ingress:
enabled: true
ingressClassName: alb
hosts:
- grafana.$MyDomain
paths:
- /*
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: myeks-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
persistence:
enabled: true
type: sts
storageClassName: "gp3"
accessModes:
- ReadWriteOnce
size: 20Gi
defaultRules:
create: false
kubeControllerManager:
enabled: false
kubeEtcd:
enabled: false
kubeScheduler:
enabled: false
alertmanager:
enabled: false
EOT
cat monitor-values.yaml | yh
# 배포
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 57.1.0 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring
# 확인
## alertmanager-0 : 사전에 정의한 정책 기반(예: 노드 다운, 파드 Pending 등)으로 시스템 경고 메시지를 생성 후 경보 채널(슬랙 등)로 전송
## grafana : 프로메테우스는 메트릭 정보를 저장하는 용도로 사용하며, 그라파나로 시각화 처리
## prometheus-0 : 모니터링 대상이 되는 파드는 ‘exporter’라는 별도의 사이드카 형식의 파드에서 모니터링 메트릭을 노출, pull 방식으로 가져와 내부의 시계열 데이터베이스에 저장
## node-exporter : 노드익스포터는 물리 노드에 대한 자원 사용량(네트워크, 스토리지 등 전체) 정보를 메트릭 형태로 변경하여 노출
## operator : 시스템 경고 메시지 정책(prometheus rule), 애플리케이션 모니터링 대상 추가 등의 작업을 편리하게 할수 있게 CRD 지원
## kube-state-metrics : 쿠버네티스의 클러스터의 상태(kube-state)를 메트릭으로 변환하는 파드
helm list -n monitoring
kubectl get pod,svc,ingress,pvc -n monitoring
kubectl get-all -n monitoring
kubectl get prometheus,servicemonitors -n monitoring
kubectl get crd | grep monitoring
kubectl df-pv
인그레스를 통해 도메인으로 프로메테우스를 접속합니다.
# ingress 확인
kubectl get ingress -n monitoring kube-prometheus-stack-prometheus
kubectl describe ingress -n monitoring kube-prometheus-stack-prometheus
# 프로메테우스 ingress 도메인으로 웹 접속
echo -e "Prometheus Web URL = https://prometheus.$MyDomain"
프로메테우스 메뉴 분석
프로메테우스 Web UI의 주요 메뉴에 대해 알아봅니다.
TSDB Status
프로메테우스의 쿼리에 대한 통계등을 확인할 수 있습니다. TSDB(Time Series Database)의 성능, 용량, 데이터의 보관 상태 등을 이해하는 데 도움이 됩니다
Configuration
- 가장 많이 활용되는 메뉴로 프로메테우스에 적용된 설정 파일을 확인할 수 있습니다.
- 수집주기 설정 =
global.scrape\_interval: 1m
수집하는 잡 =scrape\_configs.job\_name: prometheus
- 프로메테우스 스택(Operator)의 경우 시크릿, 일반 프로메테우스에서는 prometheus-server라는 컨피그맵에서 Configuration을 확인할 수 습니다.
Target
- 프로메테우스가 수집하는 모니터링 대상입니다.
- Node expoter cAdvisor, 쿠버네티스 전반적인 현황 이외에 다양한 메트릭을 포함합니다.
configuration의 job_name을 통해 프로메테우스가 Scrapping 합니다.
Service Discovery
- 실제로 프로메테우스에 설정된 잡들이 서비스 디스커버리를 통하여 통신합니다.
- 서비스 디스커버리를 대상들을 한눈에 확인할 수 있습니다.
- 아래와 같이 서비스 디스커버리에는 모든 잡들의 엔드포인트 정보가 나오지만, action, relabel 등 필드 값에 따라 쿼리가 필터링됩니다.
프로메테우스 익스포터(Exporter)
Node Exporter
- 쿠버네티스 노드의 OS 운영체제에 상태에 대한 지표를 수집하는 데 사용됩니다
- CPU 사용량, 메모리 사용량, 디스크 활용률, 네트워크 트래픽 등 다양한 시스템 지표를 수집하여 프로메테우스와 같은 모니터링 시스템으로 전송합니다.
# Table 아래 쿼리 입력 후 Execute 클릭 -> Graph 확인
## 출력되는 메트릭 정보는 node-exporter 를 통해서 노드에서 수집된 정보
node_memory_Active_bytes
# 부하테스트
stress --vm 5 --vm-bytes 10M --timeout 150s
# 특정 노드(인스턴스) 필터링 : 아래 IP는 출력되는 자신의 인스턴스 PrivateIP 입력 후 Execute 클릭 -> Graph 확인
node_memory_Active_bytes{instance="192.168.1.105:9100"}
kube-state-metrics
- 쿠버네티스 오브젝트(파드, 노드, 서비스, 디플로이먼트 등) 상태에 대한 지표를 수집합니다.
- 쿠버네티스 API 서버에서 클러스터의 현재 상태를 가져와서 Prometheus와 같은 모니터링 시스템으로 노출합니다
실습할 디플로이먼트를 배포하고, 레플리카 수를 증가시켜, kube-state-metrics을 통한 쿠버네티스 오브젝트의 메트릭 수집을 확인합니다.
cat << EOT >> deploy-http.yaml | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deploy-httpd
name: deploy-httpd
spec:
replicas: 3
selector:
matchLabels:
app: deploy-httpd
template:
metadata:
labels:
app: deploy-httpd
spec:
containers:
- image: httpd
name: httpd
EOT
# 레플리카수 증가 3 -> 6
k scale deployment deploy-httpd --replicas 6
cAdvisor(kubelet)
- 쿠버네티스 클러스터 내에서 동작하는 각 컨테이너의 리소스 사용량 및 성능 지표를 수집합니다.
- 주로 kubelet이라는 쿠버네티스 노드 에이전트에서 실행됩니다.
- 아래와 같이 컨테이너 관련 메트릭을 조회할 수 있습니다.
PromQL
메트릭 타입
PromQL에는 4가지 메트릭 타입이 존재합니다.
- 게이지(Gauge)
- 특정 시점의 값을 표현하기 위해서 사용하는 메트릭 타입
- CPU 온도나 메모리 사용량에 대한 현재 시점 값
- node_memory_Active_bytes = "노드 메모리 사용량"
- 카운터(Counter)
- 누적된 값을 표현하기 위해 사용하는 메트릭 타입
- 증가 시 구간 별로 변화(추세) 확인, 계속 증가 → 함수 등으로 활용
- 서머리(Summary)
- 구간 내에 있는 메트릭 값의 빈도, 중앙값 등 통계적 메트릭
- 히스토그램(Histogram)
- 사전에 미리 정의한 구간 내에 있는 메트릭 값의 빈도를 측정 → 함수로 측정 포맷을 변경
레이블 매처(Label Macher)
- PromQL에서 특정 레이블 값과 일치하는 시계열데이터를 선택하는 데 사용되는 메커니즘입니다.
- 레이플 매처의 4가지 조건
- = : 매치되는 값 ****
- ≠ : 매치되지 않는 값
- =~ : 정규표현식
- !~: 정규표현식에 해당하지 않는 값
```
# 예시
node_memory_Active_bytes
node_memory_Active_bytes{instance="192.168.1.188:9100"}
node_memory_Active_bytes{instance!="192.168.1.188:9100"}
# 정규표현식
node_memory_Active_bytes{instance=~"192.168.+"}
node_memory_Active_bytes{instance=~"192.168.1.+"}
# 다수 대상
node_memory_Active_bytes{instance=~"192.168.1.188:9100|192.168.2.170:9100"}
node_memory_Active_bytes{instance!~"192.168.1.188:9100|192.168.2.170:9100"}
# 여러 조건 AND
kube_deployment_status_replicas_available{namespace="kube-system"}
kube_deployment_status_replicas_available{namespace="kube-system", deployment="coredns"}
```
레이블 매처의 정규표현식을 활용하여 172 대역인 노드의 정보만 필터링할 수 있습니다.
이진 연산자(Binary Operators)
- 수식에서와 같이 연산자 중 두 개의 피연산자를 필요로 하는 연산자를 의미합니다.
- 이진 연산자의 종류
- 산술 이진 연산자 : + - * / * ^
- 비교 이진 연산자 : = =! = > < > = < =
- 논리/집합 이진 연산자 : and 교집합, or 합집합, unless 차집합
# 산술 이진 연산자 : + - * / * ^
node_memory_Active_bytes
node_memory_Active_bytes/1024
node_memory_Active_bytes/1024/1024
# 비교 이진 연산자 : = = ! = > < > = < =
nginx_http_requests_total
nginx_http_requests_total > 100
nginx_http_requests_total > 10000
# 논리/집합 이진 연산자 : and 교집합 , or 합집합 , unless 차집합
kube_pod_status_ready
kube_pod_container_resource_requests
kube_pod_status_ready == 1
kube_pod_container_resource_requests > 1
kube_pod_status_ready == 1 or kube_pod_container_resource_requests > 1
kube_pod_status_ready == 1 and kube_pod_container_resource_requests > 1
비교 이진 연산자를 이용하여 nginx의 http request가 10000 이상의 조건의 결과를 가져오도록 합니다.
집계연산자( Aggregation Operators)
- 여러 시계열 데이터를 하나의 값으로 집계하는 데 사용됩니다. 이 연산자를 사용하여 데이터를 요약하고 통계를 계산하고 활용할 수 있습니다.
- 집계 연산자의 종류
sum
(calculate sum over dimensions) : 조회된 값들을 모두 더함min
(select minimum over dimensions) : 조회된 값에서 가장 작은 값을 선택max
(select maximum over dimensions) : 조회된 값에서 가장 큰 값을 선택avg
(calculate the average over dimensions) : 조회된 값들의 평균값을 계산group
(all values in the resulting vector are 1) : 조회된 값을 모두 ‘1’로 바꿔서 출력stddev
(calculate population standard deviation over dimensions) : 조회된 값들의 모 표준 편차를 계산stdvar
(calculate population standard variance over dimensions) : 조회된 값들의 모 표준 분산을 계산count
(count number of elements in the vector) : 조회된 값들의 개수를 출력 / 인스턴스 벡터에서만 사용 가능count_values
(count number of elements with the same value) : 같은 값을 가지는 요소의 갯수를 출력bottomk
(smallest k elements by sample value) : 조회된 값들 중에 가장 작은 값들 k 개 출력topk
(largest k elements by sample value) : 조회된 값들 중에 가장 큰 값들 k 개 출력quantile
(calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) : 조회된 값들을 사분위로 나눠서 (0 < $ < 1)로 구성하고, $에 해당하는 요소들을 출력
# 출력 값 중 Top 3
topk(3, node_memory_Active_bytes)
# 출력 값 중 하위 3
bottomk(3, node_memory_Active_bytes)
bottomk(3, node_memory_Active_bytes>0)
# node 그룹별: by
node_cpu_seconds_total
node_cpu_seconds_total{mode="user"}
node_cpu_seconds_total{mode="system"}
avg(node_cpu_seconds_total)
avg(node_cpu_seconds_total) by (instance)
avg(node_cpu_seconds_total) without (instance) # 특정 내용 제외하고 출력 : without
avg(node_cpu_seconds_total{mode="user"}) by (instance)
avg(node_cpu_seconds_total{mode="system"}) by (instance)
집계연산자 topk
, bottomk를 사용하여 node cpu 사용 최상위, 최하위 Top3 노드의 결과를 가져옵니다.
인스턴트 벡터와 레인지 벡터(Vector)
- 인스턴스 벡터
- 시점에 대한 메트릭 값만을 가지는 데이터 타입
- 레인지 벡터
- 시간의 구간을 가지는 데이터 타입
- 인스턴스 백터는 사진기, 레인지 백터는 캠코더에 비유합니다.
- 시간 단위 : ms, s, m(주로 분 사용), h, d, w, y
- rate, irate 변화율 사용 시, 백터 값을 필요로 합니다
# 시점 데이터
node_cpu_seconds_total
# 15초 마다 수집하니 아래는 지난 4회차/8회차의 값 출력
node_cpu_seconds_total[1m]
node_cpu_seconds_total[2m]
백터를 활용해서 5분간 노드의 메모리 사용률의 변화율에 대한 평균값을 구할 수도 있습니다.
PromQL 활용
PromQL을 활용하면 메트릭뿐만 아니라 운영에 필요한 정보들을 손쉽게 가져올 수 있습니다.
네임스페이별 파드 개수
count(kube_pod_info) by(namespace)
object별 파드 생성 개수
count(kube_pod_info) by(created_by_kind)
파드 메모리 사용량 탑 10(메모리를 사용하는 파드)
topk(10, sum(container_memory_working_set_bytes {pod!=""}) by (pod))
7. 그라파나
프로메테우스의 PSDB 데이터를 시각화해 주고 다양한 데이터 형식 지원(메트릭, 로그, 트레이스 등) 합니다. 다양한 데이터 소스로부터 데이터를 수집하고 이를 시각적으로 표현하여 사용자가 데이터를 이해하고 분석할 수 있도록 도와줍니다
그라파나 접속
그라파나 버전 확인
kubectl exec -it -n monitoring deploy/kube-prometheus-stack-grafana -- grafana-cli --version
grafana cli version 10.4.0
ingress 확인
kubectl get ingress -n monitoring kube-prometheus-stack-grafana
kubectl describe ingress -n monitoring kube-prometheus-stack-grafana
ingress 도메인으로 웹 접속 : 기본 계정 - admin / prom-operator
echo -e "Grafana Web URL = https://grafana.$MyDomain"
대시보드 사용
공식 대시보드 가져오기
Home > Dashobards 메뉴에서 import 버튼을 통해 수많은 사용자들이 제공하는 대시보드를 손쉽게 불러올 수 있습니다.
그라파나 패널(Panel) - 추가예정
그라파나 얼럿(Alert) - 추가예정
'AWS > EKS' 카테고리의 다른 글
EKS 보안(Security) - AEWS 6주차 (1) | 2024.04.14 |
---|---|
EKS 오토스케일링(Autoscaling) - AEWS 5주차 (0) | 2024.04.07 |
EKS 노드그룹(Nodegroup) - AEWS 3주차 2 (0) | 2024.03.23 |
EKS 스토리지(Storage) - AEWS 3주차 1 (0) | 2024.03.23 |
EKS 네트워킹(Networking) - AEWS 2주차 (4) | 2024.03.16 |