开发者在面对 kubernetes 分布式集群下的日志需求时,常常会感到头疼,既有容器自身特性的原因,也有现有日志采集工具的桎梏,主要包括:

  • 容器本身特性:

    • 采集目标多:容器本身的特性导致采集目标多,需要采集容器内日志、容器 stdout。对于容器内部的文件日志采集,现在并没有一个很好的工具能够去动态发现采集。针对每种数据源都有对应的采集软件,但缺乏一站式的工具。
    • 弹性伸缩难:kubernetes 是分布式的集群,服务、环境的弹性伸缩对于日志采集带来了很大的困难,无法像传统虚拟机环境下那样,事先配置好日志的采集路径等信息,采集的动态性以及数据完整性是非常大的挑战。
  • 现有日志工具的一些缺陷:
    • 缺乏动态配置的能力。目前的采集工具都需要事先手动配置好日志采集方式和路径等信息,因为它无法能够自动感知到容器的生命周期变化或者动态漂移,所以它无法动态地去配置。
    • 日志采集重复或丢失的问题。因为现在的一些采集工具基本上是通过 tail 的方式来进行日志采集的,那么这里就可能存在两个方面的问题:一个是可能导致日志丢失,比如采集工具在重启的过程中,而应用依然在写日志,那么就有可能导致这个窗口期的日志丢失;而对于这种情况一般保守的做法就是,默认往前多采集 1M 日志或 2M 的日志,那么这就又会可能引起日志采集重复的问题。
    • 未明确标记日志源。因为一个应用可能有很多个容器,输出的应用日志也是一样的,那么当我们将所有应用日志收集到统一日志存储后端时,在搜索日志的时候,我们就无法明确这条日志具体是哪一个节点上的哪一个应用容器产生的。

本文档将介绍一种 Docker 日志收集工具 log-pilot,结合 Elasticsearch 和 kibana 等工具,形成一套适用于 kubernetes 环境下的一站式日志解决方案。

log-pilot 介绍

log-Pilot 是一个智能容器日志采集工具,它不仅能够高效便捷地将容器日志采集输出到多种存储日志后端,同时还能够动态地发现和采集容器内部的日志文件。

针对前面提出的日志采集难题,log-pilot 通过声明式配置实现强大的容器事件管理,可同时获取容器标准输出和内部文件日志,解决了动态伸缩问题,此外,log-pilot 具有自动发现机制,CheckPoint 及句柄保持的机制,自动日志数据打标,有效应对动态配置、日志重复和丢失以及日志源标记等问题。

目前 log-pilot 在 Github 完全开源,项目地址是 https://github.com/AliyunContainerService/log-pilot 。您可以深入了解更多实现原理。

针对容器日志的声明式配置

Log-Pilot 支持容器事件管理,它能够动态地监听容器的事件变化,然后依据容器的标签来进行解析,生成日志采集配置文件,然后交由采集插件来进行日志采集。

在 kubernetes 下,Log-Pilot 可以依据环境变量 aliyun_logs_$name = $path 动态地生成日志采集配置文件,其中包含两个变量:

  • $name 是我们自定义的一个字符串,它在不同的场景下指代不同的含义,在本场景中,将日志采集到 ElasticSearch 的时候,这个 $name 表示的是 Index。
  • 另一个是 $path,支持两种输入形式,stdout 和容器内部日志文件的路径,对应日志标准输出和容器内的日志文件。
    • 第一种约定关键字 stdout 表示的是采集容器的标准输出日志,如本例中我们要采集 tomcat 容器日志,那么我们通过配置标签 aliyun.logs.catalina=stdout 来采集 tomcat 标准输出日志。
    • 第二种是容器内部日志文件的路径,也支持通配符的方式,通过配置环境变量 aliyun_logs_access=/usr/local/tomcat/logs/*.log来采集 tomcat 容器内部的日志。当然如果你不想使用 aliyun 这个关键字,Log-Pilot 也提供了环境变量 PILOT_LOG_PREFIX 可以指定自己的声明式日志配置前缀,比如 PILOT_LOG_PREFIX: "aliyun,custom"

此外,Log-Pilot 还支持多种日志解析格式,通过 aliyun_logs_$name_format=<format> 标签就可以告诉 Log-Pilot 在采集日志的时候,同时以什么样的格式来解析日志记录,支持的格式包括:none、json、csv、nginx、apache2 和 regxp。

Log-Pilot 同时支持自定义 tag,我们可以在环境变量里配置 aliyun_logs_$name_tags="K1=V1,K2=V2",那么在采集日志的时候也会将 K1=V1 和 K2=V2 采集到容器的日志输出中。自定义 tag 可帮助您给日志产生的环境打上 tag,方便进行日志统计、日志路由和日志过滤。

日志采集模式

本文档采用 node 方式进行部署,通过在每台机器上部署一个 log-pilot 实例,收集机器上所有 Docker 应用日志。

该方案跟在每个 Pod 中都部署一个 logging 容器的模式相比,最明显的优势就是占用资源较少,在集群规模比较大的情况下表现出的优势越明显,这也是社区推荐的一种模式。

前提条件

您已经开通容器服务,并创建了一个 kubernetes 集群。本示例中,创建的 Kubernetes 集群位于华东 1 地域。

步骤1 部署 elasticsearch

  1. 连接到您的 Kubernetes 集群。具体操作参见通过SSH访问Kubernetes集群 或 通过 kubectl 连接 Kubernetes 集群
  2. 首先部署 elasticsearch 相关服务,该编排模板包含一个 elasticsearch-api 的服务、elasticsearch-discovery 的服务和 elasticsearch 的状态集,这些对象都会部署在 kube-system 命名空间下。
     
    kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/elasticsearch.yml
  3. 部署成功后,kube-system 命名空间下会出现相关对象,执行以下命令查看运行情况。
     
    $ kubectl get svc,StatefulSet -n=kube-system
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    svc/elasticsearch-api ClusterIP 172.21.5.134 <none> 9200/TCP 22h
    svc/elasticsearch-discovery ClusterIP 172.21.13.91 <none> 9300/TCP 22h
    ...
    NAME DESIRED CURRENT AGE
    statefulsets/elasticsearch   3    3      22h

步骤2 部署 log-pilot 和 kibana 服务

  1. 部署 log-pilot 日志采集工具,如下所示:

     
    kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/log-pilot.yml
  2. 部署 kibana 服务,该编排示例包含一个 service 和一个 deployment。
     
    kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/kibana.yml

步骤3 部署测试应用 tomcat

在 elasticsearch + log-pilot + Kibana 这套日志工具部署完毕后,现在开始部署一个日志测试应用 tomcat,来测试日志是否能正常采集、索引和显示。

编排模板如下。

 
apiVersion: v1
kind: Pod
metadata:
name: tomcat
namespace: default
labels:
name: tomcat
spec:
containers:
- image: tomcat
name: tomcat-test
volumeMounts:
- mountPath: /usr/local/tomcat/logs
name: accesslogs
env:
- name: aliyun_logs_catalina
value: "stdout" ##采集标准输出日志
- name: aliyun_logs_access
value: "/usr/local/tomcat/logs/catalina.*.log" ## 采集容器内日志文件
volumes:
- name: accesslogs
emptyDir: {}

tomcat 镜像属于少数同时使用了 stdout 和文件日志的 Docker 镜像,适合本文档的演示。在上面的编排中,通过在 pod 中定义环境变量的方式,动态地生成日志采集配置文件,环境变量的具体说明如下:

  • aliyun_logs_catalina=stdout表示要收集容器的 stdout 日志。
  • aliyun_logs_access=/usr/local/tomcat/logs/catalina.*.log 表示要收集容器内 /usr/local/tomcat/logs/ 目录下所有名字匹配 catalina.*.log 的文件日志。

在本方案的 elasticsearch 场景下,环境变量中的 $name 表示 Index,本例中 $name即是 catalina 和 access 。

步骤 4 将 kibana 服务暴露到公网

上面部署的 kibana 服务的类型采用 NodePort,默认情况下,不能从公网进行访问,因此本文档配置一个 ingress 实现公网访问 kibana,来测试日志数据是否正常索引和显示。

  1. 通过配置 ingress 来实现公网下访问 kibana 。本示例选择简单的路由服务来实现,您可参考Ingress 支持 获取更多方法。该 ingress 的编排模板如下所示。

     
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: kibana-ingress
    namespace: kube-system #要与 kibana 服务处于同一个 namespace
    spec:
    rules:
    - http:
    paths:
    - path: /
    backend:
    serviceName: kibana #输入 kibana 服务的名称
    servicePort: 80 #输入 kibana 服务暴露的端口
  2. 创建成功后,执行以下命令,获取该 ingress 的访问地址。
     
    $ kubectl get ingress -n=kube-system
    NAME HOSTS ADDRESS PORTS AGE
    shared-dns * 120.55.150.30 80 5m
  3. 在浏览器中访问该地址,如下所示。
  4. 单击左侧导航栏中的management ,然后单击Index Patterns > Create Index Pattern。具体的索引名称会在 $name变量后缀一个时间字符串,您可以配合通配符 * 进行创建。本例中使用 $name* 来创建 Index Pattern。

    您也可以执行以下命令,进入 elasticsearch 对应的 pod,在 index 下列出 elasticsearch 的所有索引。

     
    $ kubectl get pods -n=kube-system                #找到 elasticsearch 对应的 pod
    ...
    $ kubectl exec -it elasticsearch-1 bash #进入 elasticsearch 的一个 pod
    ...
    $ curl 'localhost:9200/_cat/indices?v' ## 列出所有索引
    health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
    green open .kibana x06jj19PS4Cim6Ajo51PWg 1 1 4 0 53.6kb 26.8kb
    green open access-2018.03.19 txd3tG-NR6-guqmMEKKzEw 5 1 143 0 823.5kb 411.7kb
    green open catalina-2018.03.19 ZgtWd16FQ7qqJNNWXxFPcQ 5 1 143 0 915.5kb 457.5kb
  5. 索引创建完毕后,单击左侧导航栏中的Discover,然后选择前面创建的 Index,选择合适的时间段,在搜索栏输入相关字段,就可以查询相关的日志。

至此,在阿里云 Kubernetes 集群上,我们已经成功测试基于 log-pilot、elasticsearch 和 kibana 的日志解决方案,通过这个方案,我们能有效应对分布式 kubernetes 集群日志需求,可以帮助提升运维和运营效率,保障系统持续稳定运行。

实例配置:

阿里云k8s 应用日志服务添加配置

连接 ealsticsearch pod 查看 索引index 

[root@k8s-hd-master03 ~]# kubectl exec -it elasticsearch-0 /bin/bash -n kube-system 

elasticsearch@elasticsearch-0:/usr/share/elasticsearch$ curl 'localhost:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .kibana CjKmfxiNSnm00rEw0Oqqqg 1 1 3 0 41.5kb 20.7kb
green open imagetrain-dev-2019.01.16 h_U5hNK7Q5uqUzxXElRS3w 5 1 744 0 1.3mb 689.2kb
7118 0 10.7mb 5.3mb
green open audit-c48ec13c7dbc94c6fba92748baaf296fc-2019.01.15 _pK_EcUbQYW_zAzeCx6vHA 5 1 1317843 0 2.4gb 1.2gb

  

在kibana 配置查看 相应的日志信息

对 kibana 域名访问添加密码,用户认证

kibana 服务配置类型改为 负载均衡 内网ip  的方式

配置nginx 代理到负载均衡的访问地址  ,nginx配置一层用户认证,需要密码输入,  域名解析再解析到 nginx的代理服务器

具体配置如下:

server {

     listen 8000;
server_name localhost;
location / {
auth_basic "kibana auth";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
proxy_pass http://192.168.0.139;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

  

yum install -y httpd  (安装 htpasswd命令)
类似apache创建密码文件
htpasswd -c /etc/nginx/conf.d/.htpasswd weifeng
New password:123456 nginx -t
nginx -s reload

  

访问效果如下:

打开页面时需要用户验证

利用 log-pilot + elasticsearch + kibana 搭建 kubernetes 日志解决方案的更多相关文章

  1. 使用 EFKLK 搭建 Kubernetes 日志收集工具栈

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247491992&idx=1&sn=a770252759 ...

  2. 用ElasticSearch,LogStash,Kibana搭建实时日志收集系统

    用ElasticSearch,LogStash,Kibana搭建实时日志收集系统 介绍 这套系统,logstash负责收集处理日志文件内容存储到elasticsearch搜索引擎数据库中.kibana ...

  3. Nginx filebeat+logstash+Elasticsearch+kibana实现nginx日志图形化展示

    filebeat+logstash+Elasticsearch+kibana实现nginx日志图形化展示   by:授客  QQ:1033553122   测试环境 Win7 64 CentOS-7- ...

  4. ElasticSearch、Logstash、Kibana 搭建高效率日志管理系统

    ELK (ElasticSearch.LogStash以及Kibana)三者组合是一个非常强大的工具,这里我们来实现监控日志文件并且收到日志到ElasticSearch搜索引擎,利用Kibana可视化 ...

  5. Filebeat+Logstash+ElasticSearch+Kibana搭建Apache访问日志解析平台

    对于ELK还不太熟悉的同学可以参考我前面的两篇文章ElasticSearch + Logstash + Kibana 搭建笔记.Log stash学习笔记(一),本文搭建了一套专门访问Apache的访 ...

  6. Elasticsearch、Logstash、Kibana搭建统一日志分析平台

    // // ELKstack是Elasticsearch.Logstash.Kibana三个开源软件的组合.目前都在Elastic.co公司名下.ELK是一套常用的开源日志监控和分析系统,包括一个分布 ...

  7. ELK(ElasticSearch+Logstash+ Kibana)搭建实时日志分析平台

    一.简介 ELK 由三部分组成elasticsearch.logstash.kibana,elasticsearch是一个近似实时的搜索平台,它让你以前所未有的速度处理大数据成为可能. Elastic ...

  8. lagstash + elasticsearch + kibana 3 + kafka 日志管理系统部署 02

    因公司数据安全和分析的需要,故调研了一下 GlusterFS + lagstash + elasticsearch + kibana 3 + redis 整合在一起的日志管理应用: 安装,配置过程,使 ...

  9. GlusterFS + lagstash + elasticsearch + kibana 3 + redis日志收集存储系统部署 01

    因公司数据安全和分析的需要,故调研了一下 GlusterFS + lagstash + elasticsearch + kibana 3 + redis 整合在一起的日志管理应用: 安装,配置过程,使 ...

随机推荐

  1. java log4j日志配置

    1.首先看pom.xml文件,需要以下配置 <dependency> <groupId>log4j</groupId> <artifactId>log4 ...

  2. git pull fails “unable to resolve reference” “unable to update local ref”

    问题 由于有人rebase了分支,或者不知道怎么搞的.其他人拉取代码的时候,发现拉不下来. >git fetch error: cannot lock ref 'refs/remotes/ori ...

  3. 【ElasticSearch】ElasticSearch-SQL插件

    ElasticSearch-SQL插件 image2017-10-27_11-10-53.png (1067×738) elastic SQL_百度搜索 Druid SQL 解析器的解析过程 - be ...

  4. RAMPS1.4 3d打印控制板接线与测试2

    http://learn.makerlab.me/guides/1/articles/2 mega 2560板子在3d打印机中相当于大脑,控制这所有的3d打印配件来完成复杂的打印工作,但mega256 ...

  5. dubbo Framework pic

    dubbo Framework pic

  6. Get file extention in XSLT

      When working with data view web parts or data form web parts in SharePoint, you might want to use ...

  7. 调试工具DebugView

      可以用来跟踪如下函数的输出: Win32 OutputDebugString Kernel-mode DbgPrint All kernel-mode variants of DbgPrint i ...

  8. iis 防火墙防止恶意ip攻击

    今天发现服务器里,一个IP不停的占用我的网络资源,然后在防火墙里配置,将其禁止访问,网络很快降了下来. 这个恶意的IP是 115.171.60.62

  9. Dapper - .Net 环境下一个简单对象映射的框架

    本文内容 特点 性能 参数化的查询 List 支持 缓存和非缓存的 readers 多个映射 多个结果 存储过程 Ansi Strings 和 varchar 限制和注意事项 Dapper 能运行在我 ...

  10. Java并发编程 - 基本概念

    在开始我们的并发编程前,我们必须预热一下,一些基本概念必须了解. 1. 同步(Synchronous) / 异步(Asynchronous) 同步和异步都指一次方法调用. 同步:方法开始后,调用者必须 ...