Kubernetes日志概述
Kubernetes是一种云原生的容器编排系统,它为容器化应用提供了高效的管理机制。在 Kubernetes 集群中,每个节点上都会将重要的日志信息保存在本地。由于 Kubernetes 系统的架构较为分散,实时收集日志和检测错误不是一件容易的事情。因此,对K8S日志进行分析可以帮助我们发现问题和提高系统性能。
Kubernetes日志收集方案
Kubernetes支持很多种日志收集方案,如官方的 kube-apiserver、kubelet、etcd,以及开源的 Fluentd 和 Elastic Stack 等。其中,Fluentd是最常用的一种方案。它是一个开源的日志数据收集器,可以从各种数据源中收集数据,统一处理并发送到不同的目标存储库中。
Fluentd日志收集方案实现
- 使用 Fluentd 安装的 Kubernetes 插件
Fluentd 安装的 Kubernetes 插件可以自动对 Kubernetes 所有日志源进行配置,比如 kube-apiserver、kubelet 和 etcd 等。使用这种方法,只需要将插件作为 DaemonSet 在 Kubernetes 集群中进行部署即可。
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: fluentd-kubernetes-daemonset
namespace: kube-system
spec:
template:
metadata:
labels:
k8s-app: fluentd-logging
annotations:
pod.beta.kubernetes.io/lifecycle: '{"postStart":{"exec":{"command":["/bin/sh","-c","cp -Rp /etc/fluentd/etc/* /etc/fluentd; fluentd -c /etc/fluentd/fluentd.conf -p /etc/fluentd/plugins"]}}}'
spec:
hostNetwork: true
containers:
- name: fluentd-kubernetes-daemonset
image: fluent/fluentd-kubernetes-daemonset:v1.10.2-debian-elasticsearch7-1.4
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
securityContext:
privileged: true
- name: fluentd-config
mountPath: /etc/fluentd
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: fluentd-config
configMap:
name: fluentd-config
- 使用 Fluentd DaemonSet 进行日志收集
使用 DaemonSet 部署 Fluentd Agent,并将 Fluentd 的配置文件和插件挂载到本地的节点上,通过对日志源进行配置,将日志发送到后端存储中。
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-conf
namespace: kube-system
labels:
k8s-app: fluentd-logging
data:
fluent.conf: |
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
time_format %Y-%m-%dT%H:%M:%S.%NZ
types cri,containerd
read_from_head true
<parse>
@type detect_exceptions
remove_tag_prefix kubernetes.
</parse>
</source>
<filter kubernetes.**>
@type kubernetes_metadata
</filter>
<match **>
@type elasticsearch
host elasticsearch.logging.svc.cluster.local
port 9200
logstash_format true
logstash_prefix fluentd
include_tag_key true
tag_key @log_name
flush_interval 1s
</match>
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
k8s-app: fluentd-logging
template:
metadata:
labels:
k8s-app: fluentd-logging
spec:
serviceAccount: fluentd
serviceAccountName: fluentd
terminationGracePeriodSeconds: 30
containers:
- name: fluentd
image: fluent/fluentd:v1.3-debian-1
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: fluentdconf
mountPath: /fluentd/etc/
ports:
- containerPort: 24224
hostPort: 24224
- containerPort: 24220
hostPort: 24220
env:
- name: FLUENT_UID
value: "0"
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: fluentdconf
configMap:
name: fluentd-conf
Kubernetes日志分析工具
- Kibana
Kibana是一个基于Elasticsearch搜索引擎的开源数据分析和可视化平台。使用Kibana,您可以直观地查看分析日志、文档和数据,而不仅仅是查看数据。您可以使用Kibana来搜索、查看、与数据进行交互,并创建漂亮的可视化工具。 - Prometheus
Prometheus是一套基于开源的系统监控和警报工具。Prometheus在Kubernetes应用程序与操作系统之间的缝隙中收集统计信息,并提供了一种可视化应用于存储、查询和可视化数据的方式。可以将日志转化为指标数据,Prometheus可以分析Kubernetes集群中各个组件的运行状态,如API服务器、代理、节点和应用程序等。
Kubernetes日志分析的应用
- 故障检测
定时分析Kubernetes日志,可以很好地检测集群中的故障以及其根源。如果发现系统出现了故障,则可以通过日志分析找到出错的服务、应用程序或节点。 - 性能问题诊断
使用Kubernetes中的日志,可以对应用程序的性能进行监测。如果应用程序不断重启,可以通过分析不同时期的日志,找到导致这种行为的事件。 - 安全审计
通过Kubernetes日志审计,可以检查集群中是否存在安全漏洞、是否有异常访问、是否产生过于强大的API请求等问题。
总结
通过日志分析,可以追踪系统运作情况,检测问题,提高应用程序性能和安全性,提高企业运营效率。