Kubernetes 系統(tǒng)日志

2022-05-26 15:28 更新

系統(tǒng)日志

系統(tǒng)組件的日志記錄集群中發(fā)生的事件,這對(duì)于調(diào)試非常有用。 你可以配置日志的精細(xì)度,以展示更多或更少的細(xì)節(jié)。 日志可以是粗粒度的,如只顯示組件內(nèi)的錯(cuò)誤, 也可以是細(xì)粒度的,如顯示事件的每一個(gè)跟蹤步驟(比如 HTTP 訪問日志、pod 狀態(tài)更新、控制器動(dòng)作或調(diào)度器決策)。

Klog

klog 是 Kubernetes 的日志庫。 klog 為 Kubernetes 系統(tǒng)組件生成日志消息。

Kubernetes 正在進(jìn)行簡(jiǎn)化其組件日志的努力。下面的 klog 命令行參數(shù)從 Kubernetes 1.23 開始已被廢棄, 會(huì)在未來版本中移除:

  • ?--add-dir-header ?
  • ?--alsologtostderr ?
  • ?--log-backtrace-at ?
  • ?--log-dir ?
  • ?--log-file ?
  • ?--log-file-max-size ?
  • ?--logtostderr ?
  • ?--one-output ?
  • ?--skip-headers ?
  • ?--skip-log-headers ?
  • ?--stderrthreshold?

輸出總會(huì)被寫到標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr)之上,無論輸出格式如何。 對(duì)輸出的重定向?qū)⒂烧{(diào)用 Kubernetes 組件的軟件來處理。 這一軟件可以是 POSIX Shell 或者類似 systemd 這樣的工具。

在某些場(chǎng)合下,例如對(duì)于無發(fā)行主體的(distroless)容器或者 Windows 系統(tǒng)服務(wù), 這些替代方案都是不存在的。那么你可以使用 kube-log-runner 可執(zhí)行文件來作為 Kubernetes 的封裝層,完成對(duì)輸出的重定向。 在很多 Kubernetes 基礎(chǔ)鏡像中,都包含一個(gè)預(yù)先構(gòu)建的可執(zhí)行程序。 這個(gè)程序原來稱作 ?/go-runner?,而在服務(wù)器和節(jié)點(diǎn)的發(fā)行版本庫中,稱作 ?kube-log-runner?。

下表展示的是 ?kube-log-runner? 調(diào)用與 Shell 重定向之間的對(duì)應(yīng)關(guān)系:

用法 POSIX Shell(例如 Bash) kube-log-runner <options> <cmd>
合并 stderr 與 stdout,寫出到 stdout 2>&1 kube-log-runner(默認(rèn)行為 )
將 stderr 與 stdout 重定向到日志文件 1>>/tmp/log 2>&1 kube-log-runner -log-file=/tmp/log
輸出到 stdout 并復(fù)制到日志文件中 2>&1 | tee -a /tmp/log kube-log-runner -log-file=/tmp/log -also-stdout
僅將 stdout 重定向到日志 >/tmp/log kube-log-runner -log-file=/tmp/log -redirect-stderr=false

klog 輸出

傳統(tǒng)的 klog 原生格式示例:

I1025 00:15:15.525108       1 httplog.go:79] GET /api/v1/namespaces/kube-system/pods/metrics-server-v0.3.1-57c75779f-9p8wg: (1.512ms) 200 [pod_nanny/v0.0.0 (linux/amd64) kubernetes/$Format 10.56.1.19:51756]

消息字符串可能包含換行符:

I1025 00:15:15.525108       1 example.go:79] This is a message
which has a line break.

結(jié)構(gòu)化日志

FEATURE STATE: Kubernetes v1.23 [beta]

Warning:
遷移到結(jié)構(gòu)化日志消息是一個(gè)正在進(jìn)行的過程。在此版本中,并非所有日志消息都是結(jié)構(gòu)化的。 解析日志文件時(shí),你也必須要處理非結(jié)構(gòu)化日志消息。
日志格式和值的序列化可能會(huì)發(fā)生變化。

結(jié)構(gòu)化日志記錄旨在日志消息中引入統(tǒng)一結(jié)構(gòu),以便以編程方式提取信息。 你可以方便地用更小的開銷來處理結(jié)構(gòu)化日志。 生成日志消息的代碼決定其使用傳統(tǒng)的非結(jié)構(gòu)化的 klog 還是結(jié)構(gòu)化的日志。

默認(rèn)的結(jié)構(gòu)化日志消息是以文本形式呈現(xiàn)的,其格式與傳統(tǒng)的 klog 保持向后兼容:

<klog header> "<message>" <key1>="<value1>" <key2>="<value2>" ...

示例:

I1025 00:15:15.525108       1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready"

字符串在輸出時(shí)會(huì)被添加引號(hào)。其他數(shù)值類型都使用 %+v 來格式化,因此可能導(dǎo)致日志消息會(huì)延續(xù)到下一行, 具體取決于數(shù)據(jù)本身。

I1025 00:15:15.525108       1 example.go:116] "Example" data="This is text with a line break\nand \"quotation marks\"." someInt=1 someFloat=0.1 someStruct={StringField: First line,
second line.}

上下文日志

FEATURE STATE: Kubernetes v1.24 [alpha]

上下文日志建立在結(jié)構(gòu)化日志之上。 它主要是關(guān)于開發(fā)人員如何使用日志記錄調(diào)用:基于該概念的代碼將更加靈活, 并且支持在結(jié)構(gòu)化日志 KEP 中描述的額外用例。

如果開發(fā)人員在他們的組件中使用額外的函數(shù),比如 ?WithValues ?或 ?WithName?, 那么日志條目將會(huì)包含額外的信息,這些信息會(huì)被調(diào)用者傳遞給函數(shù)。

目前這一特性是由 ?StructuredLogging ?特性門控所控制的,默認(rèn)關(guān)閉。 這個(gè)基礎(chǔ)設(shè)施是在 1.24 中被添加的,并不需要修改組件。 該 ?component-base/logs/example? 命令演示了如何使用新的日志記錄調(diào)用以及組件如何支持上下文日志記錄。

$ cd $GOPATH/src/k8s.io/kubernetes/staging/src/k8s.io/component-base/logs/example/cmd/
$ go run . --help
...
      --feature-gates mapStringBool  A set of key=value pairs that describe feature gates for alpha/experimental features. Options are:
                                     AllAlpha=true|false (ALPHA - default=false)
                                     AllBeta=true|false (BETA - default=false)
                                     ContextualLogging=true|false (ALPHA - default=false)
$ go run . --feature-gates ContextualLogging=true
...
I0404 18:00:02.916429  451895 logger.go:94] "example/myname: runtime" foo="bar" duration="1m0s"
I0404 18:00:02.916447  451895 logger.go:95] "example: another runtime" foo="bar" duration="1m0s"

?example ?前綴和 ?foo="bar"? 會(huì)被函數(shù)的調(diào)用者添加上, 不需修改該函數(shù),它就會(huì)記錄 ?runtime ?消息和 ?duration="1m0s"? 值。

禁用上下文日志后,?WithValues ?和 ?WithName ?什么都不會(huì)做, 并且會(huì)通過調(diào)用全局的 klog 日志記錄器記錄日志。 因此,這些附加信息不再出現(xiàn)在日志輸出中:

$ go run . --feature-gates ContextualLogging=false
...
I0404 18:03:31.171945  452150 logger.go:94] "runtime" duration="1m0s"
I0404 18:03:31.171962  452150 logger.go:95] "another runtime" duration="1m0s"

JSON 日志格式

FEATURE STATE: Kubernetes v1.19 [alpha]

Warning:
JSON 輸出并不支持太多標(biāo)準(zhǔn) klog 參數(shù)。
并不是所有日志都保證寫成 JSON 格式(例如,在進(jìn)程啟動(dòng)期間)。 如果你打算解析日志,請(qǐng)確??梢蕴幚矸?nbsp;JSON 格式的日志行。
字段名和 JSON 序列化可能會(huì)發(fā)生變化。

?--logging-format=json? 參數(shù)將日志格式從 klog 原生格式改為 JSON 格式。 JSON 日志格式示例(美化輸出):

{
   "ts": 1580306777.04728,
   "v": 4,
   "msg": "Pod status updated",
   "pod":{
      "name": "nginx-1",
      "namespace": "default"
   },
   "status": "ready"
}

具有特殊意義的 key:

  • ?ts ?- Unix 時(shí)間風(fēng)格的時(shí)間戳(必選項(xiàng),浮點(diǎn)值)
  • ??- 精細(xì)度(僅用于 info 級(jí)別,不能用于錯(cuò)誤信息,整數(shù))
  • ?err ?- 錯(cuò)誤字符串(可選項(xiàng),字符串)
  • ?msg ?- 消息(必選項(xiàng),字符串)

當(dāng)前支持JSON格式的組件列表:

  • kube-controller-manager
  • kube-apiserver
  • kube-scheduler
  • kubelet

日志精細(xì)度級(jí)別

參數(shù) ?-v? 控制日志的精細(xì)度。增大該值會(huì)增大日志事件的數(shù)量。 減小該值可以減小日志事件的數(shù)量。增大精細(xì)度會(huì)記錄更多的不太嚴(yán)重的事件。 精細(xì)度設(shè)置為 0 時(shí)只記錄關(guān)鍵(critical)事件。

日志位置

有兩種類型的系統(tǒng)組件:運(yùn)行在容器中的組件和不運(yùn)行在容器中的組件。例如:

  • Kubernetes 調(diào)度器和 kube-proxy 在容器中運(yùn)行。
  • kubelet 和容器運(yùn)行時(shí)不在容器中運(yùn)行。

在使用 systemd 的系統(tǒng)中,kubelet 和容器運(yùn)行時(shí)寫入 journald。 在別的系統(tǒng)中,日志寫入 ?/var/log? 目錄下的 ?.log? 文件中。 容器中的系統(tǒng)組件總是繞過默認(rèn)的日志記錄機(jī)制,寫入 ?/var/log? 目錄下的 ?.log? 文件。 與容器日志類似,你應(yīng)該輪轉(zhuǎn) ?/var/log? 目錄下系統(tǒng)組件日志。 在 ?kube-up.sh? 腳本創(chuàng)建的 Kubernetes 集群中,日志輪轉(zhuǎn)由 ?logrotate ?工具配置。 ?logrotate? 工具,每天或者當(dāng)日志大于 100MB 時(shí),輪轉(zhuǎn)日志。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)