手动安装方案——阿里云解决方案(部署失败):
https://www.jianshu.com/p/1c7ddf18e8b2
手动安装方案—— (部署成功,但是只有CPU内存等的监控信息,没有GPU的监控信息):
https://github.com/camilb/prometheus-kubernetes/tree/master
helm安装方案——GPU-Monitoring-tools解决方案(部署成功):
参考:http://fly-luck.github.io/2018/12/10/gpu-monitoring-tools%20Prometheus/
对应github:https://github.com/NVIDIA/gpu-monitoring-tools/tree/helm-charts
监控方案
- gpu-monitoring-tools(以下简称gmt)的metrics采集包含多套方案:
- NVML Go Bindings(C API)。
- DCGM exporter(Prometheus metrics on DCGM)。
- gmt的监控框架提供了多套方案:
- 直接利用DCGM exporter的Prometheus DaemonSet,只有采集和监控。
- Prometheus Operator + Kube-Prometheus(经Nvidia修改),包含完整的采集、监控、告警、图形化等组件。
我们采用第二套监控框架方案,且这套方案的功能对于没有GPU的CPU机器仍然有效。
经验证,这套方案可以同时监控宿主机硬件(CPU、GPU、内存、磁盘等)、Kubernetes核心组件(apiserver、controller-manager、scheduler等)以及运行在Kubernetes上的业务服务的运行状态。
什么是Operator
- 对于无状态的应用,原生Kubernetes的资源(如Deployment)能很好地支持自动扩缩容、自动重启以及升级。
- 对于有状态的应用,如数据库、缓存、监控系统等,需要根据特定的应用进行不同的运维操作。
- Operator针对特定的应用将运维操作封装进软件,并将Kubernetes API通过第三方资源进行扩展,允许用户创建、配置、管理应用,通常包含一系列Kubernetes CRD的集合。
- 与Kubernetes的Controller和Resource对应关系类似,Operator根据用户提交给Controller的请求,将实际的实例数和实例状态维持在与用户期望相同的效果,但封装了许多细节的操作。
前置准备
镜像
将下列镜像导入到集群的所有节点上:
1234567891011121314151617181920 |
# 如果使用原始的kubernetes搭建Prometheus,使用这两个镜像创建资源,但仅能获取metrics,没有对接监控告警# docker pull nvidia/dcgm-exporter:1.4.6# docker pull quay.io/prometheus/node-exporter:v0.16.0 # operator基础镜像docker pull quay.io/coreos/prometheus-operator:v0.17.0docker pull quay.io/coreos/hyperkube:v1.7.6_coreos.0 # exportersdocker pull nvidia/dcgm-exporter:1.4.3docker pull quay.io/prometheus/node-exporter:v0.15.2 # prometheus组件docker pull quay.io/coreos/configmap-reload:v0.0.1docker pull quay.io/coreos/prometheus-config-reloader:v0.0.3docker pull gcr.io/google_containers/addon-resizer:1.7docker pull gcr.io/google_containers/kube-state-metrics:v1.2.0docker pull quay.io/coreos/grafana-watcher:v0.0.8docker pull grafana/grafana:5.0.0docker pull quay.io/prometheus/prometheus:v2.2.1 |
helm模板
下载并解压下列helm模板:
1234 |
wget https://nvidia.github.io/gpu-monitoring-tools/helm-charts/kube-prometheus-0.0.43.tgztar zxvf kube-prometheus-0.0.43.tgzwget https://nvidia.github.io/gpu-monitoring-tools/helm-charts/prometheus-operator-0.0.15.tgztar zxvf prometheus-operator-0.0.15.tgz |
安装步骤
1. 配置
节点标签
对于需要监控的GPU node打上标签。
1 |
kubectl label no <nodename> hardware-type=NVIDIAGPU |
外源etcd
对于外源的etcd,即etcd不以容器的方式随Kubernetes集群初始化而启动,而是在事前启动的外部etcd集群,需要指定etcd的集群地址。
假设外源etcd的IP为etcd0,etcd1,etcd2,外部访问端口为2379,使用HTTP直接访问。
1 |
vim kube-prometheus/charts/exporter-kube-etcd/values.yaml |
1234567 |
#etcdPort: 4001etcdPort: 2379 #endpoints: [] endpoints: [etcd0,etcd1,etcd2]scheme: http... |
同时,需在grafana插入图表数据,注意:
- 在465行处添加一个”,”。
- 465行前为
"title": "Crashlooping Control Plane Pods"
的面板。 - 在465行处添加以下内容,注意保持缩进。
1
vim kube-prometheus/charts/grafana/dashboards/kubernetes-cluster-status-dashboard.json
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
{ "cacheTimeout": null, "colorBackground": false, "colorValue": false, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "datasource": "prometheus", "editable": true, "format": "percent", "gauge": { "maxValue": 100, "minValue": 0, "show": true, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 5, "w": 6, "x": 0, "y": 11 }, "id": 14, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "", "targets": [ { "expr": "(sum(up{job=\"kube-etcd\"} == 1) / count(up{job=\"kube-etcd\"})) * 100", "format": "time_series", "intervalFactor": 2, "refId": "A", "step": 600 } ], "thresholds": "50, 80", "title": "External etcd Servers UP", "type": "singlestat", "valueFontSize": "80%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current"} |
暴露端口
暴露prometheus、alertmanager、grafana的访问端口,以备排障。这些端口需要能从开发VPC直接访问。
1 |
vim kube-prometheus/values.yaml |
123456789101112 |
alertmanager: ... service: ... nodePort: 30779 type: NodePortprometheus: ... service: ... nodePort: 30778 type: NodePort |
1 |
vim kube-prometheus/charts/grafana/values.yaml |
123 |
service: nodePort: 30780 type: NodePort |
告警接收器
配置告警接收器,通常我们选择在同一个集群内的ControlCenter Service来接收,并将告警信息转换格式后转发给IMS。
1 |
vim kube-prometheus/values.yaml |
1234567891011121314151617181920 |
alertmanager: config: route: receiver: ‘webhook_test‘ routes: - match: alertname: DeadMansSwitch receiver: ‘webhook_test‘ - match: severity: critical receiver: ‘webhook_test‘ - match: severity: warning receiver: ‘webhook_test‘ receivers: - name: ‘webhook_test‘ webhook_configs: - send_resolved: true # short for controlcenter.default.svc or controlcenter.default.svc.cluster.local url: "http://controlcenter.default:7777/api/alerts" |
告警规则
平台监控包括Node硬件(CPU、内存、磁盘、网络、GPU)、K8s组件(Kube-Controller-Manager、Kube-Scheduler、Kubelet、API Server)、K8s应用(Deployment、StatefulSet、Pod)等。
由于篇幅较长,因此将监控告警规则放在附录。
2. 启动
12 |
cd prometheus-operatorhelm install . --name prometheus-operator --namespace monitoring |
12 |
cd kube-prometheushelm install . --name kube-prometheus --namespace monitoring |
3. 清理
1 |
helm delete --purge kube-prometheus |
1 |
helm delete --purge prometheus-operator |
常见问题
无法暴露Kubelet metrics
在1.13.0版本的kubernetes未出现此问题。
- 对于1.13.0之前的版本,需将获取kubelet metrics的方式由https改为http,否则Prometheus的kubelet targets将down掉。[github issue 926]
1
vim kube-prometheus/charts/exporter-kubelets/templates/servicemonitor.yaml
12345678910111213 |
spec: endpoints:# - port: https-metrics# scheme: https - port: http-metrics scheme: http ...# - port: https-metrics# scheme: https - port: http-metrics scheme: http path: /metrics/cadvisor ... |
- 验证
在Prometheus页面可以看到kubelet target。
无法暴露controller-manager及scheduler的metrics
方法一
针对Kubernetes v1.13.0。
- 将下述内容添加到kubeadm.conf,并在kubeadm初始化时kubeadm init –config kubeadm.conf。
12345678910
apiVersion: kubeadm.k8s.io/v1alpha3kind: ClusterConfigurationkubernetesVersion: 1.13.0networking: podSubnet: 10.244.0.0/16controllerManagerExtraArgs: address: 0.0.0.0schedulerExtraArgs: address: 0.0.0.0...
- 为pod打上label。
1234
kubectl get po -n kube-systemkubectl -n kube-system label po kube-controller-manager-<nodename> k8s-app=kube-controller-managerkubectl -n kube-system label po kube-scheduler-<nodename> k8s-app=kube-schedulerkubectl get po -n kube-system --show-labels
- 验证
在Prometheus页面可以看到kube-controller-manager及kube-scheduler两个target。
在grafana页面可以看到controller-manager及scheduler的状态监控。
方法二
guide
针对1.13.0之前的Kubernetes。
- 修改kubeadm的核心配置。
1
kubeadm config view
将上述输出保存为newConfig.yaml,并添加以下两行:
1234 |
controllerManagerExtraArgs: address: 0.0.0.0schedulerExtraArgs: address: 0.0.0.0 |
应用新配置:
1 |
kubeadm config upload from-file --config newConfig.yaml |
- 为pod打上label。
1234
kubectl get po -n kube-systemkubectl label po kube-controller-manager-<nodename> k8s-app=kube-controller-managerkubectl label po kube-scheduler-<nodename> k8s-app=kube-schedulerkubectl get po -n kube-system --show-labels
- 重建exporters。
1
kubectl -n kube-system get svc
可以看到以下两个没有CLUSTER-IP的Service:
12 |
kube-prometheus-exporter-kube-controller-managerkube-prometheus-exporter-kube-scheduler |
12 |
kubectl -n kube-system get svc kube-prometheus-exporter-kube-controller-manager -o yamlkubectl -n kube-system get svc kube-prometheus-exporter-kube-scheduler -o yaml |
将上述输出分别保存为newKubeControllerManagerSvc.yaml和newKubeSchedulerSvc.yaml,删除一些非必要信息(如uid、selfLink、resourceVersion、creationTimestamp等)后重建。
123 |
kubectl delete -n kube-system svc kube-prometheus-exporter-kube-controller-manager kube-prometheus-exporter-kube-schedulerkubectl apply -f newKubeControllerManagerSvc.yamlkubectl apply -f newKubeSchedulerSvc.yaml |
- 确保Prometheus pod到kube-controller-manager和kube-scheduler的NodePort 10251/10252的访问是通畅的。
- 验证与方法一相同。
无法暴露coredns
在Kubernetes v1.13.0中,集群DNS组件默认为coredns,因此需修改kube-prometheus的配置,才能监控到DNS服务的状态。
方法一
- 修改配置中的selectorLabel值与coredns的pod标签对应。
123
kubectl -n kube-system get po --show-labels | grep coredns# 输出coredns k8s-app=kube-dns
1 |
vim kube-prometheus/charts/exporter-coredns/values.yaml |
12 |
#selectorLabel: corednsselectorLabel: kube-dns |
- 重启kube-prometheus。
12
helm delete --purge kube-prometheushelm install --name kube-prometheus --namespace monitoring kube-prometheus
- 验证
在Prometheus可以看到kube-dns target。
方法二
- 修改pod的标签与配置中的一致。
1
kubectl -n kube-system label po
- 验证与方法一相同。
部署成功后需要使用port-forward才能访问到grafana面板,可视化看到监控效果:
https://blog.csdn.net/aixiaoyang168/article/details/81661459
原文地址:https://www.cnblogs.com/zealousness/p/11116764.html