尽管 Kubernetes Dashboard 允许我们直接进入 Pod 容器中查看日志,但是在实际的系统中,Pod 容器可能经历创建、销毁等过程,一个服务也可能由多个 Pod 负载均衡提供。因此,我们最好配置一套完整的日志收集、分析、搜索、查看系统,方便我们对系统进行监控。
而常用的集群日志系统就是 EFK,即 Elastic Search、Filebeat、Kibana。
EFK 简介
Elastic Search 是一款分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例;Filebeat 则是一种 Beats(其他的还有 Metric Beats 等),用来收集数据并上报给 Elastic Search;而 Kibana 则给用户提供了友好的界面进行日志分析。
添加官方 Helm Charts 源
Elastic 公司为 Kubernetes 集群提供了 Helm Charts,我们可以很轻松地一键部署需要的应用,但是需要执行下面的命令来添加 Elastic 的 Helm Charts 源:
helm repo add elastic https://helm.elastic.co
在 GitHub 上也可以看到这些 Charts 的详细配置方法:https://github.com/elastic/helm-charts/
部署 Elastic Search
由于 Elastic Search 是数据库应用,因此需要 StatefulSet 来部署。在部署之前,需要为其创建 PersistentVolume 来提供存储资源。
我们有一台 8x8T RAID5 SAS 存储服务器,运行 NFS 服务,因此我们声明了 NFS 的 PV。
apiVersion: v1
kind: PersistentVolume
metadata:
name: elasticsearch-node-1-pv
namespace: kube-logging
spec:
capacity:
storage: 250Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /mnt/storage/elasticsearch/node-1
server: nfs-server
readOnly: false
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: elasticsearch-node-2-pv
namespace: kube-logging
spec:
capacity:
storage: 250Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /mnt/storage/elasticsearch/node-2
server: nfs-server
readOnly: false
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: elasticsearch-node-3-pv
namespace: kube-logging
spec:
capacity:
storage: 250Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /mnt/storage/elasticsearch/node-3
server: nfs-server
readOnly: false
准备好充足的存储的空间之后,就可以安装官方的 Helm Chart 了。
helm install --namespace kube-logging --name elasticsearch elastic/elasticsearch
需要注意的是,默认的配置对于实际应用来说太小了,需要手动调整一些参数。例如 esJavaOpts
可以适当调大一些,我使用的是 -Xmx16g -Xms16g
,同时 resources
也要调大一些,否则会被 Kubernetes 杀掉或者运行过慢。
安装 Filebeat
如果没有改变 Elastic Search 的名字,那直接安装官方的 Chart 即可。
helm install --namespace kube-logging --name filebeat elastic/filebeat
安装 Kibana
这个也是直接安装官方 Chart 即可:
helm install --namespace kube-logging --name kibana elastic/kibana
如果需要浏览器访问,则需要自己安装 Ingress:
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: kibana
namespace: kube-logging
spec:
rules:
- host: kibana.kubernetes
http:
paths:
- path: /
backend:
serviceName: kibana-kibana
servicePort: 5601
打开设定的域名,看到 Kibana 能读取 Elastic Search 收集的 Filebeat 日志就代表安装成功了。