跳转至

prometheus 监控 redis

监控方案一:部署 redis-exporter 及 serviceMonitor 监控 redis

1. 部署 redis-exporter

1. 编写 redis-exporter 的资源清单文件 redis-exporter.yaml
apiVersion: apps/v1 # 版本
kind: Deployment # 资源
metadata:
  labels:
    app: redis-exporter # 标签
  name: redis-exporter # deployment 的名称
  namespace: monitoring # 命名空间
spec:
  replicas: 1 # 副本
  selector:
    matchLabels:
      k8s-app: redis-exporter # pod 标签
  strategy: {}
  template:
    metadata:
      labels:
        k8s-app: redis-exporter # pod 标签
    spec:
      containers:
      - image: oliver006/redis_exporter:latest
        name: redis-exporter
        args: ["-redis.addr", "redis://redis-headless.redisns.svc.cluster.local:6379", "-redis.password", "root"]
        ports:
        - containerPort: 9121 # 默认暴露的端口号
          name: http

---

apiVersion: v1 
kind: Service
metadata:
  name: redis-exporter 
  namespace: monitoring 
  labels:
    k8s-app: redis-exporter
spec:
  ports:
  - port: 9121 
    protocol: TCP
    name: http
  selector:
    k8s-app: redis-exporter
  type: ClusterIP 
2. 创建 redis-exporter 资源
kubectl apply -f redis-exporter.yaml
3. 查看 redis 的 IP
kubectl get svc redis-exporter -n monitoring | awk '{if(NR>1) print $3}'
4. 访问 redis 的 metrics 接口
curl -s 10.96.145.112:9121/metrics | tail -1

2. 部署 serviceMonitor

1. 编写 serviceMonitor 的资源清单文件 serviceMonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: redis-exporter 
  namespace: monitoring 
  labels:
    k8s-app: redis-exporter
spec:
  endpoints:
    - interval: 10s
      port: http # 这个是 port 对应的 Service.spec.ports.name
      scheme: http
  jobLabel: k8s-app
  selector:
    matchLabels:
      k8s-app: redis-exporter # 和 svc 的 lables 保持一致
  namespaceSelector:
    matchNames:
    - monitoring # svc 的命名空间
2. 创建 serviceMonitor 资源
kubectl apply -f serviceMonitor.yaml
3. 查看 serviceMonitor 资源
kubectl get servicemonitor -n monitoring

1. prometheus 查看

image-20240413221058236

2. grafana 配置

image-20240413221909318

监控方案二:使用 helm 部署 prometheus redis exporter 监控 redis

1. 监控手动部署的 redis

1. redis 部署

1. 编写 redis.yaml 资源清单
apiVersion: v1
kind: Namespace
metadata:
  labels:
    kubernetes.io/metadata.name: redis
  name: redis
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis
  namespace: redis
data:
  redis.conf: |+
    requirepass redis@passwd
    maxmemory 268435456
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: redis
  labels:
    app: redis
spec:
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
      annotations:
        version/date: "20220720"
        version/author: "fc"
    spec:
      containers:
      - name: redis
        image: redis
        imagePullPolicy: Always
        command: ["redis-server","/etc/redis/redis.conf"]
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: redis-config
          mountPath: /etc/redis/redis.conf
          subPath: redis.conf
      volumes:
      - name: redis-config
        configMap:
          name: redis
          items:
          - key: redis.conf
            path: redis.conf
---
kind: Service
apiVersion: v1
metadata:
  name: redis
  namespace: redis
spec:
  selector:
    app: redis
  ports:
  - port: 6379
    targetPort: 6379
2. 创建 redis 资源
kubectl apply -f redis.yaml
3. 查看 redis 所有的资源
kubectl get all -n redis

2. 部署 prometheus-redis-exporter

1. 下载并解压 prometheus-redis-exporter 资源
helm fetch prometheus-community/prometheus-redis-exporter
2. 解压
tar -xf prometheus-redis-exporter-6.2.0.tgz && cd prometheus-redis-exporter
3. 修改 values.yaml 文件
36 service:
37   type: ClusterIP
38   port: 9121
39   portName: redis-exporter
40   annotations:  # 删除默认的 {}
41     prometheus.io/path: /metrics # 添加此参数
42     prometheus.io/port: "9121" # 添加此参数
43     prometheus.io/scrape: "true" # 添加此参数

...

110 serviceMonitor:
111   # When set true then use a ServiceMonitor to configure scraping
112   enabled: true           # 默认为 false,修改为 true
113   multipleTarget: false
114   targets:  # 删除默认的 [] 
115   # for every targets, url and name must be set,
116   # an individual additionalRelabeling can be set for every target
117     - url: "redis://redis.redis.svc.cluster.local:6379"     # 添加上面的 redis 访问地址
118       name: "my-redis" # 按照实际情况取名

...

auth:
198   # Use password authentication
199   enabled: true   # 开启
200   # Use existing secret (ignores redisPassword)
201   secret:
202     name: ""
203     key: ""
204   # Redis password (when not stored in a secret)
205   redisPassword: "redis@passwd"           # 设置 redis 访问密码
4. 创建资源
helm install redis-monitor ./ -f values.yaml -n monitoring
1. prometheus 查看

image-20240413233932272

2. 监控 helm 部署的 redis 集群

1. helm 实现 redis 集群部署

1. 添加并更新 repo
helm repo add bitnami https://charts.bitnami.com/bitnami && helm repo update
2. 查看仓库
helm search repo redis
3. 安装 Helm release 指定名称为 redis
helm install redis bitnami/redis --set global.storageClass=nfs-client --set global.redis.password=root --set architecture=standalone --version 19.1.0 -n redisns --create-namespace --debug
4. 记录连接信息
host: redis-headless.redisns.svc.cluster.local
port: 6379
passwd: root
5. 查看 redisns 中所有的资源
kubectl get all -n redisns

2. 部署 prometheus-redis-exporter

1. 查看 helm 部署的 redis 服务
kubectl get svc -n redisns
2. 下载并解压 prometheus-redis-exporter
helm fetch prometheus-community/prometheus-redis-exporter
3. 解压
tar -xf prometheus-redis-exporter-6.2.0.tgz && cd prometheus-redis-exporter
4. 修改 values.yaml 文件
36 service:
37   type: ClusterIP
38   port: 9121
39   portName: redis-exporter
40   annotations:  # 删除默认的 {}
41     prometheus.io/path: /metrics # 添加此参数
42     prometheus.io/port: "9121" # 添加此参数
43     prometheus.io/scrape: "true" # 添加此参数

...

110 serviceMonitor:
111   # When set true then use a ServiceMonitor to configure scraping
112   enabled: true           # 默认为 false,修改为 true
113   multipleTarget: false
114   targets:  # 删除默认的 [] 
115   # for every targets, url and name must be set,
116   # an individual additionalRelabeling can be set for every target
117     - url: "redis://redis-headless.redisns.svc.cluster.local:6379"     # 添加上面的 redis 访问地址
118       name: "my-redis"

...

auth:
198   # Use password authentication
199   enabled: false
200   # Use existing secret (ignores redisPassword)
201   secret:
202     name: ""
203     key: ""
204   # Redis password (when not stored in a secret)
205   redisPassword: "root"           # 设置 redis 访问密码
5. 安装 prometheus-redis-exporter
helm install redis-monitor-1 ./ -f values.yaml -n monitoring
1. prometheus 查看

image-20240413224316380