隔了这么久来更新一下,算是做个记录
集群为一个Master节点和两个Node节点,安装Prometheus之前需要在集群中安装kube-state-metrics组件
1.什么是kube-state-metrics
kube-state-metrics
通过监听API Server生成有关资源对象的状态指标,比如Deployment、Node、Pod,需要注意的是kube-state-metrics只是简单的提供一个metrics数据,并不会存储这些指标数据,所以我们可以使用Prometheus来抓取这些数据然后存储,主要关注的是业务相关的一些元数据,比如Deployment、Pod、副本状态等;调度了多少个replicas?现在可用的有几个?多少个Pod是running/stopped/terminated状态?Pod重启了多少次?我有多少job在运行中。
1.2 安装kube-state-metrics组件
(1)创建sa,并对sa授权
[root@k8s-master1 prometheus]# cat kube-state-metrics-rbac.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kube-state-metrics
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kube-state-metrics
rules:
- apiGroups: [""]
resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints"]
verbs: ["list", "watch"]
- apiGroups: ["extensions"]
resources: ["daemonsets", "deployments", "replicasets"]
verbs: ["list", "watch"]
- apiGroups: ["apps"]
resources: ["statefulsets"]
verbs: ["list", "watch"]
- apiGroups: ["batch"]
resources: ["cronjobs", "jobs"]
verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]
resources: ["horizontalpodautoscalers"]
verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kube-state-metrics
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kube-state-metrics
subjects:
- kind: ServiceAccount
name: kube-state-metrics
namespace: kube-system
[root@k8s-master1 prometheus]# kubectl apply -f kube-state-metrics-rbac.yaml
serviceaccount/kube-state-metrics created
clusterrole.rbac.authorization.k8s.io/kube-state-metrics created
clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created
(2)安装kube-state-metrics组件
[root@k8s-master1 prometheus]# cat kube-state-metrics-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-state-metrics
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: kube-state-metrics
template:
metadata:
labels:
app: kube-state-metrics
spec:
serviceAccountName: kube-state-metrics
containers:
- name: kube-state-metrics
image: quay.io/coreos/kube-state-metrics:v1.9.0
ports:
- containerPort: 8080
[root@k8s-master1 prometheus]# kubectl apply -f kube-state-metrics-deploy.yaml
deployment.apps/kube-state-metrics created
[root@k8s-master1 prometheus]# kubectl get pods -n kube-system -l app=kube-state-metrics
NAME READY STATUS RESTARTS AGE
kube-state-metrics-58d4957bc5-tcbq5 1/1 Running 0 28s
(3)创建service
[root@k8s-master1 prometheus]# cat kube-state-metrics-svc.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/scrape: 'true'
name: kube-state-metrics
namespace: kube-system
labels:
app: kube-state-metrics
spec:
ports:
- name: kube-state-metrics
port: 8080
protocol: TCP
selector:
app: kube-state-metrics
[root@k8s-master1 prometheus]# kubectl apply -f kube-state-metrics-svc.yaml
service/kube-state-metrics created
[root@k8s-master1 prometheus]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3d12h
kube-state-metrics ClusterIP 10.110.15.75 <none> 8080/TCP 12s
monitoring-grafana NodePort 10.105.174.145 <none> 80:31715/TCP 11h
2.关于 Prometheus
Prometheus 是一个开源的监控框架。它为 Kubernetes 容器编排平台提供了开箱即用的监控功能。
以下是 Prometheus 中重要的一些概念:
- 指标收集: Prometheus 使用拉取模型,通过 HTTP来实现检索指标。而对于那些 Prometheus 无法抓取指标的用例,可以选择使用 Pushgateway 将指标推送到 Prometheus 。例如,从 kubernetes jobs & Cronjobs 中收集自定义指标。
- 指标端点:如果想要使用 Prometheus 来实现监控,那么系统就应该在/metrics端点上公开指标。Prometheus 会使用该端点来定期提取指标。
- PromQL:在 Prometheus 中附带有一种非常灵活的查询语言——PromQL,它可用于查询 Prometheus 仪表板中的指标。此外,Prometheus UI 和 Grafana 还使用 PromQL 查询来实现指标可视化。
- Prometheus Exporters: Exporters 是一个将来自第三方应用程序的现有指标转换为 Prometheus 指标格式的库。目前已经有许多官方和社区的 Prometheus Exporters。例如Prometheus node exporter。它以 Prometheus 的格式,公开了所有 Linux 系统级的指标。
- TSDB(时序数据库):Prometheus 使用 TSDB 存储着所有数据。默认情况下,所有数据都存储在本地。但是,也可以选择为 Prometheus TSDB 集成远程存储。
Prometheus 架构:
2.1 在 Kubernetes 上设置 Prometheus 监控
假设已有一个 kubernetes 集群,并且使用 kubectl setup 进行运行。
官方的 docker hub 帐户提供了最新版本 Prometheus 的 docker 镜像 ,下面我们使用该镜像来进行相应设置。
2.2 连接到 Kubernetes 集群
连接到 Kubernetes 集群并确保具有创建集群角色的管理员权限。
仅适用于 GKE:如果使用的是 Google Cloud GKE,那么需要运行以下命令,从而获得 Prometheus 设置创建集群角色的权限。
ACCOUNT=$(gcloud info --format='value(config.account)')
kubectl create clusterrolebinding owner-cluster-admin-binding \
--clusterrole cluster-admin \
--user $ACCOUNT
2.3 Prometheus Kubernetes 清单文件
本文中提到的所有配置文件都被托管在 Github 上,可以使用以下命令克隆存储库。
git clone https://github.com/bibinwilson/kubernetes-prometheus
接下来让我们开始进行设置。
2.4 创建命名空间和集群角色
首先,我们将为所有的监控组件创建一个 Kubernetes 命名空间。
如果不创建专用的命名空间,那么所有的 Prometheus kubernetes 部署对象都会部署在默认的命名空间上。
执行以下命令创建一个名为 monitoring 的新命名空间:
kubectl create namespace monitoring
Prometheus 使用 Kubernetes API 从 Nodes、Pods、Deployments 等等中读取所有可用的指标。因此,我们需要创建一个包含 read access 所需 API 组的 RBAC 策略,并将该策略绑定到monitoring 命名空间。
步骤 1:创建一个名为 clusterRole.yaml
的文件,并复制以下 RBAC 角色。
在下面给出的角色中,可以看到,我们已经往 nodes, services endpoints, pods 和 ingresses 中添加了get
,list
以及watch
权限。角色绑定被绑定到监控命名空间。如果有任何要从其他对象中检索指标的用例,则需要将其添加到此集群角色中。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/proxy
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups:
- extensions
resources:
- ingresses
verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: default
namespace: monitoring
步骤 2:使用下面的命令创建角色。
kubectl create -f clusterRole.yaml
2.5 创建 Config Map 以外部化 Prometheus 配置
Prometheus 的所有配置都是prometheus.yaml
文件的一部分,而 Alertmanager 的所有警报规则都配置在prometheus.rules
.
prometheus.yaml
:这是主要的 Prometheus 配置,包含所有抓取配置、服务发现详细信息、存储位置、数据保留配置等prometheus.rules
:此文件包含所有 Prometheus 警报规则
通过将 Prometheus 配置外部化到 Kubernetes 的 config map,那么就无需当需要添加或删除配置时,再来构建 Prometheus 镜像。这里需要更新配置映射并重新启动 Prometheus pod 以应用新配置。
带有所有Prometheus 抓取配置和警报规则的 config map 被挂载到 Prometheus 容器的prometheus.yaml
和 prometheus.rules
文件中,这些文件位于 /etc/prometheus
第 1 步:创建一个名为conf
ig
-map.yaml
的文件,并在下面的链接中复制文件内容
第 2 步:执行以下命令在 Kubernetes 中创建 config map 。
kubectl create -f config-map.yaml
它在容器内创建两个文件。
注意:在 Prometheus 的术语中,从端点集合收集指标的配置称为
job
.
prometheus.yaml
包含了用以发现动态运行在 Kubernetes集群的 pods 和 services 的所有配置。
Prometheus 抓取配置中有以下scrape jobs:
kubernetes-apiservers
:它从 API 服务器获取所有指标。kubernetes-nodes
:它收集所有 Kubernetes 节点指标。kubernetes-pods
:如果 pod 元数据用prometheus.io/scrape
和prometheus.io/port来
注释,那么所有的 pod 都得以发现。kubernetes-cadvisor
:收集所有 cAdvisor 指标。kubernetes-service-endpoints
:如果服务元数据使用 prometheus.io/scrape 和 prometheus.io/port 注释来进行注释,那么所有服务端点都将被报废。它可以用于黑盒监控。
prometheus.rules
包含用于向 Alertmanager 发送警报的所有警报规则。
2.6 创建 Prometheus 部署
步骤1:创建一个名为prometheus-deployment.yaml
的文件,并将以下内容复制到文件中。在此配置中,我们将 Prometheus 的 config map 作为文件安装在/etc/prometheu
中。
注意:这里没有为 Prometheus 存储使用任何持久存储卷,因为它是一个基本设置。在为生产用例设置 Prometheus 时,需要确保将持久存储添加到部署中。
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-deployment
namespace: monitoring
labels:
app: prometheus-server
spec:
replicas: 1
selector:
matchLabels:
app: prometheus-server
template:
metadata:
labels:
app: prometheus-server
spec:
containers:
- name: prometheus
image: prom/prometheus
args:
- "--storage.tsdb.retention.time=12h"
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus/"
ports:
- containerPort: 9090
resources:
requests:
cpu: 500m
memory: 500M
limits:
cpu: 1
memory: 1Gi
volumeMounts:
- name: prometheus-config-volume
mountPath: /etc/prometheus/
- name: prometheus-storage-volume
mountPath: /prometheus/
volumes:
- name: prometheus-config-volume
configMap:
defaultMode: 420
name: prometheus-server-conf
- name: prometheus-storage-volume
第 2 步:使用上述文件在监控命名空间上创建部署。
kubectl create -f prometheus-deployment.yaml
第 3 步:使用以下命令检查创建的部署。
kubectl get deployments --namespace=monitoring
2.7 连接到 Prometheus 仪表板
将 Prometheus 公开为服务 [NodePort & LoadBalancer]
要通过IP
或DNS
名称访问 Prometheus 仪表板,就需要将其公开为 Kubernetes 服务。
步骤1:创建一个名为prometheus-service.yaml
的文件,并复制以下内容。我们将在 port 30000
上的所有 kubernetes 节点 IP 上公开 Prometheus 。
注意:如果是在 AWS、Azure 或 Google Cloud 上,则可以使用 Loadbalancer 类型,这将创建一个负载均衡器并自动将其指向 Kubernetes 服务端点。
apiVersion: v1
kind: Service
metadata:
name: prometheus-service
namespace: monitoring
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '9090'
spec:
selector:
app: prometheus-server
type: NodePort
ports:
- port: 8080
targetPort: 9090
nodePort: 30000
上述 YAML 服务的 annotations 确保服务端点由 prometheus 废弃。
prometheus.io/port
应始终是上述 YAML 服务的目标端口
第 2 步:使用以下命令创建服务。
kubectl create -f prometheus-service.yaml --namespace=monitoring
第 3 步:创建后,就可以使用端口 30000 上的任何 Kubernetes 节点 IP 访问 Prometheus 仪表板。如果是在云上,就需要确保有正确的防火墙规则来从工作站访问端口 30000。