容器检查
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可视化日志