首页 > 其他分享 >基于Kube-Prometheus/v0.13.0的K8S监控部署

基于Kube-Prometheus/v0.13.0的K8S监控部署

时间:2024-07-05 14:11:31浏览次数:15  
标签:K8S name kubernetes app prometheus yaml Prometheus io Kube

Kube-Prometheus不同版本支持的Kubernetes版本信息如下:

kube-prometheus stack Kubernetes 1.22 Kubernetes 1.23 Kubernetes 1.24 Kubernetes 1.25 Kubernetes 1.26 Kubernetes 1.27 Kubernetes 1.28
release-0.10 x x x
release-0.11 x x x
release-0.12 x x x
release-0.13 x
main x x

作者部署的Kubernetes集群版本为Kubernetes 1.28.3,系统使用的CentOS7.9,部署工具使用的sealos,部署方法请查看官文文档:Sealos Official Documents ,话不多说,来看下Kube-Prometheus的部署:

一、下载安装包并解压

wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.13.0.tar.gz

tar -xf kube-prometheus-0.13.0.tar.gz

二、修改镜像地址

部分镜像地址国内访问不到,所以要修改镜像地址,国内镜像地址如失效,请重新找其它地址代替。

cd kube-prometheus-0.13.0/manifests
find ./ -type f |xargs sed -ri 's+registry.k8s.io/+k8s.mirror.nju.edu.cn/+g'
find ./ -type f |xargs sed -ri 's+quay.io/+k8s.mirror.nju.edu.cn/+g'

或者不改镜像地址,从这里下载相关镜像包,然后导入k8s集群:kube-prometheus-0.13.0镜像包

三、修改service端口类型

service默认使用端口类型为ClusterIP,为方便访问所以修改为NodePort类型,如果打算用Ingress访问,可以不修改。

(1)prometheus-service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 2.46.0
  name: prometheus-k8s
  namespace: monitoring
spec:
  type: NodePort  #新增
  ports:
  - name: web
    port: 9090
    targetPort: web
    nodePort: 32501		#新增
  - name: reloader-web
    port: 8080
    targetPort: reloader-web
  selector:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
  sessionAffinity: ClientIP

(2)grafana-service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 9.5.3
  name: grafana
  namespace: monitoring
spec:
  type: NodePort   #新增
  ports:
  - name: http
    port: 3000
    targetPort: http
    nodePort: 32500  #新增
  selector:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus

(3) alertmanager-service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: alert-router
    app.kubernetes.io/instance: main
    app.kubernetes.io/name: alertmanager
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 0.26.0
  name: alertmanager-main
  namespace: monitoring
spec:
  type: NodePort   #新增
  ports:
  - name: web
    port: 9093
    targetPort: web
    nodePort: 32503  #新增
  - name: reloader-web
    port: 8080
    targetPort: reloader-web
  selector:
    app.kubernetes.io/component: alert-router
    app.kubernetes.io/instance: main
    app.kubernetes.io/name: alertmanager
    app.kubernetes.io/part-of: kube-prometheus
  sessionAffinity: ClientIP

四、安装

kubectl apply --server-side -f manifests/setup
kubectl wait \
	--for condition=Established \
	--all CustomResourceDefinition \
	--namespace=monitoring
kubectl apply -f manifests/

五、访问页面

#prometheus
http://IP:32501
#alertmanager
http://IP:32503
#grafana
http://IP:32500

六、数据持久化

6.1、prometheus 数据持久化

这里使用NFS进行数据持久化,需要提前安装nfs-csi-provisioner,并创建好存储类。

(1)安装 nfs-csi-provisioner

#本地安装 
git clone https://github.com/kubernetes-csi/csi-driver-nfs.git
cd csi-driver-nfs
./deploy/install-driver.sh v4.7.0 local

#查看pod状态
kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
kubectl -n kube-system get pod -o wide -l app=csi-nfs-node

安装过程中需要拉取镜像,可能拉取不到,请自己修改镜像地址,主要涉及以下几个文件:

csi-driver-nfs/deploy目录下这两个文件:

csi-nfs-controller.yaml

csi-nfs-node.yaml

也可以从以下地址下载压缩包,然后导入至k8s集群中:

nfs-csi-provisioner v4.7.0镜像包

(2)创建存储类

vim prometheus-data-db-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: prometheus-data-db
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.3.119			#nfs服务地址
  share: /app/nfsdata/prometheus/   #nfs目录,最好提前创建好
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1
kubectl apply -f prometheus-data-db-sc.yaml

(3) 修改 prometheus-prometheus.yaml 文件

#在文件末尾添加以下内容:
  retention: 30d	#数据保存天数
  storage:			#存储配置
    volumeClaimTemplate:
      spec:
        storageClassName: prometheus-data-db
        resources:
          requests:
            storage: 50Gi

(4)应用 prometheus-prometheus.yaml 文件

kubectl apply -f prometheus-prometheus.yaml

6.2、grafana 数据持久化

(1)修改 grafana-deployment.yaml 文件

#找到以下位置      
      volumes:
      #注释以下两行
      #- emptyDir: {}
      #  name: grafana-storage
      #添加以下内容,这个直接用nfs卷,如需使用pvc方式,请先创建存储类
      - name: grafana-storage
        nfs:
          server: 192.168.3.119
          path: /app/nfsdata/grafana
      #PVC方式
      - name: grafana-storage
        persistentVolumeClaim:
          claimName: grafana-pvc

创建存储类SC和存储类声明PVC过程

vim grafana-pvc.yaml
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: grafana-pvc
  namespace: monitoring  #指定namespace为monitoring
spec:
  storageClassName: grafana-sc #指定StorageClass,没有可以不填写这一行。自己手动创建pv
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

vim grafana-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: grafana-sc
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.3.119			#nfs服务地址
  share: /app/nfsdata/grafana/   #nfs目录,最好提前创建好
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1

(2)应用 grafana-deployment.yaml 文件

kubectl apply -f grafana-deployment.yaml

七、解决ControllerManage和Scheduler监控不到的问题

7.1、ControllerManage 监控

(1)修改/etc/kubernetes/manifests/kube-controller-manager.yaml文件, 将--bind-address=127.0.0.1 改为 --bind-address=0.0.0.0

(2)新增 prometheus-kubeControllerManagerService.yaml 文件

vim prometheus-kubeControllerManagerService.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-controller-manager
  labels:
    app.kubernetes.io/name: kube-controller-manager  #要与kubernetesControlPlane-serviceMonitorKubeControllerManager.yaml文件的spec.selector.matchLabels相同
spec:
  selector:
    component: kube-controller-manager	#此处注意为kube-controller-manager pod的标签
  ports:
  - name: https-metrics			#名字要与kubernetesControlPlane-serviceMonitorKubeControllerManager.yaml文件的spec.endpoints.port值相同
    port: 10257					#注意端口号要正确
    targetPort: 10257			#注意端口号要正确
    protocol: TCP

(3)应用 prometheus-kubeControllerManagerService.yaml 文件

kubectl apply -f  prometheus-kubeControllerManagerService.yaml

7.2、Scheduler 监控

(1)修改/etc/kubernetes/manifests/kube-scheduler.yaml文件, 将--bind-address=127.0.0.1 改为 --bind-address=0.0.0.0

(2)新增 prometheus-kubeSchedulerService.yaml 文件

apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-scheduler
  labels:
    app.kubernetes.io/name: kube-scheduler  #要与kubernetesControlPlane-serviceMonitorKubeScheduler.yaml文件的spec.selector.matchLabels相同
spec:
  selector:
    component: kube-scheduler   #此处注意为kube-scheduler pod的标签
  ports:
  - name: https-metrics   		#名字要与kubernetesControlPlane-serviceMonitorKubeScheduler.yaml文件的spec.endpoints.port值相同
    port: 10259					#注意端口号要正确
    targetPort: 10259			#注意端口号要正确
    protocol: TCP

(3)应用 prometheus-kubeControllerManagerService.yaml 文件

kubectl apply -f prometheus-kubeControllerManagerService.yaml

八、添加etcd监控

(1)创建ectd证书secret

首先查看一下ectd的证书路径,如果使用systemd部署的可以查看service文件:/etc/systemd/system/etcd.service,如果使用静态pod部署的,可以查看一下 /etc/kubernetes/manifests/etcd.yaml 文件,找到以下三个值的路径 :

--cert-file=/etc/kubernetes/pki/etcd/server.crt
--key-file=/etc/kubernetes/pki/etcd/server.key
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

然后创建secret

kubectl create secret generic etcd-ssl --from-file=/etc/kubernetes/pki/etcd/ca.crt --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/server.key -n monitoring

(2)修改 prometheus-prometheus.yaml 文件

...
  replicas: 2	#找到此处,添加以下两行内容  
  secrets:
  - etcd-ssl
...

#修改完成后应用一下
kubectl apply -f prometheus-prometheus.yaml

(3)创建ServiceMonitor对象用于监控etcd

vim kubernetesControlPlane-serviceMonitorEtcd.yaml
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app.kubernetes.io/name: etcd
    app.kubernetes.io/part-of: kube-prometheus
  name: etcd
  namespace: monitoring
spec:
  endpoints:
  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    interval: 30s
    port: https-metrics
    scheme: https
    tlsConfig:
      #证书相关路径为prometheus pod内的路径
      caFile: /etc/prometheus/secrets/etcd-ssl/ca.crt
      certFile: /etc/prometheus/secrets/etcd-ssl/server.crt
      keyFile: /etc/prometheus/secrets/etcd-ssl/server.key
      insecureSkipVerify: true
  jobLabel: app.kubernetes.io/name
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      app.kubernetes.io/name: etcd
      
#创建完应用一下
kubectl apply -f kubernetesControlPlane-serviceMonitorEtcd.yaml

(4)创建Service对象用于匹配etcd pod

vim prometheus-etcdService.yaml
---
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: etcd
  labels:
    app.kubernetes.io/name: etcd
spec:
  selector:
    component: etcd
  ports:
  - name: https-metrics
    port: 2379
    targetPort: 2379
    protocol: TCP
    
#创建完应用一下
kubectl apply -f prometheus-etcdService.yaml

(5)稍等一会即可在prometheus web的targets页面看到etcd的信息

九、添加自定义监控

有时候我们可能需要添加集群外部的一些监控,比如MySQL、Redis、Kafka等,我们可以新建一个 prometheus-additional.yaml 文件,配置scrape_configs来添加额外监控组件。

(1)添加prometheus-additional.yaml文件,假设我们要添加MySQL和Redis的监控

- job_name: 'mysql-exporter'
  static_configs:
    - targets:
      - 192.168.3.8:9104

- job_name: 'redis-exporter'
  static_configs:
  - targets:
    - 192.168.3.9:9121

(2)然后我们需要将这些监控配置以secret资源类型存储到k8s集群中

kubectl create secret generic additional-scrape-configs --from-file=prometheus-additional.yaml -n monitoring

(3)修改 prometheus-prometheus.yaml 文件

...
  image: quay.io/prometheus/prometheus:v2.46.0  #找到此行,添加以下内容
  additionalScrapeConfigs:
    name: additional-scrape-configs
    key: prometheus-additional.yaml
...

(4)应用 prometheus-prometheus.yaml 文件

kubectl apply -f prometheus-prometheus.yaml

(5)稍等一会然后在prometheus web的targets页面查看相关监控

标签:K8S,name,kubernetes,app,prometheus,yaml,Prometheus,io,Kube
From: https://www.cnblogs.com/hovin/p/18285696

相关文章

  • Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)
    Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)简介OpenEBS是一种开源云原生存储解决方案。OpenEBS可以将Kubernetes工作节点可用的任何存储转化为本地或复制的Kubernetes持久卷。OpenEBS帮助应用和平台团队轻松地部署需要快速、持久耐用、可靠且可扩展......
  • k8s组件之Etcd
    一、ectd数据库介绍etcd 是CoreOS团队于2013年6月发起的开源项目, 是一种开源的分布式键值存储库,用于保存和管理分布式系统保持运行所需的关键信息。 etcd基于Raft共识算法而构建,可确保集群中所有节点之间的数据存储一致性。etcd 采用全新的设计,具有以下特性:......
  • KubeEdge v1.17.0发布!数据处理能力与易用性全面提升
    https://developer.huawei.com/consumer/cn/forum/topic/0207151855682956382 KubeEdgev1.17.0发布!数据处理能力与易用性全面提升软件开发发表于2024-05-2314:08发布于:广东50查看摘要:一文看完新增7个特性功能,为边缘节点和设备带来更强的数据处理能力。本文分享自......
  • K8s
    kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。传统的应用部署方式是通过插件或脚本......
  • k8s实战 ---- pod 基础
    如果你对k8s还不了解,可以看下前文k8s实战1----初识    (https://www.cnblogs.com/jilodream/p/18245222)什么是pod,pod在英文中是豌豆荚、分离仓、集装箱的意思。在k8s中,pod就是融合一堆容器实例的一个大容器(称之为集合更贴切)。K8s所能部署的最小单元就是容器,就是pod,一......
  • K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群
    前言Redis是在开发过程中经常用到的缓存中间件,为了考虑在生产环境中稳定性和高可用,Redis通常采用集群模式的部署方式。在制定Redis集群的部署策略时,常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点,相较之下,使用PetaExpress提供的Kubernetes(k8s)服务进行Redis集......
  • k8s组件有哪些?
    Kubernetes是谷歌公司一款开源的容器编排管理工具,它的本质是一组服务器集群管理工具,能够在集群的每个节点上运行特定的程序,它的目的是实现资源的管理自动化,主要提供了自我修复,弹性伸缩、服务发现、负载均衡、版本回退、存储编排等功能。1、自我修复:一个容器崩溃,会立......
  • 2.Kubernetes集群架构与组件
    一、Kubernetes组件       1.1控制面板组件(都是在master上面的)               kube-apiserver:对节点以及任务处理的一个相关接口(所有的调用都要经过这个组件调用)               kube-controller-manager:控制器管理器,管理各个类型的......
  • 编译安装Kubernetes 1.29 高可用集群(6)--Cilium网络组件和CoreDNS配置
    1.部署Cilium网络组件1.1在k8s-master节点上,下载安装helmwgethttps://mirrors.huaweicloud.com/helm/v3.15.2/helm-v3.15.2-linux-amd64.tar.gztar-zxvfhelm-v3.15.2-linux-amd64.tar.gzcplinux-amd64/helm/usr/bin/#helmversionversion.BuildInfo{Version:"v3.1......
  • k8s-核心组件
    核心组件组成Kubernetes主要由以下几个核心组件组成:-etcd:保存整个集群的状态-APIServer:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制-ControllerManager:负责维护集群的状态,如故障检测、自动扩展、滚动更新等-Scheduler:负责资源的调度......