在Debian上实现K8S日志管理,可参考以下方案:
kubectl logs命令:直接查看Pod日志,如kubectl logs <pod-name> -n <namespace>。/var/log目录,如kubelet.log、docker.log。# fluentd-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
template:
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
应用配置:kubectl apply -f fluentd-ds.yaml。# elasticsearch-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: elasticsearch
namespace: logging
spec:
replicas: 1
template:
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
ports:
- containerPort: 9200
应用配置:kubectl apply -f elasticsearch-deployment.yaml。# kibana-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: logging
spec:
template:
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:7.12.1
env:
- name: ELASTICSEARCH_HOSTS
value: "http://elasticsearch.logging.svc.cluster.local:9200"
应用配置:kubectl apply -f kibana-deployment.yaml,通过NodePort或Ingress访问Kibana。logrotate工具:在节点上安装logrotate,配置日志分割和保留策略,例如:# /etc/logrotate.d/kubernetes
/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
missingok
notifempty
sharedscripts
postrotate
systemctl restart docker
endscript
}
通过DaemonSet在节点上自动部署logrotate。# loki-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: loki
spec:
template:
spec:
containers:
- name: loki
image: grafana/loki:2.9.1
args: ["-config.file=/etc/loki/config.yaml"]
参考官方文档配置Promtail采集日志并发送至Loki。kube-apiserver添加--v=4参数(数值越大日志越详细)。json-file日志驱动,限制单个日志文件大小:# pod-log-driver.yaml
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: nginx
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
emptyDir: {}
以上方案可根据实际需求选择,EFK适合大规模集群,Loki适合轻量级场景,均可在Debian系统上通过Kubernetes资源定义实现。