在搭建Kubernetes集群的过程中,集群的日志收集架构是我们不得不考虑的问题。根据Kubernetes官方文档中提供的几种日志收集的架构,我们从中得到了很大的启发,并针对公司内部K8S集群的特殊状况,设计和实现了一套基于Fluentd、Elasticseach、Kibana的日志收集平台。我们认为这套架构存在一定的通用性,所以在这里分为几篇文章分享给大家,希望大家在搭建K8S日志收集架构的时候,可以在我的文章中得到一些启发。
Kubernetes的日志需求主要分为以下三个方面:
- Kubernetes本身日志的收集
- Docker或者Pod进程日志收集
- 应用日志收集
这篇文章主要针对的是上述列表中前两种日志的收集。对于第三种应用日志的收集,我们采用的是在应用Pod里面编排一个日志收集的sidecar镜像,将应用的日志文件以数据卷的方式挂载到sidecar镜像中,sidecar镜像监测到日志文件的变化,并推送到Elasticsearch里。
节点日志收集架构
Kubernetes官方对于Kubernetes本身日志的收集和Docker或者Pod进程日志收集的架构图如下:
根据这个架构图,我们设计了自己个性化的Kubernetes节点日志收集架构,并且基于官方的fluentd镜像,构建了自己个性化的日志收集镜像。
日志收集镜像
我们构建的日志收集镜像与官方的主要有以下几个区别:
- 在我们的镜像中,Elasticsearch的IP地址和端口号是通过环境变量注入到镜像容器中的。
- 我们修改了官方镜像在构建时存在的权限问题。
- 在官方的实现方案里,把elasticsearch也以StatefulSet的形式跑在了K8S集群上。但是我们公司已经有了自己的elasticsearch集群,并且没有部署在K8S集群上。我们认为没有必要将elasticsearch部署在K8S集群上,因为elasticsearch本身是一个有状态的应用,我们更倾向于在K8S上部署一些无状态的微服务。
我们构建的带有elasticsearch插件的fluentd以DaemonSet的形式部署在每一个节点上,主要收集如下几种日志:
- containers log: /var/log/containers/*.log
- docker log: /var/log/docker.log
- kubelet log: /var/log/kubelet.log
- kube-proxy log: /var/log/kube-proxy.log
- kube-apiserver log: /var/log/kube-apiserver.log
- kube-controller-manager log: /var/log/kube-controller-manager.log
- kube-scheduler log: /var/log/kube-scheduler.log
需要注意的是,我们的这个日志收集DaemonSet只会运行在标记有beta.kubernetes.io/fluentd-ds-ready=true标签的节点上,所以想要收集节点上的日志,您需要先将节点打上此标签。
kubectl label nodes 节点名 beta.kubernetes.io/fluentd-ds-ready=true
我们将日志收集镜像的Dockerfile以及对应的容器编排脚本开源在了Github上,请访问这里fork或者star吧:https://github.com/fengdidi/k8s-fluentd-elasticsearch,另外欢迎Pull Request~
使用方法
进入Image目录,执行如下命令:
docker build -t dockerhub.fengdidi:5000/fengdidi/fluentd-elasticsearch:1801 .
docker push dockerhub.fengdidi:5000/fengdidi/fluentd-elasticsearch:1801
dockerhub.fengdidi:5000/fengdidi/fluentd-elasticsearch:1801 是image的名字和标签, 在你构建的时候,请自己起一个新的名字和标签。
构建完镜像以后,进入yaml目录,创建一个ConfigMap:
kubectl create -f fluentd-es-configmap.yaml
修改fluentd-es-ds.yaml里面的镜像名、Elasticsearch地址和端口, Elasticsearch的IP地址和端口号通过环境变量注入到镜像容器中。配置完成后,将镜像部署为一个DaemonSet。
kubectl create -f fluentd-es-ds.yaml
如果一切正常的话,就可以去Kibana中查询日志啦~