成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一份接地氣的Kubernetes日志方案

云計算 云原生
本文主要聊聊Kubernetes場景下收集微服務應用日志方案,相對來說更接地氣,非常好落地。

微服務應用的日志鏈路一般比較長,包含以下環節:日志收集 → 日志緩沖 → 日志過濾清洗 → 日志存儲 → 日志展示。每個環節都有多種對應的組件去解決,這樣的結果就是業內組合出了多種整體解決方案。

以前我的微服務部署在IDC機房虛擬機時,采用的是ELK(Elasticsearch、Logstash、Kibana)方案,這也是通用的微服務應用的日志解決方案。幾年前我們的應用部署整體切到Kubernetes后,我依舊采用了這套方案。

下面介紹Kubernetes場景下基于ELK的日志解決方案。整體思路:Filebeat -> Kafka -> Logstash -> Elasticsearch -> Kibana。

1、日志數據流轉

日志數據流轉見下圖:

2、日志采集

2.1、容器日志在哪兒

首先得有個概念:容器只是K8S集群Node上的一個進程。要在K8S集群機器上找到此Docker進程,然后進入到對應的文件夾里查看日志文件。

一般情況下,容器的日志存放在宿主機上的這個目錄下/var/lib/docker/containers/:

# 日志在宿主機的這個文件夾下
cd /var/lib/docker/containers
# 用這個命令可以查找對應的日志文件
find /var/lib/docker/containers -name "*-json.log"

進入到/var/lib/docker/containers/下,看到的是一堆毫無規律的文件夾。

看到這些毫無規律的文件夾名稱,會一下子有點懵,但是仔細看看,其實這些碼是對應的Docker容器的id。繼續通過名稱查看容器id。

# docker命令查看容器
docker ps -a

找到了容器id之后,可以看到用容器id的前幾位,可以完全匹配到,日志文件夾名稱的前幾位。docker ps 顯示的容器id只是顯示了整個id的前幾位。

進入到日志文件夾后,就可以看到具體的json日志文件了。

至此已經知道日志文件存放的位置了。當然啦,要控制好日志級別,還要做好日志清理任務,否則大量的日志會導致磁盤空間不夠。Pod銷毀之后,日志文件也會被銷毀的。

文件找到了接下來,就看怎么采集日志了。

2.2、日志采集工具

日志采集工具有多種,本文采用Filebeat作為日志采集工具。

Filebeat是用于轉發和匯總日志與文件的輕量級傳送程序。作為服務器上的代理安裝,Filebeat會監視你指定的日志文件或位置。然后收集日志事件,并將它們轉發到Elasticsearch或Logstash或Kafka。官方文檔顯示的工作流程如下:

Filebeat的主要優勢有:

  • 輕量級并且易使用
  • 免費開源
  • 資源使用率低
  • 良好的性能

2.3、日志如何采集

日志采集工具選型確定之后,接下來就是如何采集了。

K8S部署的場景下,想要收集每臺Node下的容器日志,需要采用Deamonset控制器自動部署,這樣每次新增節點時,會自動部署Filebeat的Pod。每臺Node自動安裝好Filebeat后,每臺Node上的日志會被自動采集,然后輸出到Kafka。

Filebeat大致的編排yaml如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: ops-monit
  labels:
    k8s-app: filebeat
data:
  filebeat.yml: |-
    filebeat.inputs:
    - type: container #因為是采集的容器日志,所以這里要用container 不能用 log,否則拿不到容器日志
      enable: true
      stream: stdout #只取stdout日志
      paths:
        - /var/log/containers/*demo*.log #采集了demo環境的所有日志
      processors:
        - add_kubernetes_metadata: # 增加kubernetes的屬性
            in_cluster: true
            host: ${NODE_NAME}
            matchers:
            - logs_path:
                logs_path: "/var/log/containers/"
        - drop_event:
            when:
              contains:
                message: "INFO"
        - drop_event:
            when:
              contains:
                message: "DEBUG"
      # 配置多行顯示
      multiline.type: pattern
      multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
      multiline.negate: true
      multiline.match: after
      fields:
        logtype: applog
    output.kafka:
      hosts: ['172.10.10.10:9092','172.10.10.11:9092','172.10.10.12:9092']
      topic: 'topic-bizlog'
      partition.round_robin:
        reachable_only: false
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: ops-monit
  labels:
    k8s-app: filebeat
spec:
  selector:
    matchLabels:
      k8s-app: filebeat
  template:
    metadata:
      labels:
        k8s-app: filebeat
    spec:
      serviceAccountName: filebeat
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirstWithHostNet
      containers:
        - name: filebeat
          image: elastic/filebeat:7.12.1
          args: [
              "-c", "/etc/filebeat.yml",
              "-e",
          ]
          env:
            - name: ELASTICSEARCH_HOST
              value: "172.10.20.10"
            - name: ELASTICSEARCH_PORT
              value: "9200"
            - name: ELASTICSEARCH_USERNAME
              value:
            - name: ELASTICSEARCH_PASSWORD
              value:
            - name: ELASTIC_CLOUD_ID
              value:
            - name: ELASTIC_CLOUD_AUTH
              value:
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
          securityContext:
            runAsUser: 0
            # If using Red Hat OpenShift uncomment this:
            # privileged: true
          resources:
            limits:
              cpu: 3000m
              memory: 2000Mi
            requests:
              cpu: 500m
              memory: 100Mi
          volumeMounts:
            - name: timezone
              mountPath: /etc/localtime
            - name: config
              mountPath: /etc/filebeat.yml
              readOnly: true
              subPath: filebeat.yml
            - name: data
              mountPath: /usr/share/filebeat/data
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
            - name: varlog
              mountPath: /var/log
      volumes:
        - name: timezone
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
        - name: config
          configMap:
            defaultMode: 0640
            name: filebeat-config
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers
        - name: varlog
          hostPath:
            path: /var/log
        - name: data
          hostPath:
            path: /var/lib/filebeat-data
            type: DirectoryOrCreate
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: filebeat
  namespace: ops-monit
subjects:
  - kind: ServiceAccount
    name: filebeat
    namespace: ops-monit
roleRef:
  kind: ClusterRole
  name: filebeat
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: filebeat
  namespace: ops-monit
  labels:
    k8s-app: filebeat
rules:
  - apiGroups: [""] # "" indicates the core API group
    resources:
      - namespaces
      - pods
      - nodes
    verbs:
      - get
      - watch
      - list
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: filebeat
  namespace: ops-monit
  labels:
    k8s-app: filebeat
---

3、日志緩沖、過濾清洗、存儲、展示

3.1、緩沖

Kafka是一個消息處理引擎,這里采用Kafka作為日志數據的緩沖工具。采用Kafka有2個用途:

  • 作為緩沖,防止日志量太大導致下游來不及消費,所以要加入消息緩沖這一層。這一層必不可少。
  • Kafka消息可以被別的應用監聽消費,過濾輸出到一些告警信息到企微、釘釘、郵件等。

3.2、過濾清洗和轉發

Logstash 是一個日志收集和處理引擎,它帶有各種各樣的插件,能夠從各種來源攝取數據。并且可以對數據進行轉換,然后轉發到目的地。我這里采用Logstash作為日志攝取、過濾、清洗、轉發的工具。

這是一個大概的Logstash Conf文件,文件的內容分3塊:input 、filter 、output。

input {
    kafka {
        bootstrap_servers=>"172.10.7.79:9092"
        topics=>["topic-bizlogs"]
        codec => "json"
    }
}

filter{
    mutate{
        split => ["message", "|"]
        add_field => { "log_time" => "%{[message][0]}"}
        add_field => { "level" => "%{[message][1]}"}
        add_field => { "class" => "%{[message][2]}"}
        add_field => { "line" => "%{[message][3]}"}
        add_field => { "thread" => "%{[message][4]}"}
        add_field => { "log_message" => "%{[message][5]}"}

        add_field => { "env" => "%{[kubernetes][namespace]}"}
        add_field => { "podName" => "%{[kubernetes][pod][name]}"}
        add_field => { "podId" => "%{[kubernetes][pod][uid]}"}
        add_field => { "image" => "%{[container][image][name]}"}
        add_field => { "imageId" => "%{[container][id]}"}
        add_field => { "nodeId" => "%{[kubernetes][node][uid]}"}
        add_field => { "nodeName" => "%{[kubernetes][node][name]}"}
        add_field => { "nodeHostName" => "%{[kubernetes][node][hostname]}"}
        add_field => { "logPath" => "%{[log][file][path]}"}
        add_field => { "appName" => "%{[kubernetes][labels][app]}"}

        remove_field => ["agent","fields","input","ecs","host","@version","kubernetes","stream","log","container"]
    }
}

output{
        elasticsearch{
                hosts=>["172.11.4.82:9200"]
                index => "%{appName}‐%{+YYYY.MM.dd}"

        }
}

3.3、存儲和搜索

Elasticsearch是一個可擴展的搜索引擎,這里采用Elasticsearch作為日志存儲搜索工具。

3.4、展示

采用Kibana為日志構建可視化的UI。

4、總結

本文主要介紹Kubernetes場景下比較接地氣好落地的,基于ELK的日志解決方案。整體思路:Filebeat -> Kafka -> Logstash -> Elasticsearch -> Kibana。

本文沒有介紹Kafka、Logstash、Elasticsearch、Kibana的安裝,只提及了一些配置文件,安裝過程讀者自行查閱資料搭建。

責任編輯:華軒 來源: 不焦躁的程序員
相關推薦

2015-08-27 10:50:15

2011-06-03 16:30:39

2014-03-26 15:24:51

Microsoft AWindows Azu微軟

2021-06-24 08:30:08

架構億級消息中心數據

2019-08-27 09:20:35

微服務架構組件

2012-12-11 14:05:26

商務社交

2014-11-11 13:31:28

云戰略

2020-07-15 15:38:15

人臉識別照片活化手機

2016-04-01 09:29:36

戴爾

2016-12-09 13:30:44

大數據

2023-09-27 12:28:08

Kubernetes命令

2013-11-28 16:47:15

通達OA

2020-03-08 15:37:01

Android 10谷歌安卓

2022-12-19 10:40:07

模型中文

2017-06-07 11:51:48

災備和力記易

2019-03-24 14:14:40

代碼閱讀源代碼

2014-08-28 03:44:30

mAPM聽云App移動應用性能監測

2015-03-19 15:17:11

2018-07-29 15:33:04

2018-05-03 07:06:21

開發規范iOS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日一区二区 | 国产乱肥老妇国产一区二 | 亚洲欧美日韩精品久久亚洲区 | 国产日韩欧美精品 | 欧美一二三四成人免费视频 | 国产精品有限公司 | 国产成人在线视频 | 国产999精品久久久 精品三级在线观看 | 日韩在线视频免费观看 | 99精品观看| 成人毛片视频在线播放 | 久久久免费在线观看 | 亚洲福利精品 | 超碰在线国产 | 欧美综合网 | 91精品国产综合久久婷婷香蕉 | 国产精品久久久久久吹潮日韩动画 | 国产精品免费看 | 一级黄色片一级黄色片 | 婷婷久久综合 | 在线播放中文字幕 | 亚洲精品久久久久久久久久久久久 | www.国产精品 | 亚洲欧美日韩高清 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 成人免费观看男女羞羞视频 | 亚洲欧洲成人av每日更新 | 99re6在线视频 | 精品国产乱码久久久久久果冻传媒 | 黄色av大片| 亚洲综合国产 | www久久国产 | 2020天天操 | 欧美一级片在线看 | 亚洲一区久久 | 免费激情网站 | 国产精品视频97 | 精品国产乱码久久久久久丨区2区 | 久久久久国产一区二区三区 | 久久综合国产精品 | 久久久久久影院 |