1.收集哪些日誌?
- K8S系統的組件日誌
- K8S Cluster裏面部署的應用程序日誌
- 標準輸出html
- 日誌文件 (輸出到指定文件裏)java
- 日誌輪轉(本地保留30天)node
- 日誌格式 (json,kv)nginx
若是是kubeadm方式部署的k8s 日誌是收集的 /var/log/messageweb
若是是二進制部署的k8s 日誌是配置文件中定義的日誌路徑docker
應用容器日誌apache
/var/lib/docker/contianers/*/*-json.logjson
docker配置文件中定義了 默認日誌格式爲jsonapi
pod的日誌路徑tomcat
/var/lib/kubelet/pods/*/volumes/
2.ELK收集日誌架構
其中logstash 是非必選的組件,若是日誌場景比較複雜的時候能夠加上logstash作出更好的預處理而後存入ES。
3.容器中的日誌怎麼收集
方案一:
Node上部署一個日誌收集程序
- DaemonSet方式部署日誌收集程序
- 對本節點/var/log/kubelet/pods和 /var/lib/docker/containers/兩個目錄下的日誌進 行採集
- Pod中容器日誌目錄掛載到宿主機統一目錄上
方案二:
Pod中附加專用日誌收集的容器
- 每一個運行應用程序的Pod中增長一個日誌 收集容器,使用emtyDir共享日誌目錄讓 日誌收集程序讀取到。
方案三:
應用程序直接推送日誌
方案比較:
方式 |
優勢 |
缺點 |
方案一:Node上部署一個日誌收集程序 |
每一個Node僅需部署一個日誌收集程序, 資源消耗少,對應用無侵入 |
應用程序日誌若是寫到標準輸出和標準錯誤輸出, 那就不支持多行日誌。 |
方案二:Pod中附加專用日誌收集的容器 |
低耦合 |
每一個Pod啓動一個日誌收集代理,增長資源消耗, 並增長運維維護成本 |
方案三:應用程序直接推送日誌 |
無需額外收集工具 |
浸入應用,增長應用複雜度 |
4.k8s部署efk
elasticsearch.yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch namespace: kube-system labels: k8s-app: elasticsearch spec: serviceName: elasticsearch selector: matchLabels: k8s-app: elasticsearch template: metadata: labels: k8s-app: elasticsearch spec: containers: - image: elasticsearch:7.3.2 name: elasticsearch resources: limits: cpu: 1 memory: 2Gi requests: cpu: 0.5 memory: 500Mi env: - name: "discovery.type" value: "single-node" - name: ES_JAVA_OPTS value: "-Xms512m -Xmx2g" ports: - containerPort: 9200 name: db protocol: TCP volumeMounts: - name: elasticsearch-data mountPath: /usr/share/elasticsearch/data volumeClaimTemplates: - metadata: name: elasticsearch-data spec: storageClassName: "managed-nfs-storage" accessModes: [ "ReadWriteOnce" ]