容器服务中使用ELK

容器服务中使用ELK

日志是IT系统的重要组成部分,记录了系统在什么时候发生了什么事情。我们可以根据日志排查系统故障,也可以做统计分析。通常日志存放在本机的日志文件里,需要查看日志的时候,登录到机器上,用grep等工具过滤关键字。但是当应用要部署在多台机器上的时候,这种方式查看日志就很不方便了,为了找到一个特定的错误对应的日志,不得不登录到所有的机器上,一个文件一个文件的过滤。于是出现了集中式的日志存储方式:所有日志收集到日志服务里,在日志服务里可以查看和搜索日志。

在Docker环境里,集中式日志存储更加重要。相比传统的运维模式,Docker通常使用编排系统管理容器,容器和宿主机之间的映射并不固定,容器也可能不断的在宿主机之间迁移,登录到机器上查看日志的方式完全没法用了,集中式日志成了唯一的选择。

容器服务集成了阿里云日志服务,通过声明的方式自动收集容器日志到日志服务。但是有些用户可能更喜欢用elasticsearch、logstash、kibana这个组合,这篇文章我就介绍下如何在容器服务里使用ELK。

整体结构

容器服务中使用ELK

我们要部署一个独立的logstash集群,logstash比较重,很耗资源,所以不会在每台机器上都运行logstash,更不要说每个Docker容器里。为了采集容器日志,我们会用到syslog、logspout和filebeat,当然你还可能会用到其他的采集方式。

为了尽可能贴合实际场景,这里我们创建两个集群,一个ELK集群,只部署ELK,另外一个应用集群,用于部署应用。

部署ELK

在容器服务里部署elasticsearch非常简单。使用下面的编排文件一键部署。

注意:elasticsearch需要2g以上的内存,部署ELK的机器内存至少4G,最好8G

注意:为了能让其他服务想logstash发送日志,我们在logstash前面配置了slb。先到slb控制台创建一个slb,监听端口5000和5044,不用添加后端服务。*不要忘了修改编排文件中的slb id

version: '2'
services:
  elasticsearch:
    image: elasticsearch

  kibana:
    image: kibana
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200/
    labels:
      aliyun.routing.port_5601: kibana
    links:
      - elasticsearch

  logstash:
    image: registry.cn-hangzhou.aliyuncs.com/acs-sample/logstash
    hostname: logstash
    ports:
      - 5044:5044
      - 5000:5000
    labels:
      aliyun.lb.port_5044: 'tcp://${SLB_ID}:5044' #先创建slb
      aliyun.lb.port_5000: 'tcp://${SLB_ID}:5000'
    links:
      - elasticsearch

在这个编排文件里,elasticsearch和kibana我们直接使用了官方镜像,没有任何更改。logstash需要配置文件,所以不得不自己做了一个镜像,把配置文件放进去。镜像源码在这里:https://github.com/AliyunContainerService/demo-logstash , logstash的配置文件如下

input {
    beats {
        port => 5044
        type => beats
    }

    tcp {
        port => 5000
        type => syslog
    }

}

filter {
}

output {
    elasticsearch { 
        hosts => ["elasticsearch:9200"]
    }

    stdout { codec => rubydebug }
}

这是一个非常简单的logstash配置,我们提供了syslog和filebeats两种输入格式,对外的端口分别是5044和5000。

容器服务中使用ELK

好了,现在可以访问kibana看看。URL可以在应用的路由列表里找到。

容器服务中使用ELK

Excited!已经能打开kibana,不过还没有任何日志。接下来想办法写点日志到elasticsearch里。

收集日志

Docker里,标准的日志方式是用Stdout,所以我们先演示如何把Stdout收集到ELK,如果你在使用文件日志,可以直接用filebeat。我们用wordpress作为演示用的例子,下面是wordpress的编排模板。我们在另外一个集群中创建应用wordpress

version: '2'
services:
  mysql:
      image: mysql
      environment:
        - MYSQL_ROOT_PASSWORD=password

  wordpress:
      image: wordpress
      labels:
        aliyun.routing.port_80: wordpress
      links:
        - mysql:mysql
      environment:
        - WORDPRESS_DB_PASSWORD=password
      logging:
        driver: syslog
        options:
          syslog-address: 'tcp://${SLB_IP:5000'

待部署成功后,找到wordpress的访问地址,打开页面

容器服务中使用ELK

然后再打开kibana的页面,可以看到已经收集到日志了

容器服务中使用ELK

上一篇:Galera Cluster中节点异常宕机排查


下一篇:MySQL离线分析工具innochecksum