들어가며
이번주 스터디에서는 kOps Cluster (Kubernetes Cluster)의 node들의 매트릭을 수집하는 방법에 대하여 학습했다. kOps 클러스터에 매트릭 서버를 설치한 다음 각 노드들의 Kubelet에 존재하는 cAdvisor가 수집한 데이터를 Prometheus에 단일 차트화 한 다음 Grafana를 통해 시각화를 하는 방법에 대해 알 수 있었다.
스터디 내용에 앞서 간략하게 두 OSS (Open Source Software)에 대해 알아보자.
Prometheus
Prometheus는 이벤트 모니터링과 경고에 사용되는 무료 소프트웨어 애플리케이션 툴이다. 유연한 쿼리와 실시간 경고 기능이 있으며 시계열 데이터베이스에 실시간 매트릭을 기록한다. CNCF Graduated 프로젝트다.
출처 - 링크
Prometheus의 특징은 다음과 같다.
- 프로메테우스 사운드 클라우드에서 개발하다가 오픈소스로 공개되어 지금까지 발전했다.
- 시간대 발생한 데이터들 → 시계열 데이터 → 매트릭을 그래프형태로 볼 수 있게 제공한다.
- PromQL을 통해 유연하게 정보를 조회할 수 있다.
- HTTP Pull 방식으로 데이터를 가져온다. 모니터링 서버가 원할 때만 데이터를 가져갈 수 있게 해 주기 때문에 중앙 서버의 유연성을 유리하게 가져갈 수 있다.
- Service Discovery를 제공하여 자동으로 매트릭 요소들을 발견하여 타겟 요소로 관리한다.
Grafana
데이터 저장 위치에 관계없이 데이터를 질의하고, 시각화 및 경고를 통해 데이터를 이해할 수 있게 하는 시각화 툴이다. Grafana는 저장소에 관계없이 데이터를 통합하여 단일 창으로 시각화한다. 또한 데이터를 권한이 있는 조직의 모든 사람들이 액세스 할 수 있게끔 구성할 수 있으며, 동적인 대시보드를 만들 수 있고 커스터마이즈가 가능하다.
실습환경 구성
이번 실습환경은 c5.2xlarge 서버 3대로 클러스터를 구성했다. (Leader Node, Follow Node)
kOps 클러스터를 구성한 후 certManager, awsLoadBalancerController, externalDns, metricsServer를 설치한다. 또한 메트릭 수집이 가능하도록 spec.kubeProxy.metricsBindAddress를 0.0.0.0으로 설정한다.
kubernetes Cluster 환경의 메트릭 수집 흐름은 다음과 같다.
- cAdvisor: kubelet에 포함된 컨테이너 메트릭을 수집, 집계, 노출하는 데몬
- kubelet: 컨테이너 리소스 관리를 위한 노드 에이전트. 리소스 메트릭은 kubelet API 엔드포인트 /metrics/resource 및 /stats를 사용하여 접근 가능하다.
- 요약 API: /stats 엔드포인트를 통해 사용할 수 있는 노드 별 요약된 정보를 탐색 및 수집할 수 있도록 kubelet이 제공하는 API
- metrics-server: 각 kubelet으로부터 수집한 리소스 메트릭을 수집 및 집계하는 클러스터 애드온 구성 요소. API 서버는 HPA, VPA 및 kubectl top 명령어가 사용할 수 있도록 메트릭 API를 제공한다. metrics-server는 메트릭 API에 대한 기준 구현(reference implementation) 중 하나이다. 또한 API의 HPA를 이용해 노드의 상태 정보를 통해 오토스케일링 솔루션과 연동하여 스케일링 기준을 잡을 수 있다고 한다.
- 메트릭 API: 워크로드 오토스케일링에 사용되는 CPU 및 메모리 정보로의 접근을 지원하는 쿠버네티스 API. 이를 클러스터에서 사용하려면, 메트릭 API를 제공하는 API 확장(extension) 서버가 필요하다.
출처 - 링크
프로메테우스 실습 내용
Prometheus를 실습 하기 위해 kube-prometheus-stack을 이용했다.
kube-prometheus-stack은 Prometheus와 Grafana, Alert Manager를 한 번에 설치하여 사용할 수 있는 환경을 제공한다.
설치 방법은 다음과 같다.
# 설치
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 파라미터 파일 생성
$KOPS_CLUSTER_NAME = "클러스터 이름"
$CERT_ARN = "인증서 정보"
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:
serviceMonitorSelectorNilUsesHelmValues: false
retention: 5d
retentionSize: "10GiB"
EOT
# 파라메터 파일을 이용한 배포
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.0.0 -f monitor-values.yaml --namespace monitoring
Prometheus가 정상적으로 설치 되면 다음과 같이 매트릭 정보를 확인할 수 있다.
ssh -i ~/.ssh/id_rsa ubuntu@api.$KOPS_CLUSTER_NAME lynx -dump localhost:9100/metrics
Prometheus에 접속하면 다음과 같은 초기화면을 확인할 수 있다.
Prometheus에 접속하면 다음과 같은 초기화면을 확인할 수 있다.
매트릭 정보를 조회하기 위해 PromQL을 사용할 수 있다. 다음의 PromQL의 의미는 전체 클러스터 노드의 CPU 사용량의 합계이다.
1- avg(rate(node_cpu_seconds_total{mode="idle"}[1m]))
그라파나 실습 내용
TSDB (Time-series Database) 데이터를 시각화 하는 툴이다.
데이터 자체를 저장하지 않기 때문에 Configuration > Data sources를 통해 시각화할 데이터를 연결해야 한다.
스택형태로 설치할 경우 데이터 소스가 kube-prometheus-stack을 통해 자동으로 설치되어 있다.
다음의 명령어를 통해서 서비스의 주소를 확인할 수 있다.
kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus
테스트로 Pod를 생성 후 Pod에 접속하여 데이터 소스로 접근하는지 여부를 확인해 보았다.
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
app: pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
app: pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
다시 그라파나로 넘어와 공식 대시보드를 통해 수집되는 쿠버네티스 컴퓨팅 리소스를 확인해 볼 수 있었다.
대시보드 선택 방법은 다음과 같다.
(그라파나 랩 접속 > 원하는 대시보드 검색 > 대시보드 아이디 복사 > 대시보드 Import 페이지에 접속 > ID 입력)
kube-state-metrics-v2 설치
5주차 과제
1. 프로메테우스-스택 설치 후 ‘공식 or 여러 가지 대시보드’를 추가해 보시고, 관련 스샷 올려주세요
Grafana dashboards를 추천해 주는 사이트를 통해 괜찮은 대시보드를 찾아보고 실습해 보았다.
출처 - 링크
2. Nginx 파드를 배포 후 관련 metric를 프로메테우스 웹에서 확인하고, 그라파나에 nginx 웹서버 대시보드를 추가 후 확인하시고, 관련 스샷 올려주세요
# 사이드카 컨테이너를 함께 설치한다.
cat <<EOT > ~/nginx-values.yaml
metrics:
enabled: true
service:
port: 9113
serviceMonitor:
enabled: true
namespace: monitoring
interval: 10s
EOT
좋았던 점
Helm 기반의 kube-prometheus-stack을 통해 Kubernetes Monitoring 환경을 정말 간편하게 구축할 수 있었다. (예제의 환경설정 역시 큰 도움이 되었다.) Grafana Lab에서 지원하는 여러 대시보드들을 통해 손쉽게 모니터링 환경을 구성할 수 있었다. 회사에서는 이러한 구축의 불편함 때문에 Datadog를 사용하고 있었는데, 시간을 두고 함께 사용해 보는 것 도 괜찮을 것 같다.
힘들었던 점
이번주는 친절한 가이드 덕분에 따로 힘든 부분은 없었던 것 같다.
마치며
이번 글에서는 쿠버네티스 실무 실습 스터디 5주 차에 진행한 내용을 정리했다.
다른 주들에 비해 비교적 실습환경을 구축하기 수월했다. (Got Helm!) 그리고 몆 주간 S3, Route53, LB, Certification Manager, CloudFormation 등과 같은 서비스를 지속적으로 사용하다 보니 AWS 환경에 많이 익숙해 진 나를 발견하게 되었다. 스터디는 일주일에 2시간이었지만, 거의 3~4일 정도는 과제와 복습을 하며 계속 사용해본 덕인 것 같다. 다음 스터디도 열심히 참석해야겠다.
'클라우드 컴퓨팅 & NoSQL > [PKOS] 쿠버네티스 실무 실습 스터디' 카테고리의 다른 글
[7주차] PKOS 쿠버네티스 실무 실습 스터디 (23.02.26) (7) | 2023.03.05 |
---|---|
[6주차] PKOS 쿠버네티스 실무 실습 스터디 (23.02.19) (1) | 2023.02.26 |
[4주차] PKOS 쿠버네티스 실무 실습 스터디 (23.02.04) (0) | 2023.02.11 |
[3주차] PKOS 쿠버네티스 실무 실습 스터디 (23.01.29) (0) | 2023.02.04 |
[2주차] PKOS 쿠버네티스 실무 실습 스터디 (23.01.15) (0) | 2023.01.29 |