背景介绍
第一,对于企业来说,日志的重要性不言而喻,就不赘述了。
第二,日志收集分析展示平台的选择,这里给出几点选择ELK的理由。ELK是一套非常成熟的系统,她本身的构架非常适合Kubernetes集群,这里官网当中也是选用的 Elasticsearch作为Sample的,GitHub上下载的kubernetes二进制包中本身就有这个.yaml文件,所以使用ELK作为收集日志的理由相当充分。
对于任何基础设施或后端服务系统,日志都是极其重要的。对于受Google内部容器管理系统Borg启发而催生出的Kubernetes项目来说,自然少不了对Logging的支持。在“ Logging Overview “中,官方概要介绍了Kubernetes上的几个层次的Logging方案,并给出Cluster-level logging的参考架构:
Kubernetes还给出了参考实现:
– Logging Backend: Elastic Search stack(包括: Kibana )
– Logging-agent: fluentd
ElasticSearch stack实现的cluster level logging的一个优势在于其对Kubernetes集群中的Pod没有侵入性,Pod无需做任何配合性改动。同时EFK/ELK方案在业内也是相对成熟稳定的。
在本文中,我将为我们的Kubernetes 1.2.0集群安装Fluentd(前提 Elastic Search和kibana已经部署完成)。
一、Kubernetes 1.2.0部署脚本
Kubernetes 1.2.0集群是通过kube-up.sh搭建并初始化的。按照 K8s官方文档 有关elasticsearch logging的介绍,在kubernetes/cluster/ubuntu/config-default.sh中,有一系列配置项:
// kubernetes/cluster/ubuntu/config-default.sh
# Optional: Enable node logging.
ENABLE_NODE_LOGGING=false
LOGGING_DESTINATION=${
LOGGING_DESTINATION:-elasticsearch}
# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up.
ENABLE_CLUSTER_LOGGING=false
ELASTICSEARCH_LOGGING_REPLICAS=${
ELASTICSEARCH_LOGGING_REPLICAS:-1}
但是修改完配置文件后,EFK并没有通过kube-up.sh运行并安装elastic logging了。所以需要手工进行安装了!
镜像准备
1.2.0源码中kubernetes/cluster/addons/fluentd-elasticsearch下的manifest已经比较old了,我们直接使用kubernetes最新源码中的 manifest文件 :
k8s.io/kubernetes/cluster/addons/fluentd-elasticsearch/es-controller.yaml
分析这个yaml,我们需要这个个镜像:
gcr.io/google_containers/fluentd-elasticsearch:1.22
显然镜像都在墙外,我通过翻墙工具下载镜像并重新打tag,上传到我在hub.docker.com上的账号下。
# docker pull gcr.io/google_containers/fluentd-elasticsearch:1.2.2
# docker tag gcr.io/google_containers/fluentd-elasticsearch:1.2.2 lidnyun/elasticsearch:1.2.2
# docker push lidnyun/elasticsearch:1.2.2
下面是我们在后续安装过程中真正要使用到的镜像:
lidnyun/fluentd-elasticsearch:1.22
启动fluentd
fluentd是以 DaemonSet 的形式跑在K8s集群上的,这样k8s可以保证每个k8s cluster node上都会启动一个fluentd(注意:将image改为上述镜像地址)。
# kubectl create -f fluentd-es-ds.yaml
daemonset "fluentd-es-v1.22" created
查看daemonset中的Pod的启动情况kubectl get pods –namespace=kube-system,发现:
NAME READY STATUS RESTARTS AGE
fluentd-elasticsearch-5c2mk 0/1 ContainerCreating 0 10s
fluentd-elasticsearch-84iwz 0/1 CrashLoopBackOff 1 10s
fluentd-elasticsearch-l1rab 0/1 CrashLoopBackOff 1 10s
fluentd Pod启动失败,fluentd的日志可以通过两种方式查看,通过宿主主机/var/log/fluentd.log或者通过kubectl命令查看:
- 通过/var/log/fluentd.log
查看fluentd日志,tail -fn100 /var/log/fluentd.log
2017-03-29 08:37:35 +0000 [warn]: process died within 1 second. exit.
2017-03-29 08:38:23 +0000 [info]: reading config file path="/etc/td-agent/td-agent.conf"
2017-03-29 08:38:23 +0000 [info]: starting fluentd-0.12.31
2017-03-29 08:38:23 +0000 [info]: gem 'fluent-mixin-config-placeholders' version '0.4.0'
2017-03-29 08:38:23 +0000 [info]: gem 'fluent-mixin-plaintextformatter' version '0.2.6'
2017-03-29 08:38:23 +0000 [info]: gem 'fluent-plugin-docker_metadata_filter' version '0.1.3'
2017-03-29 08:38:23 +0000 [info]: gem 'fluent-plugin-elasticsearch' version '1.5.0'
2017-03-29 08:38:23 +0000 [info]: gem 'fluent-plugin-kafka' version '0.4.1'
2017-03-29 08:38:23 +0000 [info]: gem 'fluent-plugin-kubernetes_metadata_filter' version '0.24.0'
2017-03-29 08:38:23 +0000 [info]: gem 'fluent-plugin-mongo' version '0.7.16'
2017-03-29 08:38:23 +0000 [info]: gem 'fluent-plugin-rewrite-tag-filter' version '1.5.5'
2017-