이전 학습에서 Prometheus🔥를 통해서 매트릭을 수집하고, Prometheus에서 제공하는 기본 Graph📊를 살펴보았다.
하지만, 더욱 가시성 있고, 보기좋게 대시보드를 내 마음대로 구축할 수는 없을까?
바로 그라파나☀️를 사용해서 이를 구축할 수 있다!
그라파나의 정보를 확인하고, 그라파나의 기본 대시보드를 확인한뒤, 이후 대시보드를 내 입맛대로 만들어보자.
// 그라파나 버전 확인
kubectl exec -it -n monitoring deploy/kube-prometheus-stack-grafana -- grafana-cli --version
// 그라파나 ingress 확인
kubectl get ingress -n monitoring kube-prometheus-stack-grafana
버전을 확인하니 9.5.1 버전이 설치되어 있는 것을 확인할 수 있다. 이제 ingress로 노출한 그라파나에 접속해 보도록 하자.
ingress 도메인으로 웹 접속 시, 기본 계정은 다음과 같다.
ID : admin
PW : prom-operator
다음과 같이 그라파나에 접속할 수 있다.
각 三
을 눌렀을 때 나오는 메뉴의 의미는 다음과 같다.
Starred
: 즐겨 찾기 대시보드Dashboards
: 대시보드 목록 확인Explore
: PromQL로 메트릭 정보를 그래프 형태로 표현Alerting
: 경고 정책을 구성해 사용자에게 경고를 전달Connections
: 연결할 데이터 소스 설정 (Prometheus🔥)Administration
: 사용자, 조직, 플러그인 등을 설정
Connections 메뉴에서 Your connections에 진입하면 데이터 소스에 프로메테우스가 자동으로 생성된 것이 나타난다.
대상 데이터(프로메테우스) 소스를 클릭하면 상세 정보를 확인할 수 있다.
여기서 나온 이 주소(FQDN)는 무엇일까?
// 프로메테우스의 서비스와 엔드포인트 주소 확인
kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus
프로메테우스의 서비스 이름을 확인해 보니 동일한 이름을 가지는 것을 확인할 수 있다. 여기서 뒤에 monitoring
은 네임스페이스를 나타낸다.
즉, 그라파나에서 데이터 소스로 지정한 대상의 주소는 프로메테우스의 서비스 주소임을 알 수 있다.
정말 그런 것인지 확인해 보도록 하자.🤔
먼저 아래와 같은 테스트용 파드를 배포한다.
// 테스트용 파드 배포
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: netshoot-pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
// 생성된 파드 확인
kubectl get pod netshoot-pod
이제 테스트용 파드를 통해서 프로메테우스 주소로 /graph
를 요청해보자.
// 프로메테우스 접속 주소로 그래프 경로 접근
kubectl exec -it netshoot-pod -- curl -s kube-prometheus-stack-prometheus.monitoring:9090/graph -v ;
실제로 그래프와 관련된 응답이 반환되는 것으로 보아, 실제 프로메테우스의 서비스 주소가 맞다는 것을 알 수 있다.
프로메테우스 스택을 통해서 설치된 그라파나에는 기본 대시보드들이 있다. 이를 사용해 보도록하자.
Dashboards 메뉴에 진입해서 general
폴더를 누르면 그라파나가 기본으로 제공하는 대시보드🪟를 확인할 수 있다.
아래처럼 원하는 대시보드를 선택할 수 있다. 👇
Kubernetes / Persistent Volumes 선택
Node Exporter / Nodes 선택
기본 대시보드가 아닌 다른 대시보드를 추가하고 싶다면?😏
Grafana 사용자들이 직접 만든 공식 대시보드를 사용할 수 있다!
마음에 드는 대시보드를 찾았다면 추가해되지 않겠는가?
먼저 마음에 드는 대시보드의 ID를 복사 한 뒤, 다음 과정을 통해서 추가할 수 있다.
Dashboard » New » Import » ID 입력 » Load » Prometheus » Import
아이디를 복사하고 Load
버튼을 눌러 불러오자.
대시보드 이름과 폴더는 기본으로 두고, 이러한 대시보드에 연결할
Connections
즉, 연결할 데이터 소스(Prometheus🔥)를 설정해준다.
Import
를 눌러 마무리하면, 이렇게 이쁘장한 대시보드를 만들 수 있다!🌻
💡TIP! 추천 공식 대시보드
Kubernetes / Views / Global
: 15757Kubernetes All-in-one Cluster Monitoring KR
: 13770 or 17900Node Exporter Full
: 1860Node Exporter for Prometheus Dashboard based on 11074
: 15172kube-state-metrics-v2
: 13332
이번에는 노드에 관련된 메트릭을 수집하는 것이 아닌 애플리케이션에 대한 메트릭을 수집해 보도록 하자.
Nginx 웹 서버를 배포하고, 이를 프로메테우스로 로그를 수집한 뒤 그라파나로 시각회 해볼 것이다.
// helm repository 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
// 도메인 변수 선언
MyDomain=<자신의 도메인>
// ARN 변수 선언
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`; echo $CERT_ARN
// nginx 파라미터 파일 생성
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'
metrics:
enabled: true
service:
port: 9113
serviceMonitor:
enabled: true
namespace: monitoring
interval: 10s
EOT
cat nginx-values.yaml | yh
// nginx 배포
helm install nginx bitnami/nginx --version 14.1.0 -f nginx-values.yaml
// 파드, 서비스, 엔드포인트 확인
kubectl get pod,svc,ep
// 서비스 모니터 확인
kubectl get servicemonitor -n monitoring
// nginx 서비스 모니터 확인
kubectl get servicemonitor nginx -n monitoring -o yaml | yh
// 파드, 서비스, 엔드포인트 확인
kubectl get pod,svc,ep
다음과 같이 servicemonitor가 생성된 것을 확인할 수 있다.
/metrics
경로로 수집한 메트릭을 확인할 수 있다는 의미이다.
/metrics
경로로 접근하여 수집된 메트릭 결과를 확인할 수 있다.
// NGINX IP 변수 선언
NGINXIP=$(kubectl get pod -l app.kubernetes.io/instance=nginx -o jsonpath={.items[0].status.podIP}); echo $NGINXIP
// NGINX IP로 메트릭 확인
curl -s http://$NGINXIP:9113/metrics
// NGINX 접속 중인 연결 수💡nginx_connections_active
curl -s http://$NGINXIP:9113/metrics | grep ^nginx_connections_active
// NGINX 1회 접속
curl -s https://nginx.$MyDomain
// NGINX 1초 간격 접속
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done
// NGINX 서버가 처리 중인 연결 수 💡nginx_connections_active
curl -s http://$NGINXIP:9113/metrics | grep ^nginx_connections_active
접속을 다수 시도한 뒤, 다시 확인해보면 nginx_connections_active
값이 많이 올라있는 것을 확인할 수 있다.
이러한 nginx 서비스는 프로메테우스에서도 확인 가능하다.
Service Discovery에 추가된 모습
이를 통해 자동으로 nginx 서비스를 찾는다.
Target에 추가된 모습
kubectl scale deployment nginx --replicas=2
💻 NGINX 대시보드 : 12708 사용
100회씩 총 1000회 접속 수행을 수행해서 부하를 주고 여떻게 그래프가 변화하는지 관측해보자.
yum install -y httpd
// 100회씩 총 1000회 접속 수행
ab -c 100 -n 1000 https://nginx.$MyDomain/
다음과 같이 서버가 처리중인 접속 즉, active connections
이 폭팔적으로 증가한 것을 확인할 수 있다.