iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
自我挑戰組

從雲端開始的菜鳥任務系列 第 7

Day 7 ELK Stack + Filebeat 收集 k8s log

2021 鐵人賽 DAY7

今天來安裝 ELK Stack,並且收集 k8s 的 log,但是會有一點點不同,我們看下圖:

ELK

這個圖簡單表現出一個利用 ELK 收集 log 的流程,你的 log file 會被送到 logstash 做資料清洗或是處理, logstash 再將處理好的資料(log)送至 elsaticsearch 做儲存,最後再由 kibana 將你的資料視覺化、展示給你看,而今天所分享的方法較為簡單,雖然也可以收集 log 但卻在實際應用上會不大方便使用,我們看下圖:

ELK+Beat

跟上面那張圖相比,多了一個 beat,那 beat 在這裡擔任什麼工作呢?beat 負責的主要是收集資料,並送至 elasticsearch 或 logstash 做資料處理,再送至 elasticsearch,不過beat有分很多種,metricbeat 、 filebeat 等,每個 beat 的分工各不相同,像 filebeat ,顧名思義就是會去收集 file 的 data ,而這也是我們今天要使用的,不過我們今天不做資料處理,也就是沒有 logstash 的部分,所以會導致數面所提到的問題,那不贅述太多,先來安裝看看吧!

利用官方CRD部署

安裝elk自定義的resource

kubectl apply -f https://download.elastic.co/downloads/eck/1.3.1/all-in-one.yaml

安裝elasticsearch

kubectl apply -f es.yaml

es.yaml

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 7.10.2
  nodeSets:
    - name: default
      count: 1
      config:
        node.store.allow_mmap: false
      podTemplate:
        spec:
          volumes:
          - name: elasticsearch-data
            emptyDir: {}

測試elasticsearch是否成功部屬

Port-foward the elasticsearch service

kubectl port-forward service/quickstart-es-http 9200

從secret中獲取密碼

默認帳號:elastic

PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}')
echo $PASSWORD

測試

curl -u "elastic:$PASSWORD" -k "https://localhost:9200"

安裝kibana

 kubectl apply -f kibana.yaml

kibana.yaml

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 7.10.2
  count: 1
  elasticsearchRef:
    name: quickstart

測試kibana是否成功部屬

Port-foward the kibana service

kubectl port-forward --address=0.0.0.0 service/quickstart-kb-http 5601:5601

從secret中獲取密碼

默認帳號:elastic

kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo

測試

https://{node-IP}:5601

安裝filebeat

kubectl apply -f filebeat.yaml

filebeat.yaml

apiVersion: beat.k8s.elastic.co/v1beta1
kind: Beat
metadata:
  name: quickstart
spec:
  type: filebeat
  version: 7.10.2
  elasticsearchRef:
    name: quickstart
  config:
    filebeat.inputs:
      - type: container
        paths:
          - /var/log/containers/*.log
  daemonSet:
    podTemplate:
      spec:
        dnsPolicy: ClusterFirstWithHostNet
        hostNetwork: true
        securityContext:
          runAsUser: 0
        containers:
          - name: filebeat
            volumeMounts:
              - name: varlogcontainers
                mountPath: /var/log/containers
              - name: varlogpods
                mountPath: /var/log/pods
              - name: varlibdockercontainers
                mountPath: /var/lib/docker/containers
        volumes:
          - name: varlogcontainers
            hostPath:
              path: /var/log/containers
          - name: varlogpods
            hostPath:
              path: /var/log/pods
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers

建立測試pod來產生log

test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    # 輸出hello world
    args: [/bin/sh, -c,
            'i=0; while true; do echo "hello world: $i: $(date)"; i=$((i+1)); sleep 3; done']

ps: 記得create 或 apply :)

觀察log

至kibana查找上述pod所產生的log

Ya! 有 log 了,不過省略 logstash 其實還蠻麻煩的,這些 log 一但多了起來,樣式也多樣化之後,會挺不好看的,目前我不清楚是否能在 filebeat 上進行簡單的資料處理,所以資料處理的部分都在 logstash 上做,如果有人知道 filebeat 可以多做一些什麼的話,還請各位留言告知謝謝!

一天:)


上一篇
Day 6 ELK Stack on k8s 介紹
下一篇
Day 8 ELK Stack + Filebeat 另一種部署方式 + MetricBeat
系列文
從雲端開始的菜鳥任務30

尚未有邦友留言

立即登入留言