Kubernetes Cookbook 编程指南 中文版教程
创建时间:2018-12-07  访问量:3661  7  0

Kubernetes Cookbook 编程指南 中文版教程

使用Kubernetes日志

Kubernetes在master上有三个守护进程:API服务器,调度程序和控制器管理器。 在/ var / log文件夹下,有三个相应的日志文件记录了这些进程的日志:

API server apiserver.log Logs for API calls.
Scheduler k8s-scheduler. log Logs of scheduler data for any containers scheduling events

 

Controller manager controller manager.log Logs for showing any events or issues relate to controller manager
Controller manager controller-manager.log Logs for showing any events or issues relate to controller manager

在节点上,我们有一个kubelet进程来处理容器操作并向主服务器报告:

Daemon on node Log file Description
kubelet kubelet.log Logs for any issues happening in container

在Master服务器和Node节点上,还有另一个名为kube-proxy.log的日志文件,用于记录任何网络连接问题。

准备

我们将使用上一节中介绍的日志收集平台ELK来收集Kubernetes日志作为集中式日志平台。 对于ELK的设置,我们建议您再次查看收集应用程序日志部分。 在我们开始收集Kubernetes日志之前,了解日志中的数据结构非常重要。 前面的日志是这种格式:

<log level><date> <timestamp> <indicator> <source file>:<line
number>] <logs>

下面是一个示例:

E0328 00:46:50.870875 3189 reflector.go:227] pkg/proxy/config/api.
go:60: Failed to watch *api.Endpoints: too old resource version: 45128
(45135)

通过日志文件中行的标题字符,我们可以知道此行的日志严重性:

  • D: DEBUG

  • I: INFO

  • W: WARN

  • E: ERROR

  • F: FATAL

如何去做...

我们仍将在logstash设置中使用grok过滤器,如上一节所述,但我们可能需要为<log level> <date>模式编写自定义模式,该模式列在日志行的开头。 我们将在当前目录下创建一个模式文件:

// list custom patterns
# cat ./patterns/k8s
LOGLEVEL [DEFIW]
DATE [0-9]{4}
K8SLOGLEVEL %{LOGLEVEL:level}%{DATE}

上述设置用于将E0328模式拆分为level = E和DATE = 0328。 以下是如何将k8s-apiserver.log发送到ElasticSearch集群的示例:

// list config file for k8s-apiserver.log in logstash
# cat apiserver.conf
input {
    file {
    	path => "/var/log/k8s-apiserver.log"
    }
}

filter {
    grok {
    	patterns_dir => ["./patterns"]
    	match => { "message" => "%{K8SLOGLEVEL} %{TIME} %{NUMBER} %{PROG:program}:%{POSINT:line}] %{GREEDYDATA:message}" }
    }
}

output {
    elasticsearch {
    	hosts => ["_ES_IP_:_ES_PORT_"]
    	index => "k8s-apiserver"
    }
    stdout { codec => rubydebug }
}

对于输入,我们将使用这个文件插件https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html),它添加了k8s-apiserver.log的路径。 我们将在grok中使用patterns_dir来指定我们的自定义模式K8SLOGLEVEL的定义。 输出elasticsearch部分中的主机配置应指定给您的Elasticsearch IP和端口。 以下是示例输出:

//startlogstashwithconfigapiserver.conf
#bin/logstash-fapiserver.conf
Settings: Defaultpipelineworkers: 1
Pipelinemainstarted{
	"message"=>[[0]"E0403 15:55:24.706498 2979 errors.go:62] apiserver
received an error that is not an unversioned.Status: too old resource
version: 47419 (47437)",
	[1]"apiserver received an error that is not an unversioned.
Status: too old resource version: 47419 (47437)"],
	"@timestamp"=>2016-04-03T15: 55: 25.709Z,
	"level"=>"E",
	"host"=>"kube-master1",
	"program"=>"errors.go",
	"path"=>"/var/log/k8s-apiserver.log",
	"line"=>"62",
	"@version"=>"1"
}{
	"message"=>[[0]"E0403 15:55:24.706784 2979 errors.go:62] apiserver
received an error that is not an unversioned.Status: too old resource
version: 47419 (47437)",
	[1]"apiserver received an error that is not an unversioned.
Status: too old resource version: 47419 (47437)"],
	"@timestamp"=>2016-04-03T15: 55: 25.711Z,
	"level"=>"E",
	"host"=>"kube-master1",
	"program"=>"errors.go",
	"path"=>"/var/log/k8s-apiserver.log",
	"line"=>"62",
	"@version"=>"1"
}

它显示当前主机的日志路径,日志级别,触发的程序和综合消息。 其他日志都采用相同的格式,因此很容易复制设置。 只需指定从k8s-apiserver到其他索引的不同索引。 然后,您就可以通过Kibana自由搜索日志,或者获取与Elasticsearch集成的其他工具以获取通知等。

还可以参考

查看以下章节:

  • 第1章构建你自己的Kubernetes,配置Master和Node这一节

  • 收集应用程序日志

  • 监视Master和Node