首页 > 其他分享 >17-案例实战:教你快速搭建 Kubernete 监控平台

17-案例实战:教你快速搭建 Kubernete 监控平台

时间:2024-01-11 13:46:55浏览次数:37  
标签:monitor 17 11m grafana prometheus kube Kubernete stack 搭建

PrometheusGrafana 可以说是 Kubernetes 监控解决方案中最知名的两个。Prometheus 负责收集、存储、查询数据,而 Grafana 负责将 Prometheus 中的数据进行可视化展示,当然 Grafana 还支持其他平台,比如 ElasticSearchInfluxDBGraphite 等。CNCF 博客也将这两者称为黄金组合,目前一些公有云提供的托管式 Kubernetes (Managed Kubernetes) 都已经默认安装了 Prometheus 和 Grafana。

Drawing 0.png

我们今天就来学习如何在 Kubernetes 集群中搭建 Prometheus 和 Grafana,使之帮我们监控 Kubernetes 集群。

通过 Helm 一键安装 Prometheus 和 Grafana

还记得之前讲过的 Helm 吗?我们今天就通过 Helm 来安装相关的 Charts,一键式搭建 Prometheus 和 Grafana。如果对 Helm 的一些概念和术语还不太清楚,你可以回到第 12 讲复习一下。

首先我们先通过helm repo add添加一个 Helm repo,见如下命令:

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

我们从这个刚刚添加的prometheus-community中安装 Prometheus 的 Chart。

然后你通过helm repo list就可以看到当前已添加的所有 repo 列表:

$ helm repo list
NAME                    URL
prometheus-community    https://prometheus-community.github.io/helm-charts

如果你已经添加了这个 repo,那么可以运行helm repo update来更新内容:

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "prometheus-community" chart repository
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈Happy Helming!⎈

正如我们之前讲 Helm 提到过的,Helm 的这些 repo 非常类似于我们熟悉的 YUM 源、debian 源。

回到正题上,添加了这个 helm repo 了以后,我们就可以开始安装 Prometheus 的 Chart 了。通常来说,使用 Helm 安装 Chart 的最佳实践是单独创建一个 namespace (命名空间),方便区分、隔离和管理。这里我们就创建一个名为monitor的 namespace:

$ kubectl create ns monitor
namespace/monitor created

创建好了 namespace,我们直接运行如下helm install命令进行安装:

$ helm install prometheus-stack prometheus-community/kube-prometheus-stack -n monitor
NAME: prometheus-stack
LAST DEPLOYED: Mon Oct 19 11:07:42 2020
NAMESPACE: monitor
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace monitor get pods -l "release=prometheus-stack"
Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.

下面我来解释下上述命令中的参数含义。

其中prometheus-stack是这个 helm release 的名字,当然你在实际使用时候可以换成其他名字。从这个名字的后缀stack就可以看出来,prometheus-community/kube-prometheus-stack这个 Chart 其实包含了几个组件,类似于我们之前听说过的 ELKStack 等。除了安装 Prometheus 相关的组件外,该 Chart 的 requirements.yaml 中还定义了三个依赖组件

从这个 YAML 文件可以看到这个 Chart 不仅一起安装了 Grafana,还安装了我们之前第 15 讲提到的kube-state-metricsprometheus-node-exporter组件。

接着看prometheus-community/kube-prometheus-stack,它就是prometheus-communityrepo里面名为kube-prometheus-stack的 Chart。

最后看monitor,它是我们刚创建的新命名空间,在部署的时候使用。

当然如果你不想安装这些依赖,也可以通过文档中的提及方法更改(override)这些默认设置。

现在我们运行刚才helm install输出结果中的命令,来查看我们相关 Pod 的状态:

$ kubectl --namespace monitor get pods -l "release=prometheus-stack"
NAME                                                   READY   STATUS    RESTARTS   AGE
prometheus-stack-kube-prom-operator-6998d5c5b7-kgv8b   2/2     Running   0          2m41s
prometheus-stack-prometheus-node-exporter-l7pr9        1/1     Running   0          2m41s

这里有一个名为prometheus-stack-kube-prom-operator-6998d5c5b7-kgv8b的 Pod,它是 prometheus-operator 的一个实例,主要用于为我们创建、管理和维护 Prometheus 集群,其具体架构图如下。

Drawing 1.png

https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/user-guides/images/architecture.png)

Operator 的工作流程相对复杂一些,我会在后面单独行介绍,在此先略过。有兴趣的话可以查看官方文档简单了解下。

另外一个叫prometheus-stack-prometheus-node-exporter-l7pr9的 Pod 是一个 node-exporter,主要来采集 kubelet 所在节点上的 metrics。

这两个 Pod 都运行成功,我们再来看看monitor这个 namespace 下面其他依赖组件的状态:

$ kubectl get all -n monitor
NAME                                                         READY   STATUS    RESTARTS   AGE
pod/alertmanager-prometheus-stack-kube-prom-alertmanager-0   2/2     Running   0          11m
pod/prometheus-prometheus-stack-kube-prom-prometheus-0       3/3     Running   1          11m
pod/prometheus-stack-grafana-5b6dd6b5fb-rtp6z                2/2     Running   0          11m
pod/prometheus-stack-kube-prom-operator-6998d5c5b7-kgv8b     2/2     Running   0          11m
pod/prometheus-stack-kube-state-metrics-c7c69c8c9-bhgjv      1/1     Running   0          11m
pod/prometheus-stack-prometheus-node-exporter-l7pr9          1/1     Running   0          11m
NAME                                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/alertmanager-operated                       ClusterIP   None             <none>        9093/TCP,9094/TCP,9094/UDP   11m
service/prometheus-operated                         ClusterIP   None             <none>        9090/TCP                     11m
service/prometheus-stack-grafana                    ClusterIP   10.108.122.155   <none>        80/TCP                       11m
service/prometheus-stack-kube-prom-alertmanager     ClusterIP   10.103.37.81     <none>        9093/TCP                     11m
service/prometheus-stack-kube-prom-operator         ClusterIP   10.97.75.165     <none>        8080/TCP,443/TCP             11m
service/prometheus-stack-kube-prom-prometheus       ClusterIP   10.102.82.76     <none>        9090/TCP                     11m
service/prometheus-stack-kube-state-metrics         ClusterIP   10.109.78.8      <none>        8080/TCP                     11m
service/prometheus-stack-prometheus-node-exporter   ClusterIP   10.101.221.185   <none>        9100/TCP                     11m
NAME                                                       DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/prometheus-stack-prometheus-node-exporter   1         1         1       1            1           <none>          11m
NAME                                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/prometheus-stack-grafana              1/1     1            1           11m
deployment.apps/prometheus-stack-kube-prom-operator   1/1     1            1           11m
deployment.apps/prometheus-stack-kube-state-metrics   1/1     1            1           11m
NAME                                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/prometheus-stack-grafana-5b6dd6b5fb              1         1         1       11m
replicaset.apps/prometheus-stack-kube-prom-operator-6998d5c5b7   1         1         1       11m
replicaset.apps/prometheus-stack-kube-state-metrics-c7c69c8c9    1         1         1       11m
NAME                                                                    READY   AGE
statefulset.apps/alertmanager-prometheus-stack-kube-prom-alertmanager   1/1     11m
statefulset.apps/prometheus-prometheus-stack-kube-prom-prometheus       1/1

可以看到全部 Pod 都已经部署成功且运行。

prometheus-operator 以 Deployment 的形式部署,并帮助我们创建了名为 prometheus-prometheus-stack-kube-prom-prometheus 的 StatefulSet,副本数设置为 1。

接下来就可以本地来访问 Prometheus 了,通过如下命令,我们在本地通过 http://127.0.0.1:9090 来访问 Prometheus:

kubectl port-forward -n monitor prometheus-prometheus-stack-kube-prom-prometheus-0 9090

Drawing 2.png

同样地,我们也可以使用如下命令,在本地通过 http://127.0.0.1:3000 来访问 Grafana:

kubectl port-forward -n monitor prometheus-stack-grafana-5b6dd6b5fb-rtp6z 3000

Drawing 3.png

这里默认用户名是 admin,密码是 prom-operator。当然你也可以通过 Grafana 的配置来拿到,我们来看看如何操作。

下面是刚才 Chart 部署的 grafana Deployment 的配置:

kubectl get deploy -n monitor prometheus-stack-grafana -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-stack-grafana
  namespace: monitor
  ...
spec:
  ...
  template:
    ...
    spec:
      containers:
      ...
      - env:
        - name: GF_SECURITY_ADMIN_USER
          valueFrom:
            secretKeyRef:
              key: admin-user
              name: prometheus-stack-grafana
        - name: GF_SECURITY_ADMIN_PASSWORD
          valueFrom:
            secretKeyRef:
              key: admin-password
              name: prometheus-stack-grafana
        image: grafana/grafana:7.2.0
        ...
      ...
status:
  ...

可以看到环境变量GF_SECURITY_ADMIN_USERGF_SECURITY_ADMIN_PASSWORD就是 grafana 的登录用户名和密码,具体的值来自 Secretprometheus-stack-grafana

我们接着看这个 Secret:

$ kubectl get secret prometheus-stack-grafana -n monitor -o jsonpath='{.data}'
map[admin-password:cHJvbS1vcGVyYXRvcg== admin-user:YWRtaW4= ldap-toml:]

分别通过 base64 对其进行解码就可以得到用户名和密码:

$ kubectl get secret prometheus-stack-grafana -n monitor -o jsonpath='{.data.admin-user}' | base64 --decode
admin
$ kubectl get secret prometheus-stack-grafana -n monitor -o jsonpath='{.data.admin-password}' | base64 --decode
prom-operator

使用上述用户名和密码登录,进来后就可以看到 grafana 的主页面了。

Drawing 4.png

按照上述图示点进来,你就可以看到已经配置好的各个 Dashboard:

Drawing 5.png

这些都是prometheus-community/kube-prometheus-stack这个 Chart 预先配置好的,基本上包括我们对 Kubernetes 的各项监控大盘,你可以随意点击几个 Dashboard 进行了解。

Drawing 6.png

你可以参考官方文档学习 Dashboard 的创建和数据展示能力。

生产环境中一些重要的关注指标

集群状态、性能以及各个 API 对象

kube-state-metrics 可以帮助我们汇聚 Kubernetes 集群中的各大信息,比如 Pod 数量,APIServer 访问请求数,Pod 调度性能,等等。你可以通过如下命令可本地访问http://127.0.0.1:8080/metrics拿到相关的 metrics。

$ kubectl port-forward -n monitor prometheus-stack-kube-state-metrics-c7c69c8c9-bhgjv 8080

Drawing 7.png

各节点的监控指标

各个节点承载着 Pod 的运行,因此对各个节点的监控至关重要,比如节点的 CPU 使用率、内存使用率、平均工作负载等。你可以通过上面 Chart 预配置好的 Node dashboard 来查看:

Drawing 8.png

你可以通过切换节点来查看不同节点的状态,或者单独创建一个 Dashboard,添加一些指标,诸如:

  • kube_node_status_capacity_cpu_cores代表节点 CPU 容量;

  • kube_node_status_capacity_memory_bytes代表节点的 Memory容量;

  • kubelet_running_container_count代表节点上运行的容器数量;

  • ……

设置 Alert

除了监控指标的收集和展示以外,我们还需要设置报警(Alert)。你可以通过设置合适的 Alert rules,在触发的时候通过钉钉、邮件、Slack、PagerDuty 等多种方式通知你。

Drawing 9.png

在此不做太多介绍,可以通过官方文档来设置你的 Alert。

写在最后

在这一小节,我们介绍了快速搭建基于 Prometheus + Grafana 的 Kubernetes 监控体系。当然安装的方式有很多,今天这里只写了最方便、最快捷的方式。Chart 里预先配置了多个 Dashboard,方便你开箱即用。

如果你对本节课有什么想法或者疑问,欢迎你在留言区留言,我们一起讨论。


标签:monitor,17,11m,grafana,prometheus,kube,Kubernete,stack,搭建
From: https://www.cnblogs.com/huangjiale/p/17958405

相关文章

  • 16-迎战流量峰值:Kubernete 怎样控制业务的资源水位?
    通过前面的学习,相信你已经见识到了Kubernetes的强大能力,它能帮你轻松管理大规模的容器服务,尤其是面对复杂的环境时,比如节点异常、容器异常退出等,Kubernetes内部的Service、Deployment会动态地进行调整,比如增加新的副本、关联新的Pod等。当然Kubernetes的这种自动伸缩能......
  • 18-权限分析:Kubernete 集群权限管理那些事儿
    你好,我是正范。通过前面的课程学习,你已经学会了使用kubectl命令行,或者直接发送REST请求,以及使用各种语言的client库来跟APIServer进行交互。那么你是否知道在这其中Kubernetes是如何对这些请求进行认证、授权的呢?这节课,我们就来一探究竟。任何请求访问Kubernetes的kub......
  • 19-资源限制:如何保障你的 Kubernete 集群资源不会被打爆
    前面的课时中,我们曾提到通过HPA控制业务的资源水位,通过ClusterAutoscaler自动扩充集群的资源。但如果集群资源本身就是受限的情况下,或者一时无法短时间内扩容,那么我们该如何控制集群的整体资源水位,保障集群资源不会被“打爆”?今天我们就来看看Kubernetes中都有哪些能力可以......
  • 20-资源优化:Kubernete 中有 GC(垃圾回收)吗?
    GarbageCollector即垃圾回收,通常简称GC,和你之前在其他编程语言中了解到的GC基本上是一样的,用来清理一些不用的资源。Kubernetes中有各种各样的资源,当然需要GC啦,今天我们就一起来了解下Kubernetes中的GC。你可能最先想到的就是容器的清理,即Kubelet侧的GC,清理许多处于......
  • 02-高屋建瓴:Kubernete 的架构为什么是这样的?
    通过上一课时的学习,我们已经对Kubernetes的前世今生有所了解。接下来,我们开始具体学习如何将Kubernetes应用到自己的项目中,首先就需要了解Kubernetes的架构。所以,在本节课程中,我们会一起学习Kubernetes的架构设计,以及背后的设计哲学。Google使用Linux容器有超过15年......
  • 03-集群搭建:手把手教你玩转 Kubernete 集群搭建
    通过上一节课的学习,我们已经对Kubernetes的架构有了清楚的认识。但是到现在还没有和Kubernetes集群真正打过交道,所以你可能有一种“不识庐山真面目”的云里雾里的感觉。那么本节课,我们就来学习如何搭建Kubernetes集群,开启探索Kubernetes的第一站。在线Kubernetes集群......
  • 04-核心定义:Kubernete 是如何搞定“不可变基础设施”的?
    在上一节课,我们已经了解了Kubernetes集群的搭建方式。从现在开始,我们就要跟Kubernetes集群打交道了。本节课我们会学习Kubernetes中最重要、也最核心的对象——Pod。在了解Pod之前,我们先来看一下CNCF官方是怎么定义云原生的。云原生技术有利于各组织在公有云、私有云......
  • 06-无状态应用:剖析 Kubernete 业务副本及水平扩展底层原理
    在上两节课中,我们已经了解了Kubernetes中最关键的对象Pod,也学习了一些Pod的常见用法。每一个Pod都是应用的一个实例,但是通常来说你不会直接在Kubernetes中创建和运行单个Pod。因为Pod的生命周期是短暂的,即“用后即焚”。理解这一点很重要,这也是“不可变基础设施”这......
  • 07-有状态应用:Kubernete 如何通过 StatefulSet 支持有状态应用?
    在上一节课中,我们学习了Kubernetes中的无状态工作负载,并上手实践了Deployment对象,相信现在你已经慢慢喜欢上Kubernetes了。那么本节课,我们来一起看看Kubernetes中的另外一种工作负载StatefulSet。从名字就可以看出,这个工作负载主要用于有状态的服务发布。关于有状态服务......
  • 前世今生:Kubernete 是如何火起来的?
    本课时,我们就开始正式进入Kubernetes的学习,或许你已经听过或简单了解过Kubernetes,它是一款由Google开源的容器编排管理工具,而我们想要深入地掌握Kubernetes框架,就不得不先了解Kubernetes的前世今生,而这一切都要从“云计算”的兴起开始讲起。云计算平台说来也巧,“云计算......