logPilot + elasticsearch +kibana 监控 k8s容器日志

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

容器自己特性:

采集目标多:容器自己的特性致使采集目标多,须要采集容器内日志、容器 stdout。对于容器内部的文件日志采集,如今并无一个很好的工具可以去动态发现采集。针对每种数据源都有对应的采集软件,但缺少一站式的工具。
弹性伸缩难:kubernetes 是分布式的集群,服务、环境的弹性伸缩对于日志采集带来了很大的困难,没法像传统虚拟机环境下那样,事先配置好日志的采集路径等信息,采集的动态性以及数据完整性是很是大的挑战。nginx

现有日志工具的一些缺陷:

缺少动态配置的能力。目前的采集工具都须要事先手动配置好日志采集方式和路径等信息,由于它没法可以自动感知到容器的生命周期变化或者动态漂移,因此它没法动态地去配置。
日志采集重复或丢失的问题。由于如今的一些采集工具基本上是经过 tail 的方式来进行日志采集的,那么这里就可能存在两个方面的问题:一个是可能致使日志丢失,好比采集工具在重启的过程当中,而应用依然在写日志,那么就有可能致使这个窗口期的日志丢失;而对于这种状况通常保守的作法就是,默认往前多采集 1M 日志或 2M 的日志,那么这就又会可能引发日志采集重复的问题。
未明确标记日志源。由于一个应用可能有不少个容器,输出的应用日志也是同样的,那么当咱们将全部应用日志收集到统一日志存储后端时,在搜索日志的时候,咱们就没法明确这条日志具体是哪个节点上的哪个应用容器产生的。git

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

log-pilot 介绍

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

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

目前 log-pilot 在 Github 彻底开源,项目地址是 https://github.com/AliyunContainerService/log-pilot 。您能够深刻了解更多实现原理。后端

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

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

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

$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"。bash

此外,Log-Pilot 还支持多种日志解析格式,经过 aliyun_logs_$name_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 容器的模式相比,最明显的优点就是占用资源较少,在集群规模比较大的状况下表现出的优点越明显,这也是社区推荐的一种模式。

步骤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
  1. 部署成功后,kube-system 命名空间下会出现相关对象,执行如下命令查看运行状况。
[root@kube-master log-pilot]# kubectl get svc,sts -n kube-system
NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
service/elasticsearch-api         ClusterIP   10.245.246.19    <none>        9200/TCP                 83m
service/elasticsearch-discovery   ClusterIP   10.245.235.227   <none>        9300/TCP                 83m
service/kibana                    NodePort    10.245.82.6      <none>        80:31526/TCP             83m

NAME                             READY   AGE
statefulset.apps/elasticsearch   3/3     83m

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

  1. 部署 log-pilot 日志采集工具,以下所示:
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/log-pilot.yml
  1. 部署 kibana 服务,该编排示例包含一个 service 和一个 deployment。
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/kibana.yml

步骤3 部署测试应用 tomcat

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

[root@kube-master log-pilot]# cat tomcat.yaml 
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-stdout
       value: "stdout"
     - name: aliyun_logs_catalina
       value: "/usr/local/tomcat/logs/catalina.*.log"
     - name: aliyun_logs_access
       value: "/usr/local/tomcat/logs/localhost_access_log.*.txt"
  volumes:
    - name: accesslogs
      emptyDir: {}

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

  1. aliyun_logs_catalina=stdout表示要收集容器的 stdout 日志。
  2. aliyun_logs_access=/usr/local/tomcat/logs/localhost_access_log..txt 表示要收集容器内 /usr/local/tomcat/logs/ 目录下全部名字匹配 localhost_access_log..txt 的文件日志。
    在本方案的 elasticsearch 场景下,环境变量中的 $name 表示 Index,本例中 $name便是 catalina、catalina-stdout 和 access 。

步骤 4 获取kibana得svc,默认kibana得service type为nodeport,经过k8s ip+ nodeport访问kibana

[root@kube-master log-pilot]# kubectl get svc -n kube-system
NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
elasticsearch-api         ClusterIP   10.245.246.19    <none>        9200/TCP                 89m
elasticsearch-discovery   ClusterIP   10.245.235.227   <none>        9300/TCP                 89m
kibana                    NodePort    10.245.82.6      <none>        80:31526/TCP             89m

单击左侧导航栏中的management ,而后单击Index Patterns > Create Index Pattern。具体的索引名称会在 $name变量后缀一个时间字符串,您能够配合通配符 * 进行建立。本例中使用 $name* 来建立 Index Pattern。

您也能够执行如下命令,进入 elasticsearch 对应的 pod,在 index 下列出 elasticsearch 的全部索引

[root@kube-master log-pilot]# kubectl get pods -A -l app=es 
NAMESPACE     NAME              READY   STATUS    RESTARTS   AGE
kube-system   elasticsearch-0   1/1     Running   0          87m
kube-system   elasticsearch-1   1/1     Running   0          86m
kube-system   elasticsearch-2   1/1     Running   0          85m


[root@kube-master log-pilot]# kubectl exec -it elasticsearch-0 -n kube-system -- bash
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                    uzM03HQiSfapnZXkgq2vWg   1   1          4            0     48.6kb         24.3kb
green  open   catalina-2019.08.29        5EZoJzmPRXS9X4TInJ2oqQ   5   1         44            0    203.8kb        101.9kb
green  open   access-2019.08.29          Q2mtVT2vThSomv9XQmuYjg   5   1          9            0    151.3kb         75.6kb
green  open   catalina-stdout-2019.08.29 VmepvHN6Sq6UvP-RH81Qgw   5   1         44            0      211kb        105.4kb

索引建立完毕后,单击左侧导航栏中的Discover,而后选择前面建立的 Index,选择合适的时间段,在搜索栏输入相关字段,就能够查询相关的日志。

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

配置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

或者经过openssl passwd 
[root@test ~]# openssl passwd 12345
[root@test ~]# echo "admin:fIHcRVEKijgoM" > htpasswd
[root@test ~]# cat htpasswd
admin:fIHcRVEKijgoM

nginx -t
nginx -s  reload
相关文章
相关标签/搜索