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。
将Prometheus服务的DNS名称设置为HTTP URL。这是在使用Helm安装时显示的响应消息中的URL。
如果测试结果显示为绿色,则表示成功,然后继续下一步。点击屏幕左上角的Grafana图标右侧的HOME图标,将显示下一个画面。
点击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的仪表板。
由于它具有创建仪表板、设置阈值并通知等多种功能,因此我希望再次提及它。
总结一下
即使在本地环境中,只要有Kubernetes集群+ROOK,大多数持久存储问题都能得到解决,创建一个舒适的运行环境。这样一来,我们可以轻松部署监控工具如Prometheus和Grafana。虽然在同一集群上运行应用程序和监控系统可能会有一些阻力,但通过分配命名空间严格控制资源分配,或者将附加功能与应用程序放置在不同的节点上,采取适当的措施,问题也可以得到解决。