环境

Ubuntu 22.04
k8s kubernetes 1.29
kube-prometheus 0.14.0
calico 3.29
kuboard v3
本地运维、生产网段:192.168.120.0/24

描述

使用 kube-prometheus 部署时,社区建议使用 jsonnet (以编程的形式编辑 json)自定义生成 yaml 或 json 文件,初学者可不考虑,直接修改已有 yaml 文件。
本地加速IP:192.168.120.2:10809
若无加速IP,请更换相关 url 以及组件源,如:Docker相关url,apt 源,容器源
步骤操作执行条件:已成功部署 K8S,Calico,Kuboard,IngressNginxController,已配置相关组件加速
若未部署或不清楚,请查阅:

Kube-Prometheus 相关组件

Prometheus Operator:自动管理 Prometheus 和 Alertmanager 实例,简化 Kubernetes 中的部署和配置。
Prometheus:收集和存储指标的核心,它根据来自 Kubernetes 服务的定义指标抓取时间序列数据。
Alertmanager:管理和路由来自 Prometheus 的警报,支持复杂的规则和多种通知渠道。
Node Exporter:从集群节点收集硬件和操作系统指标。
Kube State Metrics:生成有关各种 Kubernetes 对象状态的指标。
Grafana:提供可视化功能,与 Prometheus 集成以获得详细的监控仪表板。
ServiceMonitor 和 PodMonitor:用于监控服务或 Pod 组的自定义资源定义 (CRD)。

步骤

安装配置 kube-prometheus

apt install -y unzip
wget -O  kp.zip https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.14.0.zip
unzip kp.zip
cd kube-prometheus-*

修改以下三个文件:

manifests/grafana-networkPolicy.yaml
manifests/prometheus-networkPolicy.yaml
manifests/alertmanager-networkPolicy.yaml

向其中插入以下内容,得到如下部分显示:
grafana-networkPolicy.yaml

...
spec:
  egress:
  - {}
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: prometheus
    # 插入
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: ingress-nginx
    - ipBlock:
        cidr: 192.168.120.0/24
    # 结束
    ports:
    - port: 3000
      protocol: TCP
...

prometheus-networkPolicy.yaml

...
spec:
  egress:
  - {}
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: prometheus
    # 插入
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: ingress-nginx
    - ipBlock:
        cidr: 192.168.120.0/24
    # 结束
    ports:
    - port: 9093
      protocol: TCP
    - port: 8080
      protocol: TCP
...

manifests/prometheus-networkPolicy.yaml

spec:
  egress:
  - {}
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: prometheus
    # 插入
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: ingress-nginx
    - ipBlock:
        cidr: 192.168.120.0/24
    # 结束
    ports:
    - port: 9090
      protocol: TCP
    - port: 8080
      protocol: TCP

安装

kubectl create --server-side -f manifests/setup
kubectl wait \
    --for condition=Established \
    --all CustomResourceDefinition \
    --namespace=monitoring
kubectl create -f manifests/
# 如果需要卸载
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

使用 Kuboard 配置 ingress 应用路由

首页,选择集群以 kuboard-admin 身份进入 monitoring 命名空间
应用程序,应用路由,创建,填写如下信息,效果如图

名 称:kube-prometheus-ing
IngressClass:启用,选择 ingress
路由规则
    域名:grafana.kp.yudelei.com,映射路径:前缀匹配(/,grafana,3000:http)
    域名:prometheus.kp.yudelei.com,映射路径:前缀匹配(/,prometheus-k8s,9090:web)
    域名:alertmanager.kp.yudelei.com,映射路径:前缀匹配(/,alertmanager-main,9093:web)

kp01.png

配置本地解析

在本地网络DNS添加相关解析:

grafana.kp.yudelei.com,记录类型A,IP:192.168.120.81(K8S集群任一主机IP)
prometheus.kp.yudelei.com,记录类型A,IP:192.168.120.81(K8S集群任一主机IP)
alertmanager.kp.yudelei.com,记录类型A,IP:192.168.120.81(K8S集群任一主机IP)

若无本地 DNS 仅测试,可配置本地 hosts:

# Windows hosts 文件
# 移动到桌面打开写入,在将其移动到 C:\Windows\System32\drivers\etc\ 目录下
C:\Windows\System32\drivers\etc\hosts

# Linux hosts 文件
/etc/hosts

# 追加写入即可
192.168.120.83 grafana.kp.yudelei.com
192.168.120.83 prometheus.kp.yudelei.com
192.168.120.83 alertmanager.kp.yudelei.com

完成

现在即可在本地运维网络,通过域名访问对应组件。
端口 32763 为 IngressNginxController 暴露的端口。
若遗忘:
通过 kuboard:首页(左上角 Kuboard 图标),选择集群通过 kuboard-admin 身份访问集群概要,网络,IngressClass,点击 ingress 点击进入即可查阅到 IngressNginxController 相关端口。
通过 kubectl: kubectl get svc -n ingress-nginx

grafana:http://grafana.kp.yudelei.com:32763
prometheus:http://prometheus.kp.yudelei.com:32763
alertmanager:http://alertmanager.kp.yudelei.com:32763

数据持久化

以下数据均根据 kube-prometheus 0.14.0 官方示例配置,请注意修改。
监控类组件建议使用支持高 IO 的 SSD 存储类;以下以低 IO NFS SSD 为例,配置方式均类似。
若无其他可用存储,可自行搭建 NFS 服务器,以下为 Windows Server NFS Server 配置参数。

# 注意:NFS 通常只用于学习测试,勿用于生产环境
NFS服务器:192.168.120.52
NFS路径:/nfs
无服务器身份验证:勾选
启动未映射的用户访问(通过UID/GID):勾选
共享权限:
  All Machines:勾选
  共享权限:读写
  允许根目录访问:勾选

确认所有K8S节点均可连接 NFS 服务器端。

apt install -y nfs-client
mkdir -p /tmp/testnfs && mount -t nfs 192.168.120.52:/nfs /tmp/testnfs && echo "hello nfs\n" >> /tmp/testnfs/test.txt && cat /tmp/testnfs/test.txt

成功输出1-3行"hello nfs",即为正常,然后可执行卸载挂载umount /tmp/testnfs

配置 storageClass

k8S 可视化面板 Kuboard:首页,选择集群,使用 kuboard-admin 身份访问集群概要,存储,存储类,创建存储类,填写如图(注意容量:建议300g)
kp02.png

Prometheus 数据持久化

Prometheus 是有状态服务 StatefulSet,通过修改 yaml 文件,配置 storage 相关信息即可。
vim manifests/prometheus-prometheus.yaml修改后执行kubectl apply -f manifests/prometheus-prometheus.yaml --server-side

# 末尾追加
spec:
  ...
  retention: 3d # 保留3天
  storage:
    volumeClaimTemplate:
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi # 容量1G
        storageClassName: nfs-ssd # 存储类名称

问题

kube-prometheus 部署后 无法访问 访问不了

新接触 k8s 的人在安装 kube-prometheus 社区安装步骤配置 prometheus,grafana,Alertmanager 等组件后,会发现通过本地网络无法访问。社区中演示了 port-forward k8s宿主机访问方式,且 port-forward 并不是生产部署方式。
其原因为 kube-prometheus 部署启用了 Network Policy 网络策略,默认仅允许来自内部指定 Pod prometheus 的访问。
网上通常教程通过删除 Network Policy 网络策略,并使用 NodePort 来进行访问,不适合生产环境,仅适用于测试环境。
为使本地运维或生产网段能够访问以及 ingress-controller 能够正常通过域名转发流量至指定 service,需进行网络策略配置。
以 kube-prometheus 中的 grafana 举例。
编辑网络策略文件kube-prometheus-0.14.0/manifests/grafana-networkPolicy.yaml
× 允许来自 ingress-nginx-controller 所在 namespace 命名空间 ingress-nginx 的访问
× 允许来自本地维护网段 192.168.120.0/24 的访问

...
spec:
  egress:
  - {}
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: prometheus
    # 添加
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: ingress-nginx
    - ipBlock:
        cidr: 192.168.120.0/24
    # 结束
...

参考

prometheus-operator.dev/docs/getting-started/installation/
prometheus-operator.dev/kube-prometheus/kube/access-ui/
github.com/prometheus-operator/kube-prometheus

最后修改:2024 年 11 月 09 日 10 : 34 PM
如果觉得文章帮助了您,您可以随意赞赏。