共計 2242 個字符,預(yù)計需要花費 6 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 Kubernetes 日志有關(guān)知識點有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
關(guān)于日志 #1 多種多樣的日志
應(yīng)用程序具有日志,用于排查問題。集群具有日志,用于排查問題。容器環(huán)境具有日志機(jī)制,容器化應(yīng)用應(yīng)將日志寫入標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤。
#2 但這些日志機(jī)制存在問題
但是由容器引擎提供的日志功能遠(yuǎn)遠(yuǎn)不夠:容器崩潰,驅(qū)逐 POD 實例,節(jié)點崩潰,在這些情況下我們依舊希望訪問日志。因此日志需要獨立存儲,并且生命周期與節(jié)點、容器等等無關(guān)。
該概念被稱為“集群日志”。
#3 集群日志
“集群日志”需要單獨存儲,但是 Kubernetes 并沒有提供日志后端存儲,需要我們自己集成。本文結(jié)合官方「Logging Architecture」文檔,整理與日志有關(guān)內(nèi)容。
寫入標(biāo)準(zhǔn)輸出的日志
使用 kubectl logs 查看日志,添加 –previous 選項查看已崩潰容器的日志。
如果在 POD 實例中具有容器,可以指定容器名查看特定容器日志。
節(jié)點級日志類型應(yīng)用程序日志
由容器應(yīng)用寫入標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤的日志,會被容器引擎重定向。例如在 Docker 中,由日志驅(qū)動處理(在 Kubernetes 中,被配置寫入 JSON 格式的文件中)。
注意,使用 Docker 日志驅(qū)動無法處理多行日志,需要在日志收集工具中進(jìn)行處理。
如果容器重啟,則 kubelet 會保存單個容器及它的日志。若驅(qū)逐 POD 實例,所有對應(yīng)的容器將被驅(qū)逐,包括日志。
另外節(jié)點日志還要考慮輪轉(zhuǎn)問題,防止日志消耗過多磁盤。但是 Kubernetes 當(dāng)前不負(fù)責(zé)日志輪轉(zhuǎn),這個問題應(yīng)該由容器應(yīng)用處理。另外可以可以配置容器環(huán)境處理日志輪轉(zhuǎn),例如使用 Docker 的 –log-opt 選項。
當(dāng)執(zhí)行 kubectl logs 時,由對應(yīng)節(jié)點的 kubelet 響應(yīng),直接讀取日志文件。注意,如果外部系統(tǒng)執(zhí)行輪轉(zhuǎn),日志截斷為多個文件時,則 kubectl logs 只能讀取組后一個文件。
系統(tǒng)組件日志
系統(tǒng)組件也有日志,但是分為兩類:(1)運行在容器內(nèi)的組件;(2)運行在容器外的組件;
運行在容器外的組件,例如 kubelet 及 Docker 等等:如果使用 systemd 管理,則日志寫入 journald 中;如果未使用 systemd 管理,則日志寫入 /var/log 中;
運行在容器內(nèi)的組件,例如 kube-proxy 或 scheduler 等等:使用默認(rèn)日志機(jī)制,將日志寫入 /var/log 中;
同樣,寫入 /var/log 中的日志也需要輪轉(zhuǎn)。
集群級日志的解決方案
由于 Kubernetes 沒有提供集群日志解決方案,有以下集中途徑解決:
使用節(jié)點級日志代理,運行在每個節(jié)點中
使用專用容器(Sidecar),收集應(yīng)用程序日志
從應(yīng)用程序中直接將日志寫入后端日志存儲
下面我們將簡述各種解決方法
使用節(jié)點日志代理
以 DeamonSet 在每個節(jié)點運行 POD 實例,用于直接讀取日志文件。但是這只適用于將日志寫入標(biāo)準(zhǔn)錯誤與標(biāo)準(zhǔn)輸出的容器。
常用解決方案有 Elasticsaerch+Fluentd 服務(wù)。
使用專用容器(Sidecar)
使用 Sidecar 容器(與應(yīng)用容器處于相同 POD 實例的容器),有兩種方式:(1)Sidecar 容器將應(yīng)用日志“流入”自己的標(biāo)準(zhǔn)輸出;(2)Sidecar 容器運行日志代理,收集應(yīng)用程序日志;
# 流式 Sidecar 容器:
當(dāng) Sidecar 容器使用自身的標(biāo)準(zhǔn)錯誤與標(biāo)準(zhǔn)輸出時,可以利用 kubelet 與每個節(jié)點的日志代理。Sidecar 容器可以讀取文件、套接字、journald,然后將日志寫入自己的標(biāo)準(zhǔn)錯誤、標(biāo)準(zhǔn)輸出中。
這種方法可以從應(yīng)用程序不同部分中分離出不同的日志流,即使有些應(yīng)用程序可能不支持寫入標(biāo)準(zhǔn)輸入、與標(biāo)準(zhǔn)輸出。日志重定向每次只需要處理很小日志,因此不會出現(xiàn)過渡的開銷。另外由于 Sidecar 的標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤與 kubelet 處理,因此可以通過 kubectl logs 查看日志。
雖然 Sidecar 是額外的容器,但是它可以簡單到只運行 tail 命令。Sidecar 是一種涉及模式。
另外節(jié)點級日志代理會自動處理日志,無需進(jìn)一步配置。還可以配置收集代理來根據(jù)“源容器”日志類型進(jìn)行解析。
盡管 CPU 使用降低,但是會增加磁盤使用量。如果你的應(yīng)用程序需要將日志寫入文件,那盡量寫入到標(biāo)準(zhǔn)輸出中,而不是使用 Sidecar 容器處理。
# 帶有日志代理的 Sidecar 容器:
如果節(jié)點級日志代理無法滿足需求,可以運行在 Sidecar 容器中運行日志收集代理。該代理可以經(jīng)過配置,適用于特定應(yīng)用程序。但是該類型的 Sidecar 會消耗更多資源,并且不能使用 kubectl logs 查看日志。
直接暴露日志
最后一種方法是將日志直接寫入后端存儲,這是一種日志存儲方案,但是與 Kubernetes 集群的關(guān)系并不大,這里不再討論。
最后總結(jié)
在 Kubernetes Cluster 中,需要處理的日志分為以下幾種:
容器外日志:kubelet、Docker
容器內(nèi)日志:(已寫標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)錯誤)容器應(yīng)用程序,包括集群組件(比如 kube-porxy,etcd 等等)容器內(nèi)日志:(未寫標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)錯誤)容器應(yīng)用應(yīng)用,寫入容器本地
使用 DaemonSet 運行 POD 實例,在節(jié)點中收集日志。
以上是“Kubernetes 日志有關(guān)知識點有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!