서론
이전에는 loki-stack을 활용한 loki-promtail-grafana 스택을 구축해 보았다면, 이제는 loki-stack 없이 구축해 보도록 하겠습니다. Loki-Stack을 활용하여 통합 모니터링을 구축해보고 싶으신 분들은 이전 포스팅을 참고해 주시기 바랍니다,.
[이전글]
[NCP] NKS로 개발환경 구성하기 Chapter 5. Loki, Promtail, Grafana를 활용한 로그 통합 모니터링 구축 - Feat
서론loki-stack은 grafana labs에서 좀 더 쉽게 loki-promtail-grafana 스택을 구축할 수 있도록 개발한 하나의 스택입니다. 때문에 loki-stack을 활용한 통합 모니터링 구축은 정말 쉽습니다. 다만 하나의 클러
min-nine.tistory.com
본론
Helm chart를 이용해서 손쉽게 설치할 수 있습니다. helm이란 쿠버네티스 패키지 매니저로 원하는 패키지를 쿠버네티스에 쉽게 설치할 수 있도록 도와주는 역할을 합니다.
1. Helm 설치
# Mac OS
brew install helm
# Linux OS (Script)
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
# Linux OS (Debian/Ubuntu)
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
# Windows OS (Chocolatey)
choco install kubernetes-helm
# Windows OS (Scoop)
scoop install helm
# Windows OS (Winget)
winget install Helm.Helm
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
2. Grafana 제공 helm-carts Pull
Loki, Promtail 모두 GrafanaLab에서 개발 및 운영 유지보수를 진행하고 있기 때문에 grafana의 github에서 helm-charts를 가져올 수 있습니다.
git clone https://github.com/grafana/helm-charts.git
해당 "helm-charts/charts/" 디렉터리 내부에는 많은 소프트웨어 관련 디렉터리가 존재하는데, 우리는 그중 loki-distributed, grafana, promtail 3개의 소프트웨어를 사용하여 통합 모니터링을 구축할 것이기 때문에 해당 소프트웨어 이름의 디렉터리 내부에 있는 vaules.yaml 파일을 이용할 것입니다.
3. 설계하기
로그를 수집하여 저장소에 보내는 Promtail은 애플리케이션 동작하는 파드가 있는 모든 노드들에 설치가 되어야 합니다. promtail의 values.yaml 파일을 확인해 보면 daemonset.enabled: true로 설정되어 있는데 이는, 쿠버네티스의 DaemonSets 오브젝트를 통해 각 노드에 설치하게끔 하기 위함입니다. 그렇기 때문에 Promtail은 애플리케이션이 동작하는 dev-cluster에 설치하도록 합니다.
로그를 받아서 저장 및 보관하는 Loki와 모니터링을 제공할 Grafana는 어플리케이션 단위와는 별개로 구분되어야 하기 때문에 mgt-cluster에 설치하도록 합니다.
4. Dev-Cluster에 Promtail 설치
우리가 신경써야 할 부분은 promtail/values.yaml 파일에서 config.clients.url 부분입니다. 프롬테일은 해당 url에 적힌 곳으로 로그들을 전송합니다. 때문에 저는 로키를 설치하고 해당 로키 service를 ingress alb로 띄운 후 dns와 맵핑 지었습니다. 추후에 각 클러스터끼리 통신을 가능케 하는 방법으로 수정할 수도 있지만, 지금 당장은 이렇게 진행하도록 합니다.
[promtail-values.yaml]
...
...
config:
enabled: true
clients:
- url: http://mgt-loki.mingyu.co.kr/loki/api/v1/push
...
...
그 후, helm 명령어를 통해 수정한 values.yaml 파일을 참고하여 promtail을 설치할 수 있습니다. 저는 dev-tools라는 네임스페이스에 프롬테일을 배포하도록 합니다.
helm install -n dev-tools promtail grafana/promtail --values helm-charts/charts/promtail/promtail-values.yaml
대시보드에 들어가면 아래와 같이 DaemonSets이 정상적으로 동작하면서 파드가 3/3으로 보이는 것을 확인할 수 있습니다. 저는 노드를 3개로 구성한 dev-cluster에 배포했기 때문에 각각의 노드에 파드가 하나씩 생성된 것입니다.
5. Mgt-Cluster에 Liki 설치
이제 Loki를 mgt 클러스터에 설치하도록 하겠습니다. values.yaml을 이용하여 helm을 설치할 때, 비어져있는 값은 알아서 default 값으로 대체해주기 때문에 꼭 필요한 사항만 명시해도 괜찮습니다. Loki를 설치하는 방법은 grafana 공식 문서에 나와있습니다. 모놀리틱, 마이크로서비스,스케일러블 3가지의 버전을 설치할 수 있는데 저의 경우는 추후 마이크로소프트로 전환하기 용이한 scalable Loki를 설치하였습니다.
Install the simple scalable Helm chart | Grafana Loki documentation
Install the simple scalable Helm chart This Helm Chart deploys Grafana Loki in simple scalable mode within a Kubernetes cluster. This chart configures Loki to run read, write, and backend targets in a scalable mode. Loki’s simple scalable deployment mode
grafana.com
loki:
schemaConfig:
configs:
- from: "2024-04-01"
store: tsdb
object_store: s3
schema: v13
index:
prefix: loki_index_
period: 24h
ingester:
chunk_encoding: snappy
querier:
# Default is 4, if you have enough memory and CPU you can increase, reduce if OOMing
max_concurrent: 4
pattern_ingester:
enabled: true
limits_config:
allow_structured_metadata: true
volume_enabled: true
deploymentMode: SimpleScalable
backend:
replicas: 2
read:
replicas: 2
write:
replicas: 3 # To ensure data durability with replication
# Enable minio for storage
minio:
enabled: true
gateway:
service:
type: LoadBalancer
저는 mgt-cluster의 monitoring 네임스페이스에 로키를 설치했는데, 계속 오류가 발생했습니다. 이유를 살펴보니 loki 설치시 default dnsService가 "kube-dns"로 되어있는데, NKS의 dnsSerivce는 "coredns"라는 명칭이기 때문이었습니다. 때문에 global dnsService값을 변경해줍니다. 또한, ipv6를 사용할 필요성이 없기 때문에 gateway의 nginxconfig도 변경해줍니다.
global:
dnsService: "coredns"
gateway:
nginxConfig:
enableIPv6: false
그리고 helm 명령어를 통해 배포해줍니다.
helm install --values values.yaml loki grafana/loki -n monitoring
6. Mgt-Cluster에 Grafana 설치
통합 모니터링을 관리하는 grafana를 mgt-cluster에 설치하도록 하겠습니다. values.yaml 파일의 datasources 밑에 loki관련 서비스를 맵핑지어줍니다.
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: devCluster
type: loki
url: http://loki-read.monitoring.svc.cluster.local:3100
access: proxy
isDefault: true
jsonData:
httpHeaderName1: X-Scope-OrgID
orgId: 1
helm 명령어를 사용하여 grafana를 배포합니다.
helm install grafana grafana/grafana -n monitoring --values grafana-values.yaml
초기 접속 비밀번호는 아래 명령어로 찾을 수 있습니다.
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
저는 dns에 grafana 접속 관련 도메인을 생성 후 mgt ingress alb에 연결지어줬습니다. 해당 도메인으로의 접속은 곧 grafana service로 path설정 해두었기 때문에 grafana.mingyu.co.kr 형식의 도메인으로 그라파나에 접속 가능하게 했습니다.
dns 설정 없이 그라파나에 접속하고싶으시면 kubectl 의 port forward를 사용하여 로컬에서 접속할 수 있습니다.
kubectl port-forward --address=0.0.0.0 {grafana-pod-name} -n monitoring {grafana-port}
결론
이렇게 각각의 클러스터에 알맞는 소프트웨어를 설치하여 Loki-Promtail-Grafana 스택을 구성해봤습니다. 다만 로키에 저장되고있는 로그는 별도로 저장값을 설정하지 않았기 때문에 휘발성입니다. 로그를 s3나 objectstorage 등과 같은 저장소에 저장시키고 몇일까지 보관할지 설정하는 것들또한 모두 values.yaml에서 설정할 수 있습니다. 본인의 상황에 맞에 설정하여 통합로그를 관리하고 유용하게 사용해보도록 합시다!
댓글