使用EFK收集Kubernetes多集群日志

使用EFK收集Kubernetes多集群日志

Collecting logs for multi kubernetes clusters with EFKjavascript

在有多个集群的状况下,一个集群就搭建一套日志收集分析服务实在太浪费。所以能够尝试只跑一套Elasticsearch和Kibana实例,而后让各个集群中的日志收集器向Elasticsearch发送日志。html

如图所示:java

graph TD

Elastic[Elastic server]

Elastic-->|analysis the data|Kibana

cluster1-->|send log|Elastic
cluster2-->|send log|Elastic
cluster3-->|send log|Elastic
cluster(...)-->|send log|Elastic

Elasticsearch和Kibana能够放在Kubernetes集群中也能够独立部署。这里为了方便就选择独立部署.node

部署ElasticSearch和Kibana

Elastic自建了docker镜像仓库,所以到https://www.docker.elastic.co/拉去最新的Elasticsearch和Kibana 的镜像.git

而后编写docker-compose.yaml文件.github

关于详细配置,参考官方文档:docker

version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.0
    restart: unless-stopped
    ports:
     - "9200:9200"
     - "9300:9300"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: -1
        hard: -1
    environment:
      bootstrap.memory_lock: "true"
      discovery.type: "single-node"
    volumes:
     - /opt/es_data:/usr/share/elasticsearch/data
  kibana:
    image: docker.elastic.co/kibana/kibana:6.4.0
    restart: unless-stopped
    ports:
     - "5601:5601"
    environment:
      server.host: "0.0.0.0"
      elasticsearch.url: "http://elasticsearch:9200"
    volumes:
    # 挂载kibana.yaml,能够在其中编写更详细的配置.这里图方便,用环境变量传进去.
    #  - ./kibana.yml:/usr/share/kibana/config/kibana.yml:ro
     - /opt/kibana_data:/usr/share/kibana/data

而后启动docker-compose up -d,查看日志 docker-compose logs -f能够看到ES和Kibana输出的所有都是INFO等级的日志,没有ERROR,而且Kibana已经链接上ES。json

curl -X GET 127.0.0.1:9200bootstrap

{
  "name" : "h9sEa61",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "8MjE8hwVSq2Vvbe2azZggQ",
  "version" : {
    "number" : "6.4.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "595516e",
    "build_date" : "2018-08-17T23:18:47.308994Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

curl 127.0.0.1:5601浏览器

<script>
var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';

var hash = window.location.hash;
if (hash.length) {
  window.location = hashRoute + hash;
} else {
  window.location = defaultRoute;
}
</script>

能够看到ES和Kibana成功返回数据.

部署Fluent

将Fluent以DaemonSet的方式部署在Kuberntes集群中,让Fluent收集每一个Node上的日志。

在Gihub上Fluent的官方库下载fluentd-daemonset-elasticsearch-rbac.yaml

只需对yaml文件修改一个地方,就是将envFLUENT_ELASTICSEARCH_HOST的value改为ES的IP地址或网址便可。至于X-Pack的鉴权,ES默认是收费使用的,暂不用理会,或装第三方的HTTP Basic Auth实现鉴权。

同时有的人会遇到一个错误,若是K8s集群是用root权限运行的,则fluentd在收集日志的时候会遇到权限问题。

由于fluentd镜像在构建的时候用的是fluent用户权限运行,因此会发生权限不足的状况。

解决方法就是能够去拉取fluent代码自行构建并在Dockfile中指定用户;或使用最简单的方法,在env中指定fluent用户的UID为0,以下所示:

...
        env:
          - name: FLUENT_UID
            value: "0"
...

查看es日志,发现相似以下的日志

xxx update_mapping [fluentd]

说明fluent已经链接.

用浏览器打开Kibana,点击Discover栏能够看到相似logstash-xxxx.xx.xx的条目,说明Kibana成功获取到了日志。接下来就是根据本身的日志格式编写过滤语句了。

相关文章
相关标签/搜索