专栏首页TKE学习分享TKE中部署EFK日志收集

TKE中部署EFK日志收集

目前主流的Kubernetes中采集日志主要有两种形式

第一种:DaemonSet

通过DaemonSet在每一台Node节点上跑一个Filebeat或fluentd,然后通过挂载的形式将容器日志与该Pod关联,从而处理发送至后端存储;

优点:不会对应用与Pod有侵入性;

这种方案,要求应用输出的日志,都必须是直接输出到容器的 stdout 和 stderr 中。

第二种:SideCar

通过Sidecar的形式,每一个Pod中都包含一个Filebeat或Fluentd,从而直接将日志处理发送至后端存储。

优点:部署简单,对宿主机也非常友好;

缺点:由于是Sidecar的形式,每一个Pod下多起了一个容器,资源消耗会增多;

特殊:此种方式不仅可以实现直接输出到容器的 stdout 和 stderr 中的日志收集,也可以实现对特定文件内容的收集。

这里我们采用DaemonSet这种形式来进行日志收集系统的部署。

1、为了方便辨识区分,这里新建一个namspaces;

kubectl create namespaces ns-log

2、部署ES集群;

es-svc.yml

这里的Service采用一个clusterIP=None的Headless Service

有时不需要或不想要负载均衡,以及单独的Service IP。遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为“None”来创建Headless Service。这类Service 并不会分配Cluster IP,kube-proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由。

kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
  namespace: ns-log
  labels:
    app: elasticsearch
spec:
  selector:
    app: elasticsearch
  clusterIP: None
  ports:
    - port: 9200
      name: rest
    - port: 9300
      name: inter-node

由于我们是在TKE上部署elasticsearch,所以这里我们持久化存储先创建一个StorageClass。

es-statefulset.yml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-cluster
  namespace: ns-log
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: elasticsearch:7.7.0
        resources:
            limits:
              cpu: 1000m
            requests:
              cpu: 100m
        ports:
        - containerPort: 9200
          name: rest
          protocol: TCP
        - containerPort: 9300
          name: inter-node
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        env:
          - name: cluster.name
            value: k8s-logs
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: discovery.zen.ping.unicast.hosts
            value: "es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch"
          - name: discovery.zen.minimum_master_nodes
            value: "2"
          - name: ES_JAVA_OPTS
            value: "-Xms512m -Xmx512m"
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      - name: increase-vm-max-map
        image: busybox
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: increase-fd-ulimit
        image: busybox
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
  volumeClaimTemplates:
  - metadata:
      name: data
      labels:
        app: elasticsearch
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: es-log
      resources:
        requests:
          storage: 50Gi

3、部署Kibana;

apiVersion: v1
kind: Service
metadata:
  name: kibana
  namespace: ns-log
  labels:
    app: kibana
spec:
  ports:
  - port: 5601
  # 由于是web界面,使用NodePort方式便于访问
  type: NodePort
  selector:
    app: kibana
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: ns-log
  labels:
    app: kibana
spec:
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: kibana:7.7.0
        resources:
          limits:
            cpu: 1000m
          requests:
            cpu: 100m
        env:
          - name: ELASTICSEARCH_URL
            value: http://elasticsearch:9200
        ports:
        - containerPort: 5601

4、部署fluentd;

fluentd-configmap.yml

kind: ConfigMap
apiVersion: v1
metadata:
  name: fluentd-config
  namespace: ns-log
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
data:
  system.conf: |-
    <system>
      root_dir /tmp/fluentd-buffers/
    </system>
  containers.input.conf: |-
    <source>
      @id fluentd-containers.log
      @type tail
      path /var/log/containers/*.log
      pos_file /var/log/es-containers.log.pos
      time_format %Y-%m-%dT%H:%M:%S.%NZ
      localtime
      tag raw.kubernetes.*
      format json
      read_from_head true
    </source>
    # Detect exceptions in the log output and forward them as one log entry.
    <match raw.kubernetes.**>
      @id raw.kubernetes
      @type detect_exceptions
      remove_tag_prefix raw
      message log
      stream stream
      multiline_flush_interval 5
      max_bytes 500000
      max_lines 1000
    </match>
  system.input.conf: |-
    # Logs from systemd-journal for interesting services.
    <source>
      @id journald-docker
      @type systemd
      filters [{ "_SYSTEMD_UNIT": "docker.service" }]
      <storage>
        @type local
        persistent true
      </storage>
      read_from_head true
      tag docker
    </source>
    <source>
      @id journald-kubelet
      @type systemd
      filters [{ "_SYSTEMD_UNIT": "kubelet.service" }]
      <storage>
        @type local
        persistent true
      </storage>
      read_from_head true
      tag kubelet
    </source>
  forward.input.conf: |-
    # Takes the messages sent over TCP
    <source>
      @type forward
    </source>
  output.conf: |-
    # Enriches records with Kubernetes metadata
    <filter kubernetes.**>
      @type kubernetes_metadata
    </filter>
    <match **>
      @id elasticsearch
      @type elasticsearch
      @log_level info
      include_tag_key true
      host elasticsearch
      port 9200
      logstash_format true
      request_timeout    30s
      <buffer>
        @type file
        path /var/log/fluentd-buffers/kubernetes.system.buffer
        flush_mode interval
        retry_type exponential_backoff
        flush_thread_count 2
        flush_interval 5s
        retry_forever
        retry_max_interval 30
        chunk_limit_size 2M
        queue_limit_length 8
        overflow_action block
      </buffer>
    </match>

fluentd.daemonset.yml

apiVersion: apps/v1beta2
kind: DaemonSet
metadata:
  name: fluentd-es
  namespace: ns-log
  labels:
    k8s-app: fluentd-es
    version: v2.0.4
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  selector:
    matchLabels:
      k8s-app: fluentd-es
      version: v2.0.4
  template:
    metadata:
      labels:
        k8s-app: fluentd-es
        kubernetes.io/cluster-service: "true"
        version: v2.0.4
      # This annotation ensures that fluentd does not get evicted if the node
      # supports critical pod annotation based priority scheme.
      # Note that this does not guarantee admission on the nodes (#40573).
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      serviceAccountName: fluentd-es
      containers:
      - name: fluentd-es
        image: cnych/fluentd-elasticsearch:v2.0.4
        env:
        - name: FLUENTD_ARGS
          value: --no-supervisor -q
        resources:
          limits:
            memory: 500Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /data/docker/containers
          readOnly: true
        - name: config-volume
          mountPath: /etc/fluent/config.d
      #nodeSelector:
      #  beta.kubernetes.io/fluentd-ds-ready: "true"
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /data/docker/containers
      - name: config-volume
        configMap:
          name: fluentd-config

原文链接:https://cloud.tencent.com/developer/article/1642235

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TKE中部署日志聚合工具Loki

    Loki是受Prometheus启发的水平可扩展,高度可用的多租户日志聚合系统。它的设计具有很高的成本效益,并且易于操作。它不索引日志的内容,而是为每个日志流设...

    聂伟星
  • 【云+社区年度征文】TKE实战排错

    公司企业面对不断变化的用户需求,对于应用的快速开发上线提出了新的挑战,一方面在功能性能方面要求越来越高,另一方面对安全性、稳定性、高可用性、可扩展性也越来越苛刻...

    KaliArch
  • TKE上搭建EFK日志采集系统

    需要创建一个SC,用来后续ES创建时候动态挂载PVC,在腾讯云中,如果挂载了卷,又起了多个pod,可以采用自动动态挂载PVC

    聂伟星
  • Kuberentes 1.20.5搭建eck

    https://cloud.tencent.com/act/season?from=14065

    对你无可奈何
  • 051.Kubernetes集群管理-日志管理

    在Kubernetes集群环境中,一个完整的应用或服务都会涉及为数众多的组件运行,各组件所在的Node及实例数量都是可变的。日志子系统如果不做集中化管理,则会给...

    木二
  • tke容器中部署LogListener采集日志到cls

    tke集群容器的业务日志采集通常都是用日志采集组件采集日志,但是有一个问题就是,日志采集无法扩地域投递到cls,也就是说集群的日志只能投递到同地域的cls中,但...

    聂伟星
  • Centos 7.3 简便搭建EFK日志分析

    EFK 不是一个软件,而是一套解决方案。EFK 是三个开源软件的缩写,Elasticsearch,FileBeat,Kibana。其中 ELasticsearc...

    小手冰凉
  • Kubernetes K8S之Helm部署ELK日志分析系统 chart下载与配置修改Elasticsearch部署Elasticsearch访问elasticsea

    ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。

    踏歌行
  • Docker通过EFK(Elasticsearch + Fluentd + Kibana)查询日志

    Elasticsearch是一个开源搜索引擎,以易用性着称。kibana是一个图形界面,可以在上面条件检索存储在ElasticSearch里数据,相当于提供了E...

    py3study
  • k8s集群之日志收集EFK架构

    http://tonybai.com/2017/03/03/implement-kubernetes-cluster-level-logging-with-fl...

    三杯水Plus
  • EFK(Elasticsearch+Filebeat+Kibana)日志收集系统

    Elasticsearch 是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索,它通常用于索引和搜索大量日志数据,也可用于搜索许多不同类型的文档。

    Java架构师必看
  • 一文读懂开源日志管理方案 ELK 和 EFK 的区别

    主流的 ELK (Elasticsearch, Logstash, Kibana) 目前已经转变为 EFK (Elasticsearch, Filebeat o...

    iMike
  • EFK教程 - EFK快速入门指南

    通过部署elasticsearch(三节点)+filebeat+kibana快速入门EFK,并搭建起可用的demo环境测试效果

    小慢哥Linux运维
  • EFK实战一 - 基础环境搭建

    在分布式系统中,由于节点服务会部署多台,一旦出现线上问题需要通过日志分析定位问题就需要登录服务器一台一台进行日志检索,非常不便利,这时候就需要用到EFK日志收集...

    JAVA日知录
  • Kubernetes中部署ELK Stack日志收集平台

    ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被称为Elastic Stack。其中Elasticsea...

    没有故事的陈师傅
  • 理解OpenShift(6):集中式日志处理

    理解OpenShift(5):从 Docker Volume 到 OpenShift Persistent Volume

    SammyLiu
  • EFK教程(5) - ES集群开启用户认证

    ▷ 在第一篇《EFK教程 - 快速入门指南》中,阐述了EFK的安装部署,其中ES的架构为三节点,即master、ingest、data角色同时部署在三台服务器上...

    小慢哥Linux运维
  • 腾讯云 TKE Everywhere 特性发布,用户可在自有基础设施中托管 K8s 服务

    孔令飞,腾讯云资深工程师,拥有大规模 Kubernetes 集群、微服务的研发和架构经验,目前专注于云原生混合云领域的基础架构开发。 朱翔,腾讯云容器服务高级...

    腾讯云原生
  • 开发更高可用、高质量的服务的一些建议

    产品要求的功能都都开发完了,但这并不是终结。怎么样做才能让我们的服务具有更好的质量。 笔者结合自己的遇到的问题和工作中的经验,并以提问的方式,给读者一点点建议

    sunsky

扫码关注云+社区

领取腾讯云代金券