Kubernetes在Debian上的日志管理方案
在Debian系统上管理Kubernetes(K8s)集群日志,核心目标是实现日志收集、集中存储、可视化分析及长期可维护性。以下是具体实施方法及最佳实践:
在搭建复杂日志系统前,可通过kubectl logs命令快速获取Pod日志,这是最基础的排查工具:
# 查看指定Pod的实时日志
kubectl logs <pod-name>
# 查看Pod中特定容器的日志(多容器Pod需指定容器名)
kubectl logs <pod-name> -c <container-name>
# 查看最近100行日志(结合tail命令)
kubectl logs <pod-name> | tail -n 100
若Pod已崩溃,可通过--previous参数查看上一个容器的日志:
kubectl logs <pod-name> --previous
EFK是K8s生态中最成熟的日志管理方案,适合需要全文检索、复杂分析的场景。
Fluentd部署(DaemonSet模式):
Fluentd作为日志收集器,以DaemonSet形式运行在每个节点上,收集节点及Pod日志。创建fluentd-daemonset.yaml配置文件:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
serviceAccountName: fluentd
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
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
应用配置:kubectl apply -f fluentd-daemonset.yaml。
Elasticsearch部署:
作为日志存储后端,需创建StatefulSet保证数据持久化。示例elasticsearch.yaml:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: kube-system
spec:
serviceName: "elasticsearch"
replicas: 1
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
ports:
- containerPort: 9200
volumeMounts:
- name: es-persistent-storage
mountPath: /usr/share/elasticsearch/data
volumeClaimTemplates:
- metadata:
name: es-persistent-storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
应用配置:kubectl apply -f elasticsearch.yaml。
Kibana部署与配置:
作为可视化工具,需连接Elasticsearch并创建仪表板。示例kibana.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:7.12.1
ports:
- containerPort: 5601
env:
- name: ELASTICSEARCH_HOSTS
value: "http://elasticsearch:9200"
应用配置后,通过kubectl port-forward暴露Kibana服务(如kubectl port-forward svc/kibana 5601:5601),访问http://localhost:5601即可查看日志。
若不需要复杂的全文检索,Loki是更轻量、资源消耗更低的选择,适合指标与日志关联场景(如Grafana生态)。
Loki部署:
通过Helm快速部署Loki(需提前安装Helm):
helm repo add grafana https://grafana.github.io/helm-charts
helm install loki grafana/loki-stack --namespace=logging --create-namespace --set promtail.enabled=true
```。
Promtail配置:
Promtail作为日志收集器,需配置promtail.yaml收集K8s Pod日志:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- cri: {} # 解析容器日志格式
- labeldrop:
- filename
部署Promtail:kubectl apply -f promtail.yaml。
Grafana集成:
登录Grafana(默认地址http://<grafana-ip>:3000),添加Loki为数据源(配置地址为http://loki:3100),即可通过Explore功能查询日志。
为防止日志文件过大占用磁盘空间,需配置日志轮转:
容器内日志轮转:
使用Kubernetes的json-file日志驱动(默认),通过kubelet参数配置轮转大小和数量:
编辑/etc/kubernetes/kubelet.conf(或通过kubeadm config view获取配置路径),添加:
kubeletArguments:
log-dir: ["/var/log/kubelet"]
log-file-max-size: ["100Mi"] # 单个日志文件最大100MB
log-file-max-backups: ["5"] # 保留5个备份
log-file-max-age: ["7"] # 保留7天
重启kubelet使配置生效:systemctl restart kubelet。
系统日志轮转:
使用logrotate工具管理系统日志(如/var/log/syslog、/var/log/kern.log),编辑/etc/logrotate.conf或创建自定义配置文件(如/etc/logrotate.d/k8s):
/var/log/kubelet/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root root
}
手动测试轮转:logrotate -vf /etc/logrotate.d/k8s。
日志级别优化:
生产环境中,避免将Kubernetes组件(如kube-apiserver、kube-controller-manager)的日志级别设置为--v=0(默认),可根据需要调整为--v=2(记录警告和错误)或--v=4(记录详细信息),平衡日志量与排查效率。
敏感信息过滤:
使用Fluentd或Loki的parser功能过滤日志中的敏感信息(如密码、密钥)。例如,Fluentd配置中添加record_transformer插件移除敏感字段:
<filter kube.**>
@type record_transformer
enable_ruby true
<record>
message ${(record["message"] || "").gsub(/password=[^& ]+/, "password=*****")}
</record>
</filter>
```。
集中化存储:
务必将日志发送到集中化存储(如Elasticsearch、Loki),避免依赖单个节点的本地存储,确保日志持久性和可访问性。
监控与告警:
通过Prometheus监控日志系统的关键指标(如Elasticsearch的存储使用率、Fluentd的收集延迟),并设置告警规则(如日志量突增、存储空间不足),及时响应异常。
以上方案覆盖了Debian上K8s日志管理的核心需求,可根据团队规模、日志量及预算选择合适的工具组合。