• EFKLK日志收集工具栈


    kubectl create namespace kube-log
    
    # 下载es镜像
    docker pull elasticsearch:7.13.1
    
    # 运行容器生成证书
    $ docker run --name elastic-certs -i elasticsearch:7.13.1 /bin/sh -c  
      "elasticsearch-certutil ca --out /tmp/elastic-stack-ca.p12 --pass '' && 
        elasticsearch-certutil cert --name security-master --dns 
        security-master --ca /tmp/elastic-stack-ca.p12 --pass '' --ca-pass '' 
        --out /tmp/elastic-certificates.p12"
    
    # 从容器中将生成的证书拷贝出来
    $ docker cp elastic-certs:/tmp/elastic-certificates.p12 .
    
    # 删除容器
    $ docker rm -f elastic-certs
    
    # 将 pcks12 中的信息分离出来,写入文件
    $ openssl pkcs12 -nodes -passin pass:'' -in elastic-certificates.p12 -out elastic-certificate.pem
    
    
    # 添加证书
    $ kubectl create secret -n kube-log generic elastic-certs --from-file=elastic-certificates.p12
    
    # 设置集群用户名密码
    $ kubectl create secret -n kube-log generic elastic-auth --from-literal=username=elastic --from-literal=password=elastic123
    
    
    helm repo add elastic https://helm.elastic.co
    helm repo update
    
    helm pull elastic/elasticsearch --untar --version 7.13.1
    cd elasticsearch/
    
    cat << EOF | sudo tee values-master.yaml >> /dev/null
    ## 设置集群名称
    clusterName: "elasticsearch"
    ## 设置节点名称
    nodeGroup: "master"
    
    ## 设置角色
    roles:
      master: "true"
      ingest: "false"
      data: "false"
    
    # ============镜像配置============
    ## 指定镜像与镜像版本
    image: "elasticsearch"
    imageTag: "7.13.1"
    ## 副本数
    replicas: 3
    
    # ============资源配置============
    ## JVM 配置参数
    esJavaOpts: "-Xmx1g -Xms1g"
    ## 部署资源配置(生成环境一定要设置大些)
    resources:
      requests:
        cpu: "2000m"
        memory: "2Gi"
      limits:
        cpu: "2000m"
        memory: "2Gi"
    ## 数据持久卷配置
    persistence:
      enabled: true
    ## 存储数据大小配置
    volumeClaimTemplate:
      storageClassName: csi-rbd-sc
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi
    
    # ============安全配置============
    ## 设置协议,可配置为 http、https
    protocol: http
    ## 证书挂载配置,这里我们挂入上面创建的证书
    secretMounts:
      - name: elastic-certs
        secretName: elastic-certs
        path: /usr/share/elasticsearch/config/certs
    
    ## 允许您在/usr/share/elasticsearch/config/中添加任何自定义配置文件,例如 elasticsearch.yml
    ## ElasticSearch 7.x 默认安装了 x-pack 插件,部分功能免费,这里我们配置下
    ## 下面注掉的部分为配置 https 证书,配置此部分还需要配置 helm 参数 protocol 值改为 https
    esConfig:
      elasticsearch.yml: |
        xpack.security.enabled: true
        xpack.security.transport.ssl.enabled: true
        xpack.security.transport.ssl.verification_mode: certificate
        xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        # xpack.security.http.ssl.enabled: true
        # xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        # xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    ## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件
    extraEnvs:
      - name: ELASTIC_USERNAME
        valueFrom:
          secretKeyRef:
            name: elastic-auth
            key: username
      - name: ELASTIC_PASSWORD
        valueFrom:
          secretKeyRef:
            name: elastic-auth
            key: password
    
    # ============调度配置============
    ## 设置调度策略
    ## - hard:只有当有足够的节点时 Pod 才会被调度,并且它们永远不会出现在同一个节点上
    ## - soft:尽最大努力调度
    antiAffinity: "soft"
    tolerations:
      - operator: "Exists" ##容忍全部污点
    EOF
    
    cat << EOF | sudo tee values-data.yaml >> /dev/null
    # ============设置集群名称============
    ## 设置集群名称
    clusterName: "elasticsearch"
    ## 设置节点名称
    nodeGroup: "data"
    ## 设置角色
    roles:
      master: "false"
      ingest: "true"
      data: "true"
    
    # ============镜像配置============
    ## 指定镜像与镜像版本
    image: "elasticsearch"
    imageTag: "7.13.1"
    ## 副本数(建议设置为3,我这里资源不足只用了1个副本)
    replicas: 1
    
    # ============资源配置============
    ## JVM 配置参数
    esJavaOpts: "-Xmx1g -Xms1g"
    ## 部署资源配置(生成环境一定要设置大些)
    resources:
      requests:
        cpu: "1000m"
        memory: "2Gi"
      limits:
        cpu: "1000m"
        memory: "2Gi"
    ## 数据持久卷配置
    persistence:
      enabled: true
    ## 存储数据大小配置
    volumeClaimTemplate:
      storageClassName: csi-rbd-sc
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi
    
    # ============安全配置============
    ## 设置协议,可配置为 http、https
    protocol: http
    ## 证书挂载配置,这里我们挂入上面创建的证书
    secretMounts:
      - name: elastic-certs
        secretName: elastic-certs
        path: /usr/share/elasticsearch/config/certs
    ## 允许您在/usr/share/elasticsearch/config/中添加任何自定义配置文件,例如 elasticsearch.yml
    ## ElasticSearch 7.x 默认安装了 x-pack 插件,部分功能免费,这里我们配置下
    ## 下面注掉的部分为配置 https 证书,配置此部分还需要配置 helm 参数 protocol 值改为 https
    esConfig:
      elasticsearch.yml: |
        xpack.security.enabled: true
        xpack.security.transport.ssl.enabled: true
        xpack.security.transport.ssl.verification_mode: certificate
        xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        # xpack.security.http.ssl.enabled: true
        # xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        # xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    ## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件
    extraEnvs:
      - name: ELASTIC_USERNAME
        valueFrom:
          secretKeyRef:
            name: elastic-auth
            key: username
      - name: ELASTIC_PASSWORD
        valueFrom:
          secretKeyRef:
            name: elastic-auth
            key: password
    
    # ============调度配置============
    ## 设置调度策略
    ## - hard:只有当有足够的节点时 Pod 才会被调度,并且它们永远不会出现在同一个节点上
    ## - soft:尽最大努力调度
    antiAffinity: "soft"
    ## 容忍配置
    tolerations:
      - operator: "Exists" ##容忍全部污点
    EOF
    
    cat << EOF | sudo tee values-client.yaml >> /dev/null
    # ============设置集群名称============
    ## 设置集群名称
    clusterName: "elasticsearch"
    ## 设置节点名称
    nodeGroup: "client"
    ## 设置角色
    roles:
      master: "false"
      ingest: "false"
      data: "false"
    
    # ============镜像配置============
    ## 指定镜像与镜像版本
    image: "elasticsearch"
    imageTag: "7.13.1"
    ## 副本数
    replicas: 1
    
    # ============资源配置============
    ## JVM 配置参数
    esJavaOpts: "-Xmx1g -Xms1g"
    ## 部署资源配置(生成环境一定要设置大些)
    resources:
      requests:
        cpu: "1000m"
        memory: "2Gi"
      limits:
        cpu: "1000m"
        memory: "2Gi"
    ## 数据持久卷配置
    persistence:
      enabled: false
    
    # ============安全配置============
    ## 设置协议,可配置为 http、https
    protocol: http
    ## 证书挂载配置,这里我们挂入上面创建的证书
    secretMounts:
      - name: elastic-certs
        secretName: elastic-certs
        path: /usr/share/elasticsearch/config/certs
    ## 允许您在/usr/share/elasticsearch/config/中添加任何自定义配置文件,例如 elasticsearch.yml
    ## ElasticSearch 7.x 默认安装了 x-pack 插件,部分功能免费,这里我们配置下
    ## 下面注掉的部分为配置 https 证书,配置此部分还需要配置 helm 参数 protocol 值改为 https
    esConfig:
      elasticsearch.yml: |
        xpack.security.enabled: true
        xpack.security.transport.ssl.enabled: true
        xpack.security.transport.ssl.verification_mode: certificate
        xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        # xpack.security.http.ssl.enabled: true
        # xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
        # xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    ## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件
    extraEnvs:
      - name: ELASTIC_USERNAME
        valueFrom:
          secretKeyRef:
            name: elastic-auth
            key: username
      - name: ELASTIC_PASSWORD
        valueFrom:
          secretKeyRef:
            name: elastic-auth
            key: password
    
    # ============Service 配置============
    service:
      type: NodePort
      nodePort: "30200"
    EOF
    
    helm install es-master -f values-master.yaml -n kube-log .
    helm install es-data -f values-data.yaml -n kube-log .
    helm install es-client -f values-client.yaml -n kube-log .
    
    helm pull elastic/kibana --untar --version 7.13.2
    cd kibana
    
    cat << EOF | sudo tee values-prod.yaml >> /dev/null
    ## 指定镜像与镜像版本
    image: "kibana"
    imageTag: "7.13.2"
    
    ## 配置 ElasticSearch 地址
    elasticsearchHosts: "http://elasticsearch-client:9200"
    
    # ============环境变量配置============
    ## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件
    extraEnvs:
      - name: "ELASTICSEARCH_USERNAME"
        valueFrom:
          secretKeyRef:
            name: elastic-auth
            key: username
      - name: "ELASTICSEARCH_PASSWORD"
        valueFrom:
          secretKeyRef:
            name: elastic-auth
            key: password
    
    # ============资源配置============
    resources:
      requests:
        cpu: "500m"
        memory: "1Gi"
      limits:
        cpu: "500m"
        memory: "1Gi"
    
    # ============配置 Kibana 参数============
    ## kibana 配置中添加语言配置,设置 kibana 为中文
    kibanaConfig:
      kibana.yml: |
        i18n.locale: "zh-CN"
    
    # ============Service 配置============
    service:
      type: NodePort
      nodePort: "30601"
    EOF
    
    helm install kibana -f values-prod.yaml -n kube-log .
    
    
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: fluentd-conf
      namespace: kube-log
    data:
      # 容器日志
      containers.input.conf: |-
        <source>
          @id fluentd-containers.log
          @type tail                              # Fluentd 内置的输入方式,其原理是不停地从源文件中获取新的日志
          path /var/log/containers/*.log          # Docker 容器日志路径
          pos_file /var/log/es-containers.log.pos  # 记录读取的位置
          tag raw.kubernetes.*                    # 设置日志标签
          read_from_head true                     # 从头读取
          <parse>                                 # 多行格式化成JSON
            # 可以使用我们介绍过的 multiline 插件实现多行日志
            @type multi_format                    # 使用 multi-format-parser 解析器插件
            <pattern>
              format json                         # JSON解析器
              time_key time                       # 指定事件时间的时间字段
              time_format %Y-%m-%dT%H:%M:%S.%NZ   # 时间格式
            </pattern>
            <pattern>
              format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
              time_format %Y-%m-%dT%H:%M:%S.%N%:z
            </pattern>
          </parse>
        </source>
    
        # 在日志输出中检测异常(多行日志),并将其作为一条日志转发
        # https://github.com/GoogleCloudPlatform/fluent-plugin-detect-exceptions
        <match raw.kubernetes.**>           # 匹配tag为raw.kubernetes.**日志信息
          @id raw.kubernetes
          @type detect_exceptions           # 使用detect-exceptions插件处理异常栈信息
          remove_tag_prefix raw             # 移除 raw 前缀
          message log
          multiline_flush_interval 5
        </match>
    
        <filter **>  # 拼接日志
          @id filter_concat
          @type concat                # Fluentd Filter 插件,用于连接多个日志中分隔的多行日志
          key message
          multiline_end_regexp /
    $/  # 以换行符“
    ”拼接
          separator ""
        </filter>
    
        # 添加 Kubernetes metadata 数据
        <filter kubernetes.**>
          @id filter_kubernetes_metadata
          @type kubernetes_metadata
        </filter>
    
        # 修复 ES 中的 JSON 字段
        # 插件地址:https://github.com/repeatedly/fluent-plugin-multi-format-parser
        <filter kubernetes.**>
          @id filter_parser
          @type parser                # multi-format-parser多格式解析器插件
          key_name log                # 在要解析的日志中指定字段名称
          reserve_data true           # 在解析结果中保留原始键值对
          remove_key_name_field true  # key_name 解析成功后删除字段
          <parse>
            @type multi_format
            <pattern>
              format json
            </pattern>
            <pattern>
              format none
            </pattern>
          </parse>
        </filter>
    
        # 删除一些多余的属性
        <filter kubernetes.**>
          @type record_transformer
          remove_keys $.docker.container_id,$.kubernetes.container_image_id,$.kubernetes.pod_id,$.kubernetes.namespace_id,$.kubernetes.master_url,$.kubernetes.labels.pod-template-hash
        </filter>
    
        # 只保留具有logging=true标签的Pod日志
        <filter kubernetes.**>
          @id filter_log
          @type grep
          <regexp>
            key $.kubernetes.labels.logging
            pattern ^true$
          </regexp>
        </filter>
    
      ###### 监听配置,一般用于日志聚合用 ######
      forward.input.conf: |-
        # 监听通过TCP发送的消息
        <source>
          @id forward
          @type forward
        </source>
    
      output.conf: |-
        <match **>
          @id elasticsearch
          @type elasticsearch
          @log_level info
          include_tag_key true
          host elasticsearch-client
          port 9200
          # es 账号
          user elastic
          # es 密码
          password elastic123
          logstash_format true
          logstash_prefix k8s
          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>
    
    cat <<EOF | sudo tee Dockerfile
    FROM quay.io/fluentd_elasticsearch/fluentd:v3.2.0
    RUN echo "source 'https://mirrors.tuna.tsinghua.edu.cn/rubygems/'" > Gemfile && gem install bundler
    RUN gem install fluent-plugin-kafka -v 0.16.1 --no-document
    EOF
    
    docker build -t ecloudedu/fluentd-kafka:v3.2.0 .
    
    docker login https://hub.docker.com
    Username: ecloudedu
    Password: 
    
    docker pull ecloudedu/fluentd-kafka:v3.2.0
    
    
    
    kubectl exec --tty -i kafka-client --namespace kube-log -- bash
    kafka-console-consumer.sh --bootstrap-server kafka.kube-log.svc.cluster.local:9092 --topic messages --from-beginning
    
  • 相关阅读:
    浅谈React工作原理
    手撕ES6--Promise
    快速安装create-react-app脚手架
    使用render函数渲染组件
    视图的创建与使用 Sql Server View
    数据库 简单查询 Sql Server 学生表 课程表 选课表
    基于WebServices简易网络聊天工具的设计与实现
    基于Web的实验室管理系统技术简要报告
    基于 控制台 简易 学生信息管理系统 (增、删、改)
    .net序列化与反序列化——提供多次存储对象集后读取不完全解决方案
  • 原文地址:https://www.cnblogs.com/mycloudedu/p/14881838.html
Copyright © 2020-2023  润新知