k8s_PaaS/原理及源码解析/Kubernetes相关生态.md

75 lines
5.7 KiB
Bash
Raw Normal View History

2020-04-19 12:16:57 +08:00
## Kubernetes相关生态
### Prometheus、Metrics Server与Kubernetes监控体系
> 简介Prometheus 项目与 Kubernetes 项目一样,也来自于 Google 的 Borg 体系,它的原型系统,叫作 BorgMon是一个几乎与 Borg 同时诞生的内部监控系统
2020-04-19 12:35:07 +08:00
Prometheus 项目的作用和工作方式,官方示意图
2020-04-19 12:16:57 +08:00
![1587263933585](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1587263933585.png)
> Prometheus 项目工作的核心,是使用 Pull (抓取)的方式去搜集被监控对象的 Metrics 数据(监控指标数据),然后,再把这些数据保存在一个 TSDB (时间序列数据库,比如 OpenTSDB、InfluxDB 等)当中,以便后续可以按照时间进行检索。
>
2020-04-19 12:35:07 +08:00
> **Pushgateway**:允许被监控对象以 Push 的方式向 Prometheus 推送 Metrics 数据
2020-04-19 12:16:57 +08:00
>
2020-04-19 12:35:07 +08:00
> **Alertmanager**:可以根据 Metrics 信息灵活地设置报警
2020-04-19 12:16:57 +08:00
>
2020-04-19 12:35:07 +08:00
> **Grafana **:对外暴露出的、可以灵活配置的监控数据可视化界面
2020-04-19 12:16:57 +08:00
2020-04-19 12:35:07 +08:00
#### Metrics 数据的来源
2020-04-19 12:16:57 +08:00
2020-04-19 12:35:07 +08:00
- 第一种 Metrics是宿主机的监控数据
2020-04-19 12:16:57 +08:00
- 这部分数据的提供,需要借助一个由 Prometheus 维护的[Node Exporter](https://github.com/prometheus/node_exporter) 工具,就是代替被监控对象来对 Prometheus 暴露出可以被“抓取”的 Metrics 信息的一个辅助进程。
2020-04-19 12:35:07 +08:00
- 第二种 Metrics是来自于 Kubernetes 的 API Server、kubelet 等组件的 /metrics API
2020-04-19 12:16:57 +08:00
- 除了常规的 CPU、内存的信息外这部分信息还主要包括了各个组件的核心监控指标。比如对于 API Server 来说,它就会在 /metrics API 里,暴露出各个 Controller 的工作队列Work Queue的长度、请求的 QPS 和延迟数据等等。这些信息,是检查 Kubernetes 本身工作情况的主要依据。
2020-04-19 12:35:07 +08:00
- 第三种 Metrics是 Kubernetes 相关的监控数据
2020-04-19 12:16:57 +08:00
- 这部分数据,一般叫作 Kubernetes 核心监控数据core metrics。这其中包括了 Pod、Node、容器、Service 等主要 Kubernetes 核心概念的 Metrics。
- 这里提到的 Kubernetes 核心监控数据,其实使用的是 Kubernetes 的一个非常重要的扩展能力,叫作 Metrics Server。在社区的定位是用来取代Heapster。
在具体的监控指标规划上,建议你**遵循业界通用的 USE 原则和 RED 原则**
2020-04-19 12:35:07 +08:00
USE 原则指的是,按照如下三个维度来规划资源监控指标(原则是主要关注“资源”)
2020-04-19 12:16:57 +08:00
1. 利用率Utilization资源被有效利用起来提供服务的平均时间占比
2. 饱和度Saturation资源拥挤的程度比如工作队列的长度
3. 错误率Errors错误的数量。
2020-04-19 12:35:07 +08:00
RED 原则指的是,按照如下三个维度来规划服务监控指标(原则是主要关注“服务”)
2020-04-19 12:16:57 +08:00
1. 每秒请求数量Rate
2. 每秒错误数量Errors
3. 服务响应时间Duration
### 日志收集与管理
2020-04-19 12:35:07 +08:00
> Kubernetes 中对容器日志的处理方式,都叫做 cluster-level-logging即这个日志处理系统与容器、Pod 以及 Node 的生命周期都是完全无关的。这种设计当然是为了保证无论是容器挂了、Pod 被删除,甚至节点宕机的时候,应用的日志依然可以被正常获取到。
2020-04-19 12:16:57 +08:00
2020-04-19 12:35:07 +08:00
**第一种,在 Node 上部署 logging agent将日志文件转发到后端存储里保存起来**,架构图如下
2020-04-19 12:16:57 +08:00
![1587266196364](assets/1587266196364.png)
这里的核心在于 logging agent ,它一般都会以 DaemonSet 的方式运行在节点上,然后将宿主机上的容器日志目录挂载进去,最后由 logging-agent 把日志转发出去。
2020-04-19 12:35:07 +08:00
**优势**:在 Node 上部署 logging agent在于一个节点只需要部署一个 agent并且不会对应用和 Pod 有任何侵入性。
2020-04-19 12:16:57 +08:00
2020-04-19 12:35:07 +08:00
**不足**:要求应用输出的日志,都必须是直接输出到容器的 stdout 和 stderr 里。即如果每秒日志量很大时直接输出到容器的stdout和stderr,很容易就把系统日志配额用满,因为对系统默认日志工具是针对单服务(例如docker)而不是进程进行限额的,最终导致的结果就是日志被吞掉。解决办法一个是增加配额,一个是给容器挂上存储,将日志输出到存储上
2020-04-19 12:16:57 +08:00
2020-04-19 12:35:07 +08:00
> **stdout 和 stderr**stdout是标准输出stderr是错误输出
2020-04-19 12:16:57 +08:00
2020-04-19 12:35:07 +08:00
**第二种,就是对这种特殊情况的一个处理,即当容器的日志只能输出到某些文件里的时候,我们可以通过一个 sidecar 容器把这些日志文件重新输出到 sidecar 的 stdout 和 stderr 上,这样就能够继续使用第一种方案了。**架构图如下
2020-04-19 12:16:57 +08:00
![1587267088835](assets/1587267088835.png)
2020-04-19 12:35:07 +08:00
**不足**:宿主机上实际上会存在两份相同的日志文件一份是应用自己写入的;另一份则是 sidecar 的 stdout 和 stderr 对应的 JSON 文件。这对磁盘是很大的浪费,除非万不得已或者应用容器完全不可能被修改,否则不要使用这个方案
2020-04-19 12:16:57 +08:00
2020-04-19 12:35:07 +08:00
**第三种方案,就是通过一个 sidecar 容器,直接把应用的日志文件发送到远程存储里面去**,架构图如下
2020-04-19 12:16:57 +08:00
![1587267230890](assets/1587267230890.png)
2020-04-19 12:35:07 +08:00
**优势**:直接把日志输出到固定的文件里而不是 stdoutlogging-agent 可以使用 fluentd后端存储可以是 ElasticSearch。部署简单对宿主机友好。
2020-04-19 12:16:57 +08:00
2020-04-19 12:35:07 +08:00
**不足**:这个 sidecar 容器很可能会消耗较多的资源,甚至拖垮应用容器。并且,由于日志还是没有输出到 stdout 上,所以你通过 kubectl logs 是看不到任何日志输出的。
2020-04-19 12:16:57 +08:00
最后,无论是哪种方案,都必须要及时将这些日志文件从宿主机上清理掉,或者给日志目录专门挂载一些容量巨大的远程盘。否则,一旦主磁盘分区被打满,整个系统就可能会陷入奔溃状态。