k8s 日志收集之 EFK


如今越來越多的應用部署在容器之中,如何收集日志也是一個很重要的問題。服務出問題了,排查問題需要給開發看日志。服務一般會在多個不同的 pod 中,一個一個的登進去看也的確不方便。業務數據統計也需要日志。因此日志收集很重要。今天就來試着部署一下業內常用的 k8s 日志收集方案 EFK。

E - elasticsearch

F - fluentd / filebeat

K - kibana

參考: https://github.com/easzlab/kubeasz/blob/master/docs/guide/efk.md

下面就直接是部署步驟:

1. clone 腳本

git clone https://github.com/easzlab/kubeasz.git
cd kubeasz
git checkout 2.2.3

2. 修改鏡像版本

腳本中默認的 elasticsearch / kibana 是 6.x 版本. 這里我們修改為 7.x 版本
# manifests/efk/kibana-deployment.yaml
image: registry.cn-shanghai.aliyuncs.com/ninejy/kibana-oss:7.4.2

# manifests/efk/es-static-pv/es-statefulset.yaml
image: registry.cn-shanghai.aliyuncs.com/ninejy/elasticsearch:v7.4.3

# manifests/efk/fluentd-es-ds.yaml
image: registry.cn-shanghai.aliyuncs.com/ninejy/fluentd:v3.1.0

3. 安裝並配置 nfs

# ubuntu 16.04
apt-get update && apt-get install -y nfs-kernel-server nfs-common

# cat /etc/exports
/data *(insecure,rw,sync,no_root_squash,no_all_squash,no_subtree_check)

# start nfs server
systemctl start nfs-kernel-server.service

4. 配置 pv

# cat manifests/efk/es-static-pv/es-pv0.yaml
# IP 根據實際的來寫
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-es-0
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: "es-storage-class"
  nfs:
    path: /data/es00
    server: 10.31.0.18

# cat manifests/efk/es-static-pv/es-pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-es-1
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: "es-storage-class"
  nfs:
    path: /data/es01
    server: 10.31.0.18

# cat manifests/efk/es-static-pv/es-pv2.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-es-2
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: "es-storage-class"
  nfs:
    path: /data/es02
    server: 10.31.0.18

# create directory
mkdir -p /data/{es00,es01,es02}

# manifests/efk/es-static-pv/es-statefulset.yaml
# 修改 volumeClaimTemplates 下面的 storage 容量, 跟上面創建的 pv 容量保持一致
  volumeClaimTemplates:
  - metadata:
      name: elasticsearch-logging
    spec:
      accessModes: [ "ReadWriteMany" ]
      storageClassName: "es-storage-class"
      resources:
        requests:
          storage: 5Gi

5. 執行腳本創建 efk

kubectl apply -f manifests/efk/
kubectl apply -f manifests/efk/es-static-pv/

6. 驗證

kubectl get pods -n kube-system|grep -E 'elasticsearch|fluentd|kibana'
kubectl get pv
kubectl get pvc --all-namespaces

# 強制刪除 pv
# kubectl patch pv pv-name -p '{"metadata":{"finalizers":null}}'

 說明: 這個方案只能搜集容器標准輸出的日志, 如果需要搜集文件日志,可以使用阿里雲開源的 log-pilot

下面是 log-pilot 的部署步驟:

7. 修改鏡像, 默認的鏡像使用 filebeat-6.x, 這跟 elasticsearch-7.x 不兼容。

# manifests/efk/log-pilot/log-pilot-filebeat.yaml
image: registry.cn-shanghai.aliyuncs.com/ninejy/log-pilot:0.9.7-filebeat-oss-7.4.2

8. 執行命令創建 Daemonset

kubectl apply -f manifests/efk/log-pilot/log-pilot-filebeat.yaml

9. 驗證

kubectl -n kube-system get pods | grep log-pilot

 10. 部署應用測試日志收集

# myapp-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp-test
  template:
    metadata:
      labels:
        app: myapp-test
    spec:
      containers:
      - name: myapp-container
        image: registry.cn-shanghai.aliyuncs.com/ninejy/hello:v5
        ports:
        - containerPort: 80
        env:
        - name: aliyun_logs_myappStdout
          value: "stdout"
        - name: aliyun_logs_myappFile
          value: "/var/log/app/*.log"
        volumeMounts:
        - name: myapp-log
          mountPath: /var/log/app
      volumes:
      - name: myapp-log
        emptyDir: {}

注意:容器中的環境變量 aliyun_logs_xxx 是收集日志的關鍵。"stdout" 是收集容器標准輸出的日志。"/var/log/app/*.log" 是日志文件路徑, 並且該路徑是通過 emptyDir 類型掛載到容器中。

部署測試應用並訪問一下剛部署的應用,使生成一些日志

kubectl apply -f myapp-test.yaml

kubectl get pod -o wide
# myapp-test-b5bf9975-nz2kk   1/1     Running   0          143m   172.20.2.7   192.168.0.63

curl 172.20.2.7:28080
# [2021-03-14 13:30:48] Version  --> v5.0, Hostname --> myapp-test-b5bf9975-nz2kk

# 獲取 kibana 訪問地址
kubectl cluster-info | grep kibana

 瀏覽器打開 kibana 訪問地址,創建 'index pattern', 之后就能看到應用的日志已經到 elasticsearch 中了

 

補充:通過 Api-server 訪問 kibana (dashboard 一樣的)

# 獲取客戶端證書, 進行 base64 解碼后保存到 kubecfg.crt
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d > kubecfg.crt

# 獲取客戶端公鑰, 進行 base64 解碼后保存到 kubecfg.key
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d > kubecfg.key

# 提取 kubecfg.crt 和 kubecfg.key 文件內容, 生成 P12 安全證書, 並保存到 kubecfg.p12 文件
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

# 說明: 生成安全證書時, 需要設置提取密碼, 你可以設置自定義密碼或設置密碼為空

# 將安全證書下載到本地, 以 Windows10 操作系統為例, 證書的安裝步驟如下
# 1. 雙擊證書文件, 彈出證書導入向導對話框, 確定要導入的證書文件
# 2. 輸入生成安全證書時設置的自定義密碼
# 3. 設置證書保存位置
# 4. 完成證書導入

# kubectl cluster-info | grep kibana # 這條命令獲取 kibana 的訪問地址
# https://192.168.0.61:6443/api/v1/namespaces/kube-system/services/kibana-logging/proxy
# 瀏覽器輸入上面獲取的地址即可訪問 kibana

 

更多詳細的 log-pilot 介紹請參考文檔

阿里雲介紹文檔: https://help.aliyun.com/document_detail/86552.html

介紹文檔2: https://yq.aliyun.com/articles/674327

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM