整个框架拓扑图
Kubernetes Cluster Scrapes Metrics Scrapes Metrics Scrapes Metrics Sends Alerts Scrapes Metrics Queries Metrics Manages Manages Scrapes Metrics Access Dashboards Prometheus Operator Prometheus Instances Alertmanager Instances Grafana kube-state-metrics node-exporter per Node Other Exporters Loki Promtail External Users
1、Loki的安装部署
1)编写有关角色的yaml
root@iZj6c72dzbei17o2cuksmeZ:~/loki# cat LokiServiceAccount.yaml
yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: loki-promtail-serviceaccount
namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: loki-promtail-clusterrolebinding
namespace: monitoring
subjects:
- kind: ServiceAccount
name: loki-promtail-serviceaccount
namespace: monitoring
roleRef:
kind: ClusterRole
name: loki-promtail-clusterrole
apiGroup: rbac.authorization.k8s.io
2)创建loki-configmap
yaml
---
apiVersion: v1
data:
loki.yaml: |-
auth_enabled: false
chunk_store_config:
max_look_back_period: 30d
compactor:
shared_store: filesystem
working_directory: /data/loki/boltdb-shipper-compactor
compaction_interval: 60m
retention_enabled: true
retention_delete_delay: 2h
retention_delete_worker_count: 150
ingester:
chunk_block_size: 262144
chunk_idle_period: 3m
chunk_retain_period: 1m
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
max_transfer_retries: 0
wal:
dir: /data/loki/wal
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 30d
retention_period: 30d
schema_config:
configs:
- from: "2020-10-24"
index:
period: 24h
prefix: index_
object_store: filesystem
schema: v11
store: boltdb-shipper
server:
http_listen_port: 3100
storage_config:
boltdb_shipper:
active_index_directory: /data/loki/boltdb-shipper-active
cache_location: /data/loki/boltdb-shipper-cache
cache_ttl: 24h
shared_store: filesystem
filesystem:
directory: /data/loki/chunks
table_manager:
retention_deletes_enabled: true
retention_period: 30d
kind: ConfigMap
metadata:
name: loki-configmap
namespace: monitoring
resourceVersion: '17040827'
3)创建存储类yaml文件
yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
k8s.kuboard.cn/storageType: nfs_client_provisioner
name: cluster-storage
resourceVersion: '17031467'
parameters:
archiveOnDelete: 'false'
provisioner: nfs-cluster-storage
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
4)创建loki的yaml文件
yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
annotations: {}
labels:
app: loki
k8s.kuboard.cn/addon: system-logs
k8s.kuboard.cn/name: loki
name: loki
namespace: monitoring
resourceVersion: '17042746'
spec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain
whenScaled: Retain
podManagementPolicy: OrderedReady
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: loki
k8s.kuboard.cn/addon: system-logs
k8s.kuboard.cn/layer: monitor
serviceName: loki
template:
metadata:
annotations:
kubectl.kubernetes.io/restartedAt: '2025-03-27T16:07:47+08:00'
prometheus.io/port: http-metrics
prometheus.io/scrape: 'true'
creationTimestamp: null
labels:
app: loki
k8s.kuboard.cn/addon: system-logs
k8s.kuboard.cn/layer: monitor
spec:
containers:
- args:
- '-config.file=/etc/loki/loki.yaml'
image: 'swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/loki:2.7.1'
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: http-metrics
scheme: HTTP
initialDelaySeconds: 45
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
name: loki
ports:
- containerPort: 3100
name: http-metrics
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: http-metrics
scheme: HTTP
initialDelaySeconds: 45
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources: {}
securityContext:
readOnlyRootFilesystem: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/loki
name: config
- mountPath: /data
name: storage
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext:
fsGroup: 10001
runAsGroup: 10001
runAsNonRoot: true
runAsUser: 10001
serviceAccount: loki-promtail-serviceaccount
serviceAccountName: loki-promtail-serviceaccount
terminationGracePeriodSeconds: 4800
volumes:
- configMap:
defaultMode: 420
name: loki-configmap
name: config
updateStrategy:
type: RollingUpdate
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
k8s.kuboard.cn/pvcType: Dynamic
creationTimestamp: null
name: storage
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: cluster-storage
volumeMode: Filesystem
status:
phase: Pending
---
apiVersion: v1
kind: Service
metadata:
annotations: {}
labels:
app: loki
k8s.kuboard.cn/addon: system-logs
k8s.kuboard.cn/name: loki
name: loki
namespace: monitoring
resourceVersion: '17029178'
spec:
clusterIP: 10.68.62.80
clusterIPs:
- 10.68.62.80
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http-metrics
port: 3100
protocol: TCP
targetPort: http-metrics
selector:
app: loki
k8s.kuboard.cn/addon: system-logs
k8s.kuboard.cn/layer: monitor
sessionAffinity: None
type: ClusterIP
5)启动部署deployment
bash
root@iZj6c72dzbei17o2cuksmeZ:~/loki# kubectl apply -f LokiServiceAccount.yaml
root@iZj6c72dzbei17o2cuksmeZ:~/loki# kubectl apply -f cluster-storage.yaml
root@iZj6c72dzbei17o2cuksmeZ:~/loki# kubectl apply -f loki.yaml
2、Promtail的部署
1)编写serviceaccount文件
root@iZj6c72dzbei17o2cuksmeZ:~/loki# cat promtailServiceAccount.yaml
yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: loki-promtail-clusterrole
namespace: monitoring
rules:
- apiGroups: [""]
resources:
- nodes
- services
- pods
verbs:
- get
- watch
- list
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: loki-promtail-serviceaccount
namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: loki-promtail-clusterrolebinding
namespace: monitoring
subjects:
- kind: ServiceAccount
name: loki-promtail-serviceaccount
namespace: monitoring
roleRef:
kind: ClusterRole
name: loki-promtail-clusterrole
apiGroup: rbac.authorization.k8s.io```
2)编写promtail-configmap文件
```yaml
---
apiVersion: v1
data:
promtail.yaml: |-
client:
backoff_config:
max_period: 5s
max_retries: 20
min_period: 100ms
batchsize: 102400
batchwait: 1s
external_labels: {}
timeout: 10s
positions:
filename: /run/promtail/positions.yaml
server:
http_listen_port: 3101
target_config:
sync_period: 10s
scrape_configs:
- job_name: kubernetes-pods-name
pipeline_stages:
- docker: {}
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels:
- __meta_kubernetes_pod_label_name
target_label: __service__
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: drop
regex: ''
source_labels:
- __service__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
replacement: $1
separator: /
source_labels:
- __meta_kubernetes_namespace
- __service__
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__
- job_name: kubernetes-pods-app
pipeline_stages:
- docker: {}
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: drop
regex: .+
source_labels:
- __meta_kubernetes_pod_label_name
- source_labels:
- __meta_kubernetes_pod_label_app
target_label: __service__
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: drop
regex: ''
source_labels:
- __service__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
replacement: $1
separator: /
source_labels:
- __meta_kubernetes_namespace
- __service__
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__
- job_name: kubernetes-pods-direct-controllers
pipeline_stages:
- docker: {}
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: drop
regex: .+
separator: ''
source_labels:
- __meta_kubernetes_pod_label_name
- __meta_kubernetes_pod_label_app
- action: drop
regex: '[0-9a-z-.]+-[0-9a-f]{8,10}'
source_labels:
- __meta_kubernetes_pod_controller_name
- source_labels:
- __meta_kubernetes_pod_controller_name
target_label: __service__
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: drop
regex: ''
source_labels:
- __service__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
replacement: $1
separator: /
source_labels:
- __meta_kubernetes_namespace
- __service__
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__
- job_name: kubernetes-pods-indirect-controller
pipeline_stages:
- docker: {}
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: drop
regex: .+
separator: ''
source_labels:
- __meta_kubernetes_pod_label_name
- __meta_kubernetes_pod_label_app
- action: keep
regex: '[0-9a-z-.]+-[0-9a-f]{8,10}'
source_labels:
- __meta_kubernetes_pod_controller_name
- action: replace
regex: '([0-9a-z-.]+)-[0-9a-f]{8,10}'
source_labels:
- __meta_kubernetes_pod_controller_name
target_label: __service__
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: drop
regex: ''
source_labels:
- __service__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
replacement: $1
separator: /
source_labels:
- __meta_kubernetes_namespace
- __service__
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__
- job_name: kubernetes-pods-static
pipeline_stages:
- docker: {}
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: drop
regex: ''
source_labels:
- __meta_kubernetes_pod_annotation_kubernetes_io_config_mirror
- action: replace
source_labels:
- __meta_kubernetes_pod_label_component
target_label: __service__
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: drop
regex: ''
source_labels:
- __service__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
replacement: $1
separator: /
source_labels:
- __meta_kubernetes_namespace
- __service__
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_annotation_kubernetes_io_config_mirror
- __meta_kubernetes_pod_container_name
target_label: __path__
kind: ConfigMap
metadata:
name: promtail-configmap
namespace: monitoring
resourceVersion: '17042330'
3)启动deployment
bash
root@iZj6c72dzbei17o2cuksmeZ:~/loki# kubectl apply -f promtailServiceAccount.yaml
root@iZj6c72dzbei17o2cuksmeZ:~/loki# kubectl apply -f promtail.yaml
3、web界面操作
1)登录web界面,导入loki数据源
点击Data sources --> +Add new data source
选择loki项
自定义相关的参数项
滑倒最下面点击保存
2)自定义条件查看日志信息
3)导入Dashboards
选中Dashboards-->New-->import
输入模块id-->加载
自定义Dashboard名称--id--选择loki数据源
最后点击导入