简介
在现代容器化应用中,Kubernetes 已经成为了主流的部署和管理平台。然而,在 Kubernetes 中,监控和日志管理仍然是被广泛讨论和关注的热点话题。如何设置和优化监控和日志收集已经成为了前端开发人员和 DevOps 工程师的必备技能。本文将深入探讨在 Kubernetes 中如何实现优化监控和日志收集的方案。
监控
Kubernetes 应用程序监控的基本原则是收集指标,可视化指标,然后通过控制台查看指标。指标可以是服务器、容器、应用程序或 Kubernetes 自身的指标。以下是一些选择监控解决方案所需考虑的因素:
- 测量项目-每个监控解决方案都不同
- 稳定性-它是否能够处理 Kubernetes API 的快速更改
- 巨大规模-如何减少大规模数据的指标
- 可视化-是否需要直观的仪表板
- 安全性-在 IOT 和云中是否安全
Prometheus
Prometheus 是整个 Kubernetes 集群监控和警报系统解决方案。Prometheus 是一个开源的系统,由 SoundCloud 创建。 它利用 HTTP 抓取器和自定义解析器来收集时间序列数据,并提供 HTTP API 与其存储的数据进行查询。Prometheus 具有以下特点:
- PromQL:Prometheus 查询语言,可用于定期描述数据。
- 高维度数据:Prometheus 认为度量标准是标签,而不是名称。 例如,一个容器由四个标签识别,即:镜像,名称,命名空间和 Pod 的 UID。
- 时间序列聚合:Prometheus 支持函数,例如拆分(sum,avg),标准差或百分位数。
- 灵活的警报逻辑:Prometheus 警报能够使用任意表达语言的任意条件逻辑(组成为称为 Record表达式)来静态地定义警报。
部署
在 Kubernetes 中使用 Prometheus,我们需要安装和配置 Prometheus Operator。 我们可以使用官方库中的 GrafanaDashboards 命名空间和 Operator 创建我们自己的配置。 在下面的命令中,我们将使用默认的 Prometheus Operator 模板。
$ kubectl create namespace monitoring $ helm install stable/prometheus-operator \ --name prometheus-operator \ --namespace monitoring \ --set grafana.enabled=true \ --set prometheusOperator.service.nodePort.enabled=true \ --set prometheusOperator.service.nodePort.nodePort=31000
注意,此命令使用 HelmCharts 安装 Prometheus Operator。为了简化此示例,我将开放此 Prometheus Operator 服务端口。
$ kubectl get svc
运行上述命令后,我们应该看到此类似的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 4m prometheus-operator-prometheus ClusterIP 10.152.183.92 <none> 9090/TCP,9153/TCP 3m prometheus-operator-prometheus-node NodePort 10.152.183.38 <none> 9100:31000/TCP,9101/TCP,9102/TCP 3m prometheus-operator-grafana ClusterIP 10.152.183.47 <none> 80/TCP,443/TCP 3m
我们可以看到 Prometheus 是使用 http://prometheus-operator-prometheus.monitoring.svc.cluster.local:9090 部署的。访问此 URL,我们将获得 Prometheus 管理界面。
增加监控
我们应该考虑将指标设置为 Prometheus。 这可能是由 Kubernetes 集群提供的,也可能是由应用程序提供的。
添加 Kubernetes 集群的指标
集群的指标是由 prometheus-operator-controller 创建的 ServiceMonitors 控制的。 这样就能从 Kubernetes 提供的指标中设置监控。 例如,如果希望收集节点 CPU 和内存使用情况的指标,则需要创建以下存储:
-- -------------------- ---- ------- ----------- ------------------------ ----- -------------- --------- ----- ------------- ---------- ---------- ----- --------- ------------ -------- ------------- ---------- - ----- ------- ----- ---
这些指标现在是使用标准 Kubernetes labels 在 Prometheus 中公开的。
添加应用能力的指标
应用程序指标是使用 Prometheus 客户端公开的。 如果需要在容器映像中包含 Prometheus 客户端,则可以使用以下 Dockerfile:
FROM ubuntu RUN apt-get update && apt-get install -y prometheus-node-exporter EXPOSE 9100 CMD ["prometheus-node-exporter"]
它要求将 prometheus-node-exporter 应用程序安装在容器中,并通过 EXPOSE 暴露 9100 端口。
将指标发布到 Prometheus 中
稍后,将需要注意如何公开指标。 最基本的方法是使用 KubernetesPod 直接在 YAML 文件中。 这是一个例子:
-- -------------------- ---- ------- ----- ----------- - ----- - --------------------------------- - ------------------------------------ ------ -------------- ----- ------- ------ - -------------- ---- ----- ---- --------- --- ---------- -- --- ----------- -- ----- ------- --------- ----- ------- ----- ------ - ----- ---- ----- ---- --------- --- ----------- ---- --------- ---- -----
“args”,“image”和“name”是常规的 Kubernetes 容器属性。 然而,这里的重点是红色字体的两行。 这将 prometheus 客户端与容器中的 metrics 端口联系起来。
Grafana
Grafana 是一个可视化指标和日志的监控和度量平台。 安装步骤如下:
添加 apt-key
$ wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
添加 apt-get
$ echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
更新 apt-get
$ sudo apt-get update
安装
$ sudo apt-get install grafana
安装成功后,可以通过 http://localhost:3000 访问。
部署 Grafana 和 Prometheus
第一步是将 Prometheus 的输出链接到 Grafana。 为此,我们需要在 Grafana 中添加 Prometheus 数据源。
登录到 Grafana
使用默认凭据 admin/admin 访问。
创建数据源
单击加号图标以打开新数据源菜单。
在远程写入允许的项中,选择 HTTP。
完成所有必需的值。 需要注意的是,它是为部署 Prometheus 的 Kubernetes 集群而设计的,本地部署需要指定 Prometheus 的地址。
创建面板
单击加号图标以打开面板创作工具。
添加一个面板。
单击添加 Panel +,然后单击添加 Query。
添加查询
在左侧面板菜单中选择一个新图形。
单击添加查询,并使用 Prometheus 创建查询。
使用图表进行监控
在初始化查询的基础上,Grafana 允许在 DataFrame 中添加新查询。 这可以方便地添加新图表,添加样式并自动化小部件在布局中的位置。
日志收集
在容器化环境中,协调日志变得更加困难,因为容器通常不会将日志写入本地磁盘。 而是将其保留在容器的内存或文件系统中。 只有在容器被销毁或重新启动时才会丢失该日志。 为了解决这个问题,需要一个日志收集器以收集所有容器日志并将其转发到供您选择的平台或存储库中。
Fluentd
Fluentd 是一种开源日志传输工具,可用于日志收集和聚合。 它可以从许多数据源收集数据,包括日志文件,消息队列和数据库。 Fluentd 包括数百个输入和输出插件,可以从各种来源和到各种目标转换数据。 它是 kubespray 支持的最受欢迎的日志收集器之一。
部署
在 Kubernetes 中部署 Fluentd,我们可以使用 fluentd-daemonset。 然后在下面的 YAML 文件中定义强制性 Fluentd 配置:
-- -------------------- ---- ------- ----------- ------------ ----- --------- --------- ------- -------- --------------- ----- ------- ---------- ------- ----- --------- ------------ ----- ------- --------- --------- ------- ----- ------- ----- ----------- - ----- ------- ------ ------------------------------------------------------------------ ---- - ----- ------------------ ------ ----------------------------------------------------------------------- - ----- ------------------ ------ ------ ---------- ------- ------- ----- --------- ---- ---- ------- ----- ------------- - ----- ------------- ---------- ------------ - ----- ------ ---------- -------- - ----- ---------------------- ---------- -------------------------- --------- ---- ------------------------------ -- -------- - ----- ------------- ---------- ----- -------------- ------ - ---- ----------- ----- ----------- - ---- ------------------- ----- ------------------- - ----- ------ --------- ----- -------- - ----- ---------------------- --------- ----- --------------------------
从 Fluentd 收集
在 Fluentd 中,可以使用输入插件来配置要收集日志的来源。 目前支持除 KubernetesPods 外的三种输入插件类型:Tail、Forward 和 HTTP。 下面是 Tail 插件示例:
-- -------------------- ---- ------- -------- ----- ---- ---- ------------------------- -------- ------------------------------ --- ----- -------------- ---- ------ ---- ----------- --------------------- ------------- ---- -------- ---- --------------- --------------------- ---------
在上面的配置中:
- “@type”:是必需的字段类型。 在此示例中,我们使用 fluentd 的 Tail 插件。
- “path”:是日志文件的路径名称。
- “pos_file”:是指向保存文件中的文件位置信息的文件的路径名称。
- “tag”:这是用于标记日志条目的字段名称。
- “read_from_head”:此字段告诉 Fluentd 直接读取日志文件的新行。
- “format”:此字段是指定数据的格式。 在此示例中,我们使用 JSON 格式。
- “keep_time_key”:将 Fluentd 的时间信息与站点日志指定的时间键相关联。
- “time_key_format”:这种格式的时间键。
Elasticsearch and Kibana
Elasticsearch 是一个开源的分布式搜索引擎,可以在大量数据的快速排序和分析方面的能力广泛应用于日志和指标分析。 官方提供的 Kibana 工具是一个 Web 应用程序,它通过 Elasticsearch 创建数据可视化和仪表板,并基于 Elasticsearch 中的检索操作提供搜索能力。
部署 Elasticsearch 和 Kibana
在 Kubernetes 中部署 Elasticsearch 和 Kibana,我们可以使用位于官方 Elastic Github 存储库中的部署 YAML 文件。 要开始,我们需要在 Kubernetes 中部署两个容器(Elasticsearch 和 Kibana)以从 Fluentd 中接收日志。 部署可以完成这项工作。
在 Elastic 示例中,我们的 Kibana 部署会话存储在 kibana.yml 中。 我们需要将 Fluentd 容器的 ELASTICSEARCH_HOST 和 ELASTICSEARCH_PORT 环境变量设置为 kibana Elasticsearch 容器的 IP 和 HTTP 端口。
-- -------------------- ---- ------- ----- ----------- - ----- ------ ------ ----------------------------------------- ------ - -------------- ---- ---- - ----- ------------------- ------ -------------------------
最佳实践
- 高负载应用程序必须及时监视,有利于诊断任何关键问题。
- 应尽可能自动化操作,使其易于操作 Kubernetes 实例。
- 将 Fluentd 日志汇聚到 Elasticsearch,并使用 Kibana 搭建实时监测平台。
- 对于 Prometheus 数据库,必须考虑在使用过程中保持数据准确性。
- 尽可能使用定义良好的标签,便于在监控和日志收集方案中定位已部署应用程序的容器。
- 记得定期维护和更新指标,以确保旧指标没有抛出警告。
结论
Kubernetes 监控和日志收集是一个复杂的过程,需要多方面考虑。 但是,掌握它是前端开发人员和 DevOps 工程师的必备技能之一。 正确地监控和收集应用程序和容器日志可以确保 Web 应用程序在高负载下执行良好,并可以快速诊断任何关键问题。 最后,强烈建议任何专业的 Kubernetes 前端开发人员和 DevOps 工程师在实施监视和日志收集解决方案前充分评估它们的制约因素,以免引入新的问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67071948d91dce0dc864e6c4