核心 os 项目 kube-prometheus 和 prometheus operator 有什么区别?

What is the difference between the core os projects kube-prometheus and prometheus operator?

Prometheus Operator https://github.com/coreos/prometheus-operator/ 项目的github repo 说

The Prometheus Operator makes the Prometheus configuration Kubernetes native and manages and operates Prometheus and Alertmanager clusters. It is a piece of the puzzle regarding full end-to-end monitoring.

kube-prometheus combines the Prometheus Operator with a collection of manifests to help getting started with monitoring Kubernetes itself and applications running on top of it.

有人可以详细说明一下吗?

Kubernetes operator 是 kubernetes 特定应用程序 (pods),可自动配置、管理和优化其他 Kubernetes 部署。它们作为自定义控制器实现。

根据coreOS官方网站:

Operators were introduced by CoreOS as a class of software that operates other software, putting operational knowledge collected by humans into software.

prometheus operator 提供了在 kubernetes 集群上部署配置和监控 prometheus 实例的简单方法。为此,prometheus operator 在 kubernetes 中引入了三种类型的自定义资源定义(CRD)。

  1. 普罗米修斯
  2. 警报管理器
  3. 服务监控

现在,在上述 CRD 的帮助下,您可以通过提供 kind: Prometheus 直接创建一个 prometheus 实例,并且 prometheus 实例已准备好服务,同样您可以为 AlertManager 做。如果没有这个,您将不得不使用它的图像、配置和更多东西来设置普罗米修斯的部署。

The Prometheus Operator serves to make running Prometheus on top of Kubernetes as easy as possible, while preserving Kubernetes-native configuration options.

现在,kube-prometheus 实现了 prometheus operator 并为您提供了最少的 yaml 文件,以通过 运行 a 创建 prometheusalertmanagergrafana 的基本设置单个命令。

git clone https://github.com/coreos/prometheus-operator.git
kubectl apply -f prometheus-operator/contrib/kube-prometheus/manifests/

通过在 kube-prometheus 目录中执行上述 运行 命令,您将获得一个 monitoring 命名空间,其中将包含一个 alertmanager 实例,prometheusgrafana for UI。这对于大多数基本实现来说已经足够了,如果您根据您的应用程序需要更多细节,您可以添加更多您需要的导出器 yaml。

kube-prometheus更多的是对prometheus-operator项目的贡献,它很好的实现了prometheus operator的功能,为你的kubernetes集群提供了完整的监控设置。您可以从 kube-prometheus 开始,然后根据您的应用程序从那里扩展监控设置的功能。

您可以了解更多有关 prometheus-operator 的信息here

我总是遇到完全相同的 question/repeatedly,但是阅读上面的答案并没有弄清楚,因为 me/I 需要一个简短的解释。我发现这个 github 问题让我 crystal 清楚了。 https://github.com/coreos/prometheus-operator/issues/2619

引用 GitHub 的 nicgirault:

At last I realized that prometheus-operator chart was packaging kube-prometheus stack but it took me around 10 hours playing around to realize this.

**这是我的总结解释:
“kube-prometheus”和“Prometheus Operator Helm Chart”都做同样的事情:

  1. 基本上是 Ingress/Ingress 控制器概念,应用于 Metrics/Prometheus 运算符。
  2. 两者都是在 Kubernetes 上轻松配置、安装和管理大型分布式应用程序 (Kubernetes Prometheus Stack) 的方法:**

    您问的 Entire Kube Prometheus Stack 是什么?
    Prometheus、Grafana、AlertManager、CRD(自定义资源定义)、Prometheus Operator(软件机器人应用程序) 、IaC 警报规则、IaC Grafana 仪表板、IaC ServiceMonitor CRD(自动生成 Prometheus 指标收集配置并自动将其热导入 Prometheus 服务器)
    (另外,当我说轻松配置时,我的意思是 1,000-10,000++ 行易于人类理解的配置,生成和自动管理 10,000-100,000 行机器配置 + 具有合理默认值的东西 + 监控配置自助服务,分布式配置分片与 operator/controller 结合配置 + 从漂亮的人类可读配置生成冗长的样板机器可读配置。

如果他们达到了相同的最终目标,你可能会问他们有什么区别?
https://github.com/coreos/kube-prometheus
https://github.com/helm/charts/tree/master/stable/prometheus-operator
基本上,CoreOS 的 kube-prometheus 使用 Ksonnet 部署 Prometheus Stack。
Prometheus Operator Helm Chart 包装了 kube-prometheus / 实现了相同的最终结果,但使用了 Helm。

那么用哪一个呢?
没关系 + 他们达到了相同的最终结果 + 从 1 开始并切换到另一个应该不会太难。

Helm 往往可以更快地 learn/develop 基本掌握。

Ksonnet 更难 learn/develop 基本掌握,但是:

  • 它更幂等(更适合 CICD 自动化)(但它只是 99% 幂等与 99.99% 幂等的区别。)
  • 具有内置模板,这意味着如果您有多个集群,您需要管理/您希望始终保持彼此一致。然后,您可以利用具有大量代码重用的 DRY 代码库,利用 ksonnet 的模板来管理 Kube Prometheus Stack(用于多个环境)的多个实例。 (如果你只有几个环境并且 Prometheus 不需要经常更改,那么手动保持 4 个 helm 值文件同步并不是完全不合理的。我还看到 Jinja2 模板用于模板化 helm 值文件,但是如果你我会为此烦恼,您不妨考虑一下 ksonnet。)

截至今天,28-09-2020,这是在 Kubernetes 集群中安装 Prometheus 的方式 https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack#kube-prometheus-stack

根据官方文档,kube-prometheus-stack是prometheus-operator的重命名。 据我了解,kube-prometheus-stack还预装了grafana dashboards和prometheus rules

Note: This chart was formerly named prometheus-operator chart, now renamed to more clearly reflect that it installs the kube-prometheus project stack, within which Prometheus Operator is only one component.

取自https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

在架构上容器 运行s docker 默认容器日志由 Docker 管理,默认日志驱动程序使用 JSON-file log-driver": "json-file

https://docs.docker.com/config/containers/logging/configure/ 如果使用默认jSON-file管理容器日志,则默认不进行日志轮转。因此,默认的JSON-file日志驱动日志驱动存储的日志文件会导致大量的磁盘space对于产生大量输出的容器,这会导致磁盘space到运行出来。

这种情况,将日志保存到ES,单独存放,使用curator kubernetes定期删除索引 并且运行K8S中定时任务删除索引

磁盘 space 的另一种解决方案是定期从 jSON-file 中删除旧日志 通常我们设置日志的大小和数量

这将设置最多 10 个日志文件,每个日志文件的最大大小为 20 Mb。因此,容器最大有 200 Mb 的日志 "log-driver": "json-file", "log-opts": { "max-size": "20m", "max-file": "10" },

注意:一般情况下,默认放置Docker日志 /var/lib/docker/containers/ 但是同样的情况下kubernetes也会保存日志并创建一个目录结构来帮助你找到pods-based日志,所以你可以找到一个节点上每个Pod 运行ning的容器日志 /var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/

删除pod时,/var/lib/container下docker/containers/log和k8s创建的under/var/log/pods/pod日志会被删除

比如生产中重启POD,无论是在原节点上还是跳到别的节点上,pod日志都会被删除 所以这个日志需要保存在ES中进行集中管理。很多研发项目大多数情况下都会查看日志排错