Rancher 2.6 全新 Logging 快速入門(2)¶
原文: https://itcn.blog/p/22491197293.html
概述¶
本篇為 Rancher 2.6 全新 Logging 快速入門 的後續,為實際生產配置使用手冊。主要介紹以下日誌收集配置功能:
- 審計日誌收集
- Kubernetes 組件日誌收集
- 運行在 Kubernetes 上的容器應用日誌收集
- Runtime 日誌收集
- Kubernetes 事件收集和節點
- 節點 Kernel 日誌收集
Rancher 2.6 日誌採用了 logging-operator 方式進行日誌管理,對應概念如下:
logging
:用於定義一個日誌採集端 (FleuntBit) 和傳輸端 (Fleuntd) 服務的基礎配置,在 SUSE Rancher 2.6 版本中,已經由 Rancher 自動化部署完成;flow
:用於定義一個 namespaces (命名空間)級別的日誌過濾、解析和路由等規則;clusterflow
:用於定義一個集群級別的日誌過濾、解析和路由等規則;output
:用於定義 namespace (命名空間)級別的日誌的輸出和參數,它只能被同命名空間內的 flow 關聯;clusteroutput
:用於定義集群級別的日誌輸出和參數,它能把被其他命名空間內的 flow 關聯。
Logging 配置使用¶
ElasticSearch 和 kibana 部署¶
為了更好地演示效果,這裡部署臨時的 ElasticSearch 和 kibana 作為演示環境:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.5.2
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.16.1.232:9200 -p 5601:5601 -d kibana:7.5.2
Info
注:將 ELASTICSEARCH_HOSTS 地址修改為實際 ElasticSearch 的地址。
部署完後可通過 http://ip:9200 訪問 ElasticSearch,通過 http://ip:5601 訪問 Kibana。
启用 Rancher Logging¶
切換到對應集群,選擇 cluster-Tools ——> Logging,並勾選自定義 Helm 選項:
systemd Log Path
存儲的是系統日誌,因為 k3s 和 RKE2 發行版日誌都存儲在此。因此為了收集此日誌,需要進行配置此選項。
要確定目錄位置,可在其中一個節點上運行:
- 如果返回
persistent
,則應為:systemdLogPath/var/log/journal
- 如果返回
volatile
,則應為:systemdLogPath/run/log/journal
- 如果返回
auto
,請檢查是否存在/var/log/journal
- 如果存在
/var/log/journal
,則使用/var/log/journal
- 如果不存在
/var/log/journal
,則使用/run/log/journal
- SUSE15 默認為
/run/log/journal
部署前勾選編輯 yaml,進行以下參數修改:
修改 loggint-Operator 的默認配置,如 fluentd 和 fluentbit 默認資源限制和容忍規則,將 fluentbit 部署到 Controller 節點用於系統日誌收集。
bufferStorageVolume 為 fluentd 收集 fluentbit 的 log buffer 目錄,有分佈式文件系統存儲,建議存儲到分佈式文件系統中,修改 storageClassName 為實際分佈式存儲的 stroageclass 名字。如果沒有對應存儲,可以修改為bufferStorageVolume: {}。
替換以下內容:
fluentbit:
filterKubernetes:
Merge_Log: ''
Merge_Log_Key: ''
Merge_Log_Trim: ''
Merge_Parser: ''
inputTail:
Buffer_Chunk_Size: ''
Buffer_Max_Size: ''
Mem_Buf_Limit: ''
Multiline_Flush: ''
Skip_Long_Lines: ''
resources:
limits:
cpu: 500mp where you can insert the devi
fluentd:
bufferStorageVolume:
pvc:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 40Gi
storageClassName: fast
volumeMode: Filesystem
livenessProbe:
initialDelaySeconds: 30
periodSeconds: 15
tcpSocket:
port: 24240
nodeSelector: {}
resources:
limits:
cpu: '2'
memory: 4096M
requests:
cpu: 500m
memory: 100M
tolerations: {}
replicas: 3
fullnameOverride: ''
Warning
上述的設定必需根據個自 K8S 集群的元件與配置來進行相對的修改。
執行以下命令檢查部署是否成功:
kubectl get pod -n cattle-logging-system
NAME READY STATUS RESTARTS AGE
rancher-logging-96b68cc4b-vqxnd 1/1 Running 0 9m54s
rancher-logging-fluentbit-cntgb 1/1 Running 0 69s
rancher-logging-fluentbit-hwmdx 1/1 Running 0 71s
rancher-logging-fluentbit-nw7rw 1/1 Running 0 71s
rancher-logging-fluentd-0 2/2 Running 0 9m34s
rancher-logging-fluentd-1 2/2 Running 0 9m34s
rancher-logging-fluentd-2 2/2 Running 0 9m34s
rancher-logging-fluentd-configcheck-ac2d4553 0/1 Completed 0 9m48s
集群審計日誌開啟和採集¶
要在集群所有 Controller 節點上創建審計日誌策略,需要在主機創建審計日誌策略文件 /etc/kubernetes/audit-policy.yaml
,內容如下:
添加集群參數,從 Cluster-Manager 選擇對應的集群 —> edit Config
,給 Api-server 添加以下參數:
kube-apiserver-arg:
- audit-log-maxsize=100
- audit-log-maxage=60
- audit-log-maxbackup=10
- audit-policy-file=/etc/kubernetes/audit-policy.yaml
參數解釋:
maxsize
:表示日誌量多大時進行一次輪轉maxage
:表示保留審計日誌多少天maxbackup
:表示保留審計日誌文件多少份policy-file
:定義審計日誌保存策略
添加 apiserver 目錄映射參數:
因為 api-server 是 pod 方式啟動,為了能加載 auditlog-policy,需要將此目錄映射到 api-server pod 中。
完成後,集群會進入自動升級模式。等待升級完成,集群審計日誌將存儲在 /var/lib/rancher/rke2/server/logs/audit.log
文件和目錄。
Kubernetes 組件日誌收集¶
RKE2 Kubernetes 組件日誌都集中在以下 namespace 中,在啟動 logging 時,配置日誌目錄會自動部署採集器進行採集:
應用以下 Yaml 到集群中:
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
name: test-output
namespace: cattle-logging-system
spec:
elasticsearch:
buffer:
timekey: 1m
timekey_wait: 30s
timekey_use_utc: true
host: 172.16.1.166
port: 9200
scheme: http
reconnect_on_error: true
reload_on_failure: true
reload_connections: false
logstash_format: true
logstash_prefix: k8s-components
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterFlow
metadata:
name: test
namespace: cattle-logging-system
spec:
globalOutputRefs:
- test-output
match:
- select:
namespaces:
- cattle-monitoring-system
- cattle-system
- kube-system
ClusterOutput
定義日誌發送到哪,這裡配置的是 ElasticSearch,根據實際情況,修改 ElasticSearch 的地址;Logstash_prefix
定義的是對應的 ElasticSearch 內的 index 名稱。建議根據對應集群名稱配置;Logstash_prefix
定義發送到 ES 後對應的 Index 名稱;Logstash_format
表示開啟 Index 按天自動創建輪轉;ClusterFlow
用於定義一個集群級別的日誌過濾、解析和路由等規則,在這裡 labels 與對應的採集 pod 的 label 相關連,這裡啟動 Hosttailer 後會自動啟動收集 pod 和集群層級收集關聯;GlobalOutputRefs
定義的為上面配置的 ClusterOutput 的名稱,表示輸出到什麼地方。
Kubernetes Application 日誌採集¶
應用以下 Yaml 到集群中:
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
name: k8s-application-output
namespace: cattle-logging-system
spec:
elasticsearch:
buffer:
timekey: 1m
timekey_wait: 30s
timekey_use_utc: true
host: 172.16.1.166
port: 9200
scheme: http
reconnect_on_error: true
reload_on_failure: true
reload_connections: false
logstash_format: true
logstash_prefix: k8s-application
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterFlow
metadata:
name: test
namespace: cattle-logging-system
spec:
globalOutputRefs:
- k8s-application-output
match:
- exclude:
namespaces:
- cattle-monitoring-system
- cattle-system
- cattle-logging-system
- kube-system
- cattle-fleet-system
- select: {}
通過 exclude 將系統組件命名空間排除在外,採集的便是全部應用的標準輸出日誌。
Runtime 日志采集¶
應用以下 Yaml 到集群中:
apiVersion: logging-extensions.banzaicloud.io/v1alpha1
kind: HostTailer
metadata:
name: runtimelog-hosttailer
namespace: cattle-logging-system
spec:
fileTailers:
- name: runtime-tail
path: /var/lib/rancher/rke2/agent/containerd/containerd.log
buffer_max_size: 64k #此值一定要修改,不然启动不成功
disabled: false
skip_long_lines: "true"
containerOverrides:
image: www.wanshaoyuan.com/rancher/mirrored-fluent-fluent-bit:1.8.15
workloadOverrides:
tolerations:
- effect: NoSchedule
key: cattle.io/os
operator: Equal
value: linux
- operator: Exists
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
name: runtimelog-tailer-clusteroutput
namespace: cattle-logging-system
spec:
elasticsearch:
buffer:
timekey: 1m
timekey_wait: 30s
timekey_use_utc: true
reconnect_on_error: true
reload_on_failure: true
reload_connections: false
host: 172.16.1.166
port: 9200
scheme: http
logstash_format: true
logstash_prefix: cluster1-runtimelog-tailer
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
name: runtimetailer-flow
namespace: cattle-logging-system
spec:
filters:
- tag_normaliser: {}
- parser:
parse:
type: none
match:
- select:
labels:
app.kubernetes.io/instance: runtimelog-hosttailer-host-tailer
globalOutputRefs:
- runtimelog-tailer-clusteroutput
配置審計日誌採集¶
應用以下 Yaml 到集群中:
apiVersion: logging-extensions.banzaicloud.io/v1alpha1
kind: HostTailer
metadata:
name: auditlog-hosttailer
namespace: cattle-logging-system
spec:
fileTailers:
- name: audit-tail
path: /var/lib/rancher/rke2/server/logs/audit.log
buffer_max_size: 64k #此值一定要修改,不然启动不成功
disabled: false
skip_long_lines: "true"
containerOverrides:
image: www.wanshaoyuan.com/rancher/mirrored-fluent-fluent-bit:1.8.15
workloadOverrides:
tolerations:
- effect: NoSchedule
key: cattle.io/os
operator: Equal
value: linux
- operator: Exists
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
name: auditlog-tailer-clusteroutput
namespace: cattle-logging-system
spec:
elasticsearch:
buffer:
timekey: 1m
timekey_wait: 30s
timekey_use_utc: true
reconnect_on_error: true
reload_on_failure: true
reload_connections: false
host: 172.16.1.166
port: 9200
scheme: http
logstash_format: true
logstash_prefix: cluster1-auditlog-tailer
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
name: hosttailer-flow
namespace: cattle-logging-system
spec:
filters:
- tag_normaliser: {}
- parser:
parse:
type: json
match:
- select:
labels:
app.kubernetes.io/instance: auditlog-hosttailer-host-tailer
globalOutputRefs:
- auditlog-tailer-clusteroutput
containerOverrides
定義的是離線部署的鏡像,默認鏡像地址為 fluent/fluent-bit:1.8.15;HostTailer
定義採集的文件,並自動部署 fluent-bit 進行掛載映射;ClusterOutput
定義日誌發送到哪,這裡配置的是 ElasticSearch,根據實際情況,修改 ElasticSearch 的地址,logstash_prefix 定義的是對應的 ElasticSearch 內的 index 名稱。建議根據對應集群名稱配置;Flow
用於定義一個 namespaces (命名空間)級別的日誌過濾、解析和路由等規則,在這裡 labels 與對應的採集 pod 的 label 相關連,這裡啟動 hosttailer 後會自動啟動收集 pod,它的 label 為app.kubernetes.io/instance: auditlog-hosttailer-host-tailer;globalOutputRefs
定義的為上面配置的 ClusterOutput 的名稱,表示輸出到什麼地方。
Event 收集¶
應用以下 Yaml 到集群中:
apiVersion: logging-extensions.banzaicloud.io/v1alpha1
kind: EventTailer
metadata:
name: rancher
spec:
controlNamespace: cattle-logging-system
containerOverrides:
image: www.wanshaoyuan.com/rancher/eventrouter:v0.1.0
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
name: event-tailer-clusteroutput
namespace: cattle-logging-system
spec:
elasticsearch:
buffer:
timekey: 1m
timekey_wait: 30s
timekey_use_utc: true
reconnect_on_error: true
reload_on_failure: true
reload_connections: false
host: 172.16.1.166
port: 9200
scheme: http
logstash_format: true
logstash_prefix: kubernetes-event-tailer
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
name: rancher-event-tailer-flow
namespace: cattle-logging-system
spec:
filters:
- tag_normaliser: {}
- parser:
parse:
type: json
globalOutputRefs:
- event-tailer-clusteroutput
match:
- select:
labels:
app.kubernetes.io/name: event-tailer
EventTailer
:設置 Event 收集,會啟動一個 rancher-event-tailer statefulset,內網部署需要修改鏡像地址為內網倉庫。默認鏡像地址為banzaicloud/eventrouter:v0.1.0;ClusterOutput
:定義日誌發送到哪,這裡配置的是 ElasticSearch,根據實際情況,修改 ElasticSearch 的地址,logstash_prefix 定義的是對應的 ElasticSearch 內的 index 名稱,建議根據對應集群名稱配置;labels
:關聯的是 rancher-event-tailer 這個 statefulset 的 label。
節點 Kernel 日誌收集¶
應用以下 Yaml 到集群中:
apiVersion: logging-extensions.banzaicloud.io/v1alpha1 kind: HostTailer metadata: name: rancher-host-file-tailer namespace: cattle-logging-system spec: fileTailers: - name: system-messages path: /var/log/messages buffer_max_size: 64k disabled: false skip_long_lines: "true" containerOverrides: image: www.wanshaoyuan.com/rancher/mirrored-fluent-fluent-bit:1.8.15 workloadOverrides: tolerations: - effect: NoSchedule key: cattle.io/os operator: Equal value: linux - operator: Exists
apiVersion: logging.banzaicloud.io/v1beta1 kind: ClusterOutput metadata: name: host-files-clusteroutput namespace: cattle-logging-system spec: elasticsearch: buffer: timekey: 1m timekey_wait: 30s timekey_use_utc: true reconnect_on_error: true reload_on_failure: true reload_connections: false host: 172.16.1.166 port: 9200 scheme: http logstash_format: true logstash_prefix: cluster_os_logs
apiVersion: logging.banzaicloud.io/v1beta1 kind: Flow metadata: name: rancher-host-files-flow namespace: cattle-logging-system spec: filters: - tag_normaliser: {} - record_modifier: records: - host: ${record.dig('kubernetes', 'host')} whitelist_keys: host,message globalOutputRefs: - host-files-clusteroutput match: - select: labels: app.kubernetes.io/instance: rancher-host-file-tailer-host-tailer
結果檢查¶
在 ElasticSearch 中檢查是否創建出對應的 index,並且檢查全部 index:
curl http://172.16.1.166:9200/_cat/indices
yellow open k8s-components-2022.06.02 hg9OQTQEQsKLNwn3Kf_jdA 1 1 85231 0 32.4mb 32.4mb
yellow open cluster_os_logs-2022.06.02 zARda8N1R9OpZRX-cZIS1g 1 1 3666 0 738.9kb 738.9kb
yellow open k8s-application-2022.06.02 x0XxNvmmQQurdWDn4IL2gA 1 1 433 0 232.5kb 232.5kb
yellow open cluster1-auditlog-tailer-2022.06.02 qrAzHadxTeWQXF-E8B1VEQ 1 1 1686458 0 761.2mb 761.2mb
yellow open cluster1-runtimelog-tailer-2022.06.02 0DQp0at8TzOGSt911wnocw 1 1 1545 0 469.2kb 469.2kb
yellow open kubernetes-event-tailer-2022.06.02 L80_wp6iRQy2d0DGmiSxhA 1 1 1169 0 1.1mb 1.1mb
在 kibana 中查看 index 中日誌信息:
總結¶
相比於 Rancher 2.6 之前的版本, Logging-operator 的引入大大增強了靈活性和功能性,可以非常靈活地配置各類參數和想收集的日誌信息;但與之對應的是,使用門檻比 2.6 之前版本的有所提高。希望本篇文章可以幫助你加深對 Rancher Logging 的理解。