1.收集哪些日志?
- K8S系统的组件日志
- K8S Cluster里面部署的应用程序日志
- 标准输出
- 日志文件 (输出到指定文件里)
- 日志轮转(本地保留30天)
- 日志格式 (json,kv)
如果是kubeadm方式部署的k8s 日志是收集的 /var/log/message
如果是二进制部署的k8s 日志是配置文件中定义的日志路径

应用容器日志
/var/lib/docker/contianers/*/*-json.log

docker配置文件中定义了 默认日志格式为json

pod的日志路径
/var/lib/kubelet/pods/*/volumes/

2.ELK收集日志架构

其中logstash 是非必选的组件,如果日志场景比较复杂的时候可以加上logstash做出更好的预处理然后存入ES。
3.容器中的日志怎么收集
方案一:
Node上部署一个日志收集程序
- DaemonSet方式部署日志收集程序
- 对本节点/var/log/kubelet/pods和 /var/lib/docker/containers/两个目录下的日志进 行采集
- Pod中容器日志目录挂载到宿主机统一目录上

方案二:
Pod中附加专用日志收集的容器
- 每个运行应用程序的Pod中增加一个日志 收集容器,使用emtyDir共享日志目录让 日志收集程序读取到。

方案三:
应用程序直接推送日志

方案比较:
方式
|
优点
|
缺点
|
方案一:Node上部署一个日志收集程序
|
每个Node仅需部署一个日志收集程序, 资源消耗少,对应用无侵入
|
应用程序日志如果写到标准输出和标准错误输出, 那就不支持多行日志。
|
方案二:Pod中附加专用日志收集的容器
|
低耦合
|
每个Pod启动一个日志收集代理,增加资源消耗, 并增加运维维护成本
|
方案三:应用程序直接推送日志 |
无需额外收集工具 |
浸入应用,增加应用复杂度
|
4.k8s部署efk
elasticsearch.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: kube-system
labels:
k8s-app: elasticsearch
spec:
serviceName: elasticsearch
selector:
matchLabels:
k8s-app: elasticsearch
template:
metadata:
labels:
k8s-app: elasticsearch
spec:
containers:
- image: elasticsearch:7.3.2
name: elasticsearch
resources:
limits:
cpu: 1
memory: 2Gi
requests:
cpu: 0.5
memory: 500Mi
env:
- name: "discovery.type"
value: "single-node"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx2g"
ports:
- containerPort: 9200
name: db
protocol: TCP
volumeMounts:
- name: elasticsearch-data
mountPath: /usr/share/elasticsearch/data
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
storageClassName: "managed-nfs-storage"
accessModes: [ "ReadWriteOnce" ]