如今越來越多的應用部署在容器之中,如何收集日誌也是一個很重要的問題。服務出問題了,排查問題需要給開發看日誌。服務一般會在多個不同的 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: {}
部署測試應用並訪問一下剛部署的應用,使生成一些日誌
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