Kubernetes的监视#1在ROOK Ceph上使用Promethus和Grafana

使用Kubernetes的一个优点是不需要安装监控代理等工具。只需在工作节点上部署一次监控功能,并添加命名空间来运行应用程序,无需为每个应用程序进行单独的配置。当然,需要配置必要的视图,但与以往相比,这更加简单。

在验证了ROOK Ceph的块存储后,由于现在可以使用动态分配的持久性存储,我们希望利用这个基础设施来引入时序数据库Prometheus和浏览器界面Grafana以及日志分析工具Elastiecsearch和Kibana。因此,本次我们将讨论Prometheus和Grafana。

这篇文章是关于验证ROOK Ceph块存储的备忘录,使用安装了ROOK Ceph环境的方法,引入Prometheus和Grafana。

kube-state-metrics 是什么

kube-state-metrics 是一个从 Kubernetes API 服务器获取信息并生成与 API 对象状态相关的指标的服务。该服务专注于 Kubernetes 的部署、节点、Pod 等内部多个对象的健康性。

kube-state-metrics生成的指标是从Kubernetes API对象中生成的,无需进行修改。这样,kube-state-metrics提供的功能的稳定性与Kubernetes API对象本身的质量相同。然而,需要注意的是,由于kubectl应用了特定的启发式算法来显示全面的消息,kube-state-metrics与kubectl的显示可能不一致。kube-state-metrics获取并公开了未经处理的原始数据,从Kubernetes API中获取了用户所需的所有数据,并且根据需要使用称为启发式算法的方法对数据进行处理和显示。

啟發式方法(heuristic)或稱為「發現性方法」,雖然無法確保總是能得出正確答案,但能在一定程度上獲得接近正確解的解答。這種方法以取得答案所需時間較少為特點,雖然無法保證答案準確性。

指标是在HTTP端点/metrics上以默认的8080端口进行监听和公开的。它们以明文形式提供。这些指标被设计为由Prometheus本身或Prometheus客户端的抓取器收集数据。可以在浏览器中打开/metrics来显示未加工的指标。

安装 kube-state-metrics

可以通过从GitHub获取代码并部署来进行安装。

git clone https://github.com/kubernetes/kube-state-metrics
cd kube-state-metrics
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=USER-MAIL-ADDRESS
kubectl apply -f examples/standard/

加入到主节点,在入口点上列出,并获取IP地址、端口号以及通过/metrics访问并获取原始数据。

vagrant ssh master

kubectl get ep -n kube-system kube-state-metrics 
NAME                      ENDPOINTS                                               AGE
kube-state-metrics        10.244.2.12:8080,10.244.2.12:8081                       4m21s 

curl http://10.244.2.12:8080/metrics
# HELP kube_certificatesigningrequest_labels Kubernetes labels converted to Prometheus labels.
# TYPE kube_certificatesigningrequest_labels gauge
# HELP kube_certificatesigningrequest_created Unix creation timestamp
# TYPE kube_certificatesigningrequest_created gauge
# HELP kube_certificatesigningrequest_condition The number of each certificatesigningrequest condition
# TYPE kube_certificatesigningrequest_condition gauge
# HELP kube_certificatesigningrequest_cert_length Length of the issued cert
# TYPE kube_certificatesigningrequest_cert_length gauge
# HELP kube_configmap_info Information about configmap.
# TYPE kube_configmap_info gauge
kube_configmap_info{namespace="rook-ceph",configmap="rook-ceph-osd-node3-config"} 1
kube_configmap_info{namespace="kube-system",configmap="kube-proxy"} 1
kube_configmap_info{namespace="kube-public",configmap="cluster-info"} 1
kube_configmap_info{namespace="rook-ceph",configmap="local-device-node1"} 1
kube_configmap_info{namespace="rook-ceph",configmap="rook-config-override"} 1

kube-state-metrics 和 metrics-server 有何不同?

Metric Server是受Heapster启发并实现Kubernetes监控架构以实现核心度量管道目标的组件。它是一个集群级别的组件,定期从所有Kubernetes节点的kubelet提供的度量数据中进行提取并公开。通过这种方式,聚合的度量数据被保存在内存中,并以度量API格式进行公开。仅保存最新的值,不进行度量数据传输到第三方目标。

一方,《kube-state-metrics》将重点放在生成全新指标上,这些指标是基于Kubernetes的API对象状态,例如部署、副本集等。它会将整个Kubernetes状态的快照存储在内存中,并基于此持续生成新的指标。它不承担主动传输指标至指标服务器的责任,而是作为一个等待其他需要指标信息的服务。

从Prometheus等监控系统中,您也可以访问kube-state-metrics和metrics-server提供的度量信息。

请参考以下网址:https://github.com/kubernetes/kube-state-metrics

安装 Promethuse

在这里,使用HELM版本3来安装Prometheus。确保能够通过kubectl访问Kubernetes集群,并使用helm3客户端进行安装。

首先,添加Helm Chart的存储库。

helm repo add stable https://kubernetes-charts.storage.googleapis.com/

我要确认一下,试着搜索 Prometheus 的图表。

helm search repo prometheus
NAME                                    CHART VERSION   APP VERSION DESCRIPTION                                       
stable/prometheus                       10.3.1          2.15.2      Prometheus is a monitoring system and time seri...
stable/prometheus-adapter               2.0.1           v0.5.0      A Helm chart for k8s prometheus adapter           
stable/prometheus-blackbox-exporter     3.0.0           0.15.1      Prometheus Blackbox Exporter                      
stable/prometheus-cloudwatch-exporter   0.6.0           0.6.0       A Helm chart for prometheus cloudwatch-exporter   
stable/prometheus-consul-exporter       0.1.4           0.4.0       A Helm chart for the Prometheus Consul Exporter   
stable/prometheus-couchdb-exporter      0.1.1           1.0         A Helm chart to export the metrics from couchdb...
stable/prometheus-mongodb-exporter      2.4.0           v0.10.0     A Prometheus exporter for MongoDB metrics         
stable/prometheus-mysql-exporter        0.5.2           v0.11.0     A Helm chart for prometheus mysql exporter with...
stable/prometheus-nats-exporter         2.3.0           0.6.0       A Helm chart for prometheus-nats-exporter         
stable/prometheus-node-exporter         1.8.1           0.18.1      A Helm chart for prometheus node-exporter         
stable/prometheus-operator              8.5.14          0.34.0      Provides easy monitoring definitions for Kubern...
stable/prometheus-postgres-exporter     1.2.0           0.8.0       A Helm chart for prometheus postgres-exporter     
stable/prometheus-pushgateway           1.2.13          1.0.1       A Helm chart for prometheus pushgateway           
stable/prometheus-rabbitmq-exporter     0.5.5           v0.29.0     Rabbitmq metrics exporter for prometheus          
stable/prometheus-redis-exporter        3.2.1           1.0.4       Prometheus exporter for Redis metrics             
stable/prometheus-snmp-exporter         0.0.4           0.14.0      Prometheus SNMP Exporter                          
stable/prometheus-to-sd                 0.3.0           0.5.2       Scrape metrics stored in prometheus format and ...
stable/elasticsearch-exporter           2.2.0           1.1.0       Elasticsearch stats exporter for Prometheus       
stable/helm-exporter                    0.3.2           0.4.0       Exports helm release stats to prometheus          
stable/karma                            1.4.0           v0.50       A Helm chart for Karma - an UI for Prometheus A...
stable/stackdriver-exporter             1.2.2           0.6.0       Stackdriver exporter for Prometheus               
stable/weave-cloud                      0.3.7           1.4.0       Weave Cloud is a add-on to Kubernetes which pro...
stable/kube-state-metrics               2.6.3           1.9.3       Install kube-state-metrics to generate and expo...
stable/kuberhealthy                     1.2.6           v1.0.2      The official Helm chart for Kuberhealthy.         
stable/mariadb                          7.3.6           10.3.21     Fast, reliable, scalable, and easy to use open-...

接下来创建适用于Prometheus的命名空间(namespae)。

kubectl create namespace prometheus

为了从Helm图表中获取并编辑参数,创建一个目录并进行移动。

mkdir prometheus
cd prometheus/

将参数从文件中提取出来并进行编辑。

helm inspect values stable/prometheus > prometheus-values.yaml

编辑内容是将存储类设置为ROOK Ceph,storageClass: “rook-ceph-block”,并禁用pushgateway。
完成YAML参数的编辑后,部署Prometheus。

helm install prometheus --namespace prometheus -f prometheus-values.yaml stable/prometheus

下面是一个例子,显示了访问Prometheus用户界面所需的信息。

tkr@luigi:~/sandbox-rook/prometheus$ helm install prometheus --namespace prometheus -f prometheus-values.yaml stable/prometheus
NAME: prometheus
LAST DEPLOYED: Sat Jan 25 13:23:37 2020
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-server.prometheus.svc.cluster.local


Get the Prometheus server URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace prometheus port-forward $POD_NAME 9090


The Prometheus alertmanager can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-alertmanager.prometheus.svc.cluster.local


Get the Alertmanager URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace prometheus port-forward $POD_NAME 9093
#################################################################################
######   WARNING: Pod Security Policy has been moved to a global property.  #####
######            use .Values.podSecurityPolicy.enabled with pod-based      #####
######            annotations                                               #####
######            (e.g. .Values.nodeExporter.podSecurityPolicy.annotations) #####
#################################################################################

For more information on running Prometheus, visit:
https://prometheus.io/

确认启动完成

确认Pod的启动状态。如果以下的Pod处于Running状态,则可视为成功。

kubectl get po -n prometheus
NAME                                             READY   STATUS    RESTARTS   AGE
prometheus-alertmanager-84bbc87464-vpcs7         2/2     Running   0          3m27s
prometheus-kube-state-metrics-59bb448977-h5tz4   1/1     Running   0          3m27s
prometheus-node-exporter-7s8qk                   1/1     Running   0          3m27s
prometheus-node-exporter-npnjr                   1/1     Running   0          3m27s
prometheus-node-exporter-qwmpr                   1/1     Running   0          3m27s
prometheus-server-c9977fd86-z7dk7                2/2     Running   0          3m27s

下面是服务清单。

kubectl get svc -n prometheus
NAME                            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
prometheus-alertmanager         ClusterIP   10.32.0.181   <none>        80/TCP          3m33s
prometheus-kube-state-metrics   ClusterIP   None          <none>        80/TCP,81/TCP   3m33s
prometheus-node-exporter        ClusterIP   None          <none>        9100/TCP        3m33s
prometheus-server               ClusterIP   10.32.0.163   <none>        80/TCP          3m33s

公开选项附加

可以将上述的 ClusterIP 改为 NodePort 类型,以便通过主节点访问。需要修改的是 prometheus-alertmanager 和 prometheus-server 两个服务。

kubectl edit svc -n prometheus prometheus-alertmanager

在第32行的”type: NodePort”处进行更改。

     20 spec:
     21   clusterIP: 10.32.0.11
     22   ports:
     23   - name: http
     24     port: 80
     25     protocol: TCP
     26     targetPort: 9093
     27   selector:
     28     app: prometheus
     29     component: alertmanager
     30     release: prometheus
     31   sessionAffinity: None
     32   type: NodePort

确认更改已生效,并确认分配的端口号。

kubectl get svc -n prometheus prometheus-alertmanager
NAME                            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
prometheus-alertmanager         NodePort    10.32.0.181   <none>        80:30218/TCP    6m12s

另外, 下面的内容也需要同样进行更改.

kubectl edit svc -n prometheus prometheus-server 

确认变更已生效以及已分配的端口号。

kubectl get svc -n prometheus prometheus-server
NAME                            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
prometheus-server               NodePort    10.32.0.163   <none>        80:31255/TCP    6m58s

现在,普罗米修斯的设置已经完成。

安装Grafana。

接下来,我们将使用Helm来安装显示应用程序Grafana。

helm search repo grafana
NAME            CHART VERSION   APP VERSION DESCRIPTION                                       
stable/grafana  4.4.0           6.5.2       The leading tool for querying and visualizing t...
helm inspect values stable/grafana > grafana-values.yaml

请将以下部分用自然中文进行改述(只需要一个选项):
修正的地方在存储类中,需将 storageClassName: rook-ceph-block 修改为如下形式。
在部署后获取密码的方法丢失后,将无法登录到Grafana,所以需要注意。

helm install grafana --namespace prometheus -f grafana-values.yaml stable/grafana
NAME: grafana
LAST DEPLOYED: Sat Jan 25 13:37:11 2020
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:

   kubectl get secret --namespace prometheus grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana.prometheus.svc.cluster.local

   Get the Grafana URL to visit by running these commands in the same shell:

     export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=grafana,release=grafana" -o jsonpath="{.items[0].metadata.name}")
     kubectl --namespace prometheus port-forward $POD_NAME 3000

3. Login with the password from step 1 and the username: admin
#################################################################################
######   WARNING: Persistence is disabled!!! You will lose your data when   #####
######            the Grafana pod is terminated.                            #####
#################################################################################

这样就会有两个 Helm 实例正在运行。

helm list --namespace prometheus
NAME        NAMESPACE   REVISION    UPDATED                                 STATUS      CHART               APP VERSION
grafana     prometheus  1           2020-01-25 13:37:11.709451488 +0900 JST deployed    grafana-4.4.0       6.5.2      
prometheus  prometheus  1           2020-01-25 13:23:37.957212894 +0900 JST deployed    prometheus-10.3.1   2.15.2     

如前所述,Grafana也可以编辑服务类型。

kubectl get svc -n prometheus grafana
NAME      TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
grafana   ClusterIP  10.32.0.110   <none>        80:31300/TCP   2m52s

更改的地方是第26行和第31行。

     19 spec:
     20   clusterIP: 10.32.0.110
     21   ports:
     22   - name: service
     23     port: 80
     24     protocol: TCP
     25     targetPort: 3000
     26     nodePort: 31300  <--- 追加
     27   selector:
     28     app: grafana
     29     release: grafana
     30   sessionAffinity: None
     31   type: NodePort    <--- 変更

现在可以通过节点的端口号31300来访问了。

kubectl get svc -n prometheus grafana
NAME      TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
grafana   NodePort   10.32.0.110   <none>        80:31300/TCP   2m52s

可以通过以下命令获取登录密码。

kubectl get secret --namespace prometheus grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

由于主节点的虚拟机主机IP地址为192.168.1.91,已经打开了NodePort,所以可以在http://192.168.1.91:31300/上显示Grafana登录界面。
可以使用用户名admin和上述获得的密码登录。

在接下来的初始界面上,点击“添加数据源”,然后选择Prometheus。

Grafana1.png

将Prometheus服务的DNS名称设置为HTTP URL。这是在使用Helm安装时显示的响应消息中的URL。

Grafana3.png

如果测试结果显示为绿色,则表示成功,然后继续下一步。点击屏幕左上角的Grafana图标右侧的HOME图标,将显示下一个画面。

Grafana4.png

点击Grafana.com右下方的“查找仪表盘”按钮,将显示仪表盘目录。然后,在“导入仪表盘”中输入目录的ID号并选择数据源,即可无需配置直接使用预设的仪表盘。

以下是作者推薦的儀表板ID和名稱。只需將ID從”Import”處輸入,即可方便地顯示儀表板畫面,非常方便。

    • 11074 1 Node Exporter for Prometheus Dashboard English Version UPDATE 1102

 

    • 10000 Cluster Monitoring for Kubernetes

 

    • 8685 K8s Cluster Summary

 

    • 1860 Node Exporter Full

 

    7249 Kubernetes Cluster

下一个画面是ID号为11074的仪表板。

Grafana5.png

由于它具有创建仪表板、设置阈值并通知等多种功能,因此我希望再次提及它。

总结一下

即使在本地环境中,只要有Kubernetes集群+ROOK,大多数持久存储问题都能得到解决,创建一个舒适的运行环境。这样一来,我们可以轻松部署监控工具如Prometheus和Grafana。虽然在同一集群上运行应用程序和监控系统可能会有一些阻力,但通过分配命名空间严格控制资源分配,或者将附加功能与应用程序放置在不同的节点上,采取适当的措施,问题也可以得到解决。

广告
将在 10 秒后关闭
bannerAds