5/11
모니터링, 로깅, 알람을 알아보자
프로메테우스, 그라파나를 알아보자
이름은 '먼저 보는/생각하는 사람'이라는 의미이다.
접두사인 'Pro-(먼저, 앞서)'는 다른 단어에도 많이 쓰인다
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으로 한번에 구축해보자.
콘솔에서 사용
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
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'
24단계 실습으로 정복하는 쿠버네티스 책 참고 292~298페이지
1
소개
모니터링과 알림을 제공하는 오픈소스.
Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud
2
PromQL로 쿼리가 가능하다.
수집은 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
1
PromQL 쿼리 - 책을 보자.
2
그래프
메트릭을 그래프(Graph)로 조회 : Graph - 아래 PromQL 쿼리(전체 클러스터 노드의 CPU 사용량 합계)입력 후 조회 → Graph 확인
지구 아이콘(Metrics Explorer) 클릭 시 전체 메트릭 출력되며, 해당 메트릭 클릭해서 확인
1- avg(rate(node_cpu_seconds_total{mode="idle"}[1m]))
프로메테우스 구축
다음과정
https://brunch.co.kr/@topasvga/3140
https://brunch.co.kr/@topasvga/3144
감사합니다.