title | date | tags |
Prometheus-operator | 2019-07-07 13:32:24 -0700 |
安装
通过helm安装
下载项目
helm fetch stable/prometheus-operator --version 5.10.2 --untar
启动服务
helm install --name promethues-operator --namespace monitoring prometheus-operator
没错以上就安装完了,可以进行单纯的访问使用啦。但由于此项目更贴近于rancher部署的k8s集群,所以初始化中对etcd/kube-schuduler/kube-controller-manager监控不了,除此之外还有一些基本参数需根据需求调整。
参数配置
定义配置文件
这个文件(prom-seting.yaml)的作用是根据charts预留的变量进行赋值,没在此文件中配置的均使用官方默认参数
kubeControllerManager:
endpoints:
- 10.16.200.101
- 10.16.200.102
- 10.16.200.103
kubeScheduler:
endpoints:
- 10.16.200.101
- 10.16.200.102
- 10.16.200.103
kubeEtcd:
endpoints:
- 10.16.200.101
- 10.16.200.102
- 10.16.200.103
serviceMonitor:
scheme: https
insecureSkipVerify: true
serverName: etcd
caFile: /etc/prometheus/secrets/etcd-certs/ca.pem
certFile: /etc/prometheus/secrets/etcd-certs/etcd.pem
keyFile: /etc/prometheus/secrets/etcd-certs/etcd-key.pem
prometheus:
ingress:
enabled: true
hosts:
- prometheus.ingress.com
service:
type: NodePort
nodePort: 39000
prometheusSpec:
secrets:
- etcd-certs
#nodeSelector:
# kubernetes.io/hostname: 10.16.200.108
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: managed-nfs-storage
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
replicas: 1
alertmanager:
ingress:
enabled: true
hosts:
- alertmanager.ingress.com
service:
type: NodePort
nodePort: 39001
alertmanagerSpec:
#nodeSelector:
# kubernetes.io/hostname: 10.16.200.108
storage:
volumeClaimTemplate:
spec:
storageClassName: managed-nfs-storage
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi
replicas: 1
grafana:
ingress:
enabled: true
hosts:
- grafana.ingress.com
service:
type: NodePort
nodePort: 39002
#kubeStateMetrics:
# image:
# repository: mirrorgooglecontainers/kube-state-metrics
# repository: quay.io/coreos/kube-state-metrics
kubeControllerManager
kubeScheduler
kubeEtcd
前面有提到当这三个组件不是通过Container部署时,需要申明其部署的主机ip
- etcd使用安全(既证书)部署时,需创建secret资源并提供给prometheus内部识别
# 创建命名为etcd-certs的secret资源
kubectl -n monitoring create secret generic etcd-certs --from-file=/etc/kubernetes/ssl/ca.pem --from-file=/etc/etcd/ssl/etcd.pem --from-file=/etc/etcd/ssl/etcd-key.pem
需要注意的是namespace需要和部署prometheus的相同,对应密钥位置和最重要的命名(它会在prometheus中的/etc/prometheus/secrets下创建"命名"目录)用于上文中填写证书存放识别
- kubeControllerManager kubeScheduler 这两个服务端口10252/10251一定是监听的0.0.0.0,否则prometheus在获取其metric时会抛出connection x.x.x.x 10251 timeout;需要调整Unit文件中--address配置
prometheus
alertmanager
grafana
下的配置采用配置Ingress地址/NodePort方式/绑定到固定的节点上(当使用hostPath作为持久化方案时需要配置)/使用动态pv/控制实例数量
- 其中需要注意的是在prometheus中申明使用刚才创建的secret资源,名字一定是刚才的命名"etcd-certs"
kubeStateMetrics
在此项目中未预留且镜像用的国外的不易下载,我们需要修改其中的镜像名
vim prometheus-operator/charts/kube-state-metrics/values.yaml
# 将k8s.gcr.io/kube-state-metrics 改为quay.io/coreos/kube-state-metrics
持久化
此项目默认是没有将数据进行持久化,Volume方式均采用的EmptyDir,意味着期间运行的数据随着Pod的周期而丢失,真正生产环境我们对数据的持久化是必不可少的;持久化的方式有两种,一种是采用hostPath本地落盘,另一种就是采用Persistent Volume即共享存储,官方推荐是采用hostPath方式,因为毕竟一个Prometheus-operator具备处理千万数据的处理能力,但如果涉及其高可用那就只能采用共享存储来做,接下来介绍一下两者的配置方式及需要注意的点
HostPath
- 首先获取相关应用的yaml
kubectl get pod xxxx -n monitoring -o yaml > /tmp/xxx.yaml
- 查找其yaml中的volumeMounts、volumes字段对应挂载的位置信息,同样可以快速定位到empty的位置,主要获取有效挂载路径或名称
- emptyDir: {}
name: sc-dashboard-volume
- configMap:
defaultMode: 420
name: promethues-operator-grafana-config-dashboards
name: sc-dashboard-provider
- emptyDir: {}
- 用上一步骤获取到的有效挂载路径或名称在charts中进行搜索
grep -r 'sc-dashboard-provider' prometheus-operator/*
# 搜索到结果prometheus-operator/charts/grafana/templates/deployment.yaml
- 将empty挂载方式改为hostPath
persistentVolumeClaim:
claimName: {{ .Values.persistence.existingClaim | default (include "grafana.fullname" .) }}
{{- else }}
#emptyDir: {}
hostPath:
path: /data/grafana
{{- end -}}
{{- if .Values.sidecar.dashboards.enabled }}
- name: sc-dashboard-volume
#emptyDir: {}
hostPath:
path: /data/dashboard-provider
- name: sc-dashboard-provider
configMap:
name: {{ template "grafana.fullname" . }}-config-dashboards
{{- end }}
{{- if .Values.sidecar.datasources.enabled }}
- name: sc-datasources-volume
#emptyDir: {}
hostPath:
path: /data/datasources
{{- end -}}
- 上文有提到,使用hostPath作为持久化存储时需要使用nodeSelector参数进行Pod分配绑定到固定节点
- 在节点下创建步骤4中hostPath目录,并将权限给定为777或者进入容器内确定启动容器的用户uid:gid并赋予给这几个目录
Persistent Volume Claim
- 已存在nfs文件存储
- 使用动态pv
prometheus
alertmanager
配置在项目中预留出相关变量,我们将对应的配置定义在prom-seting.yaml
prometheus:
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: managed-nfs-storage
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
alertmanager:
storage:
volumeClaimTemplate:
spec:
storageClassName: managed-nfs-storage
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi
由于prometheus和alertmanager采用的是statusetful类型进行的部署,所以如果使用pvc进行持久化数据,一定要确保replicas的数量是大于等于之前的数值,否则会存在部署数据不可读,通常这两个值保持为1即可,毕竟它们具备处理千万级别数据,如果你的集群足够大或者为了提高其高可用性可以将其初始定义为2或者更多
grafana
需在其charts(prometheus-operator/charts/grafana)下定义,并且有两种方式可以定义,分别说明一下其配置及相关注意事项
- 定义templates/deployment.yaml
# 预先创建pv(grafana.yaml)
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: grafana-storage-claim
namespace: monitoring
annotations:
#volume.beta.kubernetes.io/storage-class: "my-nfs-storage-class"
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
# 创建pv
kubectl create -f grafana.yaml
# 定义persistentVolumeClaim
persistentVolumeClaim:
claimName: grafana-storage-claim
# 启动grafana
此种配置方法需在grafana创建之前预先做一些工作,好处是数据能够一直存在固定的pv上,下面介绍如何通过项目进行定义
- 定义values.yaml
persistence:
enabled: true
storageClassName: managed-nfs-storage
accessModes:
- ReadWriteOnce
size: 10Gi
按此类方法配置后有一个问题,一定要确保动态pv创建时定义的垃圾回收为Retain
,否则一但Pod对应的资源(Deployment)被删除后则无法再使用之前的PV,就算后台achived了这份数据也无法直接通过迁移到新的PV上而实现服务正常,那么是完全不能恢复嘛?那当然不会,那么也需要改为上面介绍的那种方式进行修复(其实应该还有挺多方法,就没有去验证);不过即便采用了Retain方式后操作了Pod的删除同样需要额外的操作才能恢复
# 查看pv,处于Bound
kubectl get pv
pvc-96e431ee-7ec9-11e9-8f83-00505693fec2 10Gi RWO Retain Bound monitoring/promethues-operator-grafana managed-nfs-storage 11m
# 手动删除grafana的deployment
kubectl delete deployment grafana -n monitoring
# 查看pv,处于Released
kubectl get pv
pvc-96e431ee-7ec9-11e9-8f83-00505693fec2 10Gi RWO Retain Released monitoring/promethues-operator-grafana managed-nfs-storage 14m
# 此时我们需要将其之前服务的Pod信息进行擦除
kubectl edit pv pvc-96e431ee-7ec9-11e9-8f83-00505693fec2 #将spec.claimRef{}下的内容删除
# 查看pv,处于可用
pvc-96e431ee-7ec9-11e9-8f83-00505693fec2 10Gi RWO Retain Avaliable monitoring/promethues-operator-grafana managed-nfs-storage 14m
# 启动grafana即可恢复数据使用
不管何种方式其实都是存在一系列的操作成本,所以在日常维护中不到不得已的情况不要对Pod进行删除
更新配置
修改完配置后,需要重新进行加载
# 更新配置
helm upgrade promethues-operator --namespace monitoring -f prome-settings.yaml prometheus-operator
最后来张效果图