系統架構圖:java
1) 多個Filebeat在各個Node進行日誌採集,而後上傳至Logstashgit
2) 多個Logstash節點並行(負載均衡,不做爲集羣),對日誌記錄進行過濾處理,而後上傳至Elasticsearch集羣github
3) 多個Elasticsearch構成集羣服務,提供日誌的索引和存儲能力docker
4) Kibana負責對Elasticsearch中的日誌數據進行檢索、分析json
官方chart地址:https://github.com/elastic/helm-charts/tree/master/elasticsearchbash
建立logs命名空間架構
kubectl create ns logs
添加elastic helm charts 倉庫負載均衡
helm repo add elastic https://helm.elastic.co
安裝elasticsearch
helm install --name elasticsearch elastic/elasticsearch --namespace logs
參數說明ide
image: "docker.elastic.co/elasticsearch/elasticsearch" imageTag: "7.2.0" imagePullPolicy: "IfNotPresent" podAnnotations: {} esJavaOpts: "-Xmx1g -Xms1g" resources: requests: cpu: "100m" memory: "2Gi" limits: cpu: "1000m" memory: "2Gi" volumeClaimTemplate: accessModes: [ "ReadWriteOnce" ] storageClassName: "nfs-client" resources: requests: storage: 50Gi
官方chart地址:https://github.com/elastic/helm-charts/tree/master/filebeat
Add the elastic helm charts repo
helm repo add elastic https://helm.elastic.co
Install it
helm install --name filebeat elastic/filebeat --namespace logs
參數說明:
image: "docker.elastic.co/beats/filebeat" imageTag: "7.2.0" imagePullPolicy: "IfNotPresent" resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "1000m" memory: "200Mi"
那麼問題來了,filebeat默認收集宿主機上docker的日誌路徑:/var/lib/docker/containers。若是咱們修改了docker的安裝路徑要怎麼收集呢,很簡單修改chart裏的DaemonSet文件裏邊的hostPath參數:
- name: varlibdockercontainers hostPath: path: /var/lib/docker/containers #改成docker安裝路徑
對java程序的報錯異常log實現多行合併,用multiline定義正則來匹配。
filebeatConfig: filebeat.yml: | filebeat.inputs: - type: docker containers.ids: - '*' multiline.pattern: '^[0-9]' multiline.negate: true multiline.match: after processors: - add_kubernetes_metadata: in_cluster: true output.elasticsearch: hosts: '${ELASTICSEARCH_HOSTS:elasticsearch-master:9200}'
官方chart地址:https://github.com/elastic/helm-charts/tree/master/kibana
Add the elastic helm charts repo
helm repo add elastic https://helm.elastic.co
Install it
helm install --name kibana elastic/kibana --namespace logs
參數說明:
elasticsearchHosts: "http://elasticsearch-master:9200" replicas: 1 image: "docker.elastic.co/kibana/kibana" imageTag: "7.2.0" imagePullPolicy: "IfNotPresent" resources: requests: cpu: "100m" memory: "500m" limits: cpu: "1000m" memory: "1Gi"
官方chart地址:https://github.com/helm/charts/tree/master/stable/logstash
安裝
$ helm install --name logstash stable/logstash --namespace logs
參數說明:
image: repository: docker.elastic.co/logstash/logstash-oss tag: 7.2.0 pullPolicy: IfNotPresent persistence: enabled: true storageClass: "nfs-client" accessMode: ReadWriteOnce size: 2Gi
匹配label:json的pod日誌,沒有的話正常收集。
filebeatConfig: filebeat.yml: | filebeat.autodiscover: providers: - type: kubernetes templates: - condition: equals: kubernetes.labels.logFormat: "json" config: - type: docker containers.ids: - "${data.kubernetes.container.id}" json.keys_under_root: true json.overwrite_keys: true json.add_error_key: true - config: - type: docker containers.ids: - "${data.kubernetes.container.id}" processors: - add_kubernetes_metadata: in_cluster: true output.elasticsearch: hosts: '${ELASTICSEARCH_HOSTS:elasticsearch-master:9200}'
官方chart地址:https://github.com/helm/charts/tree/master/stable/elastalert
安裝
helm install -n elastalert ./elastalert --namespace logs
效果圖: