Kubernetes日志收集需根據場景選擇合適方案,常見工具及特點如下:
/var/log/containers/*.log中的容器日志。Elasticsearch需持久化存儲(如NFS、云盤),配置資源限制(避免OOM):
# elasticsearch-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
spec:
serviceName: "elasticsearch"
replicas: 1
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
ports:
- containerPort: 9200
env:
- name: discovery.type
value: "single-node"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx512m"
volumeMounts:
- name: elasticsearch-data
mountPath: /usr/share/elasticsearch/data
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: nfs-client # 替換為實際存儲類
resources:
requests:
storage: 10Gi
Fluentd收集節點上所有容器日志(路徑:/var/log/containers/*.log),轉發至Elasticsearch:
# fluentd-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1.16-es
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.default.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
Kibana連接Elasticsearch,提供可視化界面:
kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/2.16/deploy/kibana/kibana.yaml
訪問http://<KIBANA_IP>:5601,配置Elasticsearch連接(默認地址:elasticsearch.default.svc.cluster.local:9200)。
Loki存儲日志,支持S3/OSS等外部存儲:
# loki-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: loki
spec:
serviceName: "loki"
replicas: 1
selector:
matchLabels:
app: loki
template:
metadata:
labels:
app: loki
spec:
containers:
- name: loki
image: grafana/loki:2.9.0
ports:
- containerPort: 3100
args:
- "--config.file=/etc/loki/config.yaml"
volumeMounts:
- name: loki-config
mountPath: /etc/loki
volumeClaimTemplates:
- metadata:
name: loki-storage
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: nfs-client
resources:
requests:
storage: 20Gi
Promtail收集日志并發送至Loki:
# promtail-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: promtail
spec:
selector:
matchLabels:
app: promtail
template:
metadata:
labels:
app: promtail
spec:
containers:
- name: promtail
image: grafana/promtail:2.9.0
args:
- "-config.file=/etc/promtail/config.yaml"
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: promtail-config
mountPath: /etc/promtail
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: promtail-config
configMap:
name: promtail-config
添加Loki數據源(地址:loki.default.svc.cluster.local:3100),創建Dashboard展示日志(如按命名空間、Pod篩選)。
使用logrotate避免日志文件無限增長,配置示例(/etc/logrotate.d/kubernetes):
/var/log/containers/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
sharedscripts
postrotate
/usr/bin/killall -HUP fluentd 2>/dev/null || true
endscript
}
kubectl logs <pod-name> -n <namespace>),支持-f實時跟蹤、--tail指定行數。stdout/stderr(Kubernetes原生采集),避免寫入本地文件(減少維護成本)。