0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

納尼?自建K8s集群日志收集還能通過(guò)JMQ保存到JES

京東云 ? 來(lái)源:京東科技 劉恩浩 ? 作者:京東科技 劉恩浩 ? 2024-09-30 14:45 ? 次閱讀

作者:京東科技 劉恩浩

一、背景

基于K8s集群的私有化交付方案中,日志收集采用了ilogtail+logstash+kafka+es方案,其中ilogtail負(fù)責(zé)日志收集,logstash負(fù)責(zé)對(duì)數(shù)據(jù)轉(zhuǎn)換,kafka負(fù)責(zé)對(duì)日志傳遞中的消峰進(jìn)而減少es的寫(xiě)入壓力,es用來(lái)保存日志數(shù)據(jù)。在私有化交付中本方案中涉及的中間件一般需要單獨(dú)部署,但是在京東內(nèi)網(wǎng)環(huán)境的部署考慮到kafka和es的高可用,則不推薦采用單獨(dú)部署的方案。

二、新方案實(shí)踐

1.新方案簡(jiǎn)介

在京東內(nèi)網(wǎng)環(huán)境部署K8S收集日志, kafka+es的替代方案考慮使用JMQ+JES,由于JMQ的底層是基于kafaka、JES的底層基于ES,所以該替換方案理論上是可行的

2.主要架構(gòu)

數(shù)據(jù)流向大致如下
應(yīng)用日志 -> ilogtail -> JMQ -> logstash -> JES

3.如何使用

核心改造點(diǎn)匯總

ilogtail nameservers配置
增加解析JMQ域名的nameserver(京東云主機(jī)上無(wú)法直接解析.local域名)

spec:
    spec:
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
          - x.x.x.x # 可以解析jmq域名的nameserver

ilogtail flushers配置
調(diào)整發(fā)送到JMQ到配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: ilogtail-user-cm
  namespace: elastic-system
data:
  app_stdout.yaml: |
    flushers:
      - Type: flusher_stdout
        OnlyStdout: true
      - Type: flusher_kafka_v2
        Brokers:
          - nameserver.jmq.jd.local:80 # jmq元數(shù)據(jù)地址
        Topic: ai-middle-k8s-log-prod # jmq topic 
        ClientID: ai4middle4log # Kafka的用戶ID(識(shí)別客戶端并設(shè)置其唯一性),對(duì)應(yīng)jmq的Group名稱,重要?? (https://ilogtail.gitbook.io/ilogtail-docs/plugins/input/service-kafka#cai-ji-pei-zhi-v2)   

logstash kafka&es配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: logstash-config
  namespace: elastic-system
  labels:
    elastic-app: logstash
data:
  logstash.conf: |-
    input {
        kafka {
                bootstrap_servers => ["nameserver.jmq.jd.local:80"] #jmq的元數(shù)據(jù)地址
                group_id => "ai4middle4log" # jmq的Group的名稱
                client_id => "ai4middle4log" # jmq的Group的名稱,即jmq的省略了kafka中的client_id概念,用Group名稱代替
                consumer_threads => 2
                decorate_events => true
                topics => ["ai-middle-k8s-log-prod"] # jmp的topic
                auto_offset_reset => "latest"
                codec => json { charset => "UTF-8" }
        }
    }
    output {
        elasticsearch {
                hosts => ["http://x.x.x.x:40000","http://x.x.x.x:40000","http://x.x.x.x:40000"] # es地址
                index =>  "%{[@metadata][kafka][topic]}-%{+YYYY-MM-dd}" # 索引規(guī)則
                user => "XXXXXX" #jes的用戶名
                password => "xxxxx" #jes的密碼
                ssl => "false"
                ssl_certificate_verification => "false"
        }
    }

ilogtail 的配置如下

# ilogtail-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ilogtail-ds
  namespace: elastic-system
  labels:
    k8s-app: logtail-ds
spec:
  selector:
    matchLabels:
      k8s-app: logtail-ds
  template:
    metadata:
      labels:
        k8s-app: logtail-ds
    spec:
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
          - x.x.x.x # (京東云主機(jī)上)可以解析jmq域名的nameserver
      tolerations:
        - operator: Exists                    # deploy on all nodes
      containers:
        - name: logtail
          env:
            - name: ALIYUN_LOG_ENV_TAGS       # add log tags from env
              value: _node_name_|_node_ip_
            - name: _node_name_
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: spec.nodeName
            - name: _node_ip_
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
            - name: cpu_usage_limit           # iLogtail's self monitor cpu limit
              value: "1"
            - name: mem_usage_limit           # iLogtail's self monitor mem limit
              value: "512"
          image: dockerhub.ai.jd.local/ai-middleware/ilogtail-community-edition/ilogtail:1.3.1
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              cpu: 1000m
              memory: 1Gi
            requests:
              cpu: 400m
              memory: 384Mi
          volumeMounts:
            - mountPath: /var/run                       # for container runtime socket
              name: run
            - mountPath: /logtail_host                  # for log access on the node
              mountPropagation: HostToContainer
              name: root
              readOnly: true
            - mountPath: /usr/local/ilogtail/checkpoint # for checkpoint between container restart
              name: checkpoint
            - mountPath: /usr/local/ilogtail/user_yaml_config.d # mount config dir
              name: user-config
              readOnly: true
            - mountPath: /usr/local/ilogtail/apsara_log_conf.json
              name: apsara-log-config
              readOnly: true
              subPath: apsara_log_conf.json
      dnsPolicy: ClusterFirst
      hostNetwork: true
      volumes:
        - hostPath:
            path: /var/run
            type: Directory
          name: run
        - hostPath:
            path: /
            type: Directory
          name: root
        - hostPath:
            path: /etc/ilogtail-ilogtail-ds/checkpoint
            type: DirectoryOrCreate
          name: checkpoint
        - configMap:
            defaultMode: 420
            name: ilogtail-user-cm
          name: user-config
        - configMap:
            defaultMode: 420
            name: ilogtail-apsara-log-config-cm
          name: apsara-log-config
# ilogtail-user-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: ilogtail-user-cm
  namespace: elastic-system
data:
  app_stdout.yaml: |
    enable: true
    inputs:
      - Type: service_docker_stdout
        Stderr: true
        Stdout: true
        K8sNamespaceRegex: ai-train
        ExternalK8sLabelTag:
          platform/resource-name: k8s_label_resource-name
          platform/task-identify: k8s_label_task-identify
          task-id: k8s_label_task-id
          run-id: k8s_label_run-id
          request-id: k8s_label_request-id
    processors:
      - Type: processor_rename
        SourceKeys:
          - k8s_label_resource-name
          - k8s_label_task-identify
          - k8s_label_task-id
          - k8s_label_run-id
          - k8s_label_request-id
          - _namespace_
          - _image_name_
          - _pod_uid_
          - _pod_name_
          - _container_name_
          - _container_ip_
          - __path__
          - _source_
        DestKeys:
          - resource_name
          - task_identify
          - task_id
          - run_id
          - request_id
          - namespace
          - image_name
          - pod_uid
          - pod_name
          - container_name
          - container_ip
          - path
          - source
    flushers:
      - Type: flusher_stdout
        OnlyStdout: true
      - Type: flusher_kafka_v2
        Brokers:
          - nameserver.jmq.jd.local:80 # jmq元數(shù)據(jù)地址
        Topic: ai-middle-k8s-log-prod # jmq topic 
        ClientID: ai4middle4log # Kafka的用戶ID(識(shí)別客戶端并設(shè)置其唯一性),對(duì)應(yīng)jmq的Group名稱,重要?? (https://ilogtail.gitbook.io/ilogtail-docs/plugins/input/service-kafka#cai-ji-pei-zhi-v2)

  app_file_log.yaml: |
    enable: true
    inputs:
      - Type: file_log
        LogPath: /export/Logs/ai-dt-algorithm-tools
        FilePattern: "*.log"
        ContainerInfo:
          K8sNamespaceRegex: ai-train
          ExternalK8sLabelTag:
            platform/resource-name: k8s_label_resource-name
            platform/task-identify: k8s_label_task-identify
            task-id: k8s_label_task-id
            run-id: k8s_label_run-id
            request-id: k8s_label_request-id

    processors:
      - Type: processor_add_fields
        Fields:
          source: file
      - Type: processor_rename
        SourceKeys:
          - __tag__:k8s_label_resource-name
          - __tag__:k8s_label_task-identify
          - __tag__:k8s_label_task-id
          - __tag__:k8s_label_run-id
          - __tag__:k8s_label_request-id
          - __tag__:_namespace_
          - __tag__:_image_name_
          - __tag__:_pod_uid_
          - __tag__:_pod_name_
          - __tag__:_container_name_
          - __tag__:_container_ip_
          - __tag__:__path__
        DestKeys:
          - resource_name
          - task_identify
          - task_id
          - run_id
          - request_id
          - namespace
          - image_name
          - pod_uid
          - pod_name
          - container_name
          - container_ip
          - path

    flushers:
      - Type: flusher_stdout
        OnlyStdout: true
      - Type: flusher_kafka_v2
        Brokers:
          - nameserver.jmq.jd.local:80
        Topic: ai-middle-k8s-log-prod
        ClientID: ai4middle4log

logstash 的配置如下

# logstash-configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: logstash-config
  namespace: elastic-system
  labels:
    elastic-app: logstash
data:
  logstash.conf: |-
    input {
        kafka {
                bootstrap_servers => ["nameserver.jmq.jd.local:80"] #jmq的元數(shù)據(jù)地址
                #group_id => "services"
                group_id => "ai4middle4log" # jmq的Group的名稱
                client_id => "ai4middle4log" # jmq的Group的名稱,即jmq的省略了kafka中的client_id概念,用Group名稱代替
                consumer_threads => 2
                decorate_events => true
                #topics_pattern => ".*"
                topics => ["ai-middle-k8s-log-prod"] # jmp的topic
                auto_offset_reset => "latest"
                codec => json { charset => "UTF-8" }
        }
    }


    filter {
      ruby {
          code => "event.set('index_date', event.get('@timestamp').time.localtime + 8*60*60)"
      }
      ruby {
          code => "event.set('message',event.get('contents'))"
      }
      #ruby {
      #    code => "event.set('@timestamp',event.get('time').time.localtime)"
      #}

      mutate {
          remove_field => ["contents"]
          convert => ["index_date", "string"]
          #convert => ["@timestamp", "string"]
          gsub => ["index_date", "T.*Z",""]
          #gsub => ["@timestamp", "T.*Z",""]
      }
    }


    output {
        elasticsearch {
                #hosts => ["https://ai-middle-cluster-es-http:9200"]
                hosts => ["http://x.x.x.x:40000","http://x.x.x.x:40000","http://x.x.x.x:40000"] # es地址
                index =>  "%{[@metadata][kafka][topic]}-%{+YYYY-MM-dd}" # 索引規(guī)則
                user => "XXXXXX" #jes的用戶名
                password => "xxxxx" #jes的密碼
                ssl => "false"
                ssl_certificate_verification => "false"
                #cacert => "/usr/share/logstash/cert/ca_logstash.cer"
        }
        stdout {
            codec => rubydebug
        }
    }

4.核心價(jià)值

在私有化部署的基礎(chǔ)上通過(guò)簡(jiǎn)單改造實(shí)現(xiàn)了與京東內(nèi)部中間件的完美融合,使得系統(tǒng)在高可用性上適應(yīng)性更強(qiáng)、可用范圍更廣。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 集群
    +關(guān)注

    關(guān)注

    0

    文章

    86

    瀏覽量

    17177
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對(duì)比

    摘要: 今天,日志服務(wù)再次升級(jí)Kubernetes(k8s)的日志解決方案。1分鐘內(nèi)即可完成整個(gè)集群部署,支持動(dòng)態(tài)擴(kuò)容,提供采集宿主機(jī)日志、
    發(fā)表于 02-28 12:49

    全面提升,阿里云Docker/Kubernetes(K8S日志解決方案與選型對(duì)比

    摘要: 今天,日志服務(wù)再次升級(jí)Kubernetes(k8s)的日志解決方案。1分鐘內(nèi)即可完成整個(gè)集群部署,支持動(dòng)態(tài)擴(kuò)容,提供采集宿主機(jī)日志、
    發(fā)表于 02-28 12:50

    K8s 從懵圈到熟練 – 集群網(wǎng)絡(luò)詳解

    iptables 規(guī)則做 SNAT,而此規(guī)則就是 flanneld 依據(jù)命令行 --ip-masq 選項(xiàng)做的配置??偨Y(jié)以上是阿里云 K8S 集群網(wǎng)絡(luò)的搭建和通信原理。我們主要通過(guò)網(wǎng)絡(luò)搭建和通信兩個(gè)角度
    發(fā)表于 10-14 15:06

    搭建K8s環(huán)境平臺(tái)的步驟

    1 搭建K8s環(huán)境平臺(tái)規(guī)劃1.1 單master集群1.2 多master集群
    發(fā)表于 11-04 06:03

    如何利用K8S全面擁抱微服務(wù)架構(gòu)?

    K8S是第一個(gè)將“一切以服務(wù)為中心,一切圍繞服務(wù)運(yùn)轉(zhuǎn)”作為指導(dǎo)思想的創(chuàng)新型產(chǎn)品,它的功能和架構(gòu)設(shè)計(jì)自始至終都遵循了這一指導(dǎo)思想,構(gòu)建在K8S上的系統(tǒng)不僅可以獨(dú)立運(yùn)行在物理機(jī)、虛擬機(jī)集群或者企業(yè)私有云上,也可以被托管在公有云中。
    的頭像 發(fā)表于 10-08 15:59 ?2.7w次閱讀

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對(duì)強(qiáng)大的集群,成千上萬(wàn)的容器,突然感覺(jué)不香了。 這時(shí)候就需要我們的主角 Kubernetes 上場(chǎng)了,先來(lái)了解一下 K8s 的基本概念,后面再介紹實(shí)踐,由淺入深步步為營(yíng)
    的頭像 發(fā)表于 06-02 11:56 ?3445次閱讀

    簡(jiǎn)單說(shuō)明k8s和Docker之間的關(guān)系

    這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利用圖文講解的很透徹,有需要的同學(xué)可以研究下 最近項(xiàng)目用到kubernetes(以下簡(jiǎn)稱k8s,ks之間有
    的頭像 發(fā)表于 06-24 15:48 ?3416次閱讀

    K8S集群服務(wù)訪問(wèn)失敗怎么辦 K8S故障處理集錦

    問(wèn)題1:K8S集群服務(wù)訪問(wèn)失?。?? ? 原因分析:證書(shū)不能被識(shí)別,其原因?yàn)椋鹤远x證書(shū),過(guò)期等。 解決方法:更新證書(shū)即可。 問(wèn)題2:K8S集群服務(wù)訪問(wèn)失敗? curl: (7) Fa
    的頭像 發(fā)表于 09-01 11:11 ?1.6w次閱讀
    <b class='flag-5'>K8S</b><b class='flag-5'>集群</b>服務(wù)訪問(wèn)失敗怎么辦 <b class='flag-5'>K8S</b>故障處理集錦

    3個(gè)管理多k8s集群實(shí)用工具

    命令就會(huì)很低效。 今天介紹3個(gè)工具會(huì)讓你在多k8s集群環(huán)境中工作的很輕松。我將從以下幾個(gè)方面來(lái)評(píng)估工具實(shí)用性。
    的頭像 發(fā)表于 04-26 10:33 ?1149次閱讀
    3個(gè)管理多<b class='flag-5'>k8s</b><b class='flag-5'>集群</b>實(shí)用工具

    k8s集群環(huán)境中工作有多快

    命令就會(huì)很低效。 今天介紹3個(gè)工具會(huì)讓你在多k8s集群環(huán)境中工作的很輕松。我將從以下幾個(gè)方面來(lái)評(píng)估工具實(shí)用性: 速度 如果你有多個(gè)k8s集群可選擇,你切換
    的頭像 發(fā)表于 05-29 14:28 ?589次閱讀
    多<b class='flag-5'>k8s</b><b class='flag-5'>集群</b>環(huán)境中工作有多快

    切換k8s上下文有多快

    use-context 命令就會(huì)很低效。 今天介紹3個(gè)工具會(huì)讓你在多k8s集群環(huán)境中工作的很輕松。我將從以下幾個(gè)方面來(lái)評(píng)估工具實(shí)用性: 速度 如果你有多個(gè)k8s集群可選擇,你切換
    的頭像 發(fā)表于 05-29 15:26 ?765次閱讀
    切換<b class='flag-5'>k8s</b>上下文有多快

    k8s是什么意思?kubeadm部署k8s集群k8s部署)|PetaExpres

    ),Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。 在Kubernetes中,我們可以創(chuàng)建多個(gè)容器,每個(gè)容器里面運(yùn)行一個(gè)應(yīng)用實(shí)例,然后通過(guò)內(nèi)置的負(fù)載均衡策略,實(shí)現(xiàn)對(duì)這一組應(yīng)用實(shí)例的管理、發(fā)現(xiàn)、訪問(wèn),而這些細(xì)節(jié)都不需要運(yùn)維人員去進(jìn)行復(fù)雜的手工配置和處理。 kubernetes(
    發(fā)表于 07-19 13:14 ?1116次閱讀

    K8s集群管理:為什么需要多集群、多集群的優(yōu)勢(shì)是什么

    隨著K8s和云原生技術(shù)的快速發(fā)展,以及各大廠商在自己的數(shù)據(jù)中心使用K8s的API進(jìn)行容器化應(yīng)用編排和管理,讓?xiě)?yīng)用交付本身變得越來(lái)越標(biāo)準(zhǔn)化和統(tǒng)一化,并且實(shí)現(xiàn)了與底層基礎(chǔ)設(shè)施的完全解耦,為多集群和混合云提供了一個(gè)堅(jiān)實(shí)技術(shù)基礎(chǔ)。
    發(fā)表于 09-14 10:48 ?1329次閱讀
    <b class='flag-5'>K8s</b>多<b class='flag-5'>集群</b>管理:為什么需要多<b class='flag-5'>集群</b>、多<b class='flag-5'>集群</b>的優(yōu)勢(shì)是什么

    k8s云原生開(kāi)發(fā)要求

    IO性能。網(wǎng)絡(luò)要求穩(wěn)定,建議使用私有網(wǎng)絡(luò)VPC,并配置與Kubernetes兼容的網(wǎng)絡(luò)插件。操作系統(tǒng)需與K8s版本匹配,虛擬化平臺(tái)支持Docker等。此外,還需關(guān)注安全配置,如禁用Swap、調(diào)整Sysctl等,以及etcd數(shù)據(jù)存儲(chǔ)后端的配置。合理配置硬件可確保K8s
    的頭像 發(fā)表于 10-24 10:03 ?224次閱讀
    <b class='flag-5'>k8s</b>云原生開(kāi)發(fā)要求

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地與公有云分別建立K8s集群,并確保網(wǎng)絡(luò)連接。接著,配置kubeconfig文件連接兩集群,并安裝云服務(wù)
    的頭像 發(fā)表于 11-07 09:37 ?150次閱讀