[K8S] 쿠버네티스 환경에서 Helm으로 Grafana Loki 설치하기

NewNewDaddy·2024년 5월 19일
0

DOCKER-KUBERNETES

목록 보기
10/10
post-thumbnail

0. INTRO

  • Kubernetes Cluster에서 생성되고 없어지는 Pod들의 Log를 확인할 수 있는 방법에는 가장 기본적으로는 kubectl get logs 명령이 있을 것이다. 하지만 하나의 pod에 대해서 해당 명령을 쳐서 log를 확인하는 작업도 번거로운데 pod가 많아지면 상당히 귀찮고 불가능한 작업이 된다.
  • Grafana Loki는 Pod내에서 쌓이는 Log들을 시간 단위로 필터링해서 보여주고 Pod 로그들에 대해 간단한 시각화도 해주는 등 로깅 작업을 하기에 적합한 툴이다. 이번 글에서는 Kubernetes Cluster에 Helm을 통해 Grafana Loki를 설치하는 과정을 간단히 다뤄볼 것이다.

1. Helm을 통한 Grafana Loki 설치

1) Helm Chart 추가

helm repo add grafana https://grafana.github.io/helm-charts

helm repo update

2) Helm Chart values override

  • grafana/loki-stack 차트에 대한 values.yaml 파일을 override-values.yaml 이름으로 저장 후 필요한 서비스들만 남기고 지워준다.
  • YAML 파일에서 loki 서비스의 경우 PV를 통한 데이터 지속성을 위해 persistence 항목을 추가해준다.
helm show values grafana/loki-stack > ./override-values.yaml

override-values.yaml

loki:
  enabled: true
  isDefault: true
  url: http://{{(include "loki.serviceName" .)}}:{{ .Values.loki.service.port }}
  readinessProbe:
    httpGet:
      path: /ready
      port: http-metrics
    initialDelaySeconds: 45
  livenessProbe:
    httpGet:
      path: /ready
      port: http-metrics
    initialDelaySeconds: 45
  datasource:
    jsonData: "{}"
    uid: ""
  persistence:
    enabled: true
    storageClassName: nfs-client
    size: 5Gi

promtail:
  enabled: true
  config:
    logLevel: info
    serverPort: 3101
    clients:
      - url: http://{{ .Release.Name }}:3100/loki/api/v1/push

grafana:
  enabled: true
  sidecar:
    datasources:
      label: ""
      labelValue: ""
      enabled: true
      maxLines: 1000
  image:
    tag: 10.3.3

3) grafana/loki-stack 설치

  • 설치될 때 override-values.yaml 파일의 내용이 참조될 수 있도록 해준다. (dataops라는 namespace에 설치하였다.)
helm install loki-stack grafana/loki-stack --values override-values.yaml -n dataops

    NAME: loki-stack
    LAST DEPLOYED: Thu May  9 09:00:51 2024
    NAMESPACE: dataops
    STATUS: deployed
    REVISION: 1
    NOTES:
    The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.

    See http://docs.grafana.org/features/datasources/loki/ for more detail.
  • 약 2분정도 기다리면 아래와 같이 필요한 리소스들이 모두 Running 상태가 되며 설치가 잘 된 것을 확인할 수 있다.
kubectl get all -n dataops

    NAME                                      READY   STATUS    RESTARTS   AGE
    pod/loki-stack-0                          1/1     Running   0          2m59s
    pod/loki-stack-grafana-5fb9bb986f-xj8vj   2/2     Running   0          2m59s
    pod/loki-stack-promtail-7l6nv             1/1     Running   0          2m59s
    pod/loki-stack-promtail-hddjq             1/1     Running   0          2m59s
    pod/loki-stack-promtail-tvgph             1/1     Running   0          2m59s

    NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    service/loki-stack              ClusterIP   198.19.210.169   <none>        3100/TCP   2m59s
    service/loki-stack-grafana      ClusterIP   198.19.170.17    <none>        80/TCP     2m59s
    service/loki-stack-headless     ClusterIP   None             <none>        3100/TCP   2m59s
    service/loki-stack-memberlist   ClusterIP   None             <none>        7946/TCP   2m59s

    NAME                                 DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    daemonset.apps/loki-stack-promtail   3         3         3       3            3           <none>          2m59s

    NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/loki-stack-grafana   1/1     1            1           2m59s

    NAME                                            DESIRED   CURRENT   READY   AGE
    replicaset.apps/loki-stack-grafana-5fb9bb986f   1         1         1       2m59s

    NAME                          READY   AGE
    statefulset.apps/loki-stack   1/1     2m59s

4) PV, PVC 리소스 생성 확인

  • Kubernetes 클러스터에 nfs-subdir-external-provisioner가 설치되어 있어야 Default로 연결된 NAS Volume에 PV가 생성이 되는데 해당 내용은 이 글에서는 따로 설명하지 않고 자세한 내용은>>>NAS 볼륨 관련 글<<< 이 글에서 확인해볼 수 있다.
  • Loki의 데이터 지속성을 위해 추가했던 PVC 리소스에 대한 PV가 잘 생성되었는지 확인한다.
kubectl get pv,pvc -n dataops

    NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                   STORAGECLASS   REASON   AGE
    persistentvolume/pvc-3a495763-b43b-4d3c-b341-a4484dc35b96   5Gi        RWO            Delete           Bound    dataops/storage-loki-stack-0            nfs-client              87s

    NAME                                         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    persistentvolumeclaim/storage-loki-stack-0   Bound    pvc-3a495763-b43b-4d3c-b341-a4484dc35b96   5Gi        RWO            nfs-client     87s

2. Grafana 대시보드 접속

1) Service 리소스 수정

  • loki-stack helm chart 관련 리소스가 모두 생성이 되고 Service를 확인해보면 디폴트 타입인 ClusterIP로 되어있는 것을 확인할 수 있다. 따라서 Loki 대시보드에 대한 외부 접속을 위해 서비스 리소스에 대해 ClusterIP를 NodePort로 수정하는 작업이 필요하다.
kubectl edit svc loki-stack-grafana -n dataops

2) Ingress를 통한 ALB 생성

loki-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: loki-ingress
  namespace: dataops
  annotations:
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]'
    alb.ingress.kubernetes.io/load-balancer-name: 'ai-prd-nks-alb-loki'
    alb.ingress.kubernetes.io/ssl-certificate-no: "11111"
    alb.ingress.kubernetes.io/ssl-redirect: "443"
    alb.ingress.kubernetes.io/enable-sticky-session: "true"
spec:
  ingressClassName: alb
  defaultBackend:
    service:
      name: loki-stack-grafana
      port:
        number: 80
  • Ingress 리소스가 배포되면 alb-ingress-controller가 해당 내용을 감지하여 쿠버네티스가 배포된 클라우드 환경(AWS, AZURE, NCLOUD 등등)에 ALB를 자동으로 생성해준다. 해당 ALB의 URL로 접속하면 아직 SSL 적용이 안된 Grafana UI를 볼 수 있다.
  • SSL 적용을 위해서는 특정 도메인에 대해 Certificate Manager에서 인증서를 발급받아 해당 도메인의 CNAME으로 ALB를 등록하는 과정이 필요한데 UI상에서 로그 조회에 꼭 HTTPS 접속이 필요한 것은 아니기 때문에 이번 글에서는 해당 과정은 생략하도록 한다.

3) 대시보드 최초 로그인

  • UI에 최초로 로그인하기 위해서는 secret 리소스를 확인하는 과정이 필요하다. loki-stack이 배포되면서 loki-stack-grafana라는 이름의 secret 리소스도 함께 생성이 되는데 관리자 로그인 ID와 비밀번호가 담겨있다.
kubectl get secret -n dataops

    NAME                               TYPE                 DATA   AGE
    loki-stack                         Opaque               1      9m26s
    loki-stack-grafana                 Opaque               3      9m26s
    loki-stack-promtail                Opaque               1      9m26s
    sh.helm.release.v1.loki-stack.v1   helm.sh/release.v1   1      9m26s
  • loki-stack-grafana secret 리소스를 YAML 형식으로 열게되면 BASE64로 인코딩된 관리자 ID와 비밀번호를 확인할 수 있다.
kubectl get secret loki-stack-grafana -n dataops -o yaml
  • 이 문자들을 각각 디코딩 해준값들로 Grafana UI에 로그인이 가능하다.
echo YWRtaW4= | base64 -d
echo VmVCV2JOb3FrQVdkRHASDF86D8G568SkWkxnNm9iUw== | base64 -d

4) Default Data Source 선택

  • 홈 화면의 Explore 탭으로 들어가면 로깅에 대한 Data Source를 선택할 수 있다. 기본적으로 loki-grafana로 설치를 하였기 대문에 loki가 기본 Data Source로 선택이 되어있다.
  • 이제 아래 화면에서 다양한 필터링 옵션들을 사용하여 Kubernetes Cluster 내에서 발생한 로그 내역들을 조회해볼 수 있다.

4. 참고 문서

profile
데이터 엔지니어의 작업공간 / #PYTHON #SPARK #AWS #NCLOUD

1개의 댓글

최초에 배포할때 간혹 이 이슈가 발생하네요. 저도 최초에 설치했을 때는 해당 이슈가 뜨지 않았는데, helm uninstall 하고 다시 설치할 때 해당 이슈가 뜨네요.

https://github.com/grafana/loki/issues/1153
https://github.com/grafana/loki/issues/3346

답글 달기