brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Mar 27. 2023

쿠버4탄-5. K8S-프로메테우스 Prometheus

5/11

본 내용은 CloudNet 에서 진행하는 주말 스터디에 참여하여 해당 내용을 참고로 작성되었습니다.
https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863  



목표

모니터링, 로깅, 알람을 알아보자

프로메테우스, 그라파나를 알아보자


프로메테우스

이름은 '먼저 보는/생각하는 사람'이라는 의미이다. 

접두사인 'Pro-(먼저, 앞서)'는 다른 단어에도 많이 쓰인다



<1> 쿠버네티스 준비

<2> 메트릭 서버 사용

<3> k9 모니터링 설치

<4> 프로메테우스 Prometheus

<5> 정리




<1> 쿠버네티스 준비


1

AWS 콘솔 로그인후 '새탭'에서 열기하여 새로운 창을 띠우자.

사용하다보면 편하다.



2

네트워크와 쿠버네티스 설치를 위한 준비 ?


ec2 키페어 -topasvga22-ec2

access-key 

secret key

ClusterBaseName  도메인명 입력  masterseo1.link

S3StateStore = s3 버킷  seo2-pkos-kops-s3-mybucket

필요 사양 - kops 인스턴스 t3.small & 노드=  c5a.2xlarge


CloudFormation으로 한번에 구축해보자.

콘솔에서 사용

oneclick



or


3

# YAML 파일 다운로드

curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/kops-oneclick-f1.yaml



4

콘솔로 배포

Cloudformation으로 가기

스택생성

S3 URL입력 또는 다운로드 받은 템플릿 파일 업로드

여기서는 템플릿 파일 업로드를 한다.

mykops


5

ec2 가서 node까지 생성되는지 확인 (10분 대기)



6

ec2 > 연결에서 명령어 실행


(masterseo1:N/A) [root@kops-ec2 ~]# kubectl get nodes

NAME                  STATUS   ROLES           AGE     VERSION

i-001ed34c9b5d8b9ab   Ready    node            3m26s   v1.24.12

i-0481e4dc12b99e9ae   Ready    control-plane   5m39s   v1.24.12

i-0b7979aade0ab9887   Ready    node            3m14s   v1.24.12



또는



7

Cli로 배포


# CloudFormation 스택 배포 : 노드 인스턴스 타입 변경 - MasterNodeInstanceType=t3.medium WorkerNodeInstanceType=c5d.large

aws cloudformation deploy --template-file kops-oneclick-f1.yaml --stack-name mykops --parameter-overrides KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32  MyIamUserAccessKeyID=AKIA5... MyIamUserSecretAccessKey='CVNa2...' ClusterBaseName='gasida.link' S3StateStore='gasida-k8s-s3' MasterNodeInstanceType=c5a.2xlarge WorkerNodeInstanceType=c5a.2xlarge --region ap-northeast-2


# CloudFormation 스택 배포 완료 후 kOps EC2 IP 출력

aws cloudformation describe-stacks --stack-name mykops --query 'Stacks[*].Outputs[0].OutputValue' --output text


# 13분 후 작업 SSH 접속

ssh -i ~/.ssh/kp-gasida.pem ec2-user@$(aws cloudformation describe-stacks --stack-name mykops --query 'Stacks[*].Outputs[0].OutputValue' --output text)



8

로드 밸랜선 컨트롤러를 사용할 예정이다.


# EC2 instance profiles 에 IAM Policy 추가(attach) : 처음 입력 시 적용이 잘 안될 경우 다시 한번 더 입력 하자! - IAM Role에서 새로고침 먼저 확인!


aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --role-name masters.$KOPS_CLUSTER_NAME


aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --role-name nodes.$KOPS_CLUSTER_NAME





<2> 메트릭 서버 사용


1

Metrics-server 확인 : kubelet으로부터 수집한 리소스 메트릭을 수집 및 집계하는 클러스터 애드온 구성 요소

cAdvisor : kubelet에 포함된 컨테이너 메트릭을 수집, 집계, 노출하는 데몬



그림 출처

https://kubernetes.io/ko/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/



2

(masterseo1:N/A) [root@kops-ec2 ~]# kubectl ns default

Context "masterseo1.link" modified.

Active namespace is "default".




3

# 메트릭 서버 확인


kops addon에 매트릭 서버를 미리 설치 했다.


(masterseo1:default) [root@kops-ec2 ~]# more addon.yaml

  certManager:

    enabled: true

  awsLoadBalancerController:

    enabled: true

  externalDns:

    provider: external-dns

  metricsServer:

    enabled: true



4

 메트릭은 15초 간격으로 cAdvisor를 통하여 가져옴

kubectl get pod -n kube-system -l k8s-app=metrics-server


(masterseo1:default) [root@kops-ec2 ~]# kubectl get pod -n kube-system -l k8s-app=metrics-server

NAME                              READY   STATUS    RESTARTS   AGE

metrics-server-5f65d889cd-9kg4j   1/1     Running   0          46m

metrics-server-5f65d889cd-khp88   1/1     Running   0          46m



kubectl get apiservices |egrep '(AVAILABLE|metrics)'

(masterseo1:default) [root@kops-ec2 ~]# kubectl get apiservices |egrep '(AVAILABLE|metrics)'

NAME                                   SERVICE                      AVAILABLE   AGE

v1beta1.metrics.k8s.io                 kube-system/metrics-server   True        46m



5

Cpu, 메모리  top으로 사용하고 있는 서버  정보 확인

# 노드 메트릭 확인

kubectl top node


(masterseo1:default) [root@kops-ec2 ~]# kubectl top node

NAME                  CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   

i-001ed34c9b5d8b9ab   35m          0%     1029Mi          6%        

i-0481e4dc12b99e9ae   155m         7%     2045Mi          54%       

i-0b7979aade0ab9887   28m          0%     985Mi           6%



6

# 파드 메트릭 확인

kubectl top pod -A


cpu , 메모리로 정열해서 보기

kubectl top pod -n kube-system --sort-by='cpu'

kubectl top pod -n kube-system --sort-by='memory'




<3> k9 모니터링 설치


https://k9scli.io/

24단계 실습으로 정복하는 쿠버네티스 책 참고  292~298페이지




<4> 프로메테우스 Prometheus


1

소개 

모니터링과 알림을 제공하는 오픈소스.

Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud



2

PromQL로  쿼리가 가능하다.

수집은 Pull 방식 이다.

Pull 방식은 모니터링 서버가 데이터를 에이전트에게 접근하여 가져오는 것입니다.

Pull방식 장점

서비스 디스커버리를 지원한다.

보통 그라파나로  시각화한다.



3

구성도

이미지 출처 : https://prometheus.io/docs/introduction/overview/



4

설치와 사용 순서 ?

프로메테우스-스택으로 설치 해보자.

모니터링에 필요한 여러 요소를 단일 차트(스택)으로 제공 

시각화(그라파나)도 포함, 이벤트 메시지 정책(경고 임계값, 경고 수준) 등



5

# 다른 터미널로 모니터링

kubectl create ns monitoring

watch kubectl get pod,pvc,svc,ingress -n monitoring



6

HTTPS로 웹 화면 접근을 해서 인증서 확인 한다.


# 사용 리전의 인증서 ARN 확인

CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`

echo "alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN"



7

# 설치

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts


8

# 파라미터 파일 생성

cat <<EOT > ~/monitor-values.yaml

alertmanager:

  ingress:

    enabled: true

    ingressClassName: alb


    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/group.name: "monitoring"


    hosts:

      - alertmanager.$KOPS_CLUSTER_NAME


    paths:

      - /*


grafana:

  defaultDashboardsTimezone: Asia/Seoul

  adminPassword: prom-operator


  ingress:

    enabled: true

    ingressClassName: alb


    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/group.name: "monitoring"


    hosts:

      - grafana.$KOPS_CLUSTER_NAME


    paths:

      - /*


prometheus:

  ingress:

    enabled: true

    ingressClassName: alb


    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/group.name: "monitoring"


    hosts:

      - prometheus.$KOPS_CLUSTER_NAME


    paths:

      - /*


  prometheusSpec:

    podMonitorSelectorNilUsesHelmValues: false

    serviceMonitorSelectorNilUsesHelmValues: false

    retention: 5d

    retentionSize: "10GiB"

EOT




변수 값들 입력 되었는지 확인한다.

ec2 ~]# cat monitor-values.yaml |yh



9

# 배포

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.7.1 --set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' -f monitor-values.yaml --namespace monitoring


( --set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s'  내용 추가함)



# 확인

## 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 -n monitoring

kubectl get-all -n monitoring

kubectl get prometheus,alertmanager -n monitoring

kubectl get prometheusrule -n monitoring

kubectl get servicemonitors -n monitoring

kubectl get crd | grep monitoring



10

Pod들 확인

k get pods -n monitoring


(masterseo1:default) [root@kops-ec2 ~]# k get pods -n monitoring

NAME                                                        READY   STATUS    RESTARTS        AGE

alertmanager-kube-prometheus-stack-alertmanager-0         2/2     Running   1 (5m25s ago) 

kube-prometheus-stack-grafana-56d8cc744f-l9zl2              3/3     Running   0 

kube-prometheus-stack-kube-state-metrics-7c44b8c9c4-mcmm7   1/1     Running   0 

kube-prometheus-stack-operator-75b7b9747d-7m6k9             1/1     Running   0 

kube-prometheus-stack-prometheus-node-exporter-8vf5g        1/1     Running   0 

kube-prometheus-stack-prometheus-node-exporter-c4x8x        1/1     Running   0 

kube-prometheus-stack-prometheus-node-exporter-qp7bk        1/1     Running   0 

prometheus-kube-prometheus-stack-prometheus-0               2/2     Running   0 






11

삭제

# helm 삭제

helm uninstall -n monitoring kube-prometheus-stack


# crd 삭제

kubectl delete crd alertmanagerconfigs.monitoring.coreos.com

kubectl delete crd alertmanagers.monitoring.coreos.com

kubectl delete crd podmonitors.monitoring.coreos.com

kubectl delete crd probes.monitoring.coreos.com

kubectl delete crd prometheuses.monitoring.coreos.com

kubectl delete crd prometheusrules.monitoring.coreos.com

kubectl delete crd servicemonitors.monitoring.coreos.com

kubectl delete crd thanosrulers.monitoring.coreos.com




12

프로메테우스 기본 사용 : 모니터링 그래프


# 아래 처럼 프로메테우스가 각 서비스의 9100 접속하여 메트릭 정보를 수집

kubectl get node -owide

kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus-node-exporter


(masterseo1:default) [root@kops-ec2 ~]# kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus-node-exporter

NAME                                                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE

service/kube-prometheus-stack-prometheus-node-exporter   ClusterIP   100.64.182.6   <none>        9100/TCP   13h

NAME                                                       ENDPOINTS                                                 AGE

endpoints/kube-prometheus-stack-prometheus-node-exporter   172.30.41.170:9100,172.30.51.179:9100,172.30.70.45:9100   13h



13

# 마스터노드에 lynx 설치

ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME hostname


ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME sudo apt install lynx -y


# 노드의 9100번의 /metrics 접속 시 다양한 메트릭 정보를 확인할수 있음

 : 마스터 이외에 워커노드도 확인 가능

ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME lynx -dump localhost:9100/metrics

// 다양한 메트릭 정보를 가져온다.


14

프로메테우스 ingress 도메인으로 웹 접속


# ingress 확인

kubectl get ingress -n monitoring kube-prometheus-stack-prometheus

kubectl describe ingress -n monitoring kube-prometheus-stack-prometheus



15

# 프로메테우스 ingress 도메인으로 웹 접속

echo -e "Prometheus Web URL = https://prometheus.$KOPS_CLUSTER_NAME"

-------------

Prometheus Web URL = https://prometheus.masterseo1.link



16

오른쪽 지구본 클릭하면 수집하는 정보를 확인할수 있다.

수집정보를 선택하고 실행해 보자.


17

# 웹 상단 주요 메뉴 설명

1. 경고(Alert) : 사전에 정의한 시스템 경고 정책(Prometheus Rules)에 대한 상황

2. 그래프(Graph) : 프로메테우스 자체 검색 언어 PromQL을 이용하여 메트릭 정보를 조회 -> 단순한 그래프 형태 조회

3. 상태(Status) : 경고 메시지 정책(Rules), 모니터링 대상(Targets) 등 다양한 프로메테우스 설정 내역을 확인 > 버전(2.42.0)

4. 도움말(Help)



18

Prometheus server는 exporter를 통해 pull방식으로 수집정보를 가져 온다.  

exporters로 메트릭 수집을 위해 준비를 해놓는다.

Prometheus 의 Status 항목 메뉴들을 클릭해서 보자.





19

  kubeProxy 정보는 기본적으로 가져오지 못하지만 0.0.0.0 으로 변경하여 가져오도록 함.


(masterseo1:default) [root@kops-ec2 ~]# cat addon.yaml

  certManager:

    enabled: true

  awsLoadBalancerController:

    enabled: true

  externalDns:

    provider: external-dns

  metricsServer:

    enabled: true

  kubeProxy:

    metricsBindAddress: 0.0.0.0

  kubeDNS:

    provider: CoreDNS

    nodeLocalDNS:

      enabled: true

      memoryRequest: 5Mi

      cpuRequest: 25m




<5>  예제)  전체 cpu의 총합을 보자.


1

PromQL 쿼리 - 책을 보자.


2

그래프

메트릭을 그래프(Graph)로 조회 : Graph - 아래 PromQL 쿼리(전체 클러스터 노드의 CPU 사용량 합계)입력 후 조회 → Graph 확인

 지구 아이콘(Metrics Explorer) 클릭 시 전체 메트릭 출력되며, 해당 메트릭 클릭해서 확인

1- avg(rate(node_cpu_seconds_total{mode="idle"}[1m]))










<6> 정리


프로메테우스 구축



다음과정

https://brunch.co.kr/@topasvga/3140




https://brunch.co.kr/@topasvga/3144


감사합니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari