介绍
Prometheus是一个开源的仪器框架,可以每秒吸收大量数据。该属性使普罗米修斯非常适合监控复杂的工作负载。
使用Prometheus监控您的服务器、虚拟机、数据库,并利用这些数据来分析应用程序和基础设施的性能。
本文解释了如何在Kubernetes集群中安装和设置Prometheus监控。
先决条件
- Kubernetes集群
- 本地机器上完全配置的kubectl命令行界面
在Kubernetes上安装Prometheus监控
Prometheus监控可以通过使用一组YAML(但另一种标记语言)文件安装在Kubernetes集群上。这些文件包含配置、权限和服务,允许普罗米修斯通过抓取集群的元素来访问资源和提取信息。
YAML文件易于跟踪、编辑,并且可以无限期重用。
注意:以下的.yaml文件,以其当前形式,不打算在生产环境中使用。相反,您应该调整这些文件,以适应您的系统要求。
第1步:创建监控命名空间
Kubernetes中的所有资源都是在命名空间中启动的。除非指定一个,否则系统使用默认命名空间。为了更好地控制集群监控过程,请指定一个监控命名空间。
命名空间的名称需要与DNS兼容的标签。为了便于参考,我们将命名命名空间:monitor。
有两种方法可以创建监控命名空间,以便从Kubernetes API检索指标。
选项1:
在命令行界面中输入此简单命令,并在主机上创建监控命名空间:
kubectl create namespace monitoring
输出确认命名空间的创建。
选项2:
1.创建并应用一个.yml文件:
apiVersion: v1 kind: Namespace metadata: name: monitoring
此方法很方便,因为您可以在未来的实例中部署相同的文件。
2. 通过在命令终端中输入以下命令,将文件应用于集群:
kubectl -f apply namespace monitoring.yml
3.使用以下命令列出现有的命名空间:
kubectl get ns
注意:了解如何删除Kubernetes命名空间。
第2步:创建持久卷和持久卷索赔
Prometheus的部署需要专用存储空间来存储刮擦数据。满足这一要求的一个实用方法是将普罗米修斯部署连接到NFS卷。以下是为普罗米修斯创建NFS卷并通过持久卷将其纳入部署的过程。
1.在您的主系统上安装NFS服务器。
sudo apt install nfs-kernel-server
2.创建一个目录以与普罗米修斯一起使用。
sudo mkdir -p /mnt/nfs/promdata
3.更改目录的所有权。
sudo chown nobody:nogroup /mnt/nfs/promdata
4.更改目录的权限。
sudo chmod 777 /mnt/nfs/promdata
5.使用文本编辑器(如nano)创建一个.yaml文件:
nano pv-pvc.yaml
6.将以下配置粘贴到文件中。调整参数以适应您的系统。spec.nfs.server字段应与您安装NFS的系统的IP地址相对应。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-data namespace: monitoring labels: type: nfs app: prometheus-deployment spec: storageClassName: managed-nfs capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.49.1 path: "/mnt/nfs/promdata" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs-data namespace: monitoring labels: app: prometheus-deployment spec: storageClassName: managed-nfs accessModes: - ReadWriteMany resources: requests: storage: 500Mi
存储文件并退出。
7.使用kubectl应用配置。
kubectl apply -f pv-pvc.yaml
第3步:创建集群角色、服务帐户和集群角色绑定
命名空间旨在限制默认角色的权限。因此,如果我们想检索全集群数据,我们需要让普罗米修斯访问所有集群资源。
以下步骤解释了如何创建和应用一组基本的.yaml文件,为普罗米修斯提供集群范围的访问权限。
1.为集群角色定义创建一个文件。
nano cluster-role.yaml
2.复制以下配置,并根据您的需求进行调整。每条规则上的动词定义了角色可以对apiGroups采取的行动。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus rules: - apiGroups: [""] resources: - nodes - services - endpoints - pods verbs: ["get", "list", "watch"] - apiGroups: - extensions resources: - ingresses verbs: ["get", "list", "watch"]
存储文件并退出。
3.应用文件。
kubectl apply -f cluster-role.yaml
4.创建一个服务帐户文件。
nano service-account.yaml
5.复制以下配置以定义服务帐户。
apiVersion: v1 kind: ServiceAccount metadata: name: prometheus namespace: monitoring
存储文件并退出。
6.应用文件。
kubectl apply -f service-account.yaml
7.在文本编辑器中创建另一个文件:
nano cluster-role-binding.yaml
8. 定义ClusterRoleBinding。此操作将把服务帐户绑定到之前创建的集群角色。
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: prometheus namespace: monitoring
存储文件并退出。
9.最后,用kubectl应用绑定。
kubectl apply -f cluster-role-binding.yaml
通过将这些资源添加到我们的文件中,我们从监控命名空间授予了普罗米修斯集群范围的访问权限。
第4步:创建普罗米修斯ConfigMap
文件的这一部分提供了刮擦过程的说明。Kubernetes集群每个元素的具体说明应自定义,以匹配单个监控要求和集群设置。
本文中的示例使用一个简单的ConfigMap,定义了刮擦和评估间隔、作业和目标。
1.在文本编辑器中创建文件。
nano configmap.yaml
2.复制以下配置。
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: monitoring data: prometheus.yml: | global: scrape_interval: 15s evaluation_interval: 15s alerting: alertmanagers: - static_configs: - targets: rule_files: # - "example-file.yml" scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']
存储文件并退出。
3.使用kubectl应用ConfigMap。
kubectl apply -f configmap.yaml
虽然上述配置足以创建测试普罗米修斯部署,但ConfigMaps通常会提供进一步的配置详细信息。以下部分讨论了您可以包含在文件中的其他一些选项。
刮擦节点
此服务发现公开了构成Kubernetes集群的节点。kubelet在每个节点上运行,是有价值的信息来源。
Scrape kubelet
scrape_configs: - job_name: 'kubelet' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true # Required with Minikube.
刮擦 cAdvisor(容器级别信息)
kubelet只提供有关自身的信息,而不是容器的信息。要从容器级别接收信息,我们需要使用出口商。cAdvisor已经嵌入,只需要ametrics_path:/metrics/cadvisor,普罗米修斯收集容器数据:
- job_name: 'cadvisor' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true # Required with Minikube. metrics_path: /metrics/cadvisor
Scrape API服务器
使用端点角色来定位每个应用程序实例。文件的这一部分允许您在Kubernetes集群中刮擦API服务器。
- job_name: 'k8apiserver' kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true # Required if using Minikube. bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https
Kubernetes服务的刮擦豆荚(不包括API服务器)
刮擦支持所有Kubernetes服务的pod,并忽略API服务器指标。
- job_name: 'k8services' kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_service_name action: drop regex: default;kubernetes - source_labels: - __meta_kubernetes_namespace regex: default action: keep - source_labels: [__meta_kubernetes_service_name] target_label: job
Pod角色
使用容器名称作为作业标签,发现所有带有名称指标的pod端口。
- job_name: 'k8pods' kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_container_port_name] regex: metrics action: keep - source_labels: [__meta_kubernetes_pod_container_name] target_label: job
第5步:创建普罗米修斯部署文件
部署.yaml定义了应用于定义的pod集的副本和模板的数量。该文件还连接了之前文件中定义的元素,如PV和PVC。
1.创建一个文件来存储部署配置。
nano deployment.yaml
2.复制以下示例配置,并根据您的需求进行调整。
apiVersion: apps/v1 kind: Deployment metadata: name: prometheus namespace: monitoring labels: app: prometheus spec: replicas: 1 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate selector: matchLabels: app: prometheus template: metadata: labels: app: prometheus annotations: prometheus.io/scrape: "true" prometheus.io/port: "9090" spec: containers: - name: prometheus image: prom/prometheus args: - '--storage.tsdb.retention=6h' - '--storage.tsdb.path=/prometheus' - '--config.file=/etc/prometheus/prometheus.yml' ports: - name: web containerPort: 9090 volumeMounts: - name: prometheus-config-volume mountPath: /etc/prometheus - name: prometheus-storage-volume mountPath: /prometheus restartPolicy: Always volumes: - name: prometheus-config-volume configMap: defaultMode: 420 name: prometheus-config - name: prometheus-storage-volume persistentVolumeClaim: claimName: pvc-nfs-data
保存并退出。
3.使用以下命令部署普罗米修斯。
kubectl apply -f deployment.yaml
第6步:创建普罗米修斯服务
Prometheus目前正在集群中运行。按照程序创建服务并获得普罗米修斯收集的数据的访问权限:
1.创建一个.yaml来存储与服务相关的数据。
nano service.yaml
2.定义文件中的服务。
apiVersion: v1 kind: Service metadata: name: prometheus-service namespace: monitoring annotations: prometheus.io/scrape: 'true' prometheus.io/port: '9090' spec: selector: app: prometheus type: NodePort ports: - port: 8080 targetPort: 9090 nodePort: 30909
存储文件并退出。
3.使用kubectl apply创建服务。
kubectl apply -f service.yaml
用普罗米修斯监控Kubernetes集群
Prometheus是一个基于拉的系统。它根据部署文件中定义的配置发送HTTP请求,即所谓的scrape。对此scrape请求的响应与刮擦本身的指标一起存储和解析。
该存储是普罗米修斯服务器上的自定义数据库,可以处理大量数据流入。可以使用一台普罗米修斯服务器同时监控数千台机器。
注:随着数据的输入,磁盘空间可能会很快成为问题。收集的数据具有很大的短期价值。如果您计划保存大量长期记录,最好提供额外的持久存储卷。
数据需要适当公开和格式化,以便普罗米修斯可以收集数据。Prometheus可以直接从应用程序的客户端库或使用出口商访问数据。
出口商用于您无法完全控制的数据(例如,内核指标)。出口商是放置在应用程序旁边的软件。其目的是接受来自普罗米修斯的HTTP请求,确保数据以受支持的格式提供,然后将请求的数据提供给普罗米修斯服务器。
一旦您装备了应用程序向普罗米修斯提供数据,您需要通知普罗米修斯在哪里查找该数据。普罗米修斯通过使用服务发现发现发现可以刮掉的目标。
Kubernetes集群已经有了标签和注释,以及跟踪变化及其元素状态的绝佳机制。因此,普罗米修斯使用Kubernetes API来发现目标。
您可以向普罗米修斯暴露的Kubernetes服务发现是:
- 节点
- 端点
- 服务
- 豆荚
- 进入
Prometheus将机器级指标与应用程序信息分开检索。公开内存、磁盘空间、CPU使用情况和带宽指标的唯一方法是使用节点导出器。此外,关于cgroups的指标也需要公开。
幸运的是,cAdvisor导出器已经嵌入在Kubernetes节点级别,并且可以随时暴露。
一旦系统收集数据,您可以使用PromQL查询语言访问它,将其导出到Graphal界面,如Grafana,或使用它与Alertmanager发送警报。
访问普罗米修斯监控
确保所有相关元素在监控命名空间中正常运行:
kubectl get all -n monitoring
使用service.yaml文件中定义的单个节点URL和nodePort从浏览器访问Prometheus。例如:
通过输入节点的URL或IP,并通过从.yaml文件中指定端口,您已成功访问Prometheus Monitoring。
注意:如果您需要一个全面的仪表板系统来绘制普罗米修斯收集的指标,可用的选项之一是Grafana。它使用数据源检索用于创建图表的信息。
如何监控立方体状态度量?(可选)
您现在可以完全监控您的Kubernetes基础架构以及应用程序实例。然而,这不包括Kubernetes拥有的关于集群中资源的信息的指标。
kube-state-metrics是一个允许普罗米修斯也抓取该信息的出口商。
1.为kube-state-metrics出口商创建一个YAML文件:
--- apiVersion: apps/v1beta2 kind: Deployment metadata: name: kube-state-metrics spec: selector: matchLabels: app: kube-state-metrics replicas: 1 template: metadata: labels: app: kube-state-metrics spec: serviceAccountName: prometheus containers: - name: kube-state-metrics image: quay.io/coreos/kube-state-metrics:v1.2.0 ports: - containerPort: 8080 name: monitoring --- kind: Service apiVersion: v1 metadata: name: kube-state-metrics spec: selector: app: kube-state-metrics type: LoadBalancer ports: - protocol: TCP port: 8080 targetPort: 8080
2.通过输入以下命令来应用文件:
kubectl apply -f kube-state-metrics.yml
应用文件后,通过输入节点IP/URL和之前定义的nodePort来访问普罗米修斯。
结论
现在您已在Kubernetes集群上成功安装了Prometheus Monitoring,您可以跟踪系统的整体运行状况、性能和行为。
无论您的操作多么庞大和复杂,普罗米修斯等基于指标的监控系统都是维护基于分布式微服务的架构的重要DevOps工具。