6 监控与日志

容器检查

kubectl get 和kubectl describe 查询部署状态

kubectl logs将容器的标准输出重定向到终端

kubectl top查看CPU和内存使用情况

kubectl exec 可在容器内运行shell

K8s仪表盘

整合上述数据,web可视化展示

监控k8s

应用程序:关注内部状态数据,可用分析profiling工具或跟踪tracking工具诊断

主机:监控框架提供的代理完成主机数据采集,如负载、磁盘、网络连接

外部资源:检查其他依赖组件的状态

容器:将容器相关逻辑附加到度量指标,如Pod标签、控制器名称

k8s:负责管理、调度、编排应用程序,关注k8s状态

k8s监控要点:监控栈的每层,找到对应的采集器,如cAdvisor来满足容器级别指标收集需求,聚合主机上每个运行的容器的资源使用情况和性能统计信息(cAdviser部署在主机而非容器,嵌入在kubelet中);监控栈另一个重要组件Heapster,从每个节点检索监控统计信息,主要是节点上的kubelet然后写入外部接收器;通过restfull api公开聚合度量指标

cAdvisor和Heapster专注于监控物理指标,kube-state-metrics关注逻辑状态,监控Kubernetes master节点,并将监控内容转换为Prometheus格式的指标

监控实践

Prometheus介绍

Prometheus框架包含若干组件

依靠代理从系统组件中收集统计信息,采用pull拉取模型的方式收集数据,不被动接收指标而是主动从exporter拉数据

存储后端是内嵌的LevelDB,可以切换到其他存储如InfluxDB或Graphite

Prometheus服务器负责根据预先配置的规则向警报管理器Alert Manager发送警报,警报管理器处理警报并发送作业,将警报分组并发送到消息推送工具,如电子邮件、Slack、Pagerduty

使用PromQL

三种数据类型

即时向量instant vector:数据采样的时间序列

范围向量range vector:包含特定时间范围内的数据的一组时间序列

标量scalar:具体的数值

Kubernetes目标发现

Prometheus只从它知道的端点中提取指标,要明确告诉他从哪里收集数据

路径/config是当前已配置目标的列表,默认情况下,会有一项作业(job)收集Prometheus自身的指标,位于路径/metrics下

Prometheus的默认作业被配置为静态目标,但Kubernetes中的容器是动态创建和销毁的,Prometheus通过k8s内部服务发现功能,查询运行服务的信息,并相应的将目标配置添加或删除

四种发现机制

节点发现模式:为每个节点创建一个目标,默认情况下,目标端口是kubelet的端口

服务发现模式:为每个服务对象创建目标,并且服务中的所有已定义端口将成为抓取目标

Pod发现模式:为每个pod创建目标,为每个pod保留所有已定义的容器端口

端口发现模式:发现服务创建的端口对象

Prometheus只获取集群中被标记的资源,如pod注解格式如下:

prometheus.io/scrape:true 表示应拉取这个pod

prometheus.io/path:公开指标路径,只有目标pod使用/metrics之外路径才需要配置

prometheus.io/port:如定义的端口和实际端口不同,注释覆盖

从Kubernetes收集数据

Prometheus监控步骤:

安装exporter、适当标记进行注解、自动发现端点上收集数据

Kubernetes组件其他指标

Kubernetes API服务器:在/metrics处显示其状态,默认情况此目标会启动

kube-controller-manager:端口10252

kube-scheduler:端口10251

kube-dns:两个容器dnsmasq、sky-dns,端口10054、10055

etcd:端口4001

nginx Ingress控制器:端口10254

使用Grafana查看指标

Grafana查看Prometheus指标,必须先添加数据源,连接到Prometheus服务器

配置参数:

示例:

日志

日志系统主要组件

日志代理:程序的抽象层,收集、转换、分发日志到后端

日志后端:存储接收到的日志

三种日志记录方式

将所有内容发送到stdout/stderr

写入日志文件

将日志发送到日志代理或直接记录到后端

日志聚合模式

节点代理方式收集日志

kubectl logs查看的消息是从容器stdout/stderr重定向输出的

kubectl log从kubelet获取日志,kubelet将日志从容器引擎聚合到主机的/var/log/containers.

配置日志代理从系统、Kubernetes、Master和节点上的/var/log下的各组件收集日志

如kube-proxy.log、kube-apiserver.log、kube-scheduler.log、kube-controller-manager.log、etcd.long

Sidecar容器方式转发日志

每个应用程序的pod都有两个容器共享相同的emptyDir卷,Sidecar容器可以跟踪应用程序容器中的日志并将它们发送到Pod之外,利用Sidecar容器将日志输出到标准流

获取Kubernetes事件

Eventer可以帮助观察k8s API服务器并将事件聚合到日志记录接收器中

Eventer是Heapster的一部分,支持ES、InfluxDB、Riemann、Google Cloud Logging作为接收器

Fluentd和Elasticsearch日志

日志系统和监控系统架构:采集器、存储、用户界面

相应组件:Fluentd\Eventer、ES、Kibana

ES:文本搜索和分析引擎,是数据存储、处理和分析的理想选择

Fluentd:较低内存占用空间,满足日志代理选项,FluentBit 可资源利用最小化

从日志中提取指标

构建针对Kubernetes上应用程序的监控和日志系统

Prometheus善于处理时间序列数据,但没法提取文本

mtail、GrokExporter等工具会计算日志条目,并将这些数字组织到指标中,以便可以在Prometheus中处理它们

总结

kubectl获取容器运行状态

Prometheus为核心构建监控系统,通过Exporter收集Kubernetes指标,Grafana可视化监控数据

EFK堆栈来处理日志,ES存储日志,Kibana可视化日志

你可能感兴趣的:(6 监控与日志)