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原生采集),避免写入本地文件(减少维护成本)。