Prometheus, Grafana Loki로 Amazon EKS 모니터링 대시보드 구성하기

강다·2023년 3월 11일
1
post-thumbnail

MSA 프로젝트 시작 후 구성을 이어가면 이어갈 수록 리소스에 대한 관심 없이 관리와 운영을 이어 간다면 안 되겠다고 느꼈다.

그래서, 사용중이던 EKS에서 관측 가능성 확보를 위해 쿠버네티스에서 모니터링과 로깅을 위해 가장 많이 선택한다는 PLG(Prometheus, Loki, Grafana) 스택을 구성해 보았다. (물론 다른 k8s 서비스에서도 동일)

Prometheus

prometheus는 SoundCloud사에서 만든 오픈소스 시스템 모니터링 및 경고 툴킷이다. k8s에서도 프로메테우스를 사용해 메트릭 수집 및 대시보드 구축하는 방법을 장려하고 있어서 사용했다. 다른 모니터링 도구와 다르게, Pull 방식을 사용한다. 따라서, 서버가 각 클라이언트를 알고 있어야 하는게 아니라 서버에 클라이언트가 떠 있으면 서버가 주기적으로 클라이언트에 접속해 데이터를 가져온다.

Grafana Loki

Grafana는 Data Visualization tool로 시각화 프로케테우스에서 부족한 시각화 도구 역할을 채워준다. 그 중에서도 grafana loki를 사용했는데, 이는 Grafana Labs에서 개발한 새로운 중앙 로깅 시스템이다. Grafana를 통한 로그 시각화를 제공하며 kubernetes에서 잘 운영될 수 있는 구조를 갖추었다고 한다. 이미 Elasticsearch가 로깅 부분에서 선점하고 있지만 Loki가 더 쉽고 효율적 운영에 좋다고 한다.
(다음엔 일반적인 로그 수집/활용 조합인 ELK(Elasticsearch, Logstash, Kibana) 조합을 통한 모니터링도 해보고싶다.)


위와 같은 이유로 EKS모니터링을 prometehus + grafana loki조합으로 진행하게 되었다.



0. 환경 구성

💡 helm과 aws cli 설치 및 configure 설정, kubectl 과 eksctl설치는 완료된 상태에서 시작한다고 가정! 또, 원래는 역할 > 정책 > (그룹 >) 사용자 순의 IAM 구성이 필요하나, 진행한 프로젝트에서는 편의상 그룹 내 모든 사용자가 Full Access 권한을 가지고 있었음으로 생략했다. (AdministratorAccess 정책이 연결된 그룹의 사용자)

❓helm이란

: k8s 패키지 관리를 도와주는 패키지 매니저로, yaml 파일의 모음이라고 할 수 있다.

만약, 역할을 생성후 진행해야 한다면

EKS-ControlPlane-Role에 연결 정책

  • AmazonEKSClusterPolicy

EKS-WorkerNode-Role에 연결 정책

  • AmazonEKSWorkerNodePolicy
  • AmazonEC2ContainerRegistryReadOnly
  • AmazonEKS_CNI_Policy



1. eks cluster 생성하기

dh-eks.yaml 파일

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: dh-eks
  region: ap-northeast-2
  version: "1.24"

vpc:
  id: "${VPC_ID}"
  securityGroup: "${SECURITY_GROUP_ID}"
  subnets:
    private:
      private1:
        id: "${SUBNET1_ID}"
      private3:
        id: "${SUBNET2_ID}"

#iam:
# serviceRoleARN: "arn:aws:iam::{계정 ID}:role/EKS-ControlPlane-Role"

nodeGroups:
  - name: eks-node
    instanceType: t2.medium
    minSize: 2
    desiredCapacity: 2
    maxSize: 5
    privateNetworking: true
    ssh:
      allow: true
      publicKeyName: traffic-test
#   iam:
#     instanceRoleARN: "arn:aws:iam::{계정 id}:role/EKS-WorkerNode-Role"
$ eksctl create cluster -f dh-eks.yaml
$ aws eks --region ap-northeast-2 update-kubeconfig --name dh-eks

$ kubectl create ns monitoring



2. EKS CSI Driver 설치(add-on)

참고 : Managing the Amazon EBS CSI driver as an Amazon EKS add-on - Amazon EKS

처음에 CSI Driver의 존재를 모르고 모니터링툴 설정을 했다가 전부 다시 했다.

CSI(Container Storage Interface) : 스토리지 관련 기능을 k8s 코어 기능에서 분리하여 각 vendor 별로 스냅샷, 볼륨 확장 등의 스토리지 부가 기능을 자유롭게 확장할 수 있도록 만든 인터페이스
⇒ EBS CSI driver는 AWS에서 실행되는 K8S 클러스터가 Amazon EFS 파일 시스템의 수명주기를 관리할 수 있게 해주는 CSI 인터페이스를 제공


주의

이 경우도 만약 full access 권한을 가진 user가 아니라면, cluster가 AmazonEBSCSIDriverPolicy 정책을 attach한 IAM 역할을 부여 받아야 한다. (이미 만들어 사용중인 역할에 attach 해주면 됨!)


💡 service account를 만들고 다음으로 snapshot 관련 component를 설치한다. 이게 순서가 중요한데, csi-driver add-on 설치후에 snapshot component를 설치하면 snapshot이 제대로 동작하지 않는다고 한다.
#snapshot 설치
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
#csi-driver add-on 설치
$ eksctl create addon --region ap-northeast-2 --name aws-ebs-csi-driver --cluster dh-eks \
> --service-account-role-arn arn:aws:iam::XXXXXXXXXX:role/EKS-ControlPlane-Role --force



3. Prometheus 설치

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo udpate #repo를 helm에 등록

Default로 설치를 진행하게 되면 emptydir에 Prometheus 데이터를 적재하기 때문에 노드가 삭제되면 데이터도 그대로 날아가게 된다.

이런 난감한 상황을 방지하려면 Prometheus가 Persistent volume을 마운트해 노드가 삭제되어도 데이터를 유지하도록 해야 한다.

다행히도 helm 이용 시 몇 가지 값을 바꿔주는 것으로 쉽게 Persistent volume이 마운트된 상태로 Prometheus를 설치할 수 있다.


#chart의 value 값 가져오기
#kube-prometheus-stack이라는 repository는 Node_expoter, Grafana, kube_state_metrics를 포함
$ helm show values prometheus-community/kube-prometheus-community/kube-prometheus-stack > prom-config.yaml

Node-exporter : 노드 단의 메트릭을 수집해 Prometheus server에게 노출하는 exporter로 노드의 cpu 사용률, 램 사용률, 네트워크 대역폭 등 하드웨어에서 측정할 수 있는 수치를 보기 위해 설치
Grafana : 수집한 데이터를 시각화 해줄 툴로, 아래에서 구체적인 설정 예정
kube_state_metrics : k8s단의 메트릭을 수집하는 exporter로 pod리소스, deployment 리소스, replicaset 리소스 등 k8s api에서 측정할 수 있는 수치를 보기 위해 설치


prom-config.yaml 파일은 Chart 설치 시 변경할 수 있는 값들이 나와있는 manifest file

prom-config.yaml 파일은 Chart 설치 시 변경할 수 있는 값들이 나와있는 manifest file

위 명세는 prometheus가 emptydir가 아닌 gp2 클래스의 스토리지를 Persistent Volume으로 사용하는 PersistentVolumeClaim 명세이다.

따라서, 프로메테우스 노드를 삭제해도 PV는 살아있어 데이터를 영구적으로 저장 가능하다.

주석 처리를 해제한 후 변경사항을 저장하고, helm을 통해 설치를 진행해 Prometheus를 Cluster에 설치한다.

$ helm install --values prom-config.yaml prometheus prometheus-community/kube-prometheus-stack --namespace monitoring

#포트포워딩
$ kubectl port-forward prometheus-prometheus-kube-prometheus-prometheus-0 9090:9090 -n monitoring




4. Grafana 설치

위에서 이미, Helm을 통해(kube-prometheus-stack repository) prometheus-grafana stack설치를 진행했어서, 이미 Grafana pod가 생성되어 있는 것을 확인할 수 있다!

$ kubectl get pods -n monitoring
$ kubectl port-forward wervice/prometheus-grafana 3000:80 -n monitoring

Grafana의 default로그인 username과 password는 각각 admin과 prom-operator이다.



5. Loki 구성

마지막으로 Loki를 이용해 메트릭이 아닌 로그를 기반으로 수집과 시각화가 가능하다.

Grafana를 운영하는 Grafana Lab에서 Loki도 운영!

$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm install loki grafana/loki-stack -n monitoring \
> --set grafana.enabled=false,prometheus.enabled=false,loki.persistence.enabled=true,loki.persistence.storageClassName=gp2,loki.persistence.size=5Gi
$ kubectl -n monitoring port-forward service/loki 3100

-set 플래그를 이용해 Loki를 제외한 나머지 스택을 설치하지 않고 PersistentVolumeClaim을 명시해 Prometheus와 같이 영구적인 볼륨에 데이터를 저장하도록 했다.

접속이 가능하다.


이제, Grafana와 연동을 진행해야 한다. Grafana에 접속 후, Data sources에서 Loki를 Select 한다.

다음과 같이 설정 후 Dashboards에서 Import dashboard를 통해 확인해 보겠다.
(나는 dashboard ID 12019를 import 했다.)


6. 최종 접속 테스트



다음과 같이 설정이 가능하다!

2개의 댓글

comment-user-thumbnail
2024년 2월 22일

강다님 혹시 이 LPG 스택에 대해서 질문 좀 여쭤보고 싶은데 slack이나 오픈채팅 가능할까요??

1개의 답글