- Published on
[Grafana Loki] Triển khai lên K8s
- Authors
- Name
- Đông Trần
- Github
- @dongitran
Series Grafana Loki Kubernetes:
Bài trước chúng ta đã tìm hiểu được cơ bản về grafana loki, promtail. Bây giờ mình triển khai lên k8s luôn nhé 😄
👽Tạo namespace
Trước tiên mình cần tạo namespace để dễ quản lý tài nguyên, mình đặt namespace tên monitoring nha.
Mình sẽ tạo file namespace.yaml:
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
sau đó chạy lệnh kubectl apply -f namespace.yaml để tạo namespace
🚁 Deploy grafana dashboard
Tạo password đăng nhập vào grafana dashboard
Do mình muốn tạo password luôn nên tạo bằng secret bằng câu lệnh dưới luôn, bạn thay "admin" bằng password bạn muốn cấu hình nhé
kubectl create secret generic grafana-secret --from-literal=admin-password=admin --namespace=monitoring
Sau đó apply code bên dưới để grafana, khi chạy xong thì các bạn có thể access vào http://{nodePortIP}:31005
sẽ ra dashboard của grafana nha, nhưng sẽ không có nguồn data nào được add vào nên chưa thể query log gì cả 😅
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: grafana
namespace: monitoring
spec:
serviceName: grafana
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:latest
ports:
- containerPort: 3000
env:
- name: GF_SECURITY_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: grafana-secret
key: admin-password
volumeMounts:
- name: grafana-storage
mountPath: /var/lib/grafana
volumes:
- name: grafana-storage
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: grafana-nodeport
namespace: monitoring
spec:
type: NodePort
selector:
app: grafana
ports:
- protocol: TCP
port: 3000
targetPort: 3000
nodePort: 31005
🛸 Deploy grafana loki
Tiếp theo là apply file dưới để tạo loki để kết nối đến grafana và nhận dữ liệu từ promtail
apiVersion: v1
kind: Service
metadata:
name: loki
namespace: monitoring
spec:
selector:
app: loki
ports:
- protocol: TCP
port: 3100
targetPort: 3100
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: loki
namespace: monitoring
spec:
serviceName: loki
replicas: 1
selector:
matchLabels:
app: loki
template:
metadata:
labels:
app: loki
spec:
containers:
- name: loki
image: docker.io/grafana/loki:2.9.6
args:
- -config.file=/etc/loki/local-config.yaml
ports:
- containerPort: 3100
volumeMounts:
- name: config-volume
mountPath: /etc/loki
volumes:
- name: config-volume
configMap:
name: loki-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: loki-config
namespace: monitoring
data:
local-config.yaml: |
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://localhost:9093
🚀 Deploy promtail
Cuối cùng mình apply thêm yaml dưới để tạo promtail để thu thập data từ các pod nhé
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: promtail-daemonset
namespace: monitoring
spec:
selector:
matchLabels:
name: promtail
template:
metadata:
labels:
name: promtail
spec:
serviceAccount: promtail-serviceaccount
containers:
- name: promtail-container
image: grafana/promtail
args:
- -config.file=/etc/promtail/promtail.yaml
env:
- name: 'HOSTNAME'
valueFrom:
fieldRef:
fieldPath: 'spec.nodeName'
volumeMounts:
- name: logs
mountPath: /var/log
- name: promtail-config
mountPath: /etc/promtail
- mountPath: /var/lib/docker/containers
name: varlibdockercontainers
readOnly: true
volumes:
- name: logs
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: promtail-config
configMap:
name: promtail-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: promtail-config
namespace: monitoring
data:
promtail.yaml: |
server:
http_listen_port: 9080
grpc_listen_port: 0
clients:
- url: http://loki:3100/loki/api/v1/push
positions:
filename: /tmp/positions.yaml
target_config:
sync_period: 10s
scrape_configs:
- job_name: pod-logs
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- docker: {}
relabel_configs:
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
replacement: $1
separator: /
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_pod_name
target_label: job
- action: replace
source_labels:
- __meta_kubernetes_namespace
target_label: namespace
- action: replace
source_labels:
- __meta_kubernetes_pod_name
target_label: pod
- action: replace
source_labels:
- __meta_kubernetes_pod_container_name
target_label: container
- replacement: /var/log/pods/*$1/*.log
separator: /
source_labels:
- __meta_kubernetes_pod_uid
- __meta_kubernetes_pod_container_name
target_label: __path__
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: promtail-clusterrole
namespace: monitoring
rules:
- apiGroups: [""]
resources:
- nodes
- services
- pods
- pods/log
- nodes/proxy
verbs:
- get
- watch
- list
- get
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: promtail-serviceaccount
namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: promtail-clusterrolebinding
namespace: monitoring
subjects:
- kind: ServiceAccount
name: promtail-serviceaccount
namespace: monitoring
roleRef:
kind: ClusterRole
name: promtail-clusterrole
apiGroup: rbac.authorization.k8s.io
🎉️️️️️️ Demo thử nào
Như vậy là ta đã triển khai xong cả grafana dashboard, loki và promtail, giờ hãy truy cập vào dashboard http://{nodePortIP}:31005
, sau đó tiến đến phần Connections -> Add new connection và thêm như sau và nhấn Save lại nhé
Sau đó bạn vào Explore và chọn vào datasource là Loki và query thử nhé
Như vậy đã xong quá trình deploy lên k8s sử dụng nodejs, các bạn có thắc mắc cứ comment bên dưới nha 🥰