k8s容器日志收集方案

这篇具有很好参考价值的文章主要介绍了k8s容器日志收集方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景
由于以下容器本身特性和现有日志采集工具的缺陷,开发者在收集Kubernetes分布式集群日志时常常遇到困扰:

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

Log-pilot介绍
   Log-pilot是一个智能容器日志采集工具,它不仅能够高效便捷地将容器日志采集输出到多种存储日志后端,同时还能够动态地发现和采集容器内部的日志文件。
   针对前面提出的日志采集难题,Log-pilot通过声明式配置实现强大的容器事件管理,可同时获取容器标准输出和内部文件日志,解决了动态伸缩问题,此外,Log-pilot具有自动发现机制、CheckPoint及句柄保持的机制、自动日志数据打标、有效应对动态配置、日志重复和丢失以及日志源标记等问题。
基于阿里云的开源日志搜集方案,并且使用daemonset的方式部署到node节点上用来自定义搜集控制台或者固定目录下的日志文件
本次的yaml是自定义输出到后端到kafka然后由logstash过滤以后发送到es中,kibana直接读es的索引
注:在阿里云上开通阿里云sls日志收集与arms应用链路监控,
	会导致自定义安装的log-polit日志收集无法收集到日志,
	默认的阿里云自定义前缀是aliyun_logs,
	会导致冲突,需要自定义 - name: PILOT_LOG_PREFIX 日志收集格式的前缀可以解决。

架构图

 

 文章来源地址https://www.toymoban.com/news/detail-604604.html

 

log-pilot安装

#在k8s集群內以daemonset的方式来进行部署
#注:在阿里云上开通阿里云sls日志收集与arms应用链路监控,
	会导致自定义安装的log-polit日志收集无法收集到日志,
	默认的阿里云自定义前缀是aliyun_logs,
	会导致冲突,需要自定义 - name: PILOT_LOG_PREFIX 日志收集格式的前缀可以解决。


apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-pilot
  labels:
    k8s-app: log-pilot
  namespace: kube-system
spec:
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s-app: log-pilot
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: log-pilot
        image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.7-filebeat
        env:
          - name: "LOGGING_OUTPUT"
            value: "kafka"
          - name: PILOT_LOG_PREFIX
            value: ailieyun
          - name: "KAFKA_BROKERS"
            value: "192.168.200.100:9092,192.168.200.101:9092,192.168.200.102:9092"
          - name: "NODE_NAME"
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
        volumeMounts:
        - name: sock
          mountPath: /var/run/docker.sock
        - name: logs
          mountPath: /var/log/filebeat
        - name: state
          mountPath: /var/lib/filebeat
        - name: root
          mountPath: /host
          readOnly: true
        - name: localtime
          mountPath: /etc/localtime
        securityContext:
          capabilities:
            add:
            - SYS_ADMIN
      terminationGracePeriodSeconds: 30
      volumes:
      - name: sock
        hostPath:
          path: /var/run/docker.sock
      - name: logs
        hostPath:
          path: /var/log/filebeat
      - name: state
        hostPath:
          path: /var/lib/filebeat
      - name: root
        hostPath:
          path: /
      - name: localtime
        hostPath:
          path: /etc/localtime

安装zookeeper和kafka集群 

#zookeeper集群
#以其中一台机器为例
tar -zxvf zookeeper-3.4.14.tar.gz -C /data/service/
cd /data/service/zookeeper-3.4.14/ && cp conf/zoo_sample.cfg conf/zoo.cfg
查看配置:
cat /data/service/zookeeper-3.4.14/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/data/zookeeper
clientPort=2181
server.1=192.168.1.7:2888:3888
server.2=192.168.1.6:2888:3888
server.3=192.168.1.5:2888:3888
添加:
echo 1 > /data/data/zookeeper/myid
其他机器:
echo 2 > /data/data/zookeeper/myid
echo 3 > /data/data/zookeeper/myid
 
启动: /data/service/zookeeper-3.4.14/bin/zkServer.sh start
查看状态: /data/service/zookeeper-3.4.14/bin/zkServer.sh status
 
#kafka集群
tar -zxvf kafka_2.12-2.0.1.tgz -C /data/service/
#修改zookeeper链接地址:
/data/service/kafka_2.12-2.0.1/config/server.properties
zookeeper.connect=192.168.1.7:2181,192.168.1.6:2181,192.168.1.5:2181

安装logstash 

#logstash集群
tar -zxvf logstash-7.7.1.tar.gz -C /data/service/
cd /data/service/logstash-7.7.1
cat log-polit.conf
input {
  kafka {
    bootstrap_servers=>"192.168.2.137:9092,192.168.2.138:9092,192.168.2.139:9092"
    topics_pattern => "logs.*"
    client_id => "kafka_client_one"
    group_id => "logstash"
    codec => "json"
  }
}
 
filter {
  mutate {
   remove_field => ["input","beat","prospector","@version","offset"]
  }
}
 
output {
  if "nginx-access" in [tags] {
    elasticsearch {
      hosts => ["192.168.1.5:9200","192.168.1.6:9200","192.168.1.7:9200"]
      index => "%{[domain]}-%{+YYYY-MM-dd}"
    }
  } else {
    elasticsearch {
      hosts => ["192.168.1.5:9200","192.168.1.6:9200","192.168.1.7:9200"]
      index => "%{[topic]}-%{+YYYY-MM-dd}"
    }
  }
}
#cd /data/app/logstash-7.7.1 && nohup ./bin/logstash -f log-polit.conf &

es集群安装 

#es集群
tar -zxvf elasticsearch-7.7.1-linux-x86_64.tar.gz -C /data/service/
cd /data/service/elasticsearch-7.7.1
#cat elasticsearch.yml
cluster.name: kkb-logs
node.name: kkb-sys-esmaster-001
path.data: /data/data/elasticsearch/data
path.logs: /data/data/elasticsearch/logs
bootstrap.memory_lock: true
network.host: 192.168.23.30
action.auto_create_index: true
http.port: 9200
discovery.seed_hosts: ["192.168.1.18", "192.168.1.19"]
cluster.initial_master_nodes: ["192.168.1.18", "192.168.1.19"]
node.master: true
node.data: false
#设置堆内存大小
# cat jvm.options|grep "Xm"
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms6g
-Xmx6g
 
#cd /data/app/elasticsearch && ./bin/elasticsearch -d

kibana集群 

此处应该为3台机器,由于是test,所以只上了一台
rpm -ivh kibana-7.7.1-x86_64.rpm
cat /etc/kibana/kibana.yml |grep -Ev "^#|^$"
server.port: 5601
xpack.reporting.csv.maxSizeBytes: 2097152000
server.host: "192.168.1.21"
server.name: "192.168.1.21"
elasticsearch.hosts: ["http://192.168.1.18:9200","http://192.168.1.19:9200"]
elasticsearch.requestTimeout: 300000

 k8s集群日志接入

#nginx deployment
#- name: ailieyun_logs_logs-plat-file-console
#  value: "stdout"
#- name: ailieyun_logs_logs-plat-file-console_ttl
#  value: "3"
#这两行会自动在kafka集群中创建topic
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: ng-demo-1
  name: ng-demo-1
spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  replicas: 5
  selector:
    matchLabels:
      run: java-demo-1
  template:
    metadata:
      labels:
        run: ng-demo-1
    spec:
      containers:
      - image:  nginx:latest
        name: ng-demo-1
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
        env:
          - name: ailieyun_logs_logs-java-demo
            value: "stdout"
          - name: ailieyun_logs_logs-java-demo_ttl
            value: "3"

#创建好deploy以后进到容器里while true;do curl 127.0.0.1;sleep 1 ;done
#然后手动执行数据消费
./kafka-console-consumer.sh --bootstrap-server 192.168.1.5:9092,192.168.1.6:9092,192.168.1.7:9092   --topic logs-java-demo
#然后看到下面到图即视为任务收集成功

k8s 容器日志收集方案,kubernetes,容器,kafka es kibana 

 

 

 

 

 

到了这里,关于k8s容器日志收集方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(中)

    目录 一、安装存储日志组件 Elasticsearch 1.1 创建名称空间 1.2 安装 elasticsearch 组件 1)创建 headless service 服务 2)通过 statefulset 创建 elasticsearch 集群 二、安装 kibana 可视化 UI 界面 本篇文章所用到的资料文件下载地址: kibana-v7.2.0-kubernetes文档类资源-CSDN下载 https://download.csdn.ne

    2023年04月08日
    浏览(31)
  • ELK 日志系统收集K8s中日志

    • K8s弹性伸缩性:导致不能预先确定采集的目标 • 容器隔离性:容器的文件系统与宿主机是隔离,导致日志采集器读取日志文件受阻。 应用程序日志记录体现方式分为两类: • 标准输出:输出到控制台,使用kubectl logs可以看到。 例如 nginx日志是将访问日志输出到标准输出

    2024年02月09日
    浏览(28)
  • K8s 日志收集-Day 07

    官方文档:https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/ (1)node节点收集 基于daemonset部署日志收集进程,实现json-file类型(标准输出/dev/stdout、错误输出/dev/stderr)日志收集; 该方式的优点:日志收集架构简单,易部署、易维护。 该方式的缺点:node节点产生的日志、

    2024年03月26日
    浏览(29)
  • EFK简单部署收集K8S日志

    安装ES kibana K8S部署

    2024年04月27日
    浏览(23)
  • k8s部署elk+filebeat;springCloud集成elk+filebeat+kafka+zipkin实现多个服务日志链路追踪聚合到es

    如今2023了,大多数javaweb架构都是springboot微服务,一个前端功能请求后台可能是多个不同的服务共同协做完成的。例如用户下单功能,js转发到后台 网关gateway服务 ,然后到 鉴权spring-sercurity服务 ,然后到 业务订单服务 ,然后到 支付服务 ,后续还有发货、客户标签等等服务

    2024年02月16日
    浏览(31)
  • K8S部署EFK(fluentd)收集日志

    首先部署es和kinban es部署 创建es-svc es-statefulset.yaml 开启es跨域访问 部署kinban 创建kibana的configmap kinban开启中文 创建kibana 部署fluentd 创建fluentd-configmap 只收集pod label 标记为 logging=true 的日志 注意挂载的日志目录出现unreadable 说明日志软连接有问题,无法读取日志 部署fluentd-dae

    2024年02月16日
    浏览(32)
  • k8s日志收集组件 Grafana loki --- 理论篇

    当我们在k8s上运行程序时,习惯的会使用ELK来收集和查询程序运行日志。今天我们介绍一款新的专为日志收集而生的神器:Grafana loki。Grafana Loki 是一组组件,可以组合成一个功能齐全的日志堆栈。 与其他日志记录系统不同,Loki 仅构建索引有关日志的元数据:标签(就像 P

    2024年02月10日
    浏览(37)
  • 第26关 K8s日志收集揭秘:利用Log-pilot收集POD内业务日志文件

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维。 OK,到目前为止,我们的服务顺利容器化并上了K8s,同时也能通过外部网络进行请求访问,相关的服务数据也能进行持久化存储了,那么接下来很关键的事情,就是怎么去收集服务产生的日志进行数据分析及

    2024年02月03日
    浏览(35)
  • k8s命令查看容器日志

    ● namespace 以不同命名空间区分环境,如:TEST,DEV ● POD k8s运行的最小单位 ● Service 一种资源类型,将pod开放给外部访问,拥有IP地址,port,target port,前者为对外端口,后者为pod端口 kbpod 功能:列出pod 使用方式: kbpod namespace 说明:如果namespace为all,将打印所有命名空间的

    2024年02月06日
    浏览(38)
  • 容器化进阶Kubernetes(K8S)详解

    1.1.1 Kubernetes是什么及作用 Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。 Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 官网地址 Kubernetes 中文社区 Kubernetes(k8s)中文文档 目录_Kubernetes中文社

    2024年02月05日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包