8 분 소요

설명


yaml

  • filebeat와 metricbeat의 데이터를 받아서 각각 다른 alias로 elasticsearch에 저장
  • filebeat는 에러 로그 여부를 판단하여 http 전송
  • metricbeat는 정적 매핑을 위해 템플릿 설정
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: logstash-configmap
      namespace: default
    data:
      logstash.yml: |
        log.level: debug
        http.host: "127.0.0.1"
        #path.config: /usr/share/logstash/pipeline
        pipeline.workers: 2
      pipelines.yml: |
        - pipeline.id: main
          path.config: "/usr/share/logstash/pipeline/main.yml"

        - pipeline.id: filebeat
          path.config: "/usr/share/logstash/pipeline/filebeat.yml"

        - pipeline.id: filebeat_http
          path.config: "/usr/share/logstash/pipeline/filebeat-http.yml"

        - pipeline.id: metricbeat
          path.config: "/usr/share/logstash/pipeline/metricbeat.yml"
      main.yml: |
        input {
          beats {
            port => 5044
          }
        }
        output {
          if [agent][type] == "filebeat" {
            pipeline {
              send_to => filebeat
            }
          } else if [agent][type] == "metricbeat" {
            pipeline {
              send_to => metricbeat
            }
          }
        }
      filebeat.yml: |
        input {
          pipeline {
            address => filebeat
          }
        }
        output {
    	  if "level=error" in [message] or "[ERROR]" in [message] or  [message] =~ /^E\d* *([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/ {
            pipeline {
              send_to => filebeat_http
            }
          }

          elasticsearch {
            hosts => ["http://elasticsearch:9200"]
            ilm_rollover_alias => "filebeat"
            ilm_pattern => "{now/d}-000001"
            ilm_policy => "filebeat-ilm-policy"
          }
        }
      filebeat-http.yml: |
        input {
          pipeline {
            address => filebeat_http
          }
        }
        output {
          http {
            url => "http://127.0.0.1:10000/test"
            content_type => "application/json"
            http_method => "post"
            format => "json"
            #mapping => ["field1", "value1", "text", "%{message}"]
            #headers => ["Authorization", "xxx"]
            message => "%{message}"
            pool_max  => 1000
            pool_max_per_route => 500
          }
        }
      metricbeat.yml: |
        input {
          pipeline {
            address => metricbeat
          }
        }
        output {
          elasticsearch {
            hosts => ["http://elasticsearch:9200"]
            ilm_rollover_alias => "metricbeat-prometheus"
            ilm_pattern => "{now/d}-000001"
            ilm_policy => "metricbeat-prometheus-ilm-policy"
            template => "/usr/share/logstash/template/template.json"
            template_name => "metricbeat-prometheus-template"
            template_overwrite => true
          }
        }

    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: metricbeat-prometheus-template
      namespace: default
    data:
      template.json: |
        {
        "index_patterns": [
          "metricbeat-prometheus-*"
        ],
        "settings" : {
          "index" : {
            "number_of_shards" : "1",
            "number_of_replicas" : "1",
            "lifecycle.name": "metricbeat-prometheus-ilm-policy",
            "lifecycle.rollover_alias": "metricbeat-prometheus"
          }
        },
        "mappings" : {
          "properties" : {
            "@timestamp" : {
              "type" : "date"
            },
            "agent" : {
              "properties" : {
                "ephemeral_id" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "hostname" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "id" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "name" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "type" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "version" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "ecs" : {
              "properties" : {
                "version" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "event" : {
              "properties" : {
                "dataset" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "duration" : {
                  "type" : "long"
                },
                "module" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "host" : {
              "properties" : {
                "name" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "metricset" : {
              "properties" : {
                "name" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "period" : {
                  "type" : "long"
                }
              }
            },
            "prometheus" : {
              "properties" : {
                "labels" : {
                  "properties" : {
                    "area" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "branch" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "breaker" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "build_date" : {
                      "type" : "date"
                    },
                    "build_hash" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "cache" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "cluster" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "cluster_uuid" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "code" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "color" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "device" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "es_client_node" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "es_data_node" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "es_ingest_node" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "es_master_node" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "gc" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "goversion" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "handler" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "host" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "index" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "instance" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "job" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "lucene_version" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "method" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "mount" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "name" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "node" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "path" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "pool" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "quantile" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "revision" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "role" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "shard" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "type" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "url" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    },
                    "version" : {
                      "type" : "text",
                      "fields" : {
                        "keyword" : {
                          "type" : "keyword",
                          "ignore_above" : 256
                        }
                      }
                    }
                  }
                }
              }
            },
            "service" : {
              "properties" : {
                "address" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "type" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            }
          }
        }
        }

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: logstash
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: logstash
      template:
        metadata:
          labels:
            app: logstash
        spec:
          containers:
            - name: logstash
              image: logstash:7.14.0
              ports:
                - containerPort: 5044
              volumeMounts:
                - name: config-volume
                  mountPath: /usr/share/logstash/config/logstash.yml
                  subPath: logstash.yml
                - name: logstash-pipeline-volume
                  mountPath: /usr/share/logstash/config/pipelines.yml
                  subPath: pipelines.yml
                - name: main-pipeline-volume
                  mountPath: /usr/share/logstash/pipeline/main.yml
                  subPath: main.yml
                - name: filebeat-pipeline-volume
                  mountPath: /usr/share/logstash/pipeline/filebeat.yml
                  subPath: filebeat.yml
                - name: filebeat-http-pipeline-volume
                  mountPath: /usr/share/logstash/pipeline/filebeat-http.yml
                  subPath: filebeat-http.yml
                - name: metricbeat-pipeline-volume
                  mountPath: /usr/share/logstash/pipeline/metricbeat.yml
                  subPath: metricbeat.yml
                - name: template-volume
                  mountPath: /usr/share/logstash/template/template.json
                  subPath: template.json
          volumes:
            - name: config-volume
              configMap:
                name: logstash-configmap
                items:
                  - key: logstash.yml
                    path: logstash.yml
            - name: logstash-pipeline-volume
              configMap:
                name: logstash-configmap
                items:
                  - key: pipelines.yml
                    path: pipelines.yml
            - name: main-pipeline-volume
              configMap:
                name: logstash-configmap
                items:
                  - key: main.yml
                    path: main.yml
            - name: filebeat-pipeline-volume
              configMap:
                name: logstash-configmap
                items:
                  - key: filebeat.yml
                    path: filebeat.yml
            - name: filebeat-http-pipeline-volume
              configMap:
                name: logstash-configmap
                items:
                  - key: filebeat-http.yml
                    path: filebeat-http.yml
            - name: metricbeat-pipeline-volume
              configMap:
                name: logstash-configmap
                items:
                  - key: metricbeat.yml
                    path: metricbeat.yml
            - name: template-volume
              configMap:
                name: metricbeat-prometheus-template

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: logstash
      namespace: default
    spec:
      selector:
        app: logstash
      ports:
        - protocol: TCP
          port: 5044
          targetPort: 5044
      type: ClusterIP