监控是运维中至关重要的工作,对于像Kubernetes这样的当下风行的技术来说,强大的监控设置可以充分了解整个集群的机器状态,包括主机的基础性能,Pod资源利用率等。
今天,我们将在不到5分钟的时间内部署基于生产级Prometheus的监控系统。
前期准备条件:
1、运行具有至少6个内核和8 GB可用内存的Kubernetes集群。在本教程中,我将使用6个Node节点
2、Kubernetes部署和服务的工作知识。
步骤:
1、具有持久卷的Prometheus服务器。这将是我们的指标存储(TSDB)。
2、Alertmanager服务器,它将触发对Slack / Hipchat和/或Pagerduty / Victorops等的警报。
3、Kube-state-metrics服务器公开容器和pod度量,而不是由cadvisor公开的节点。
4、Grafana服务器可基于Prometheus数据创建仪表板。
部署Alertmanager
部署之前,请更新“ <your_slack_hook>”,“ <your_victorops_hook>”,“ <YOUR_API_KEY>”。 如果使用其他以外的通知渠道,例如微信webhook或钉钉,请遵循文档调整:
kubectl apply -f k8s / monitoring / alertmanager /
这将创建以下内容:
1、监视名称空间。
2、警报管理器将使用的配置映射来管理警报通道。
3、运行1个副本的Alertmanager部署。
4、可通过VPC(使用VPN)访问负责均衡服务IP
1 2 3 4 5 6 7 8 9 |
root$ kubectl get pods -l app=alertmanager NAME READY STATUS RESTARTS AGE alertmanager-42s7s25467-b2vqb 1/1 Running 0 2m root$ kubectl get svc -l name=alertmanager NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager LoadBalancer 10.12.8.110 10.0.0.6 9093:32634/TCP 2m root$ kubectl get configmap NAME DATA AGE alertmanager 1 2m |
在浏览器中,导航到http:// <Alertmanager-Svc-Ext-Ip>:9093,应该看到alertmanager控制台。
部署普罗米修斯
部署之前,请创建一个EBS卷(AWS),并将其命名为prometheus-volume(这很重要,因为PVC会以此名称查找卷)。
kubectl apply -f k8s / monitoring / prometheus /
这将创建以下内容:
1、Prometheus需要的服务帐户,群集角色和群集角色绑定。
2、Prometheus配置图,其中详细说明了scrape配置和alertmanager端点。 应该注意的是,我们可以直接使用alertmanager服务名称代替IP。 如果要从特定的pod或服务中收集指标,则必须对其应用Prometheus annotations。 例如:
1 2 3 4 5 6 7 8 9 10 11 12 |
spec: replicas: 1 template: metadata: annotations: prometheus.io/path: <path_to_scrape> prometheus.io/port: "80" prometheus.io/scrape: "true" labels: app: myapp spec: ... |
警报规则的Prometheus配置图。 其中已经配置了一些基本警报(例如,容器和节点的CPU和内存使用率过高等)。 可以根据实际情况随意添加更多规则。
Prometheus服务器数据目录的存储类,持久卷和持久卷声明。 这样可以确保在Pod重新启动时保持数据持久性。
运行1个副本的Prometheus部署。
可通过VPC(使用VPN)访问的内部负载平衡器IP服务。
1 2 3 4 5 6 7 8 9 10 11 |
root$ kubectl get pods -l app=prometheus-server NAME READY STATUS RESTARTS AGE prometheus-deployment-69d6cfb5b7-l7xjj 1/1 Running 0 2m root$ kubectl get svc -l name=prometheus NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus-service LoadBalancer 10.12.8.124 10.0.0.7 8080:32731/TCP 2m root$ kubectl get configmap NAME DATA AGE alertmanager 1 5m prometheus-rules 1 2m prometheus-server-conf 1 2m |
在浏览器中,导航到http:// <Prometheus-Svc-Ext-Ip>:8080,应该看到Prometheus控制台。 应当注意,在“状态”->“目标”部分下,所有已抓取的endpoint都是可见的,在“警报”部分下,可以看到所有已配置的警报。
部署Kube-State-Metrics
kubectl apply -f k8s / monitoring / kube-state-metrics /
这将创建以下内容:
kube-state-metrics需要的服务帐户,集群角色和集群角色绑定。
运行1个副本的Kube状态度量部署。
集群内服务,这将由Prometheus抓取以获取度量标准:
1 2 3 4 5 6 |
root$ kubectl get pods -l k8s-app=kube-state-metrics NAME READY STATUS RESTARTS AGE kube-state-metrics-255m1wq876-fk2q6 2/2 Running 0 2m root$ kubectl get svc -l k8s-app=kube-state-metrics NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-state-metrics ClusterIP 10.12.8.130 <none> 8080/TCP,8081/TCP 2m |
部署Grafana
到现在为止,我们已经部署了监控系统的核心(度量标准获取和存储),现在该将所有这些放在一起并创建仪表板了
kubectl apply -f k8s / monitoring / grafana
这将创建以下内容:
1、正在运行1个副本的Grafana部署。
2、可以从VPC(使用VPN)进行访问,内部负载平衡器IP的服务
1 2 3 4 5 6 7 8 9 10 11 12 |
root$ kubectl get pods NAME READY STATUS RESTARTS AGE grafana-7x23qlkj3n-vb3er 1/1 Running 0 2m kube-state-metrics-255m1wq876-fk2q6 2/2 Running 0 5m prometheus-deployment-69d6cfb5b7-l7xjj 1/1 Running 0 5m alertmanager-42s7s25467-b2vqb 1/1 Running 0 2m root$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana LoadBalancer 10.12.8.132 10.0.0.8 3000:32262/TCP 2m kube-state-metrics ClusterIP 10.12.8.130 <none> 8080/TCP,8081/TCP 5m prometheus-service LoadBalancer 10.12.8.124 10.0.0.7 8080:30698/TCP 5m alertmanager LoadBalancer 10.12.8.110 10.0.0.6 9093:32634/TCP 5m |
现在需要做的就是将Prometheus服务器添加为Grafana中的数据源,并开始创建仪表板。 使用以下配置:
名称:DS_Prometheus
类型:普罗米修斯
网址:http:// prometheus-service:8080
注意:由于Grafana和Prometheus服务器都部署在同一群集中,因此我们在URL部分中使用Prometheus服务名称。 如果Grafana服务器在群集之外,则应在URL中使用Prometheus服务的外部IP。
所有仪表板都可以在这里找到。 可以直接导入json文件,一切搞定。
注意:
1、部署新服务时无需添加单独的仪表板。 所有的仪表板都是通用的和模板化的。
2、Prometheus热加载。 因此,如果需要更新配置或规则文件,只需更新配置映射并向Prometheus端点发出HTTP POST请求。 例如:
1 2 3 4 5 6 7 |
curl -XPOST http://<Prometheus-Svc-Ext-Ip>:8080>/-/reload #In the prometheus logs it can be seen as level=info ts=2019-01-17T03:37:50.433940468Z caller=main.go:624 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml level=info ts=2019-01-17T03:37:50.439047381Z caller=kubernetes.go:187 component="discovery manager scrape" discovery=k8s msg="Using pod service account via in-cluster config" level=info ts=2019-01-17T03:37:50.439987243Z caller=kubernetes.go:187 component="discovery manager scrape" discovery=k8s msg="Using pod service account via in-cluster config" level=info ts=2019-01-17T03:37:50.440631225Z caller=kubernetes.go:187 component="discovery manager scrape" discovery=k8s msg="Using pod service account via in-cluster config" level=info ts=2019-01-17T03:37:50.444566424Z caller=main.go:650 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml |
可以通过类似的api调用重新加载Alertmanager配置。
curl -XPOST http:// <Alertmanager-Svc-Ext-Ip>:9093> /-/重新加载
我希望这可以帮助大家深入了解Kubernetes集群并有效监控工作负载。 此设置应足以使开始监控工作负载。 在下一篇文章中,我们将学习水平扩展Prometheus并确保高可用性。 敬请关注 :)
原文:https://appfleet.com/blog/kubernetes-monitoring-using-prometheus/
git:https://github.com/Thakurvaibhav/k8s/tree/master/monitoring