理解OpenShift(1):網絡之 Router 和 Routehtml
理解OpenShift(2):網絡之 DNS(域名服務)node
理解OpenShift(5):從 Docker Volume 到 OpenShift Persistent Volumegit
理解OpenShift(6):集中式日誌處理github
** 本文基於 OpenShift 3.11,Kubernetes 1.11 進行測試 ***sql
(1)由應用本身處理日誌,而不須要容器引擎參與docker
好比一個使用Log4j2 日誌組件的Java應用, 它經過日誌組件將日誌發往一個遠端日誌服務器。此時,不利用容器引擎的日誌功能。數據庫
(2)使用數據卷(Data volume)json
使用數據卷,容器內應用將日誌寫入數據卷中。此時,也不利用容器引擎的日誌功能。
(3)使用 Docker 日誌驅動(logging driver)
Docker 日誌驅動會讀取容器中主進程的 stdout(標準輸出) 和 stderr(錯誤輸出),而後將內容寫入容器所在的宿主機上的文件中。
Docker 支持多種日誌驅動。
(圖片來源:https://jaxenter.com/docker-logging-gotchas-137049.html)
幾個比較常見的:
更多日誌驅動,能夠查看 https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers。
Docker 還支持插件形式的更多日誌驅動,具體請看 https://docs.docker.com/config/containers/logging/plugins/。
(4)使用專門的日誌容器
Docker 日誌驅動這種實現方式有一些限制:
對於這些不支持的場景,好比應用有將日誌寫到日誌文件,此時能夠利用在同一個Pod中的專門日誌容器。它會以邊車(sidecar)形式讀取應用容器中的日誌產生,而後作處理和轉發,好比轉發到 stdout 和 stderr。
另外,某些這種場景還有另一種更簡單的處理方式。以 Nginix 爲例,它默認寫入日誌文件,而後經過下面的方式,將日誌也輸出到 stdout 和 stderr。這種方式有一些限制,具體可參考 https://github.com/moby/moby/issues/19616:
# forward request and error logs to docker log collector RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log
OpenShift/Kubernetes 環境的日誌處理可分爲三個發展階段,或三種處理類型:
類型 | 說明 | 使用方式 |
容器本地日誌(container local logging) | 寫到容器內部的標準輸出(standard output)和標準錯誤流(stand error),或者容器內日誌文件。這種日誌的問題是當容器死掉後,日誌也會丟失,也就沒法再訪問了。 | 需登陸進容器查看日誌文件,或使用容器命令獲取日誌。OpenShift 提供 oc rsh 命令以進入容器,oc logs 命令以獲取日誌。 |
節點本地日誌(node-level logging) | 容器引擎將容器中全部的標準輸出和標準錯誤輸出都轉發到容器所在的本地節點上。Docker 可利用其日誌驅動(logging driver)。爲了不容器中的日誌將節點撐爆,能夠作 log rotation。這種方式比 local logging 方式要好,可是還不是很是好,由於日誌會保存在本地節點上。 | 需登陸宿主機,查看本地日誌文件 |
集羣集中日誌(cluster-level-loggin) | 這須要另外的後端來存儲、分析和查詢日誌。後端能夠在集羣內,也可在集羣外。一個 node-level 日誌處理插件(好比 Fluentd)會運行在每一個節點上,將節點上的日誌發到集中的日誌處理後端。還有一個可視化組件,讓用戶能夠可視化地查看日誌。 | 可經過瀏覽器或其它可視化界面在線查看日誌 |
EFK(ElasticSearch - Fluentd - Kibana)是一種可以實現集羣集中日誌處理的開源套件。其中,
三個組件中,Fluentd 會直接和Docker/K8S/OKD打交道,而 ES 和 Kibana 則相對獨立,不和容器集羣有直接關係,除了用戶校驗之外。Fluentd 致力於解決多種日誌來源和多種日誌存儲之間的複雜問題。它做爲日誌和日誌存儲之間的中間件,負責日誌的收集、過濾和轉發工做。
Fluentd 採用插件形式的架構,支持爲了知足各類需求的日誌採集、過濾、緩存和輸出等功能。其v0.12 版本架構以下:
其中:
在 K8S/OKD 環境中,Fulentd 以 DeamonSet 形式運行在每一個節點上。它會以 Volume 形式將所在宿主機上的多個保存日誌的目錄或文件掛載進容器,以被容器中的Fluentd進程所讀取:
Fluentd 的配置文件被建立了一個 OpenShfit ConfigMap 對象(名爲logging-fluentd),而後該對象被以 Volume 形式掛載爲Fluentd容器目錄 /etc/fluent/configs.d/user。其中的配置文件 fluentd.conf 指定了Fluentd 所使用的 input、filter 和 output 插件及其配置:
其中
ES 環境的信息以環境變量的形式保存在 Fluentd pod 上:
被影響人員 | 影響(好的方面) | 影響(很差的方面)/要求 |
容器雲平臺運維人員 |
|
|
容器應用開發人員 |
|
|
容器雲平臺研發團隊 |
|
|
備註:本部份內容引用自 http://blog.51cto.com/13527416/2051506。
這種架構只適合於開發測試環境,以及小型生產環境。
這種架構適合於較大型可是日誌產生量不大及頻率不高的環境。
在日誌產生量大頻率高的狀況下,須要引入消息隊列,以減輕對後端日誌存儲的壓力,減小日誌丟失機率。
目前沒有特別成熟的方案,估計大部分的架構仍是前面的架構,這種跨機房架構更多地在大型互聯網公司有落地。一般有幾種方案供參考:
參考鏈接:
感謝您的閱讀,歡迎關注個人微信公衆號: