4주차 - EKS Observability - Prometheus, Grafana, Loki
0. 도입
AWS 내에서 K8S을 통해 Prometheus와 Grafana를 사용해서 실습을 진행했습니다.
EKS 콘솔에서 CloudWatch Insights 를 사용한 로그 확인 방법들, 컴포넌트 별 로그 스트림 확인 방법을 실습했습니다.
모니터링을 진행할 때, AWS 진영의 Cloudwatch Container Observability를 통해 agent를 설치해서 로그와 메트릭을 확인 하는 방법도 실습했습니다.
Node와 pod 각각 로그의 확인은 어떻게 하는지, 어떤 원리로 진행되는지 알아보았습니다.
Prometheus를 사용한 Grafana와 Grafana Alert을 실습했습니다.
자세한 PromQL과 Grafana에서 대시보드 추가하는 방법을 실습했습니다.
다시 한번 가르침을 주시는 @CloudNet 팀에 감사함을 표합니다!
1. 선수지식
CloudWatch
K8S
node
pod
Grafana
Prometheus
2. 실습 환경 배포
이번 환경은 ebs addon, ec2 iam role, irsa lb, preCmd가 추가되었고 노드도 t3.large로 설정되었다.
이외에도
DNS 설정
LB 설정
CSI 드라이버 설정
GP3 스토리지 클래스 생성
eksctl 설치 및 addon들의 정책을 설정
현재 배포된 pod들의 이미지들 확인 -> 정상적으로 다 올라온것을 확인
kubectl get pods --all-namespaces -o jsonpath="{.items[
].spec.containers[
].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c
3. EKS Console
A. [이론] AWS 내에서 EKS 자원 확인 방법
해당 화면에서 리소스 유형의 항목들을 확인 할 수 있습니다.
워크로드
Pods, ReplicaSets, Deployments, DaemonSets
클러스터
Nodes, Namespaces, Service, k8s의 api 서비스들
서비스와 네트워킹
Service, Ingress
구성 및 보안 암호
ConfigMap, Secrets
스토리지
PV, PVC, Storage class, CSI Drivers, CSI Nodes, Volume Attachement
인증
Service Account (IAM 역할(ARN))
권한 부여
Cluster Roles & Roles, ClusterRoleBindings, RoleBindings
정책
Limit Ranges, Resource Quotas, Network Policies, Pod Disruption Budgets, Pod Security Policies
확장프로그램
Custom Resource Definitions, Webhook Configuration
4. Logging in EKS
A. [실습] ControlPlane Logging
목적: 감사를 위한 ControlPlane의 로깅 활성화 확인
실험 설정:
로깅 활성화
로그 TAIL 확인
aws logs tail /aws/eks/$CLUSTER_NAME/cluster | more
실험 결과:
Deployment 관련 요청 이후 정상적으로 표기됨을 확인
로그 스트림에 따라 표기하는것도 확인
B. [실습] CloudWatch Log/Metrics Insights 쿼리
목적: 로깅/모니터링으로 수집한 정보들을 쿼리로서 확인
실험 설정:
A 스텝에서의 AUDIT 설정
fields userAgent, requestURI, @timestamp, @message | filter @logStream ~= "kube-apiserver-audit" | stats count(userAgent) as count by userAgent | sort count desc
해당 쿼리를 EKS 대상으로실행
실험 결과:
다음과 같은 로깅 생성 확인
C. [실습] 파드 로깅
목적: 파드 대상으로 로깅 조회하는 방법 확인
실험 설정:
NGINX 웹서버 배포
kubectl logs 로 로그 조회
실험 결과:
kubectl logs deploy/nginx -f
로 로그 확인로그로 생성되는 파일 확인
기본 설정으로 etc/kubernetes/kubelet-config.yaml 에 containerLogMaxSize 는 10Mi이다. ClusterConfig에서 수정 가능하다.
5. Container Insights metrics in Amazon CloudWatch & Fluent Bit
A. [이론] Container Insights metrics 이란?/ 노드 로그 확인
CloudWatch Container Insight 는 AWS 에서 지원하는 CloudWatch와 연동되는 에이전트와 Fluent 파드를 데몬 셋으로 생성해서 Metrics 와 Log를 수집합니다.
동작원리:
CloudWatch Agent를 데몬셋으로 생성
메트릭 정보들을 수집 및 CloudWatchLogs로 전송
Fluent Bit를 데몬셋으로 생성
/aws/containerinsights/Cluster_Name/application -> 컨테이너 로그(var/log/containers)
/aws/containerinsights/Cluster_Name/host -> 노드 로그(var/log/messages)
/aws/containerinsights/Cluster_Name/dataplane -> k8s 데이터 플레인 로그(var/log/journal)
해당 로그들을 CloudWatchLogs에 전송
Log Insights를 사용해서 대상 로그 분석 및 시각화
B. [실습] CloudWatch Container observability 설치 / Nginx 로그 확인
목적: CloudWatch의 노드 메트릭, 로그 확인 및 FluentBit 파드가 로그를 수집하는 방법 확인
실험 설정:
CloudWatch Observability Add-on 설치
daemon set 들 확인
FluentBit 파드가 로그를 수집하는 방법 확인 (Volume 의 HostPath)
설치 완료 이후에 CloudWatch 관련 daemon set 떠있는것을 확인
kubectl describe -n amazon-cloudwatch ds cloudwatch-agent
HostPath는 노드의 탑 디렉토리로 확인 (보안상 이슈가 있다. 설정 변경 가능할듯)
kubectl describe -n amazon-cloudwatch ds fluent-bit
Fluent Bit 파드가 가지는 HostPath를 확인
kubectl describe cm fluent-bit-config -n amazon-cloudwatch
INPUT: Path /var/log/containers/*.log
OUTPUT: log_group_name /aws/containerinsights/${CLUSTER_NAME}/application
해당 인풋 아웃풋으로 매칭 되서 로그를 쌓게 된다.
실험 결과:
CloudWatch > Container Insights 에서 메트릭 확인
다음과 같은 CloudWatch dataplane의 로그 이벤트도 명시가 됩니다.
6. Metrics-server & kwatch & botkube
A. [이론] metrics-server 이란?
kubelet으로 수집한 리소스 메트릭을 수집 및 집계하는 클러스터 애드온 구성요소
cAdvisor: 에서 컨테이너 메트릭을 수집함
B. [실습] Metrics-server 확인
목적: 메트릭 서버로 k8s 노드와 파드의트릭을 확인
실험 설정:
메트릭 서버 배포
노드 메트릭 확인
파드 메트릭 확인
실험 결과:
C. [실습] Kwatch 소개
목적: Kwatch를 사용해 discord에 웹훅을 날리는 것을 확인
실험 설정:
kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.8.5/deploy/deploy.yaml
실험 결과:
해당 웹훅이 나가질 않는다;;
설정은 잘 해준것을 확인했는데 웹훅의 재설정이 필요해 보인다.
7. 프로메테우스-스택
A. [이론] 프로메테우스 소개
프로메테우스는 Time Series Database로 metric의 이름과 key value 값으로 pair들로 매칭이 된다.
PromQL 은 flexible Query Language로 해당 메트릭을 가져올 수 있다. (Pull 방식 )
B. [실습] 프로메테우스 설치
목적: CSI 드라이버를 설치하고 실제 스토리지 클래스를 생성하는것을 확인
실험 설정:
모니터링 네임 스페이스 생성
helm repo 추가
배포 진행
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
실험 결과:
배포된 것을 확인 가능합니다.
yaml 파일에서 ingress 에대해서 80 포트를 443 포트로 redirect 시켜놨습니다.
ELB의 갯수는 한개로 프로메테우스와 그라파나 두개가 동일한 ALB를 LoadBalancerName을 통해서 공유하게끔 설정 가능합니다. URL 기반 라우팅을 하게됨
Scheduler와 컨트롤러 매니저는 데이터가 수집이 되지 않는데 그 이유는 컨트롤러 노드들은 EKS에 의해서 관리되고 있기 떄문입니다.
B. [실습] AWS CNI Metrics 수집을 위한 사전 설정
목적: CNI Metrics 수집 확
실험 설정:
AWS CNI Metrics 수집을 위해서 설정
실험 결과:
curl -s $N1:61678/metrics | grep '^awscni'
메트릭 수집 되는 것을 확인
프로메테우스에서도 정상적으로 수집하는 것을 확인
C. [이론] 프로메테우스 기본 사용
쿼리 입력옵션
프로메테우스 설정
프로메테우스 설정 Flags
프로메테우스 확인
D. [실습] 쿼리: node-exporter, kube-state-metrics, kube-proxy
목적: 쿼리 그래프 생성 및 확인
실험 설정:
node_memory_Active_bytes
를 Query로 입력했을때 생기는 그래프 확인
kube_deployment_status_replicas_available{deployment="coredns"}
를 query로 입력했을때 생기는 그래프 확인
실험 결과:
E. [실습] 애플리케이션 모니터링 설정
목적: 타겟을 추가 할 때 설정 방법 확인
실험 설정:
nginx 배포 - 다음 코드로 서비스 모니터 방식으로 nginx를 모니터하겠다는 것을 명시
주요 config 적용 필요 시 reloader 동작한것을 확
실험 결과:
nginx 가 메트릭으로 나온것을 확인
F. [실습] PromQL
목적: PromQL을 사용해 원하는 메트릭 생성
배경 지식:
게이지: 특정 시점의 값을 표현하기 위한 현재 시점의 값
카운터: 누적된 값을 표현 증가시 구간별 추세 확인
서머리: 구간 내에 있는 메트릭 빈도, 중앙 값
히스토그램: 메트릭 값 빈도 측정
실험 설정:
Aggregation Operator 연산자 생성
Binary Operator 연산자 생성
정규 표현식 생성
실험 결과:
정상적 표기 확인
8. Grafana
A. [이론] Grafana 소개
TSDB 데이터를 시각화 해주는 툴
데이터는 저장하지 않음
프로메테우스와 연결해서 사용
Search: 대시보드 검색
Starred: 즐겨찾기
Dashboard: 대시보드 전체 목록
Explore: 쿼리언어 이용해 메트릭 정보 그래프로 탐색
Alerting: 경고
Connection: 설정
Administrator: 사용자, 조직, 플러그인 설
B. [실습] 대시보드 사용
목적: CSI 드라이버를 설치하고 실제 스토리지 클래스를 생성하는것을 확인
실험 설정:
기본 대시보드 확인
공식대시보드 가져오기
15757 Import해서 Prometheus에서 데이터를 들고온다.
Node Exporter for Prometheus Dashboard 15172
CPU나 리소스들을 색깔로 표기해줘서 간편하게 모니터링 할 수 있다.
실험 결과:
9. Grafana Alert
A. Grafana Alert
B. [실습] Alert 설정하기기
목적: CSI 드라이버를 설치하고 실제 스토리지 클래스를 생성하는것을 확인
실험 설정:
RULE 생성
컨택트 포인트 생성
실험 결과:
여기도 실행이 되지 않았다.
원인 분석이 필요해보인다.
15. 느낀점/배운점
내가 배워봤던 툴들중에 제일 멋있었다.
현업에서 사용하기위해서 간단한 데모를 만들어봐야겠다.
Last updated