Kubernetes 日志

ELK 可谓是容器日志收集、处理和搜索的黄金搭档:

  • Logstash(或者 Fluentd)负责收集日志
  • Elasticsearch 存储日志并提供搜索
  • Kibana 负责日志查询和展示

注意:Kubernetes 默认使用 fluentd(以 DaemonSet 的方式启动)来收集日志,并将收集的日志发送给 elasticsearch。

小提示

在使用 cluster/kube-up.sh 部署集群的时候,可以设置 KUBE_LOGGING_DESTINATION 环境变量自动部署 Elasticsearch 和 Kibana,并使用 fluentd 收集日志 (配置参考 addons/fluentd-elasticsearch):

  1. KUBE_LOGGING_DESTINATION=elasticsearch
  2. KUBE_ENABLE_NODE_LOGGING=true
  3. cluster/kube-up.sh

如果使用 GCE 或者 GKE 的话,还可以 将日志发送给 Google Cloud Logging,并可以集成 Google Cloud Storage 和 BigQuery。

如果需要集成其他的日志方案,还可以自定义 docker 的 log driver,将日志发送到 splunk 或者 awslogs 等。

部署方法

由于 Fluentd daemonset 只会调度到带有标签 kubectl label nodes --all beta.kubernetes.io/fluentd-ds-ready=true 的 Node 上,需要给 Node 设置标签

  1. kubectl label nodes --all beta.kubernetes.io/fluentd-ds-ready=true

然后下载 manifest 部署:

  1. $ git clone https://github.com/kubernetes/kubernetes
  2. $ cd cluster/addons/fluentd-elasticsearch
  3. $ kubectl apply -f .
  4. clusterrole "elasticsearch-logging" configured
  5. clusterrolebinding "elasticsearch-logging" configured
  6. replicationcontroller "elasticsearch-logging-v1" configured
  7. service "elasticsearch-logging" configured
  8. serviceaccount "elasticsearch-logging" configured
  9. clusterrole "fluentd-es" configured
  10. clusterrolebinding "fluentd-es" configured
  11. daemonset "fluentd-es-v1.24" configured
  12. serviceaccount "fluentd-es" configured
  13. deployment "kibana-logging" configured
  14. service "kibana-logging" configured

注意:Kibana 容器第一次启动的时候会用较长的时间(Optimizing and caching bundles for kibana and statusPage. This may take a few minutes),可以通过日志观察初始化的情况

  1. $ kubectl -n kube-system logs kibana-logging-1237565573-p88lm -f

访问 Kibana

可以从 kubectl cluster-info 的输出中找到 Kibana 服务的访问地址,注意需要在浏览器中导入 apiserver 证书才可以认证:

  1. $ kubectl cluster-info | grep Kibana
  2. Kibana is running at https://10.0.4.3:6443/api/v1/namespaces/kube-system/services/kibana-logging/proxy

这里采用另外一种方式,使用 kubectl 代理来访问(不需要导入证书):

  1. # 启动代理
  2. kubectl proxy --address='0.0.0.0' --port=8080 --accept-hosts='^*$' &

然后打开 http://<master-ip>:8080/api/v1/proxy/namespaces/kube-system/services/kibana-logging/app/kibana#。在 Settings -> Indices 页面创建一个 index,选中 Index contains time-based events,使用默认的 logstash-* pattern,点击 Create。

日志 - 图1

Filebeat

除了 Fluentd 和 Logstash,还可以使用 Filebeat 来收集日志:

  1. kubectl apply -f https://raw.githubusercontent.com/elastic/beats/master/deploy/kubernetes/filebeat-kubernetes.yaml

注意,默认假设 Elasticsearch 可通过 elasticsearch:9200 访问,如果不同的话,需要先修改再部署

  1. - name: ELASTICSEARCH_HOST
  2. value: elasticsearch
  3. - name: ELASTICSEARCH_PORT
  4. value: "9200"
  5. - name: ELASTICSEARCH_USERNAME
  6. value: elastic
  7. - name: ELASTICSEARCH_PASSWORD
  8. value: changeme

参考文档