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

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

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

pod的日志路径tomcat
/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" ]