글에 중간 중간에 첨부된 다이어그램은 스터디에서 사용하는 다이어그램을 캡처하였습니다.
쿠버네티스에서 기본적인 메트릭 집합을 지원한다. 메트릭 파드를 설치하면 사용자는 간단하게
kubectl top
명령어로 현재 노드와 파드의 CPU, 메모리 사용량을 확인 할 수 있다.
# 공식 설치 가이드
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl top pod --sort-by memory # 메모리 사용량 순서
kubectl top pods --help 로 확인
메트릭 서버는 사용자의 kubectl top 명령어를 API 서버에서 전달받아 개별 노드에 실행 중인 kubelet의 cAdvisor에 전달해서 현재 파드와 노드의 자원 사용량을 가져온다.
cAdvisor(Container Advisor)는 컨테이너와 노드의 CPU, 메모리, 네트워크, 파일 등에 대한 다양한 자원 사용량을 백그라운드에서 자동 수집한다.
쿠버네티스 환경은 모니터링 측면에서 기존의 가상 머신이나 베어메탈 환경과 어떻게 다른가?
쿠버네티스 환경의 모니터링 대상은?
쿠버네티스 모니터링 솔루션으로는 프로메테우스 등과 같은 오픈소스 솔루션과 데이터독, 뉴렐릭, 와탭 등 상용 솔루션으로 분류 할 수 있음.
-> 프로메테우스는 사실상의 쿠버네티스 환경의 모니터링 표준
( 뭐든 표준 따라가는게 좋다 git 브런치 전략이던 컨테이너 환경 이던.. )
프로메테우스 스택은 프로메테우스와 관련해서 모니터링에 필요한 여러 요소를 함께 제공하는 것을 의미
헬름 설치하려고 보니 이전에 설치했다고 뜬다. 언제 깔았지 🧐
# 파라미터 파일 생성
# 가시다님이 삽질 하지 않게 고대로 복붙 하라고 만들어주셨다. 우하하
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
생성한 monitor-values.yaml 토대로 helm 설치.
네임스페이스는 monitoring으로 명명한다.
참고로 운영 환경에서는 resource requests/limits 등의 추가 설정이 필요하다고 한다.
# 배포
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
몇 초 뒤 설치 완료
새삼 다시 느끼는것이지만 helm 차트는 참 좋은 서비스 인 것 같다.
푸시 게이트웨이를 통해 측정항목을 스크랩 -> 이러쿵 저러쿵 해서 PromQL로 시각화 데이터를 보여주고 Push Alert로 알림을 보내준다
로컬로 임시 확인
프로메테우스 플랫폼을 포함한 대부분의 모니터링 시스템은 기본 설정으로 웹서버의 /metrics 엔드포인트 경로에 노출(expose) 한다. 프로메테우스는 노드 익스포터의 서비스 이름과 9100 포트를 사용해 접속한다.
port-forward 명령어를 사용하면 NodePort, LoadBalancer, Ingress 등으로 지정하지 않은 ClusterIP 타입의 서비스를 임시로 외부에서 접속하는 경우 사용할 수 있다.
# 마스터노드에 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
lyns란 웹 내용을 콘솔로 찍어주는 것
# configmap 생성
apiVersion: v1
kind: Namespace
metadata:
name: kwatch
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kwatch
namespace: kwatch
data:
config.yaml: |
alert:
slack:
webhook: '슬랙 웹훅 url'
#title:
#text:
pvcMonitor:
enabled: true
interval: 5
threshold: 70
# 잘못된 이미지 정보의 파드 배포
kubectl apply -f https://raw.githubusercontent.com/junghoon2/kube-books/main/ch05/nginx-error-pod.yml
kubectl get events -w
이미지를 배포하자마자 발생된 경고
-------
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: nginx
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
모니터링이 실무에서 가장 중요한 서비스가 아닐까 생각이 든다.
모니터링 서비스를 내 손으로 구축해본 좋은 경험이였다.