700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > kubernetes之监控Operator部署Prometheus(三)

kubernetes之监控Operator部署Prometheus(三)

时间:2020-07-29 03:18:47

相关推荐

kubernetes之监控Operator部署Prometheus(三)

第一章和第二章中我们配置Prometheus的成本非常高,而且也非常麻烦。但是我们要考虑Prometheus、AlertManager 这些组件服务本身的高可用的话,成本就更高了,当然我们也完全可以用自定义的方式来实现这些需求,我们也知道 Promethues 在代码上就已经对 Kubernetes 有了原生的支持,可以通过服务发现的形式来自动监控集群,因此我们可以使用另外一种更加高级的方式来部署 Prometheus:Operator框架。

什么是Operator

Operator是由CoreOS开发的,用来扩展Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。Operator基于Kubernetes的资源和控制器概念之上构建,但同时又包含了应用程序特定的领域知识。创建Operator的关键是CRD(自定义资源)的设计。

Operator是将运维人员对软件操作的知识给代码化,同时利用 Kubernetes 强大的抽象来管理大规模的软件应用。目前CoreOS官方提供了几种Operator的实现,其中就包括我们今天的主角:Prometheus OperatorOperator的核心实现就是基于 Kubernetes 的以下两个概念:

资源:对象的状态定义控制器:观测、分析和行动,以调节资源的分布

当前CoreOS提供的以下四种Operator:

etcd:创建etcd集群Rook:云原生环境下的文件、块、对象存储服务Prometheus:创建Prometheus监控实例Tectonic:部署Kubernetes集群

接下来我们将使用Operator创建Prometheus。

安装

我们这里直接通过 Prometheus-Operator 的源码来进行安装,当然也可以用 Helm 来进行一键安装,我们采用源码安装可以去了解更多的实现细节。首页将源码 Clone 下来:

git clone /coreos/prometheus-operatorcd prometheus-operator/contrib/kube-prometheus/manifests

进入到 manifests 目录下面,这个目录下面包含我们所有的资源清单文件,直接在该文件夹下面执行创建资源命令即可:

kubectl apply -f .

部署完成后,会创建一个名为monitoring的 namespace,所以资源对象对将部署在改命名空间下面,此外 Operator 会自动创建4个 CRD 资源对象:

kubectl get crd |grep coreosalertmanagers. -03-18T02:43:57Zprometheuses. -03-18T02:43:58Zprometheusrules. -03-18T02:43:58Zservicemonitors. -03-18T02:43:58Z

可以在 monitoring 命名空间下面查看所有的 Pod,其中 alertmanager 和 prometheus 是用 StatefulSet 控制器管理的,其中还有一个比较核心的 prometheus-operator 的 Pod,用来控制其他资源对象和监听对象变化的:

kubectl get pods -n monitoringNAMEREADYSTATUS RESTARTS AGEalertmanager-main-02/2 Running 037malertmanager-main-12/2 Running 034malertmanager-main-22/2 Running 033mgrafana-7489c49998-pkl8w1/1 Running 040mkube-state-metrics-d6cf6c7b5-7dwpg4/4 Running 027mnode-exporter-dlp252/2 Running 040mnode-exporter-fghlp2/2 Running 040mnode-exporter-mxwdm2/2 Running 040mnode-exporter-r9v922/2 Running 040mprometheus-adapter-84cd9c96c9-n92n4 1/1 Running 040mprometheus-k8s-0 3/3 Running 137mprometheus-k8s-1 3/3 Running 137mprometheus-operator-7b74946bd6-vmbcj 1/1 Running 040m

查看创建的 Service:

kubectl get svc -n monitoringNAMETYPE CLUSTER-IPEXTERNAL-IP PORT(S) AGEalertmanager-main ClusterIP 10.110.43.207 <none> 9093/TCP 40malertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 38mgrafana ClusterIP 10.109.160.0 <none> 3000/TCP 40mkube-state-metricsClusterIP None <none> 8443/TCP,9443/TCP 40mnode-exporter ClusterIP None <none> 9100/TCP 40mprometheus-adapterClusterIP 10.105.174.21 <none> 443/TCP 40mprometheus-k8sClusterIP 10.97.195.143 <none> 9090/TCP 40mprometheus-operatedClusterIP None <none> 9090/TCP 38mprometheus-operatorClusterIP None <none> 8080/TCP 40m

可以看到上面针对 grafana 和 prometheus 都创建了一个类型为 ClusterIP 的 Service,当然如果我们想要在外网访问这两个服务的话可以通过创建对应的 Ingress 对象或者使用 NodePort 类型的 Service,我们这里为了简单,直接使用 NodePort 类型的服务即可,编辑 grafana 和 prometheus-k8s 这两个 Service,将服务类型更改为 NodePort:

kubectl edit svc grafana -n monitoringkubectl edit svc prometheus-k8s -n monitoringkubectl get svc -n monitoringNAMETYPE CLUSTER-IPEXTERNAL-IP PORT(S) AGE.....grafana NodePort 10.109.160.0 <none> 3000:31740/TCP42mprometheus-k8sNodePort 10.97.195.143 <none> 9090:31310/TCP42m

更改完成后,我们就可以通过去访问上面的两个服务了,比如查看 prometheus 的 targets 页面:

我们可以看到大部分的配置都是正常的,只有两三个没有管理到对应的监控目标,比如 kube-controller-manager 和 kube-scheduler 这两个系统组件,这就和 ServiceMonitor 的定义有关系了,我们先来查看下 kube-scheduler 组件对应的 ServiceMonitor 资源的定义:(prometheus-serviceMonitorKubeScheduler.yaml)

配置kube-scheduler

apiVersion: /v1kind: ServiceMonitormetadata:labels:k8s-app: kube-schedulername: kube-schedulernamespace: monitoringspec:endpoints:- interval: 30s #30s获取一次信息port: http-metrics# 对应service的端口名jobLabel: k8s-app namespaceSelector:# 表示去匹配某一命名空间中的service,如果想从所有的namespace中匹配用any: truematchNames:- kube-systemselector:# 匹配的 Service 的labels,如果使用mathLabels,则下面的所有标签都匹配时才会匹配该service,如果使用matchExpressions,则至少匹配一个标签的service都会被选择matchLabels:k8s-app: kube-scheduler

上面是一个典型的 ServiceMonitor 资源文件的声明方式,上面我们通过selector.matchLabels在 kube-system 这个命名空间下面匹配具有k8s-app=kube-scheduler这样的 Service,但是我们系统中根本就没有对应的 Service,所以我们需要手动创建一个 Service:(prometheus-kubeSchedulerService.yaml)

apiVersion: v1kind: Servicemetadata:namespace: kube-systemname: kube-schedulerlabels:k8s-app: kube-schedulerspec:selector:component: kube-schedulerports:- name: http-metricsport: 10251targetPort: 10251protocol: TCP

其中最重要的是上面 labels 和 selector 部分,labels 区域的配置必须和我们上面的 ServiceMonitor 对象中的 selector 保持一致,selector下面配置的是component=kube-scheduler,为什么会是这个 label 标签呢,我们可以去 describe 下 kube-scheduelr 这个 Pod:

$ kubectl describe pod kube-scheduler-k8s-master -n kube-systemName:kube-scheduler-k8s-masterNamespace:kube-systemPriority: 2000000000PriorityClassName: system-cluster-criticalNode:k8s-master/172.16.138.40Start Time: Tue, 19 Feb 21:15:05 -0500Labels: component=kube-schedulertier=control-plane......

我们可以看到这个 Pod 具有component=kube-schedulertier=control-plane这两个标签,而前面这个标签具有更唯一的特性,所以使用前面这个标签较好,这样上面创建的 Service 就可以和我们的 Pod 进行关联了,直接创建即可:

$ kubectl create -f prometheus-kubeSchedulerService.yaml$ kubectl get svc -n kube-system -l k8s-app=kube-schedulerNAME TYPE CLUSTER-IPEXTERNAL-IP PORT(S)AGEkube-scheduler ClusterIP 10.103.165.58 <none> 10251/TCP 4m

创建完成后,隔一小会儿后去 prometheus 查看 targets 下面 kube-scheduler 的状态:

我们可以看到现在已经发现了 target,但是抓取数据结果出错了,这个错误是因为我们集群是使用 kubeadm 搭建的,其中 kube-scheduler 默认是绑定在127.0.0.1上面的,而上面我们这个地方是想通过节点的 IP 去访问,所以访问被拒绝了,我们只要把 kube-scheduler 绑定的地址更改成0.0.0.0即可满足要求,由于 kube-scheduler 是以静态 Pod 的形式运行在集群中的,所以我们只需要更改静态 Pod 目录下面对应的 YAML (kube-scheduler.yaml)文件即可:

$ cd /etc/kubernetes/manifests将 kube-scheduler.yaml 文件中-command的--address地址更改成0.0.0.0$ vim kube-scheduler.yamlapiVersion: v1kind: Podmetadata:annotations:scheduler.alpha.kubernetes.io/critical-pod: ""creationTimestamp: nulllabels:component: kube-schedulertier: control-planename: kube-schedulernamespace: kube-systemspec:containers:- command:- kube-scheduler- --address=0.0.0.0- --kubeconfig=/etc/kubernetes/scheduler.conf- --leader-elect=true....

修改完成后我们将该文件从当前文件夹中移除,隔一会儿再移回该目录,就可以自动更新了,然后再去看 prometheus 中 kube-scheduler 这个 target 是否已经正常了:

配置kube-controller-manager

我们来查看一下kube-controller-manager的ServiceMonitor资源的定义:

apiVersion: /v1kind: ServiceMonitormetadata:labels:k8s-app: kube-controller-managername: kube-controller-managernamespace: monitoringspec:endpoints:- interval: 30smetricRelabelings:- action: dropregex: etcd_(debugging|disk|request|server).*sourceLabels:- __name__port: http-metricsjobLabel: k8s-appnamespaceSelector:matchNames:- kube-systemselector:matchLabels:k8s-app: kube-controller-manager

上面我们可以看到是通过k8s-app: kube-controller-manager这个标签选择的service,但系统中没有这个service。这里我们手动创建一个:

创建前我们需要看确定pod的标签:

$ kubectl describe pod kube-controller-manager-k8s-master -n kube-systemName:kube-controller-manager-k8s-masterNamespace:kube-systemPriority: 2000000000PriorityClassName: system-cluster-criticalNode:k8s-master/172.16.138.40Start Time: Tue, 19 Feb 21:15:16 -0500Labels: component=kube-controller-managertier=control-plane....

创建svc

apiVersion: v1kind: Servicemetadata:namespace: kube-systemname: kube-controller-managerlabels:k8s-app: kube-controller-managerspec:selector:component: kube-controller-managerports:- name: http-metricsport: 10252targetPort: 10252protocol: TCP

创建完后,我们查看targer

这里和上面是同一个问题。让我们使用上面的方法修改。让我们修改kube-controller-manager.yaml:

apiVersion: v1kind: Podmetadata:annotations:scheduler.alpha.kubernetes.io/critical-pod: ""creationTimestamp: nulllabels:component: kube-controller-managertier: control-planename: kube-controller-managernamespace: kube-systemspec:containers:- command:- kube-controller-manager- --node-monitor-grace-period=10s- --pod-eviction-timeout=10s- --address=0.0.0.0 #修改......

修改完成后我们将该文件从当前文件夹中移除,隔一会儿再移回该目录,就可以自动更新了,然后再去看 prometheus 中 kube-controller-manager 这个 target 是否已经正常了:

配置coredns

coredns启动的metrics端口是9153,我们查看kube-system下的svc是否有这个端口:

kubectl get svc -n kube-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEheapster ClusterIP 10.96.28.220<none> 80/TCP19dkube-controller-manager ClusterIP 10.99.208.51<none> 10252/TCP 1hkube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 188dkube-scheduler ClusterIP 10.103.165.58 <none> 10251/TCP 2hkubeletClusterIP None <none> 10250/TCP 5hkubernetes-dashboard NodePort 10.103.15.27<none> 443:30589/TCP 131dmonitoring-influxdb ClusterIP 10.103.155.57 <none> 8086/TCP 19dtiller-deploy ClusterIP 10.104.114.83 <none> 44134/TCP 18d

这里我们看到kube-dns没有metrics的端口,但是metrics后端是启动,所以我们需要把这个端口通过svc暴露出来。创建svc:

apiVersion: v1kind: Servicemetadata:namespace: kube-systemname: kube-prometheus-prometheus-corednslabels:k8s-app: prometheus-operator-corednsspec:selector:k8s-app: kube-dnsports:- name: metricsport: 9153targetPort: 9153protocol: TCP

这里我们启动一个svc,labels是k8s-app: prometheus-operator-coredns ,所有我们需要修改DNS的serviceMonitor下的labels值。

apiVersion: /v1kind: ServiceMonitormetadata:labels:k8s-app: corednsname: corednsnamespace: monitoringspec:endpoints:- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/tokeninterval: 15sport: metricsjobLabel: k8s-appnamespaceSelector:matchNames:- kube-systemselector:matchLabels:k8s-app: prometheus-operator-coredns

创建查看这两个资源:

$ kubectl apply -f prometheus-serviceMonitorCoreDNS.yaml$ kubectl create -f prometheus-KubeDnsSvc.yaml$ kubectl get svc -n kube-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkube-prometheus-prometheus-coredns ClusterIP 10.100.205.135 <none> 9153/TCP 1h

让我们再去看 prometheus 中 coredns 这个 target 是否已经正常了:

上面的监控数据配置完成后,现在我们可以去查看下 grafana 下面的 dashboard,同样使用上面的 NodePort 访问即可,第一次登录使用 admin:admin 登录即可,进入首页后,可以发现已经和我们的 Prometheus 数据源关联上了,正常来说可以看到一些监控图表了:

自定义监控项

除了 Kubernetes 集群中的一些资源对象、节点以及组件需要监控,有的时候我们可能还需要根据实际的业务需求去添加自定义的监控项,添加一个自定义监控的步骤也是非常简单的。

第一步建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项第二步为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象第三步确保 Service 对象可以正确获取到 metrics 数据

接下来演示如何添加 etcd 集群的监控。

无论是 Kubernetes 集群外的还是使用 Kubeadm 安装在集群内部的 etcd 集群,我们这里都将其视作集群外的独立集群,因为对于二者的使用方法没什么特殊之处。

etcd 证书

对于 etcd 集群一般情况下,为了安全都会开启 https 证书认证的方式,所以要想让 Prometheus 访问到 etcd 集群的监控数据,就需要提供相应的证书校验。

由于我们这里演示环境使用的是 Kubeadm 搭建的集群,我们可以使用 kubectl 工具去获取 etcd 启动的时候使用的证书路径:

$ kubectl get pods -n kube-system | grep etcdetcd-k8s-master1/1 Running 2773 188detcd-k8s-node011/1 Running 2104d$ kubectl get pod etcd-k8s-master -n kube-system -o yaml.....spec:containers:- command:- etcd- --advertise-client-urls=https://172.16.138.40:2379- --initial-advertise-peer-urls=https://172.16.138.40:2380- --initial-cluster=k8s-master=https://172.16.138.40:2380- --listen-client-urls=https://127.0.0.1:2379,https://172.16.138.40:2379- --listen-peer-urls=https://172.16.138.40:2380- --cert-file=/etc/kubernetes/pki/etcd/server.crt- --client-cert-auth=true- --data-dir=/var/lib/etcd- --key-file=/etc/kubernetes/pki/etcd/server.key- --name=k8s-master- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt- --peer-client-cert-auth=true- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt- --snapshot-count=10000- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crtimage: -/google_containers/etcd-amd64:3.2.18imagePullPolicy: IfNotPresentlivenessProbe:exec:command:- /bin/sh- -ec- ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.keyget foofailureThreshold: 8initialDelaySeconds: 15periodSeconds: 10successThreshold: 1timeoutSeconds: 15name: etcdresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /var/lib/etcdname: etcd-data- mountPath: /etc/kubernetes/pki/etcdname: etcd-certs......tolerations:- effect: NoExecuteoperator: Existsvolumes:- hostPath:path: /var/lib/etcdtype: DirectoryOrCreatename: etcd-data- hostPath:path: /etc/kubernetes/pki/etcdtype: DirectoryOrCreatename: etcd-certs.....

我们可以看到 etcd 使用的证书都对应在节点的 /etc/kubernetes/pki/etcd 这个路径下面,所以首先我们将需要使用到的证书通过 secret 对象保存到集群中去:(在 etcd 运行的节点)

$ kubectl -n monitoring create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key --from-file=/etc/kubernetes/pki/etcd/ca.crtsecret/etcd-certs created

然后将上面创建的 etcd-certs 对象配置到 prometheus 资源对象中,直接更新 prometheus 资源对象即可:

nodeSelector:beta.kubernetes.io/os: linuxreplicas: 2secrets:- etcd-certs

更新完成后,我们就可以在 Prometheus 的 Pod 中获取到上面创建的 etcd 证书文件了,具体的路径我们可以进入 Pod 中查看:

$ kubectl exec -it prometheus-k8s-0 /bin/sh -n monitoringDefaulting container name to prometheus.Use 'kubectl describe pod/prometheus-k8s-0 -n monitoring' to see all of the containers in this pod./prometheus $ ls /etc/prometheus/config_out/ console_libraries/ consoles/ prometheus.ymlrules/ secrets//prometheus $ ls /etc/prometheus/secrets/etcd-certs/ca.crt healthcheck-client.crt healthcheck-client.key/prometheus $

创建 ServiceMonitor

现在 Prometheus 访问 etcd 集群的证书已经准备好了,接下来创建 ServiceMonitor 对象即可(prometheus-serviceMonitorEtcd.yaml)

apiVersion: /v1kind: ServiceMonitormetadata:name: etcd-k8snamespace: monitoringlabels:k8s-app: etcd-k8sspec:jobLabel: k8s-appendpoints:- port: portinterval: 30sscheme: httpstlsConfig:caFile: /etc/prometheus/secrets/etcd-certs/ca.crtcertFile: /etc/prometheus/secrets/etcd-certs/healthcheck-client.crtkeyFile: /etc/prometheus/secrets/etcd-certs/healthcheck-client.keyinsecureSkipVerify: trueselector:matchLabels:k8s-app: etcdnamespaceSelector:matchNames:- kube-system

上面我们在 monitoring 命名空间下面创建了名为 etcd-k8s 的 ServiceMonitor 对象,基本属性和前面章节中的一致,匹配 kube-system 这个命名空间下面的具有 k8s-app=etcd 这个 label 标签的 Service,jobLabel 表示用于检索 job 任务名称的标签,和前面不太一样的地方是 endpoints 属性的写法,配置上访问 etcd 的相关证书,endpoints 属性下面可以配置很多抓取的参数,比如 relabel、proxyUrl,tlsConfig 表示用于配置抓取监控数据端点的 tls 认证,由于证书 serverName 和 etcd 中签发的可能不匹配,所以加上了 insecureSkipVerify=true

直接创建这个 ServiceMonitor 对象:

$ kubectl create -f prometheus-serviceMonitorEtcd.yamlservicemonitor./etcd-k8s created

创建 Service

ServiceMonitor 创建完成了,但是现在还没有关联的对应的 Service 对象,所以需要我们去手动创建一个 Service 对象(prometheus-etcdService.yaml):

apiVersion: v1kind: Servicemetadata:name: etcd-k8snamespace: kube-systemlabels:k8s-app: etcdspec:type: ClusterIPclusterIP: Noneports:- name: portport: 2379protocol: TCP---apiVersion: v1kind: Endpointsmetadata:name: etcd-k8snamespace: kube-systemlabels:k8s-app: etcdsubsets:- addresses:- ip: 172.16.138.40nodeName: etcd-k8s-master- ip: 172.16.138.41nodeName: etcd-k8s-node01ports:- name: portport: 2379protocol: TCP

我们这里创建的 Service 没有采用前面通过 label 标签的形式去匹配 Pod 的做法,因为前面我们说过很多时候我们创建的 etcd 集群是独立于集群之外的,这种情况下面我们就需要自定义一个 Endpoints,要注意 metadata 区域的内容要和 Service 保持一致,Service 的 clusterIP 设置为 None,对改知识点不太熟悉的,可以去查看我们前面关于 Service 部分的讲解。

Endpoints 的 subsets 中填写 etcd 集群的地址即可,我们这里是创建的是高可用测试集群,我们创建的时候指定了node的主机IP地址(2个etcd也是不符合规范的。因为etcd是选举制,2个就等于一个是一样的。),直接创建该 Service 资源:

$ kubectl create -f prometheus-etcdService.yamlservice/etcd-k8s createdendpoints/etcd-k8s created

创建完成后,隔一会儿去 Prometheus 的 Dashboard 中查看 targets,便会有 etcd 的监控项了:

数据采集到后,可以在 grafana 中导入编号为3070的 dashboard,获取到 etcd 的监控图表。

配置 PrometheusRule

现在我们知道怎么自定义一个 ServiceMonitor 对象了,但是如果需要自定义一个报警规则的话呢?比如现在我们去查看 Prometheus Dashboard 的 Alert 页面下面就已经有一些报警规则了,还有一些是已经触发规则的了:

但是这些报警信息是哪里来的呢?他们应该用怎样的方式通知我们呢?我们知道之前我们使用自定义的方式可以在 Prometheus 的配置文件之中指定 AlertManager 实例和 报警的 rules 文件,现在我们通过 Operator 部署的呢?我们可以在 Prometheus Dashboard 的 Config 页面下面查看关于 AlertManager 的配置:

alerting:alert_relabel_configs:- separator: ;regex: prometheus_replicareplacement: $1action: labeldropalertmanagers:- kubernetes_sd_configs:- role: endpointsnamespaces:names:- monitoringscheme: httppath_prefix: /timeout: 10srelabel_configs:- source_labels: [__meta_kubernetes_service_name]separator: ;regex: alertmanager-mainreplacement: $1action: keep- source_labels: [__meta_kubernetes_endpoint_port_name]separator: ;regex: webreplacement: $1action: keeprule_files:- /etc/prometheus/rules/prometheus-k8s-rulefiles-0/*.yaml

上面 alertmanagers 实例的配置我们可以看到是通过角色为 endpoints 的 kubernetes 的服务发现机制获取的,匹配的是服务名为 alertmanager-main,端口名未 web 的 Service 服务,我们查看下 alertmanager-main 这个 Service:

kubectl describe svc alertmanager-main -n monitoringName: alertmanager-mainNamespace: monitoringLabels: alertmanager=mainAnnotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"alertmanager":"main"},"name":"alertmanager-main","namespace":"monitoring"},...Selector:alertmanager=main,app=alertmanagerType: ClusterIPIP:10.110.43.207Port: web 9093/TCPTargetPort: web/TCPEndpoints: 10.244.0.31:9093,10.244.2.42:9093,10.244.3.40:9093Session Affinity: NoneEvents: <none>

可以看到服务名正是 alertmanager-main,Port 定义的名称也是 web,符合上面的规则,所以 Prometheus 和 AlertManager 组件就正确关联上了。而对应的报警规则文件位于:/etc/prometheus/rules/prometheus-k8s-rulefiles-0/目录下面所有的 YAML 文件。我们可以进入 Prometheus 的 Pod 中验证下该目录下面是否有 YAML 文件:

$ kubectl exec -it prometheus-k8s-0 /bin/sh -n monitoringDefaulting container name to prometheus.Use 'kubectl describe pod/prometheus-k8s-0 -n monitoring' to see all of the containers in this pod./prometheus $ ls /etc/prometheus/rules/prometheus-k8s-rulefiles-0/monitoring-prometheus-k8s-rules.yaml/prometheus $ cat /etc/prometheus/rules/prometheus-k8s-rulefiles-0/monitoring-prometheus-k8s-rules.yamlgroups:- name: k8s.rulesrules:- expr: |sum(rate(container_cpu_usage_seconds_total{job="kubelet", image!="", container_name!=""}[5m])) by (namespace)record: namespace:container_cpu_usage_seconds_total:sum_rate- expr: |sum by (namespace, pod_name, container_name) (rate(container_cpu_usage_seconds_total{job="kubelet", image!="", container_name!=""}[5m]))record: namespace_pod_name_container_name:container_cpu_usage_seconds_total:sum_rate...........

这个 YAML 文件实际上就是我们之前创建的一个 PrometheusRule 文件包含的:

$ cat prometheus-rules.yaml apiVersion: /v1kind: PrometheusRulemetadata:labels:prometheus: k8srole: alert-rulesname: prometheus-k8s-rulesnamespace: monitoringspec:groups:- name: k8s.rulesrules:- expr: |sum(rate(container_cpu_usage_seconds_total{job="kubelet", image!="", container_name!=""}[5m])) by (namespace)record: namespace:container_cpu_usage_seconds_total:sum_rate- expr: |sum by (namespace, pod_name, container_name) (rate(container_cpu_usage_seconds_total{job="kubelet", image!="", container_name!=""}[5m]))record: namespace_pod_name_container_name:container_cpu_usage_seconds_total:sum_rate.....

我们这里的 PrometheusRule 的 name 为 prometheus-k8s-rules,namespace 为 monitoring,我们可以猜想到我们创建一个 PrometheusRule 资源对象后,会自动在上面的 prometheus-k8s-rulefiles-0 目录下面生成一个对应的<namespace>-<name>.yaml文件,所以如果以后我们需要自定义一个报警选项的话,只需要定义一个 PrometheusRule 资源对象即可。至于为什么 Prometheus 能够识别这个 PrometheusRule 资源对象呢?这就需要查看我们创建的 prometheus 这个资源对象了,里面有非常重要的一个属性 ruleSelector,用来匹配 rule 规则的过滤器,要求匹配具有 prometheus=k8s 和 role=alert-rules 标签的 PrometheusRule 资源对象,现在明白了吧?

ruleSelector:matchLabels:prometheus: k8srole: alert-rules

所以我们要想自定义一个报警规则,只需要创建一个具有 prometheus=k8s 和 role=alert-rules 标签的 PrometheusRule 对象就行了,比如现在我们添加一个 etcd 是否可用的报警,我们知道 etcd 整个集群有一半以上的节点可用的话集群就是可用的,所以我们判断如果不可用的 etcd 数量超过了一半那么就触发报警,创建文件 prometheus-etcdRules.yaml:

apiVersion: /v1kind: PrometheusRulemetadata:labels:prometheus: k8srole: alert-rulesname: etcd-rulesnamespace: monitoringspec:groups:- name: etcdrules:- alert: EtcdClusterUnavailableannotations:summary: etcd cluster smalldescription: If one more etcd peer goes down the cluster will be unavailableexpr: |count(up{job="etcd"} == 0) > (count(up{job="etcd"}) / 2 - 1)for: 3mlabels:severity: critical

.....

$ kubectl create -f prometheus-etcdRules.yam

注意 label 标签一定至少要有 prometheus=k8s 和 role=alert-rules,创建完成后,隔一会儿再去容器中查看下 rules 文件夹:

$ kubectl exec -it prometheus-k8s-0 /bin/sh -n monitoringDefaulting container name to prometheus.Use 'kubectl describe pod/prometheus-k8s-0 -n monitoring' to see all of the containers in this pod./prometheus $ ls /etc/prometheus/rules/prometheus-k8s-rulefiles-0/monitoring-etcd-rules.yaml monitoring-prometheus-k8s-rules.yaml

可以看到我们创建的 rule 文件已经被注入到了对应的 rulefiles 文件夹下面了,证明我们上面的设想是正确的。然后再去 Prometheus Dashboard 的 Alert 页面下面就可以查看到上面我们新建的报警规则了:

配置报警

我们知道了如何去添加一个报警规则配置项,但是这些报警信息用怎样的方式去发送呢?前面的课程中我们知道我们可以通过 AlertManager 的配置文件去配置各种报警接收器,现在我们是通过 Operator 提供的 alertmanager 资源对象创建的组件,应该怎样去修改配置呢?

首先我们将 alertmanager-main 这个 Service 改为 NodePort 类型的 Service,修改完成后我们可以在页面上的 status 路径下面查看 AlertManager 的配置信息:

$ kubectl edit svc alertmanager-main -n monitoring......selector:alertmanager: mainapp: alertmanagersessionAffinity: Nonetype: NodePort.....

这些配置信息实际上是来自于我们之前在prometheus-operator/contrib/kube-prometheus/manifests目录下面创建的 alertmanager-secret.yaml 文件:

apiVersion: v1data:alertmanager.yaml: Imdsb2JhbCI6IAogICJyZXNvbHZlX3RpbWVvdXQiOiAiNW0iCiJyZWNlaXZlcnMiOiAKLSAibmFtZSI6ICJudWxsIgoicm91dGUiOiAKICAiZ3JvdXBfYnkiOiAKICAtICJqb2IiCiAgImdyb3VwX2ludGVydmFsIjogIjVtIgogICJncm91cF93YWl0IjogIjMwcyIKICAicmVjZWl2ZXIiOiAibnVsbCIKICAicmVwZWF0X2ludGVydmFsIjogIjEyaCIKICAicm91dGVzIjogCiAgLSAibWF0Y2giOiAKICAgICAgImFsZXJ0bmFtZSI6ICJEZWFkTWFuc1N3aXRjaCIKICAgICJyZWNlaXZlciI6ICJudWxsIg==kind: Secretmetadata:name: alertmanager-mainnamespace: monitoringtype: Opaque

可以将 alertmanager.yaml 对应的 value 值做一个 base64 解码:

echo Imdsb2JhbCI6IAogICJyZXNvbHZlX3RpbWVvdXQiOiAiNW0iCiJyZWNlaXZlcnMiOiAKLSAibmFtZSI6ICJudWxsIgoicm91dGUiOiAKICAiZ3JvdXBfYnkiOiAKICAtICJqb2IiCiAgImdyb3VwX2ludGVydmFsIjogIjVtIgogICJncm91cF93YWl0IjogIjMwcyIKICAicmVjZWl2ZXIiOiAibnVsbCIKICAicmVwZWF0X2ludGVydmFsIjogIjEyaCIKICAicm91dGVzIjogCiAgLSAibWF0Y2giOiAKICAgICAgImFsZXJ0bmFtZSI6ICJEZWFkTWFuc1N3aXRjaCIKICAgICJyZWNlaXZlciI6ICJudWxsIg== | base64 -d

解码出来的结果"global":"resolve_timeout": "5m""receivers":- "name": "null""route":"group_by":- "job""group_interval": "5m""group_wait": "30s""receiver": "null""repeat_interval": "12h""routes":- "match":"alertname": "DeadMansSwitch""receiver": "null"

我们可以看到内容和上面查看的配置信息是一致的,所以如果我们想要添加自己的接收器,或者模板消息,我们就可以更改这个文件:

global:resolve_timeout: 5msmtp_smarthost: ':587'smtp_from: 'zhaikun1992@'smtp_auth_username: 'zhaikun1992@'smtp_auth_password: '***'smtp_hello: ''smtp_require_tls: truetemplates:- "/etc/alertmanager-tmpl/wechat.tmpl"route:group_by: ['job', 'severity']group_wait: 30sgroup_interval: 5mrepeat_interval: 5mreceiver: defaultroutes:- receiver: 'wechat'group_wait: 10smatch:alertname: CoreDNSDownreceivers:- name: 'default'email_configs:- to: 'zhai_kun@'send_resolved: true- name: 'wechat'wechat_configs:- corp_id: '***'to_party: '*'to_user: "**"agent_id: '***'api_secret: '***'send_resolved: true

将上面文件保存为 alertmanager.yaml,然后使用这个文件创建一个 Secret 对象:

#删除原secret对象kubectl delete secret alertmanager-main -n monitoringsecret "alertmanager-main" deleted#将自己的配置文件导入到新的secretkubectl create secret generic alertmanager-main --from-file=alertmanager.yaml -n monitoring

我们添加了两个接收器,默认的通过邮箱进行发送,对于 CoreDNSDown 这个报警我们通过 wechat 来进行发送,上面的步骤创建完成后,很快我们就会收到一条钉钉消息:

同样邮箱中也会收到报警信息:

我们再次查看 AlertManager 页面的 status 页面的配置信息可以看到已经变成上面我们的配置信息了:

AlertManager 配置也可以使用模板(.tmpl文件),这些模板可以与 alertmanager.yaml 配置文件一起添加到 Secret 对象中,比如:

apiVersion:v1kind:secretmetadata:name:alertmanager-exampledata:alertmanager.yaml:{BASE64_CONFIG}template_1.tmpl:{BASE64_TEMPLATE_1}template_2.tmpl:{BASE64_TEMPLATE_2}...

模板会被放置到与配置文件相同的路径,当然要使用这些模板文件,还需要在 alertmanager.yaml 配置文件中指定:

templates:- '*.tmpl'

创建成功后,Secret 对象将会挂载到 AlertManager 对象创建的 AlertManager Pod 中去。

样例:我们创建一个alertmanager-tmpl.yaml文件,添加如下内容:

{{ define "wechat.default.message" }}{{ range .Alerts }}========start==========告警程序: prometheus_alert告警级别: {{ .Labels.severity }}告警类型: {{ .Labels.alertname }}故障主机: {{ .Labels.instance }}告警主题: {{ .Annotations.summary }}告警详情: {{ .Annotations.description }}触发时间: {{ .StartsAt.Format "-12-02 15:04:05" }}========end=========={{ end }}{{ end }}

删除原secret对象

$ kubectl delete secret alertmanager-main -n monitoringsecret "alertmanager-main" deleted

创建新的secret对象

$ kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml --from-file=alertmanager-tmpl.yaml -n monitoringsecret/alertmanager-main created

过一会我们的微信就会收到告警信息。当然这里标签定义的问题,获取的值不全,我们可以根据实际情况自定义。

自动发现配置

我们想一个问题,如果在我们的 Kubernetes 集群中有了很多的 Service/Pod,那么我们都需要一个一个的去建立一个对应的 ServiceMonitor 对象来进行监控吗?这样岂不是又变得麻烦起来了?

为解决这个问题,Prometheus Operator 为我们提供了一个额外的抓取配置的来解决这个问题,我们可以通过添加额外的配置来进行服务发现进行自动监控。和前面自定义的方式一样,我们想要在 Prometheus Operator 当中去自动发现并监控具有prometheus.io/scrape=true这个 annotations 的 Service,之前我们定义的 Prometheus 的配置如下:

- job_name: 'kubernetes-service-endpoints'kubernetes_sd_configs:- role: endpointsrelabel_configs:- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]action: keepregex: true- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]action: replacetarget_label: __scheme__regex: (https?)- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]action: replacetarget_label: __metrics_path__regex: (.+)- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]action: replacetarget_label: __address__regex: ([^:]+)(?::\d+)?;(\d+)replacement: $1:$2- action: labelmapregex: __meta_kubernetes_service_label_(.+)- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: kubernetes_namespace- source_labels: [__meta_kubernetes_service_name]action: replacetarget_label: kubernetes_name

要想自动发现集群中的 Service,就需要我们在 Service 的annotation区域添加prometheus.io/scrape=true的声明,将上面文件直接保存为 prometheus-additional.yaml,然后通过这个文件创建一个对应的 Secret 对象:

$ kubectl create secret generic additional-configs --from-file=prometheus-additional.yaml -n monitoringsecret/additional-configs created

创建完成后,会将上面配置信息进行 base64 编码后作为 prometheus-additional.yaml 这个 key 对应的值存在:

$ kubectl get secret additional-configs -n monitoring -o yamlapiVersion: v1data:prometheus-additional.yaml: LSBqb2JfbmFtZTogJ2t1YmVybmV0ZXMtc2VydmljZS1lbmRwb2ludHMnCiAga3ViZXJuZXRlc19zZF9jb25maWdzOgogIC0gcm9sZTogZW5kcG9pbnRzCiAgcmVsYWJlbF9jb25maWdzOgogIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZV0KICAgIGFjdGlvbjoga2VlcAogICAgcmVnZXg6IHRydWUKICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY2hlbWVdCiAgICBhY3Rpb246IHJlcGxhY2UKICAgIHRhcmdldF9sYWJlbDogX19zY2hlbWVfXwogICAgcmVnZXg6IChodHRwcz8pCiAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcGF0aF0KICAgIGFjdGlvbjogcmVwbGFjZQogICAgdGFyZ2V0X2xhYmVsOiBfX21ldHJpY3NfcGF0aF9fCiAgICByZWdleDogKC4rKQogIC0gc291cmNlX2xhYmVsczogW19fYWRkcmVzc19fLCBfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0XQogICAgYWN0aW9uOiByZXBsYWNlCiAgICB0YXJnZXRfbGFiZWw6IF9fYWRkcmVzc19fCiAgICByZWdleDogKFteOl0rKSg/OjpcZCspPzsoXGQrKQogICAgcmVwbGFjZW1lbnQ6ICQxOiQyCiAgLSBhY3Rpb246IGxhYmVsbWFwCiAgICByZWdleDogX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispCiAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlXQogICAgYWN0aW9uOiByZXBsYWNlCiAgICB0YXJnZXRfbGFiZWw6IGt1YmVybmV0ZXNfbmFtZXNwYWNlCiAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9uYW1lXQogICAgYWN0aW9uOiByZXBsYWNlCiAgICB0YXJnZXRfbGFiZWw6IGt1YmVybmV0ZXNfbmFtZQo=kind: Secretmetadata:creationTimestamp: -03-20T03:38:37Zname: additional-configsnamespace: monitoringresourceVersion: "29056864"selfLink: /api/v1/namespaces/monitoring/secrets/additional-configsuid: a579495b-4ac1-11e9-baf3-005056930126type: Opaque

然后我们只需要在声明 prometheus 的资源对象文件中添加上这个额外的配置:(prometheus-prometheus.yaml)

apiVersion: /v1kind: Prometheusmetadata:labels:prometheus: k8sname: k8snamespace: monitoringspec:alerting:alertmanagers:- name: alertmanager-mainnamespace: monitoringport: webbaseImage: quay.io/prometheus/prometheusnodeSelector:beta.kubernetes.io/os: linuxreplicas: 2secrets:- etcd-certsresources:requests:memory: 400MiruleSelector:matchLabels:prometheus: k8srole: alert-rulessecurityContext:fsGroup: 2000runAsNonRoot: truerunAsUser: 1000additionalScrapeConfigs:name: additional-configskey: prometheus-additional.yamlserviceAccountName: prometheus-k8sserviceMonitorNamespaceSelector: {}serviceMonitorSelector: {}version: v2.5.0

添加完成后,直接更新 prometheus 这个 CRD 资源对象:

$ kubectl apply -f prometheus-prometheus.yamlprometheus./k8s configured

隔一小会儿,可以前往 Prometheus 的 Dashboard 中查看配置是否生效:

在 Prometheus Dashboard 的配置页面下面我们可以看到已经有了对应的的配置信息了,但是我们切换到 targets 页面下面却并没有发现对应的监控任务,查看 Prometheus 的 Pod 日志:

$ kubectl logs -f prometheus-k8s-0 prometheus -n monitoringevel=error ts=-03-20T03:55:01.298281581Z caller=main.go:240 component=k8s_client_runtime err="/prometheus/prometheus/discovery/kubernetes/kubernetes.go:302: Failed to list *v1.Pod: pods is forbidden: User \"system:serviceaccount:monitoring:prometheus-k8s\" cannot list pods at the cluster scope"level=error ts=-03-20T03:55:02.29813427Z caller=main.go:240 component=k8s_client_runtime err="/prometheus/prometheus/discovery/kubernetes/kubernetes.go:301: Failed to list *v1.Service: services is forbidden: User \"system:serviceaccount:monitoring:prometheus-k8s\" cannot list services at the cluster scope"level=error ts=-03-20T03:55:02.298431046Z caller=main.go:240 component=k8s_client_runtime err="/prometheus/prometheus/discovery/kubernetes/kubernetes.go:300: Failed to list *v1.Endpoints: endpoints is forbidden: User \"system:serviceaccount:monitoring:prometheus-k8s\" cannot list endpoints at the cluster scope"level=error ts=-03-20T03:55:02.299312874Z caller=main.go:240 component=k8s_client_runtime err="/prometheus/prometheus/discovery/kubernetes/kubernetes.go:302: Failed to list *v1.Pod: pods is forbidden: User \"system:serviceaccount:monitoring:prometheus-k8s\" cannot list pods at the cluster scope"level=error ts=-03-20T03:55:03.299674406Z caller=main.go:240 component=k8s_client_runtime err="/prometheus/prometheus/discovery/kubernetes/kubernetes.go:301: Failed to list *v1.Service: services is forbidden: User \"system:serviceaccount:monitoring:prometheus-k8s\" cannot list services at the cluster scope"level=error ts=-03-20T03:55:03.299757543Z caller=main.go:240 component=k8s_client_runtime err="/prometheus/prometheus/discovery/kubernetes/kubernetes.go:300: Failed to list *v1.Endpoints: endpoints is forbidden: User \"system:serviceaccount:monitoring:prometheus-k8s\" cannot list endpoints at the cluster scope"level=error ts=-03-20T03:55:03.299907982Z caller=main.go:240 component=k8s_client_runtime err="/prometheus/prometheus/discovery/kubernetes/kubernetes.go:302: Failed to list *v1.Pod: pods is forbidden: User \"system:serviceaccount:monitoring:prometheus-k8s\" cannot list pods at the cluster scope"

可以看到有很多错误日志出现,都是xxx is forbidden,这说明是 RBAC 权限的问题,通过 prometheus 资源对象的配置可以知道 Prometheus 绑定了一个名为 prometheus-k8s 的 ServiceAccount 对象,而这个对象绑定的是一个名为 prometheus-k8s 的 ClusterRole:(prometheus-clusterRole.yaml)

apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: prometheus-k8srules:- apiGroups:- ""resources:- nodes/metricsverbs:- get- nonResourceURLs:- /metricsverbs:- get

上面的权限规则中我们可以看到明显没有对 Service 或者 Pod 的 list 权限,所以报错了,要解决这个问题,我们只需要添加上需要的权限即可:

apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: prometheus-k8srules:- apiGroups:- ""resources:- nodes- services- endpoints- pods- nodes/proxyverbs:- get- list- watch- apiGroups:- ""resources:- configmaps- nodes/metricsverbs:- get- nonResourceURLs:- /metricsverbs:- get

更新上面的 ClusterRole 这个资源对象,然后重建下 Prometheus 的所有 Pod,正常就可以看到 targets 页面下面有 kubernetes-service-endpoints 这个监控任务了:

$ kubectl apply -f prometheus-clusterRole.yamlclusterrole.rbac.authorization.k8s.io/prometheus-k8s configured

我们这里自动监控了两个 Service,这两个都是coredns的,我们在 Service 中有两个特殊的 annotations:

$ kubectl describe svc kube-dns -n kube-systemName: kube-dnsNamespace: kube-system....Annotations: prometheus.io/port=9153prometheus.io/scrape=true

...

所以被自动发现了,当然我们也可以用同样的方式去配置 Pod、Ingress 这些资源对象的自动发现。

数据持久化

上面我们在修改完权限的时候,重启了 Prometheus 的 Pod,如果我们仔细观察的话会发现我们之前采集的数据已经没有了,这是因为我们通过 prometheus 这个 CRD 创建的 Prometheus 并没有做数据的持久化,我们可以直接查看生成的 Prometheus Pod 的挂载情况就清楚了:

............volumeMounts:- mountPath: /etc/prometheus/config_outname: config-outreadOnly: true- mountPath: /prometheusname: prometheus-k8s-db- mountPath: /etc/prometheus/rules/prometheus-k8s-rulefiles-0 .........volumes:- name: configsecret:defaultMode: 420secretName: prometheus-k8s- emptyDir: {}

我们可以看到 Prometheus 的数据目录 /prometheus 实际上是通过 emptyDir 进行挂载的,我们知道 emptyDir 挂载的数据的生命周期和 Pod 生命周期一致的,所以如果 Pod 挂掉了,数据也就丢失了,这也就是为什么我们重建 Pod 后之前的数据就没有了的原因,对应线上的监控数据肯定需要做数据的持久化的,同样的 prometheus 这个 CRD 资源也为我们提供了数据持久化的配置方法,由于我们的 Prometheus 最终是通过 Statefulset 控制器进行部署的,所以我们这里需要通过 storageclass 来做数据持久化, 我们之前用rook已经搭建过storageclass。所以我们就可以直接用了。我们让prometheus 的 CRD 资源对象(prometheus-prometheus.yaml)中添加如下配置:

storage:volumeClaimTemplate:spec:storageClassName: rook-ceph-blockresources:requests:storage: 10Gi

注意这里的 storageClassName 名字为上面我们创建的 StorageClass 对象名称,然后更新 prometheus 这个 CRD 资源。更新完成后会自动生成两个 PVC 和 PV 资源对象:

$ kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASSREASON AGEpvc-dba11961-4ad6-11e9-baf3-005056930126 10Gi RWO Delete Boundmonitoring/prometheus-k8s-db-prometheus-k8s-0 rook-ceph-block 1mpvc-dbc6bac5-4ad6-11e9-baf3-005056930126 10Gi RWO Delete Boundmonitoring/prometheus-k8s-db-prometheus-k8s-1 rook-ceph-block 1m$ kubectl get pvc -n monitoringNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASSAGEprometheus-k8s-db-prometheus-k8s-0 Boundpvc-dba11961-4ad6-11e9-baf3-005056930126 10Gi RWO rook-ceph-block 2mprometheus-k8s-db-prometheus-k8s-1 Boundpvc-dbc6bac5-4ad6-11e9-baf3-005056930126 10Gi RWO rook-ceph-block 2m

现在我们再去看 Prometheus Pod 的数据目录就可以看到是关联到一个 PVC 对象上了。

.......volumeMounts:- mountPath: /etc/prometheus/config_outname: config-outreadOnly: true- mountPath: /prometheusname: prometheus-k8s-dbsubPath: prometheus-db- mountPath: /etc/prometheus/rules/prometheus-k8s-rulefiles-0name: prometheus-k8s-rulefiles-0.........volumes:- name: prometheus-k8s-dbpersistentVolumeClaim:claimName: prometheus-k8s-db-prometheus-k8s-0.........

现在即使我们的 Pod 挂掉了,数据也不会丢失了。让我们测试一下。

我们先随便查一下数据

删除pod

kubectl delete pod prometheus-k8s-1 -n monitorinkubectl delete pod prometheus-k8s-0 -n monitorin

查看pod状态

kubectl get pod -n monitoringNAMEREADYSTATUS RESTARTS AGEalertmanager-main-02/2 Running 02dalertmanager-main-12/2 Running 02dalertmanager-main-22/2 Running 02dgrafana-7489c49998-pkl8w1/1 Running 02dkube-state-metrics-d6cf6c7b5-7dwpg4/4 Running 02dnode-exporter-dlp252/2 Running 02dnode-exporter-fghlp2/2 Running 02dnode-exporter-mxwdm2/2 Running 02dnode-exporter-r9v922/2 Running 02dprometheus-adapter-84cd9c96c9-n92n4 1/1 Running 02dprometheus-k8s-0 0/3 ContainerCreating 03sprometheus-k8s-1 3/3 Running 09sprometheus-operator-7b74946bd6-vmbcj 1/1 Running 02d

pod正在重新创建。等创建完成,我们再查看一下数据

我们的数据是正常的,没有丢失。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。