Prometheus部署以及问题解决

打印 上一主题 下一主题

主题 642|帖子 642|积分 1926

Prometheus作用:

Prometheus监控(Prometheus Monitoring)是一种开源的体系监控和警报工具。它最初由SoundCloud开发并于2012年发布,并在2016年加入了云原生计算基金会(CNCF)。Prometheus监控旨在网络、存储和查询各种指标数据,以资助用户监督其应用步伐和体系的性能和运行状态。
部署流程:

本文采用Prometheus来监控k8s集群资源状态,并解决alertmanager 9093端口连接拒绝的问题
1.根据k8s集群版本下载对应矩阵的Prometheus版本
  1. # 我的k8s集群版本为1.26.9,所以我下载0.13版本
  2. wget https://mirror.ghproxy.com/https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.13.0.zip
  3. # 下载完成后解压即可使用
  4. unzip v0.13.0.zip
复制代码


2.进入解压出来的目录,自定义配置告警规则和邮件推送(看需求)
  1. cd kube-prometheus-0.13.0/manifests/
  2. # 该文件配置告警规则
  3. vim prometheus-prometheusRule.yaml
  4. # 该文件配置告警推送
  5. vim alertmanager-secret.yaml
复制代码
3.部署Prometheus监控和删除
  1. kubectl apply --server-side -f manifests/setup -f manifests
  2. # 移除Prometheus
  3. kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup
  4. # 以下为部署完成后正常的资源状态
复制代码
  1. # 如果没有部署ingress则需要更改以下几个svc配置文件,将svc类型改为NodePort才能对外访问
  2. kubectl -n monitoring edit svc alertmanager-main
  3. kubectl -n monitoring edit svc prometheus-k8s
  4. kubectl -n monitoring edit svc grafana
  5. # 删除对应的网络策略,它默认限制了出口和入口流量,即便使用了 NodePort 类型的 svc 或者 ingress 也无法直接访问
  6. kubectl -n monitoring delete networkpolicy --all
复制代码


4.接下来说一下我之前碰到的问题
  1. # 在我部署Prometheus监控服务的时候,我的alertmanager一直无法正常启动,查看状态发现了报错信息
  2. kubectl -n monitoring describe pod alertmanager-main-1
  3. # dial tcp 10.244.135.151:9093 connection refused
复制代码

  1. # 最开始在github官网查看issue时,发现有人遇到了相同的问题,并且也有人给出了解决办法,我试着按照他的方法解决,没成功。他要修改sts里的文件内容,你改了就会发现不管你怎么改,它都不会生效,并且你还删不掉它的sts,该sts是由(crd)自定义资源alertmanager main所控制的,你只有修改这个或者删除这个资源才能停掉sts
  2. kubectl -n monitoring edit alertmanager main
  3. kubectl -n monitoring delete alertmanager main
复制代码
  1. # 起初想着可能是探针超时时间太短了导致它一直无法通过检测,就修改了alertmanager main的文件,更改超时时间为300s,但还是有问题。后面把探针给它注释掉,不让它检测发现还是有问题。最后是直接把容器的端口给注释掉了,让它通过域名查找,发现了真正的问题
  2. kubectl -n monitoring get alertmanager main -o yaml >
  3. dump-modify.yaml
  4. vim dump-modify.yaml
  5. apiVersion: monitoring.coreos.com/v1
  6. kind: Alertmanager
  7. metadata:
  8.   creationTimestamp: "2024-08-19T08:12:24Z"
  9.   generation: 1
  10.   labels:
  11.     app.kubernetes.io/component: alert-router
  12.     app.kubernetes.io/instance: main
  13.     app.kubernetes.io/name: alertmanager
  14.     app.kubernetes.io/part-of: kube-prometheus
  15.     app.kubernetes.io/version: 0.26.0
  16.   name: main
  17.   namespace: monitoring
  18.   resourceVersion: "510527"
  19.   uid: ee407f56-bffa-4191-baa7-e458e7a1b9ff
  20. spec:
  21.   image: quay.io/prometheus/alertmanager:v0.26.0
  22.   nodeSelector:
  23.     kubernetes.io/os: linux
  24.   podMetadata:
  25.     labels:
  26.       app.kubernetes.io/component: alert-router
  27.       app.kubernetes.io/instance: main
  28.       app.kubernetes.io/name: alertmanager
  29.       app.kubernetes.io/part-of: kube-prometheus
  30.       app.kubernetes.io/version: 0.26.0
  31.   portName: web
  32.   replicas: 3
  33.   logLevel: debug
  34.   resources:
  35.     limits:
  36.       cpu: 100m
  37.       memory: 100Mi
  38.     requests:
  39.       cpu: 4m
  40.       memory: 100Mi
  41.   retention: 120h
  42.   securityContext:
  43.     fsGroup: 2000
  44.     runAsNonRoot: true
  45.     runAsUser: 1000
  46.   serviceAccountName: alertmanager-main
  47.   version: 0.26.0
  48.   containers:
  49.   - args:
  50.     - --config.file=/etc/alertmanager/config_out/alertmanager.env.yaml
  51.     - --storage.path=/alertmanager
  52.     - --data.retention=120h
  53.     - --cluster.listen-address=[$(POD_IP)]:9094
  54.     - --web.listen-address=:9093
  55.     - --web.route-prefix=/
  56.     - --cluster.peer=alertmanager-main-0.alertmanager-operated:9094
  57.     - --cluster.peer=alertmanager-main-1.alertmanager-operated:9094
  58.     - --cluster.peer=alertmanager-main-2.alertmanager-operated:9094
  59.     - --cluster.reconnect-timeout=5m
  60.     - --web.config.file=/etc/alertmanager/web_config/web-config.yaml
  61.     env:
  62.     - name: POD_IP
  63.       valueFrom:
  64.         fieldRef:
  65.           apiVersion: v1
  66.           fieldPath: status.podIP
  67.     image: quay.io/prometheus/alertmanager:v0.26.0
  68.     imagePullPolicy: IfNotPresent
  69.     livenessProbe:
  70.       failureThreshold: 10
  71.       httpGet:
  72.         path: /
  73.         port: 443
  74.         scheme: HTTPS
  75.         host: example.com
  76.       periodSeconds: 10
  77.       successThreshold: 1
  78.       timeoutSeconds: 3
  79.     name: alertmanager
  80.     # ports:
  81.     # - containerPort: 9093
  82.     #   name: web
  83.     #   protocol: TCP
  84.     # - containerPort: 9094
  85.     #   name: mesh-tcp
  86.     #   protocol: TCP
  87.     # - containerPort: 9094
  88.     #   name: mesh-udp
  89.     #   protocol: UDP
  90.     readinessProbe:
  91.       failureThreshold: 10
  92.       httpGet:
  93.         path: /
  94.         port: 443
  95.         scheme: HTTPS
  96.         host: example.com
  97.       initialDelaySeconds: 3
  98.       periodSeconds: 5
  99.       successThreshold: 1
  100.       timeoutSeconds: 3
  101.     resources:
  102.       limits:
  103.         cpu: 100m
  104.         memory: 100Mi
  105.       requests:
  106.         cpu: 4m
  107.         memory: 100Mi
  108.     securityContext:
  109.       allowPrivilegeEscalation: false
  110.       capabilities:
  111.         drop:
  112.         - ALL
  113.       readOnlyRootFilesystem: true
  114.     terminationMessagePath: /dev/termination-log
  115.     terminationMessagePolicy: FallbackToLogsOnError
  116.     volumeMounts:
  117.     - mountPath: /etc/alertmanager/config
  118.       name: config-volume
  119.     - mountPath: /etc/alertmanager/config_out
  120.       name: config-out
  121.       readOnly: true
  122.     - mountPath: /etc/alertmanager/certs
  123.       name: tls-assets
  124.       readOnly: true
  125.     - mountPath: /alertmanager
  126.       name: alertmanager-main-db
  127.     - mountPath: /etc/alertmanager/web_config/web-config.yaml
  128.       name: web-config
  129.       readOnly: true
  130.       subPath: web-config.yaml
  131. # status:
  132. #   availableReplicas: 0
  133. #   conditions:
  134. #   - lastTransitionTime: "2024-08-19T08:12:28Z"
  135. #     message: |-
  136. #       pod alertmanager-main-1: containers with incomplete status: [init-config-reloader]
  137. #       pod alertmanager-main-2: containers with incomplete status: [init-config-reloader]
  138. #     observedGeneration: 1
  139. #     reason: NoPodReady
  140. #     status: "False"
  141. #     type: Available
  142. #   - lastTransitionTime: "2024-08-19T08:12:28Z"
  143. #     observedGeneration: 1
  144. #     status: "True"
  145. #     type: Reconciled
  146. #   paused: false
  147. #   replicas: 3
  148. #   unavailableReplicas: 3
  149. #   updatedReplicas: 3
  150. # 删除已有的main资源
  151. kubectl -n monitoring delete alertmanager main
  152. # 重新创建main资源
  153. kubectl -n monitoring apply -f dump-modify.yaml
复制代码
  1. # 查看sts的日志发现报错信息提示说dns解析有问题,于是就去查看k8s组件coredns的信息,发现了问题所在,我的k8s集群采用的高可用部署方案,网络插件为calico,集群地址为10.10.40.100-105,service网段为10.96.0.0/16,pod网段为10.244.0.0/16,而这个coredns网段却是10.88.0.0/16网段的
  2. kubectl -n monitoring logs sts alertmanager
  3. kubectl get pod -A -o wide
复制代码

  1. # 于是查看cni网络组件信息,看到所有节点都有这个cni0的网卡,这个网卡是安装了flannel网络组件才会提供的,问题就出在这里,calico网络组件提供的网卡是calic741a2df36d@if2的网卡名称,所以将原本的coredns删除掉后,网络就恢复正常了
  2. # 此时再将整个Prometheus服务删除重新部署就恢复正常了
  3. ls -l /etc/cni/net.d/
  4. # 两个都要删
  5. kubectl -n kube-system delete pod coredns-5bbd96d687-gtl9r
  6. kubectl -n kube-system get pod -o wide
复制代码


总结
  1. # 不管部署一套什么服务,pod能跑起来,跨节点pod和pod之间能互相访问就不是网络问题,像这种个别pod有问题的,就查看报错,只要发现是端口拒绝之类的优先检查k8s组件coredns的问题,有奇效,当然还是得根据实际情况而论。
  2. # 如果部署集群有问题的时候,给它改成单节点测试也是很好的排错方式。
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表