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

Kubernetes Cookbook 编程指南 中文版教程

使用etcd日志

数据存储区etcd用于保存Kubernetes资源的信息。 没有健壮的etcd服务器,Kubernetes系统将不稳定。 如果pod的信息丢失,对于在如何通过Kubernetes服务访问或通过副本控制器进行管理部分提到的系统,我们将无法在此系统中识别它。 在本节中,您将了解从etcd日志中可以获得的消息类型以及如何使用ELK收集它们。

准备

在我们开始收集etcd的日志之前,我们应该准备ELK的服务器。 请返回第8章“记录和监控”中的“收集应用程序日志”这一节,以查看如何设置ELK并研究其基本用法。

另一方面,如果您的etcd服务器是Kubernetes集群之外的单独机器,请公开您的Elasticsearch的Kubernetes服务。 您可以修改Elasticsearch的服务模板,如下所示:

# cat es-svc.yaml
apiVersion: v1
kind: Service
metadata:
    name: elasticsearch
    labels:
    	component: elasticsearch
spec:
    type: LoadBalancer
    selector:
    	component: elasticsearch
    ports:
    - name: http
        port: 9200
        nodePort: 30000
        protocol: TCP
    - name: transport
        port: 9300
        protocol: TCP

然后,etcd服务器上的Logstash进程可以使用URL <NODE_ENDPOINT>:30000访问它。 端口30000在每个节点上公开,这意味着每个节点的端点都可以联系它。

如何去做...

在etcd服务器上,我们在/var/ log/etcd.log中记录了守护进程etcd中的日志。 消息按以下格式逐行显示:

<date> <time> <subpackage>: <logs>

显示时间戳和信息非常简单。 我们还可以看到日志的来源,这意味着我们知道哪种子包可以处理这个问题。 以下是etcd日志的示例:

2016/04/4 08:43:51 etcdserver: starting server... [version: 2.1.1,
cluster version: to_be_decided]

在了解了消息的样式之后,是时候创建Logstash配置文件了:

# cat etcd.conf
input{
	file{
		path=>"/var/log/etcd.log"
	}
}filter{
	grok{
		match=>{
			"message"=>"%{DATA:date} %{TIME:time} %{PROG:subpackage}:
%{GREEDYDATA:message}"
		}
	}
}output{
	elasticsearch{
		hosts=>["<ELASTIC_SERVICE_IP>:<EXPOSE_PORT>"]index=>"etcd-log"
	}stdout{
		codec=>rubydebug
	}
}

在文件中,我们将etcd日志文件的位置指定为输入数据。 grok过滤器中定义的模式只是将日志分为三个部分:时间戳,子包和消息。 当然,我们不仅在屏幕上显示输出,还将数据发送到Elasticsearch服务器以进行进一步分析:

// Under the directory of $LOGSTASH_HOME
# ./bin/logstash -f etcd.conf
Settings: Default pipeline workers: 1
Pipeline main started
{
	"subpackage"=>"raft",
	"message"=>[[0]"2016/04/4 08:43:53 raft: raft.node: ce2a822cea30bfca elected
leader ce2a822cea30bfca at term 2",
	[1]"raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca
at term 2"],
	"@timestamp"=>2016-04-04T11: 23: 27.571Z,
	"time"=>"08:43:53",
	"host"=>"etcd1",
	"path"=>"/var/log/etcd.log",
	"date"=>"2016/04/4",
	"@version"=>"1"
}{
	"subpackage"=>"etcdserver",
	"message"=>[[0]"2016/04/4 08:43:53 etcdserver: setting up the initial
cluster version to 2.1.0",
	[1]"setting up the initial cluster version to 2.1.0"],
	"@timestamp"=>2016-04-04T11: 24: 09.603Z,
	"time"=>"08:43:53",
	"host"=>"etcd1",
	"path"=>"/var/log/etcd.log",
	"date"=>"2016/04/4",
	"@version"=>"1"
}

正如您所看到的,通过Logstash,我们将在特定时间解析不同子包问题中的日志。 现在是您访问Kibana仪表板并使用etcd日志的好时机。

还可以参考

在跟踪etcd的日志之前,您必须拥有自己的etcd系统。 看看前几章; 您将了解如何构建单个节点或类集群(cluster-like)的etcd系统。 查看以下章节:

  • 第1章构建你自己的Kubernetes,构建数据存储库这一节

  • 第4章构建高可用集群,etcd集群这一节

  • 收集应用程序日志

  • 使用Kubernetes日志