Kubernetes 实战 | 配置日志系统

尽管 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 日志就代表安装成功了。